Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 551

/ вопрос открыт /

Здравствуйте, эксперты!
Никак не могу довести до ума задачку: посчитать среднее арифметическое значений элементов двумерного массива вещественных чисел,расположенных выше главной диагонали.
Очень надеюсь на вашу помощь, заранее спасибо.

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, StdCtrls, Grids;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. Edit1: TEdit;
  12. Edit2: TEdit;
  13. Button1: TButton;
  14. StringGrid1: TStringGrid;
  15. procedure Button1Click(Sender: TObject);
  16. private
  17. { Private declarations }
  18. public
  19. { Public declarations }
  20. end;
  21.  
  22. var
  23. Form1: TForm1;
  24.  
  25. implementation
  26.  
  27. {$R *.dfm}
  28.  
  29. procedure TForm1.Button1Click(Sender: TObject);
  30. const n=100;m=100;
  31. var a:array [1..n,1..m] of integer;
  32. i,j,k,s:integer;
  33. b:real;
  34. begin
  35.  
  36.  
  37. for i:=1 to n do
  38. for j:=1 to m do
  39.  
  40. for i:=1 to n do
  41. for j:=1 to m do
  42. if a[i,j]>0 then s:=s+a[i,j];
  43.  
  44. edit2.Text:=floattostr(b);
  45. end;
  46. end.


slava a.k. Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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.

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™

min@y™ (статус: Доктор наук), 20 декабря 2009, 13:37 [#2]:

Цитата (slava a.k.):

подставил зачения от 1 до 9 в матрицу размером 3 на 3 ответ получился 270 с чем то тясяч, вобщем неправильный. Не знаете в чем дело?


А где инициализация содержимого массива A[i, j]? Он у тебя объявлен, но в него не заносятся значения, поэтому в нём "мусор".
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 20 декабря 2009, 13:44 [#3]:

Вставляй куски кода в теги форматирования, а то читать и анализировать очень трудно.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
slava a.k.

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™

min@y™ (статус: Доктор наук), 20 декабря 2009, 14:38 [#5]:

Значит процесс натыкается на пустую ячейку в stringgrid1. Там ячейки нумеруются с нуля, а не с 1.

З.Ы. Ну форматируй ты код! В глазах рябит. Посмотри на код в моём ответе - неужели не легче читать?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

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.

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™

min@y™ (статус: Доктор наук), 20 декабря 2009, 15:29 [#8]:

Цитата (slava a.k.):

Как только ни пробовал - не получается. Всеравно ошибка:

Какая ошибка-то?!

З.Ы. Ну форматируй ты код! В глазах рябит. Посмотри на код в моём ответе - неужели не легче читать?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 20 декабря 2009, 15:32 [#9]:

Ты же видишь, что у тебя N и M = 100. Ну какого хрена тупо копипастить? У тебя в гриде 100 строк на 100 столбцов? Т.е. 10000 ячеек?

Постучись ко мне в аську, поговорим. А то мне это уже надоело.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
slava a.k.

slava a.k. (статус: Посетитель), 20 декабря 2009, 16:09 [#10]:

я в аське, тебя уже добавил
min@y™

min@y™ (статус: Доктор наук), 20 декабря 2009, 16:41 [#11]:

Цитата (slava a.k.):

я в аське, тебя уже добавил


Не вижу. Попробуй написать сообщение.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:48
Выполнено за 0.03 сек.