Форум по 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, 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.
Ответить с цитированием
  #8  
Старый 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 раз прочитал его и такое чувство что количество элементов нужно считать во всех столбцах а не только у следующего или ?
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter