Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.07.2014, 00:04   #1
.FROST.
Пользователь
 
Регистрация: 13.11.2012
Сообщений: 56
По умолчанию Упорядочивание матрицы в стринггреде

В общем есть задание:
1. Заполнение матрицы случайными целыми числами с ее отображением на экран;
2. Упорядочение ее строк по неубыванию суммы их элементов;

Я вроде сделал что-то, но сумму считает неправильно. Да и с сортировкой проблемы Я уже голову сломал. Помогите разобраться, пожалуйста.


Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    StringGrid2: TStringGrid;
    Button1: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Edit2: TEdit;
    Button2: TButton;
    Label3: TLabel;
    Label4: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  n,m:byte;
  x:array of array of integer;
implementation

{$R *.dfm}
//создадим таблицы и заполнение
procedure TForm1.Button1Click(Sender: TObject);
var i,j:byte;
begin
randomize;
//размеры с учетом фиксированных элементов
n:=StrToInt(Edit1.Text);
m:=StrToInt(Edit2.Text);
StringGrid1.ColCount:=m+2;//столбцов на 1 больше, для Сумма
StringGrid1.RowCount:=n+1;
   //шапка таблицы
StringGrid1.Cells[0,0]:='Матрица';
  For i:= 1 to StringGrid1.ColCount-1 do   StringGrid1.Cells[0,i]:=' i='+inttostr(i);
  For j:= 1 to StringGrid1.RowCount-1 do   StringGrid1.Cells[j,0]:=' j='+inttostr(j);
 StringGrid2.Cells[0,0]:='Матрица';
  For i:= 1 to StringGrid2.ColCount-1 do   StringGrid2.Cells[0,i]:=' i='+inttostr(i);
  For j:= 1 to StringGrid2.RowCount-1 do   StringGrid2.Cells[j,0]:=' j='+inttostr(j);
StringGrid1.Cells[m+1,0]:='Сумма.';
StringGrid2.ColCount:=m+2;
StringGrid2.RowCount:=n+1;
StringGrid2.Cells[m+1,0]:='Сумма';
SetLength(x,n,m);
for i:=0 to n-1 do
for j:=0 to m-1 do
 begin
  x[i,j]:=random(50)-14;
  StringGrid1.Cells[j+1,i+1]:=IntToStr(x[i,j]);
end;
end;
//сортировака и вывод
procedure TForm1.Button2Click(Sender: TObject);
var i,j,l:byte;
    b:integer;
    sx:array of integer;
    buf:array of array of integer;
begin
SetLength(sx,n);
//вычисление сумм в строках и запись их в дополнительный столбец

  for i:=0 to n-1 do
  begin
  sx[i]:=x[0,1];
  for j:=0 to m-1 do
  sx[i]:=sx[i]+x[i,j];
  end;
for i:=0 to n-1 do
StringGrid1.Cells[m+1,i]:=IntToStr(sx[i]);

//перестановка строк по неубыванию сумм
for i:=0 to n-2 do
for l:=i+1 to n-1 do
 if sx[i]>sx[i-1] then
for j:=0 to m do
 begin
  b:=x[i,j];
  x[i,j]:=x[l,j];
  x[l,j]:=b;
 end;
//запись отсортированной матрицы в таблицу 2
for i:=0 to n-1 do
for j:=0 to m-1 do
StringGrid2.Cells[j+1,i+1]:=IntToStr(x[i,j]);
end;

end.
лаба.rar
.FROST. вне форума Ответить с цитированием
Старый 03.07.2014, 09:50   #2
GetMax
Форумчанин
 
Регистрация: 21.10.2010
Сообщений: 588
По умолчанию

Код:
procedure TForm1.Button2Click(Sender: TObject);
var i,j,l:byte;
    b:integer;
    sx:array of integer;
    buf:array of array of integer;
begin
  SetLength(sx,n);
//вычисление сумм в строках и запись их в дополнительный столбец

  for i:=0 to n-1 do
  begin
    sx[i]:= 0;
    for j:=0 to m-1 do
      sx[i]:=sx[i]+x[i,j];
    StringGrid1.Cells[m + 1, i+1] := IntToStr(sx[i])
  end;


//перестановка строк по неубыванию сумм
for i:=0 to n-2 do
for l := i+1 to n-1 do
Begin
 if sx[i]>sx[l] then
 Begin
   for j:=0 to m do
   begin
     b:=x[i,j];
     x[i,j]:=x[l,j];
     x[l,j]:=b;
  end;
  //обязательно сортируем и sx
  b:=sx[i];
  sx[i]:=sx[l];
  sx[l]:=b;
 End;
End;
//запись отсортированной матрицы в таблицу 2
for i:=0 to n-1 do
for j:=0 to m-1 do
StringGrid2.Cells[j+1,i+1]:=IntToStr(x[i,j]);
end;
Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Для благодарностей WMR R145235935681
GetMax вне форума Ответить с цитированием
Старый 03.07.2014, 11:32   #3
.FROST.
Пользователь
 
Регистрация: 13.11.2012
Сообщений: 56
По умолчанию

Это исправил. Теперь другая проблема. При очистке таблице
Код:
var i, j: Integer;
begin
with StringGrid1 do
 for j:=FixedCols to ColCount-1 do
for i:=FixedRows to RowCount-1 do
Cells[j, i]:='';
 StringGrid1.ColCount:=3;
  StringGrid1.RowCount:=3;

  with StringGrid2 do
  for j:=FixedCols to ColCount-1 do
  for i:=FixedRows to RowCount-1 do
  Cells[j, i]:=''; 
  StringGrid2.ColCount:=3;
  StringGrid2.RowCount:=3;
когда строк больше столбцов, выскакивает ошибка "инвалид поинтер операйшин"...
.FROST. вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
упорядочивание матрицы Екатерина Воробей Паскаль, Turbo Pascal, PascalABC.NET 3 08.11.2011 15:26
Упорядочивание матрицы... we4r Помощь студентам 0 23.05.2011 13:16
упорядочивание строк матрицы в с++ LovingDaisy Общие вопросы C/C++ 4 11.01.2010 02:20
Упорядочивание строк матрицы CodeError Помощь студентам 2 25.12.2008 19:42
упорядочивание матрицы Rom Паскаль, Turbo Pascal, PascalABC.NET 10 21.12.2008 18:35