![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
![]() В двухмерном массиве 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
|
|||
|
|||
![]() Код:
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. |
#8
|
|||
|
|||
![]() вроде бы разобрался, но вот вопрос
Код:
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 раз прочитал его и такое чувство что количество элементов нужно считать во всех столбцах а не только у следующего или ? |