Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > String Grid


Автор: Dvix 10.5.2008, 18:17
 дана матрица размером n*m. Упорядочить её строки по возрастанию суммы их элементов.
Размерность вводится пользователем в Edit.
Как Упорядочить её строки по возрастанию суммы их элементов?

Код

Edit1.Text:=FloatToStr(n);
Edit2.Text:=FloatToStr(m);
for i := 1 to N do
for j := 1 to N do
A[i, j]:=StrToFloat(StringGrid1.Cells[j,i]);



Автор: almagnit 10.5.2008, 19:57
На стадии ввода массива, формируешь одномерный массив, записывая суммы строк каждой строки, а

потом сортируя полученный массив переставляешь местами элементы строки соответствующей 

номеру ячейки в третьем массиве.

Могу написать на чем угодно, но на Паскале программировал еще в школе и даже на олимпиаду 

ездил (не безуспешно  smile ) однако как язык он мне не нравиться поэтому листинг не сделаю, если 

будет желание тогда подробнее опишу алгоритм или могу дать листинг на другом языке.

Автор: THandle 10.5.2008, 20:12
Если я правильно понял задание, то вот:

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, Grids, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    StringGrid1: TStringGrid;
    procedure Edit1Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  A : array of array of integer;
  n : integer = 5;

implementation

{$R *.dfm}



function SumLine(num : integer) : integer;
var
  i : integer;
begin
  result := 0;
  for i := 0 to n - 1 do
    result := result + A[num, i];
end;


procedure swap(first, second : integer);
var
  i, tmp : integer;
begin
  for i := 0 to n - 1 do
    begin
      tmp := A[first, i];
      A[first, i] := A[second, i];
      A[second, i] := tmp;
    end;
end;

procedure BubbleSort;
var
  i, j : integer;
begin
  for i := 0 to n - 1 do
    for j := 1 to n - i - 1 do
      if SumLine(j - 1) > SumLine(j) then
        swap(j - 1, j);
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  if TryStrToInt(Edit1.Text, n) then
    begin
      SetLength(A, n, n);
      StringGrid1.ColCount := n;
      StringGrid1.RowCount := n;
    end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  i, j : integer;
begin
  for i := 0 to n - 1 do
    for j := 0 to n - 1 do
      A[i, j] := StrToInt(StringGrid1.Cells[i, j]);
  BubbleSort;
  for i := 0 to n - 1 do
    for j := 0 to n - 1 do
      StringGrid1.Cells[i, j] := IntToStr(A[i, j]);
end;

end.



Правда сортирует не строки, а столбцы, спешил и соответственно намудрилsmile
Ну там переделать не трудно.

В аттаче сам проект.
 smile 

Автор: Dvix 10.5.2008, 21:10
это массив а с целым типом:
A : array of integer;

а это что? объясни.
Код

A : array of array of integer;

Автор: THandle 10.5.2008, 21:18
Dvix, динамический двумерный массив.

Статический объявляется так:

Код

var
  a : array [0..MAX, 0..MAX] of integer;


Автор: Dvix 11.5.2008, 13:32
Огромное СПС. Про статические двумерные массивы я знал, про динамические в первый раз слышу. Но передо мной стоит задача написать этот же код, без EditChange, по нажатию кнопки.

Автор: THandle 11.5.2008, 13:37
Dvix, не за что. А какие проблемы? Кидаешь еще одну кнопку на форму, создаешь обработчик OnClick, и пишешь в него вот этот код:

Код

  if TryStrToInt(Edit1.Text, n) then
    begin
      SetLength(A, n, n);
      StringGrid1.ColCount := n;
      StringGrid1.RowCount := n;
    end;

Автор: Dvix 11.5.2008, 13:46
Ещё раз огромное СПС.
Со строками разобрался,  но вот ещё проблема:по возрастанию суммы их элементов?

Автор: THandle 11.5.2008, 13:54
Цитата(Dvix @  11.5.2008,  14:46 Найти цитируемый пост)
и ничего не происходит. Необходимо удалить Edit1Change?


Очисти от кода Edit1Change:

Код

procedure TForm1.Edit1Change(Sender: TObject);
begin
end;



Далее в Edit1 вводишь число и тыкаешь на эту кнопку. Колво столбцов и строк должно изменится если введено число.


Цитата(Dvix @  11.5.2008,  14:46 Найти цитируемый пост)
как упорядочить её строки по возрастанию суммы их элементов?

В точности наоборот) Тут столбцы сортирует) поменяй строки со столбцами)


На счет этого, если не разберешься напишу вечером(если буду еще в здравом умеsmile), ну или завтраsmile

Автор: Dvix 14.5.2008, 09:41
необходимо упорядочить строки матрицы по возрастанию их наибольших элементов.

Автор: THandle 15.5.2008, 09:21
Цитата(Dvix @  11.5.2008,  14:46 Найти цитируемый пост)
Со строками разобрался,  но вот ещё проблема:по возрастанию суммы их элементов?


Цитата(Dvix @  14.5.2008,  10:41 Найти цитируемый пост)
необходимо упорядочить строки матрицы по возрастанию их наибольших элементов.


Так что? Суммы всех элементов строки или же по возрастанию максимальных? Если первое, то оно там и реализовано...

Автор: Dvix 15.5.2008, 18:32
второе:
Цитата

как упорядочить строки матрицы по возрастанию их наибольших элементов. 


Автор: THandle 15.5.2008, 20:00
Измени вот эту вот функцию:

Код

function SumLine(num : integer) : integer;
var
  i : integer;
begin
  result := 0;
  for i := 0 to n - 1 do
    result := result + A[num, i];
end;


На:

Код

function SumLine(num : integer) : integer;
var
  i : integer;
begin
  result := A[num, 0];
  for i := 1 to n - 1 do
    if A[num, i] > result then
      result := A[num, i];
end;


ну и название функции поменяй, как понравится, а то так не информативно получится smile 

Автор: Dvix 15.5.2008, 20:56
огромное спасибо.

Автор: THandle 15.5.2008, 21:39
Не за что. Если вопрос решен, то пометь тему как решенную smile 

Автор: Dvix 17.5.2008, 14:31
Нет, вопрос не решён.
Первую задачу нужно решить так:

Находить сумму элементов строки и записывать их в массив, нужно поменять строки матрицы местами
в зависимости от суммы элементов. Первой строкой будет строка, у котороой сумма элементов минимальна. Последней строкой будет строка, у которой сумма элементов максимальна.
Ответ вывести в отдельный stringgrid. 
вводить числа в строки Stringgrid.

Вторую задачу нужно решить так:

Находить масксимальный элемент каждой строки. Менять местами стоки в зависимости от их максимального элемента. Первой строкой будет та строка, у которой макс. элемент минимален.Последнейц строкой буде та строка, у кот. макс. элемент наибольший.
Ответ вывести в отдельный stringgrid. 
вводить числа в строки Stringgrid.

Автор: THandle 17.5.2008, 16:04
Цитата(Dvix @  17.5.2008,  15:31 Найти цитируемый пост)
Первую задачу нужно решить так:


Цитата(Dvix @  17.5.2008,  15:31 Найти цитируемый пост)
Вторую задачу нужно решить так:


Переделай оба варианта под строки, а не столбцы - и будет решение, если я правильно понял вопрос.

Автор: Dvix 17.5.2008, 16:09
как записать на делфи вот это: 
В StringGrid: Для начала выбрать размерность: 3*3. 
Вводишь числа: например 5, 7, 1. 6,6,1 и 5,4,1. После нажатия кнопки числа должны быть в обратном порядке занесены в строки?

Автор: THandle 17.5.2008, 16:34
Цитата(Dvix @  17.5.2008,  17:09 Найти цитируемый пост)
В StringGrid: Для начала выбрать размерность: 3*3. 
Вводишь числа: например 5, 7, 1. 6,6,1 и 5,4,1.


Код


  StringGrid1.RowCount := 3;
  StringGrid1.ColCount := 3;
  StringGrid1.FixedCols := 0;
  StringGrid1.FixedRows := 0;
  StringGrid1.Options := StringGrid1.Options + [goEditing];



Вводишь любые числа.

Цитата(Dvix @  17.5.2008,  17:09 Найти цитируемый пост)
После нажатия кнопки числа должны быть в обратном порядке занесены в строки? 


Как нибудь так:

Код

procedure TForm1.Button2Click(Sender: TObject);
var
  i, j, k : integer;
begin
  for i := 0 to StringGrid1.RowCount - 1 do
    begin
      j := 0;
      k := StringGrid1.ColCount - 1;
      repeat
        StringGrid1.Rows[i].Exchange(j, k);
        inc(j);
        dec(k);
      until j > k;
    end;
end;


?

Автор: Dvix 17.5.2008, 16:50
всё верно, но как написать, чтобы менялись строки?

Автор: THandle 17.5.2008, 16:53
Dvix, это ответ на твой предыдущий пост:

Цитата(Dvix @  17.5.2008,  17:09 Найти цитируемый пост)
как записать на делфи вот это: 
В StringGrid: Для начала выбрать размерность: 3*3. 
Вводишь числа: например 5, 7, 1. 6,6,1 и 5,4,1. После нажатия кнопки числа должны быть в обратном порядке занесены в строки? 



Насчет задач - просто переделай их под строки.

Автор: Dvix 17.5.2008, 16:58
Числа вводятся в StringGrid пользователeм.
ввести матрицу:
171
151
161
должно выводиться в тот же StringGrid1: 
151 
161
171
ответ должен выводиться в отдельный StringGrid2:
7
8
9

Как это записать на Делфи?

Автор: THandle 19.5.2008, 09:15
Вот тебе 1:

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, Grids, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    StringGrid1: TStringGrid;
    procedure Edit1Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  A : array of array of integer;
  n : integer = 5;

implementation

{$R *.dfm}



function SumLine(num : integer) : integer;
var
  i : integer;
begin
  result := 0;
  for i := 0 to n - 1 do
    result := result + A[i, num];
end;


procedure swap(first, second : integer);
var
  i, tmp : integer;
begin
  for i := 0 to n - 1 do
    begin
      tmp := A[i, first];
      A[i, first] := A[i, second];
      A[i, second] := tmp;
    end;
end;

procedure BubbleSort;
var
  i, j : integer;
begin
  for i := 0 to n - 1 do
    for j := 1 to n - i - 1 do
      if SumLine(j - 1) > SumLine(j) then
        swap(j - 1, j);
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  if TryStrToInt(Edit1.Text, n) then
    begin
      SetLength(A, n, n);
      StringGrid1.ColCount := n;
      StringGrid1.RowCount := n;
    end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  i, j : integer;
begin
  for i := 0 to n - 1 do
    for j := 0 to n - 1 do
      A[j, i] := StrToInt(StringGrid1.Cells[j, i]);
  BubbleSort;
  for i := 0 to n - 1 do
    for j := 0 to n - 1 do
      StringGrid1.Cells[j, i] := IntToStr(A[j, i]);
end;

end.


Вот второе:
Код


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, Grids, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    StringGrid1: TStringGrid;
    procedure Edit1Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  A : array of array of integer;
  n : integer = 5;

implementation

{$R *.dfm}



function MaxInLine(num : integer) : integer;
var
  i : integer;
begin
  result := A[0, num];
  for i := 1 to n - 1 do
    if A[i, num] > result then
      result := A[i, num];
end;


procedure swap(first, second : integer);
var
  i, tmp : integer;
begin
  for i := 0 to n - 1 do
    begin
      tmp := A[i, first];
      A[i, first] := A[i, second];
      A[i, second] := tmp;
    end;
end;

procedure BubbleSort;
var
  i, j : integer;
begin
  for i := 0 to n - 1 do
    for j := 1 to n - i - 1 do
      if MaxInLine(j - 1) > MaxInLine(j) then
        swap(j - 1, j);
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  if TryStrToInt(Edit1.Text, n) then
    begin
      SetLength(A, n, n);
      StringGrid1.ColCount := n;
      StringGrid1.RowCount := n;
    end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  i, j : integer;
begin
  for i := 0 to n - 1 do
    for j := 0 to n - 1 do
      A[j, i] := StrToInt(StringGrid1.Cells[j, i]);
  BubbleSort;
  for i := 0 to n - 1 do
    for j := 0 to n - 1 do
      StringGrid1.Cells[j, i] := IntToStr(A[j, i]);
end;

end.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)