| 
| 
 | Вопрос # 3 551/ вопрос открыт / | 
 |  Здравствуйте, эксперты!Никак не могу довести до ума задачку: посчитать среднее арифметическое значений элементов двумерного массива вещественных чисел,расположенных выше главной диагонали.
 Очень надеюсь на вашу помощь, заранее спасибо.
 Приложение:Переключить в обычный режим unit Unit1; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls, Grids; typeTForm1 = class(TForm)    Edit1: TEdit;    Edit2: TEdit;    Button1: TButton;    StringGrid1: TStringGrid;    procedure Button1Click(Sender: TObject);  private    { Private declarations }  public    { Public declarations }  end; var  Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject);const n=100;m=100;var a:array [1..n,1..m] of integer;i,j,k,s:integer;b:real;begin  for i:=1 to n dofor j:=1 to m do for i:=1 to n dofor j:=1 to m doif a[i,j]>0 then s:=s+a[i,j]; edit2.Text:=floattostr(b);end;end.
|  |   Вопрос задал: slava a.k. (статус: Посетитель)Вопрос отправлен: 20 декабря 2009, 11:54
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: min@y™ Вот примерчик для квадратной матрицы:
 //Перебор элементов выше главной диагонали:
var
  i, j, Sum: Integer;
  Average: Extended;
begin
  Sum:= 0;
  for i:= 1 to N do // строка
    for j:= i + 1 to N do // столбец
      Inc(Sum, A[i, j]); // Подсчёт суммы
 
  // Среднее
  Average:= Sum / (N(N - 1) div 2); // <--- для N > 1
end;Не отлаживал, но вроде так.
|  | Ответ отправил: min@y™ (статус: Доктор наук)Время отправки: 20 декабря 2009, 12:46
 Оценка за ответ: 5
 Комментарий к оценке: спасибо, что хоть чем то помог |  
 Мини-форум вопросаВсего сообщений: 11; последнее сообщение — 20 декабря 2009, 16:41; участников в обсуждении: 2. 
|   | slava a.k. (статус: Посетитель), 20 декабря 2009, 13:26 [#1]:Что-то не так. Текст программы исправил: procedure TForm1.Button1Click(Sender: TObject);
 const n=100;m=100;
 var A:array[1..n,1..m] of integer;
 i,j,Sum: Integer;
 Average: Extended;
 begin
 Sum:= 0;
 for i:= 1 to N do
 for j:= i + 1 to N do
 Inc(Sum, A[i, j]);
 Average:= Sum /(N*(N - 1)div 2);
 edit2.Text:=floattostr(Average);
 end;
 end.
 подставил зачения от 1 до 9 в матрицу размером 3 на 3 ответ получился 270 с чем то тясяч, вобщем неправильный. Не знаете в чем дело?
 |  
|   | min@y™ (статус: Доктор наук), 20 декабря 2009, 13:37 [#2]: Цитата (slava a.k.): подставил зачения от 1 до 9 в матрицу размером 3 на 3 ответ получился 270 с чем то тясяч, вобщем неправильный. Не знаете в чем дело?  
 А где инициализация содержимого массива A[i, j]? Он у тебя объявлен, но в него не заносятся значения, поэтому в нём "мусор".
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | min@y™ (статус: Доктор наук), 20 декабря 2009, 13:44 [#3]:Вставляй куски кода в теги форматирования, а то читать и анализировать очень трудно. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | slava a.k. (статус: Посетитель), 20 декабря 2009, 14:30 [#4]:исправил: 
 procedure TForm1.Button1Click(Sender: TObject);
const n=100;m=100;
var A:array[1..n,1..m] of integer;
i,j,Sum: Integer;
Average: Extended;
begin
Sum:=0;
for i:=1 to N do
for j:=i + 1 to N do
A[i,j]:=strtoint(stringgrid1.cells[i,j]); 
Inc(Sum,A[i,j]);
Average:= Sum/(N*(N - 1)div 2);
edit2.Text:=floattostr(Average);
end;
end.теперь ошибка вылазиет - Debugger exception notification Project Project1.exe raised exception class EConvertError with message '''is not a valid integer value'.Process stoped
 |  
|   | min@y™ (статус: Доктор наук), 20 декабря 2009, 14:38 [#5]:Значит процесс натыкается на пустую ячейку в stringgrid1. Там ячейки нумеруются с нуля, а не с 1. 
 З.Ы. Ну форматируй ты код! В глазах рябит. Посмотри на код в моём ответе - неужели не легче читать?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | min@y™ (статус: Доктор наук), 20 декабря 2009, 14:40 [#6]:И ты забыл кое-что ещё: 
 for i:= 1 to N do
  for j:= i + 1 to N do
    begin // <---
      A[i,j]:= ...;
      Inc(Sum,A[i,j]);
    end; // <---К тому же, если нужно просто посчитать среднее, то матрица А тут вообще не нужна. Можно дёргать значения прямо из грида и плюсовать их к сумме.Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | slava a.k. (статус: Посетитель), 20 декабря 2009, 15:21 [#7]:Извиняюсь, но я не знаю как на вашем форуме изменить фон окна,хоть бы панель инструментов была. Как только ни пробовал - не получается. Всеравно ошибка:
 
 procedure TForm1.Button1Click(Sender: TObject);
const n=100;m=100;
var A:array[1..n,1..m] of integer;
i,j,Sum: Integer;
Average: Extended;
begin
Sum:=0;
for i:=1 to N do
for j:=i + 1 to N do
begin
A[i,j]:=strtoint(stringgrid1.cells[i,j]);
Inc(Sum,A[i,j]);
end;
Average:= Sum/(N*(N - 1)div 2);
edit2.Text:=floattostr(Average);
end;
end.А что надо изменить,что бы этот этот стринггрид не учитывал пустые ячейки? |  
|   | min@y™ (статус: Доктор наук), 20 декабря 2009, 15:29 [#8]: Цитата (slava a.k.): Как только ни пробовал - не получается. Всеравно ошибка: Какая ошибка-то?!
 
 З.Ы. Ну форматируй ты код! В глазах рябит. Посмотри на код в моём ответе - неужели не легче читать?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | min@y™ (статус: Доктор наук), 20 декабря 2009, 15:32 [#9]:Ты же видишь, что у тебя N и M = 100. Ну какого хрена тупо копипастить? У тебя в гриде 100 строк на 100 столбцов? Т.е. 10000 ячеек? 
 Постучись ко мне в аську, поговорим. А то мне это уже надоело.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | slava a.k. (статус: Посетитель), 20 декабря 2009, 16:09 [#10]:я в аське, тебя уже добавил |  
|   | min@y™ (статус: Доктор наук), 20 декабря 2009, 16:41 [#11]: Цитата (slava a.k.): я в аське, тебя уже добавил  
 Не вижу. Попробуй написать сообщение.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |