![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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 раз прочитал его и такое чувство что количество элементов нужно считать во всех столбцах а не только у следующего или ? |