|
Вопрос # 3 551/ вопрос открыт / |
|
Здравствуйте, эксперты!
Никак не могу довести до ума задачку: посчитать среднее арифметическое значений элементов двумерного массива вещественных чисел,расположенных выше главной диагонали.
Очень надеюсь на вашу помощь, заранее спасибо.
Приложение: Переключить в обычный режим- unit Unit1;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls, Grids;
-
- type
- TForm1 = 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 do
- for j:=1 to m do
-
- for i:=1 to n do
- for j:=1 to m do
- if 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. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|