|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
2ву мерный массив помогите сделать
В двухмерном массиве n на m найдите среднее арифметическое первого столбца и количество элементов в каждом из следующих
столбцов, превышающих среднее арифметическое предыдущего столбца.Изобразите графически алгоритм и напишите программу для решения этой задачи. З.Ы. как я понял сначала вводим n * m потом массив заполняется рандомами и далее идут вычисление.... как это реализовать не пойму ... помогите кто тут гуру в делфе! |
#2
|
|||
|
|||
Цитата:
Последний раз редактировалось Annihilator, 11.09.2013 в 11:39. |
#3
|
|||
|
|||
угу сам алгоритм на основе VCL...
|
#4
|
|||
|
|||
Сейчас изображу что нибудь
Первую часть можно решить как-то так, например: Код:
procedure TForm1.calculation(const m, n: integer); var a: array of array of integer; row,col,count, sum:integer; mean:double; begin //m - строки, n - столбцы {выделяем память под массив и заполняем рандомами 0-39} setlength(a, m, n); randomize; for row:=0 to high(a) do begin for col:=0 to high(a[0]) do begin a[row,col]:=random(40); end; end; {Пробегаем по 1 столбцу и считаем среднее арифметическое} sum:=0; for row:=0 to high(a) do begin sum:=sum+a[row,0]; end; mean:=sum / length(a); //cреднее арифметическое ....... end; Код:
unit uMain; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type T2DIntegerDynArray = array of array of integer; TForm1 = class(TForm) edtM: TEdit; edtN: TEdit; Label1: TLabel; Label2: TLabel; memLog: TMemo; Button1: TButton; procedure Button1Click(Sender: TObject); private procedure calculation(const m,n:integer); function getNextCount(const a:T2DIntegerDynArray; const col:integer):integer; { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} { TForm1 } procedure TForm1.Button1Click(Sender: TObject); var m,n:integer; begin m:= StrToInt(edtM.Text); n:=StrToInt(edtN.Text); calculation(m,n); end; procedure TForm1.calculation(const m, n: integer); var a: T2DIntegerDynArray; row,col, count:integer; s:string; begin //m - строки, n - столбцы {выделяем память под массив и заполняем рандомами 0-39} Randomize; setlength(a, m, n); for row:=0 to high(a) do begin s:=''; for col:=0 to high(a[0]) do begin a[row,col]:=random(40); s:=s+' '+ IntToStr(a[row,col]); end; memLog.Lines.Add(Format('Строка №%d (%s)',[row, s])); end; for col:=0 to high(a[0])-1 do begin count:=getNextCount(a, col); memLog.Lines.Add(Format('Столбец %d, результат = %d',[col+1, count])); end; end; function TForm1.getNextCount(const a: T2DIntegerDynArray; const col: integer): integer; var sum, row:integer; mean :double; begin sum:=0; result:=0; for row:=0 to high(a) do sum:=sum+a[row,col]; mean:=sum / length(a); //cреднее арифметическое memLog.Lines.Add(Format('Среднее арифметическое для столбца №%d = %n',[col,mean])); for row:=0 to high(a) do if a[row, col+1] > mean then inc(result); end; end. Последний раз редактировалось M.A.D.M.A.N., 12.09.2013 в 14:45. |
#5
|
|||
|
|||
спс за код, но я сделал по проще хотя мб и не правильно
Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls, Spin; type TForm1 = class(TForm) Button1: TButton; StringGrid1: TStringGrid; Label1: TLabel; SpinEdit1: TSpinEdit; Edit2: TEdit; Label4: TLabel; SpinEdit2: TSpinEdit; Edit3: TEdit; Button3: TButton; procedure Button1Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; var d: array of array of real; k, n, m: integer; sum, sr: real; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i, j: integer; mx: real; begin if SpinEdit1.Value = 0 then begin Showmessage('Вы не ввели размер матрицы'); exit end; randomize; n := SpinEdit1.Value; m := SpinEdit2.Value; StringGrid1.ColCount := m; StringGrid1.RowCount := n; Setlength(d, n, m); for i := 0 to n - 1 do for j := 0 to m - 1 do d[i, j] := random(30); for i := 0 to n - 1 do for j := 0 to m - 1 do StringGrid1.Cells[j, i] := FloatToStrF(d[i, j], ffFixed, 5, 0); sum := 0; for i := 0 to n - 1 do begin sum := sum + d[i, 0]; k := k + 1; sr := sum / k; end; k:=0; for i := 0 to n - 1 do for j := 1 to m - 1 do if d[i, j] > sr then k := k + 1; Edit2.Text := 'количество элементов =' + FloatToStrF(k, ffFixed, 5, 0); Edit3.Text := 'среднее арифметическое =' + FloatToStrF(sr, ffFixed, 5, 2); end; procedure TForm1.Button3Click(Sender: TObject); begin close end; end. з.ы. а как скидывать код с линейкой Последний раз редактировалось Admin, 12.09.2013 в 08:26. |
#6
|
|||
|
|||
Кнопка есть "КОД".
Там по условию задачи: "среднее арифметическое первого столбца и количество элементов в каждом из следующих столбцов, превышающих среднее арифметическое предыдущего столбца", т.е. я так понял, надо для КАЖДОГО, кроме последнего столбца считать среднее арифметическое и сравнивать числа из следующего столбца. А у вас, в конце: Код:
for i := 0 to n - 1 do for j := 1 to m - 1 do if d[i, j] > sr then k := k + 1; Последний раз редактировалось Annihilator, 12.09.2013 в 02:09. |
#7
|
|||
|
|||
мм да.... условие не так понял, а как по проще изменить мой код под это условие, а то я ваш код не понимаю
|
#8
|
|||
|
|||
Цитата:
|
#9
|
|||
|
|||
Не понятно как работает функция и как мне ее вставить в мой код, чтоб результат отображался в Edit'тах как раньше или лучше использовать memo?
|
#10
|
|||
|
|||
Цитата:
|
#11
|
|||
|
|||
Код:
unit uMain; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type T2DIntegerDynArray = array of array of integer; //Объявляем свой тип дынных, 2 мерный динамический массив из целых (у вас real, зачем?) TForm1 = class(TForm) edtM: TEdit; //Сюда пишем строки edtN: TEdit; //Сюда столбцы Label1: TLabel; Label2: TLabel; memLog: TMemo;//Сюда выводим логи Button1: TButton; procedure Button1Click(Sender: TObject); private procedure calculation(const m,n:integer); function getNextCount(const a:T2DIntegerDynArray; const col:integer):integer; { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} { TForm1 } procedure TForm1.Button1Click(Sender: TObject); var m,n:integer; begin m:= StrToInt(edtM.Text); n:=StrToInt(edtN.Text); calculation(m,n); end; procedure TForm1.calculation(const m, n: integer); var a: T2DIntegerDynArray; //Объявляем наш массив row,col, count:integer; //счетчики циклов s:string; //вспомогательная строка begin //m - строки, n - столбцы {выделяем память под массив и заполняем рандомами 0-39} Randomize; //Необходимо, чтоб функция random давала всегда разные результаты setlength(a, m, n); //выделили память for row:=0 to high(a) do //пробегаем по строкам begin s:=''; for col:=0 to high(a[0]) do //пробегаем по столбцам begin a[row,col]:=random(40); //заполняем рандомами s:=s+' '+ IntToStr(a[row,col]); //заполняем строку, чтоб потом вывести её в лог (необязательно, просто для удобства, чтоб мы сразу видели наш массив), у вас так StringGrid заполняется, зачем-то в отдельном цикле (у вас по сути 2 одинаковых цикла подряд, не надо так) end; memLog.Lines.Add(Format('Строка №%d (%s)',[row, s])); //Выводим строку row в лог end; for col:=0 to high(a[0])-1 do //пробегаем от 0 до n-2 столбцам begin count:=getNextCount(a, col); //вычисляем количество превышающих элементов memLog.Lines.Add(Format('Столбец %d, результат = %d',[col+1, count])); //выводим результат по каждому столбцу end; end; function TForm1.getNextCount(const a: T2DIntegerDynArray; const col: integer): integer; //скармливаем массив a, столбец col, получаем количество превышающих элементов в столбце col+1 var sum, row:integer; mean :double; begin sum:=0; result:=0; for row:=0 to high(a) do sum:=sum+a[row,col]; //сумма всех элементов в столбце col mean:=sum / length(a); //cреднее арифметическое (length(a) - это фактически количество строк в массиве) memLog.Lines.Add(Format('Среднее арифметическое для столбца №%d = %n',[col,mean]));//вывели в лог for row:=0 to high(a) do if a[row, col+1] > mean then inc(result); //посчитали количество элементов в столбце col+1, которое превышает среднее арифметическое столбца col end; end. |
#12
|
|||
|
|||
вроде бы разобрался, но вот вопрос
Код:
begin a[row,col]:=random(40); s:=s+' '+ IntToStr(a[row,col]); StringGrid1.Cells[col,row] := IntToStr(a[row,col]); end; memLog.Lines.Add(Format('Строка №%d (%s)',[row, s])); почему у StringGrid1 параметры наоборот надо ставить чтоб сетка получилась аналогичной логу ? и все же по заданию... 98 раз прочитал его и такое чувство что количество элементов нужно считать во всех столбцах а не только у следующего или ? |
#13
|
|||
|
|||
Цитата:
По заданию. Условие кривое само по себе. Я так понял: 1. Считаем MEAN 1 столбца и количество превышающих его элементов во 2 столбце. 2. Считаем MEAN 2 столбца и количество превышающих его элементов во 3 столбце. 3. Считаем MEAN 3 столбца и количество превышающих его элементов во 4 столбце. И так пока не достигнем конца массива. Так понимаю условие я. Это ИМХО, я могу ошибаться. |
#14
|
|||
|
|||
У меня при массиве 5 строк на 6 столбцов такое получается:
Код:
Строка №0 ( 37 6 38 37 32 29) Строка №1 ( 37 37 30 25 3 32) Строка №2 ( 20 12 19 25 12 7) Строка №3 ( 21 34 2 26 28 29) Строка №4 ( 23 15 29 38 35 3) Среднее арифметическое для столбца №0 = 27,60 Столбец 1, результат = 2 Среднее арифметическое для столбца №1 = 20,80 Столбец 2, результат = 3 Среднее арифметическое для столбца №2 = 23,60 Столбец 3, результат = 5 Среднее арифметическое для столбца №3 = 30,20 Столбец 4, результат = 2 Среднее арифметическое для столбца №4 = 22,00 Столбец 5, результат = 3 |
#15
|
|||
|
|||
ну да ладно спасибо еще раз хоть за это.. я в начале вообще по другому условие прочитал .. кстати а не подскажете какой нибудь удобный редактор для рисования блок схем?
|