Сортировка столбцов массива по суммам элементов в них

Ответить
slimlime
Сообщения: 2
Зарегистрирован: 12 ноя 2009, 17:50

Люди добрые помогите разобраться. Задача такая:
с клавы вводится размерность массива и заполняется также либо рандомно- все это я сделал, затем под каждым столбцом выводим сумму столбца-это тоже получилось, потом по нажатию волшебной кнопки должна произойти сортировка столбцов по суммам столбцов(по убыванию от большего к меньшему),тоесть столбик с самой большой суммой должен быть первым, потом меньше...... вот сортировка у меня и не получилась, правильно работает через раз, не могу понять что не так. Помогите пожалуйста.Код программы прилагаю
[syntax="Delphi"]
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
StringGrid1: TStringGrid;
Button2: TButton;
Button3: TButton;
Label1: TLabel;
Button4: TButton;

procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var Form1: TForm1;
x,y:integer;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
stringgrid1.colcount:=strtoint(edit1.text)+1;
stringgrid1.rowcount:=strtoint(edit2.text)+2;
for y:=0 to 0 do
for x:=1 to stringgrid1.ColCount-1 do stringgrid1.Cells[x,y] := inttostr(x);
for x:=0 to 0 do
for y:=1 to stringgrid1.RowCount-2 do stringgrid1.Cells[x,y] := inttostr(y);
stringgrid1.Cells[0,stringgrid1.rowcount-1]:= 'Суммы столбцов' ;
for x:=1 to stringgrid1.RowCount-1 do
for y:=1 to stringgrid1.ColCount-1 do stringgrid1.Cells[y,x] := '';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
for x:=1 to stringgrid1.RowCount-2 do
for y:=1 to stringgrid1.ColCount-1 do stringgrid1.Cells[y,x] := Inttostr(random(50));
end;

procedure TForm1.Button3Click(Sender: TObject);
var s:integer;
begin
for x:=1 to stringgrid1.ColCount-1 do
begin
s:=0;
for y:=1 to stringgrid1.RowCount-1 do
begin
if stringgrid1.cells[x,y]='' then stringgrid1.cells[x,y]:=inttostr(0);
if y<>stringgrid1.RowCount-1 then s:=s+strtoint(stringgrid1.Cells[x,y] ) ;
if y=stringgrid1.RowCount-1 then stringgrid1.Cells[x,y] := inttostr(s);
end;
end;
end;

procedure TForm1.Button4Click(Sender: TObject);
var sav:array[1..100] of integer;
c,j,i:integer;
begin
for x:=1 to stringgrid1.colCount-1 do
if stringgrid1.Cells[x,stringgrid1.rowCount-1]<stringgrid1.Cells[x+1,stringgrid1.rowCount-1] then
begin
for i:=1 to stringgrid1.RowCount-1 do sav:= strtoint(stringgrid1.Cells[x,i]);
for i:=1 to stringgrid1.rowCount-1 do stringgrid1.Cells[x,i]:=stringgrid1.Cells[x+1,i];
for i:=1 to stringgrid1.rowCount-1 do stringgrid1.Cells[x+1,i]:=inttostr(sav);
end;
end;

end.
[/syntax]
Добавлено сообщение
--------------------------------------------------------------------------------
Вот исходник программы
http://slil.ru/28195840
DexterUa
Сообщения: 20
Зарегистрирован: 30 окт 2009, 11:16
Контактная информация:

Ух, ели прочитал код.

Насколько понял, вы пытаетесь сортировать пузырьком.
Но вы делаете только один проход, а нужно делать пока можно что-то менять.

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

А вам нужно добавить переменную flag:boolean;

и добавить цикл

Код: Выделить всё

flag:=false;
while (flag=false) do
begin
flag=true;
//дальше ваше пошло

for ...
if ...
begin
 тут меняете местами
 flag=false;
end;
//конец цыкла
end;
slimlime
Сообщения: 2
Зарегистрирован: 12 ноя 2009, 17:50

попробывал добавить код, не помогло
Ответить