Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ] > Код на шару!
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.09.2013, 21:41
Plin Plin вне форума
Прохожий
 
Регистрация: 04.09.2013
Сообщения: 9
Версия Delphi: Delphi 7
Репутация: 10
Печаль 2ву мерный массив помогите сделать

В двухмерном массиве n на m найдите среднее арифметическое первого столбца и количество элементов в каждом из следующих
столбцов, превышающих среднее арифметическое предыдущего столбца.Изобразите графически алгоритм и напишите программу
для решения этой задачи.


З.Ы. как я понял сначала вводим n * m потом массив заполняется рандомами и далее идут вычисление.... как это реализовать не пойму ... помогите кто тут гуру в делфе!
Ответить с цитированием
  #2  
Старый 11.09.2013, 11:37
Annihilator Annihilator вне форума
Прохожий
 
Регистрация: 16.06.2013
Сообщения: 29
Версия Delphi: Delphi XE 2
Репутация: 10
По умолчанию

Цитата:
Сообщение от Plin
В двухмерном массиве n на m найдите среднее арифметическое первого столбца и количество элементов в каждом из следующих
столбцов, превышающих среднее арифметическое предыдущего столбца.Изобразите графически алгоритм и напишите программу
для решения этой задачи.


З.Ы. как я понял сначала вводим n * m потом массив заполняется рандомами и далее идут вычисление.... как это реализовать не пойму ... помогите кто тут гуру в делфе!
А что именно не понятно, сам алгоритм или как работать с многомерными массивами? Приложение консольное должно быть или на основе VCL?

Последний раз редактировалось Annihilator, 11.09.2013 в 11:39.
Ответить с цитированием
  #3  
Старый 11.09.2013, 11:46
Plin Plin вне форума
Прохожий
 
Регистрация: 04.09.2013
Сообщения: 9
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

угу сам алгоритм на основе VCL...
Ответить с цитированием
  #4  
Старый 11.09.2013, 12:01
Annihilator Annihilator вне форума
Прохожий
 
Регистрация: 16.06.2013
Сообщения: 29
Версия Delphi: Delphi XE 2
Репутация: 10
По умолчанию

Сейчас изображу что нибудь

Первую часть можно решить как-то так, например:
Код:
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  
Старый 11.09.2013, 16:14
Plin Plin вне форума
Прохожий
 
Регистрация: 04.09.2013
Сообщения: 9
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

спс за код, но я сделал по проще хотя мб и не правильно
Код:
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  
Старый 12.09.2013, 02:06
Annihilator Annihilator вне форума
Прохожий
 
Регистрация: 16.06.2013
Сообщения: 29
Версия Delphi: Delphi XE 2
Репутация: 10
По умолчанию

Кнопка есть "КОД".
Там по условию задачи: "среднее арифметическое первого столбца и количество элементов в каждом из следующих
столбцов, превышающих среднее арифметическое предыдущего столбца", т.е. я так понял, надо для КАЖДОГО, кроме последнего столбца считать среднее арифметическое и сравнивать числа из следующего столбца. А у вас, в конце:
Код:
for i := 0 to n - 1 do
 for j := 1 to m - 1 do

 if d[i, j] > sr then
 k := k + 1;
считается общая сумма всех элементов, начиная со 2 столбца, которые превышают среднее арифметическое 1 столбца.

Последний раз редактировалось Annihilator, 12.09.2013 в 02:09.
Ответить с цитированием
  #7  
Старый 12.09.2013, 14:15
Plin Plin вне форума
Прохожий
 
Регистрация: 04.09.2013
Сообщения: 9
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

мм да.... условие не так понял, а как по проще изменить мой код под это условие, а то я ваш код не понимаю
Ответить с цитированием
  #8  
Старый 12.09.2013, 14:20
Annihilator Annihilator вне форума
Прохожий
 
Регистрация: 16.06.2013
Сообщения: 29
Версия Delphi: Delphi XE 2
Репутация: 10
По умолчанию

Цитата:
Сообщение от Plin
мм да.... условие не так понял, а как по проще изменить мой код под это условие, а то я ваш код не понимаю
Так у нас первая часть по сути одинаковая Что именно не понятно? Я закомментировать код могу.
Ответить с цитированием
  #9  
Старый 12.09.2013, 14:32
Plin Plin вне форума
Прохожий
 
Регистрация: 04.09.2013
Сообщения: 9
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Не понятно как работает функция и как мне ее вставить в мой код, чтоб результат отображался в Edit'тах как раньше или лучше использовать memo?
Ответить с цитированием
  #10  
Старый 12.09.2013, 14:49
Annihilator Annihilator вне форума
Прохожий
 
Регистрация: 16.06.2013
Сообщения: 29
Версия Delphi: Delphi XE 2
Репутация: 10
По умолчанию

Цитата:
Сообщение от Plin
Не понятно как работает функция и как мне ее вставить в мой код, чтоб результат отображался в Edit'тах как раньше или лучше использовать memo?
Ну если брать в расчёт то, что у нас надо результат выводить по каждому столбцу, а количество столбцов заранее неизвестно, то для того, чтоб его выводить в TEdit, их надо динамически создавать на форме, либо выводить одной длинной строкой, что неудобно. Что именно выбрать для вывода результата значения не имеет, просто, ИМХО, TMemo тут удобнее. А код сейчас закомментирую, станет понятно.
Ответить с цитированием
  #11  
Старый 12.09.2013, 15:06
Annihilator Annihilator вне форума
Прохожий
 
Регистрация: 16.06.2013
Сообщения: 29
Версия Delphi: Delphi XE 2
Репутация: 10
По умолчанию

Код:
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  
Старый 12.09.2013, 15:45
Plin Plin вне форума
Прохожий
 
Регистрация: 04.09.2013
Сообщения: 9
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

вроде бы разобрался, но вот вопрос
Код:
 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  
Старый 12.09.2013, 15:58
Annihilator Annihilator вне форума
Прохожий
 
Регистрация: 16.06.2013
Сообщения: 29
Версия Delphi: Delphi XE 2
Репутация: 10
По умолчанию

Цитата:
Сообщение от Plin
вроде бы разобрался, но вот вопрос
Код:
 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 раз прочитал его и такое чувство что количество элементов нужно считать во всех столбцах а не только у следующего или ?
Потому что stringGrid.cells требует на вход первый параметр - столбцы, а второй - строки, а мы условились, что в нашем массиве первое измерение - это строки, а второе - столбцы.
По заданию. Условие кривое само по себе. Я так понял:
1. Считаем MEAN 1 столбца и количество превышающих его элементов во 2 столбце.
2. Считаем MEAN 2 столбца и количество превышающих его элементов во 3 столбце.
3. Считаем MEAN 3 столбца и количество превышающих его элементов во 4 столбце.
И так пока не достигнем конца массива. Так понимаю условие я. Это ИМХО, я могу ошибаться.
Ответить с цитированием
  #14  
Старый 12.09.2013, 16:07
Annihilator Annihilator вне форума
Прохожий
 
Регистрация: 16.06.2013
Сообщения: 29
Версия Delphi: Delphi XE 2
Репутация: 10
По умолчанию

У меня при массиве 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  
Старый 12.09.2013, 16:51
Plin Plin вне форума
Прохожий
 
Регистрация: 04.09.2013
Сообщения: 9
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

ну да ладно спасибо еще раз хоть за это.. я в начале вообще по другому условие прочитал .. кстати а не подскажете какой нибудь удобный редактор для рисования блок схем?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:52.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter