{$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin with StringGrid1 do for i:=0 to ColCount -1 do for j:=0 to RowCount -1 do cells[i,j]:=inttostr(random(50)+1); end;
procedure TForm1.Button2Click(Sender: TObject); var temp:integer; begin with StringGrid1 do for i:=1 to ColCount -1 do for j:=0 to RowCount -1 do if StrToInt(cells[i,j])>StrToInt(cells[i-1,j]) then begin temp:=StrToInt(cells[i-1,j]); cells[i-1,j]:=cells[i,j]; cells[i,j]:=IntToStr(temp); end; end;
begin randomize; end.
Код для стрингрида и двух кнопок. Первая формирует, вторая сортирует по убыванию
Помогите плиз: 1.сортировка происходит с шагом на одну клетку, как сделать что бы они выстроились в нужную последовательность после 1 нажатия? 2. нужно сосчитать сумму чисел в строке и выстроить строки по возрастанию этого самого числа
ЧТО формирует? ЧТО сортирует? По убыванию ЧЕГО? Ты б хоть пример приводил, что ожидать-то от кода, а то были одни числа, потом раз - поменялись напрочь на другие. И чего это было?
Тебе чего надо-то?
Update Объясняю: ДО:
ПОСЛЕ:
Внимание - вопрос, по какому критерию "отсортирован" грид?
С использованием минимальных возможностей Дельфи сортировка элементов строк Grid-а по убыванию пишется так:
function mySort(List: TStringList; first, second: Integer): Integer; // это функция сортировки function f(index: integer): integer; begin result := StrToInt(List.Strings[index]) end; begin result := f(second) - f(first) end;
procedure TForm1.Button12Click(Sender: TObject); var ts: TStringList; i: integer; begin ts := TStringList.Create; try with StringGrid1 do begin for i := 0 to RowCount - 1 do begin ts.Assign(Rows[i]); // Получаем элементы очередной строки ts.CustomSort(mySort); // сортируем их как числа по убыванию Rows[i].Assign(ts); // возвращаем назад в Грид end; end; finally ts.Free; end; end;
volvo Первой кнопкой формируем массив рандомных чисел, второй кнопкой сортируем построчно в порядке убывания, тесть первый элемент строки - самая большая цифра этой строки, а последняя - самая маленькая. На кнопку сортировки надо нажать несколько раз, что бы цыфры переползли на свое место.
у меня не получается найти сумму элементов строки грида, а именно синтаксис обращения к гриду. Если в массиве:
var m,i:integer; a:array[1..5] of integer;
for i:=1 to 5 do m:=m+a[i];
прокатывал, то
m:=m+StrToInt(cells[i]);
ни в какую не хочет
Когда будет найдена сумма всех 5 строк грида, нужно выстроить строки в порядке возрастания (первая строка с самой маленькой суммой, последняя самой большой)
type TForm2 = class(TForm) StringGrid1: TStringGrid; Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
type a=array [1..5] of integer; m=array [1..5] of a; const n=5;
var Form2: TForm2; mas:m;
implementation
{$R *.dfm}
procedure refreshtable; var i,j:byte; begin for I := 1 to n do for j := 1 to n do form2.StringGrid1.Cells[j-1,i-1]:=inttostr(mas[i,j]); // тут укажи свою форму end;
procedure TForm2.Button1Click(Sender: TObject); var i,j:byte; s:integer; begin for I := 1 to n do begin s:=0; for j := 1 to n do begin mas[i,j]:=Random(100); s:=s+mas[i,j]; end; StringGrid1.Cells[5,i-1]:=inttostr(s); end; refreshtable; end;
procedure TForm2.Button2Click(Sender: TObject); var i,j:byte; s:string; k:a; begin for I := 1 to 4 do for j := 1 to n-i do if (strtoint(StringGrid1.Cells[5,j]) < strtoint(stringGrid1.Cells[5,j-1])) then begin k:=mas[j]; mas[j]:=mas[j+1]; mas[j+1]:=k; s:=StringGrid1.Cells[5,j-1]; StringGrid1.Cells[5,j-1]:=StringGrid1.Cells[5,j]; StringGrid1.Cells[5,j]:=s; end; refreshtable; end;
procedure TForm2.FormCreate(Sender: TObject); begin Randomize; end;
end.
На форме стринггрид и 2 кнопки. Еще надо отсорировать сами строки...
у меня не получается найти сумму элементов строки грида
Блин... Вы чего, издеваетесь? Как ЭТО связано с заданием
Цитата
второй кнопкой сортируем построчно в порядке убывания, тесть первый элемент строки - самая большая цифра этой строки, а последняя - самая маленькая.
? Вот где здесь, в задании, сказано что-то про какую-то сумму? Процитируй мне это, может у меня что-то с глазами? Ощущение создается такое, что ты сам не знаешь, чего тебе надо. Ты мой код смотрел? Запускал? Он делает в точности то, что написано во второй моей цитате. Нет, блин, тебе теперь какую-то сумму приплести понадобилось. Задание сформулируй как положено, безо всяких виляний, потом будем дальше разговаривать.
? Вот где здесь, в задании, сказано что-то про какую-то сумму? Процитируй мне это, может у меня что-то с глазами?
Не хочу тебя расстраивать, но...
Цитата
Код для стрингрида и двух кнопок. Первая формирует, вторая сортирует по убыванию
Помогите плиз: 1.сортировка происходит с шагом на одну клетку, как сделать что бы они выстроились в нужную последовательность после 1 нажатия? 2. нужно сосчитать сумму чисел в строке и выстроить строки по возрастанию этого самого числа
Client СПАСИБО
А можно обойтись без массива в этом задании? Все операции сделать в стринггриде? Это ведь тоже массив
type a=array [1..5] of integer; m=array [1..5] of a; const n=5; var Form1: TForm1; mas:m;
implementation
{$R *.dfm}
procedure refreshtable; var i,j:byte; begin for i:= 1 to n do for j:= 1 to n do Form1.StringGrid1.Cells[j-1,i-1]:=IntToStr(mas[i,j]); end;
procedure TForm1.Button1Click(Sender: TObject); var i,j:byte; s:integer; begin for i:= 1 to n do begin s:=0; for j:= 1 to n do begin mas[i,j]:=Random(50)+1; s:=s+mas[i,j]; end; StringGrid1.Cells[5,i-1]:=IntToStr(s); end; refreshtable; end;
procedure TForm1.Button3Click(Sender: TObject); var i,j:byte; s:string; k:a; begin for i := 1 to 4 do for j := 1 to n-i do if (StrToInt(StringGrid1.Cells[5,j]) < StrToint(StringGrid1.Cells[5,j-1])) then begin k:=mas[j]; mas[j]:=mas[j+1]; mas[j+1]:=k; s:=StringGrid1.Cells[5,j-1]; StringGrid1.Cells[5,j-1]:=StringGrid1.Cells[5,j]; StringGrid1.Cells[5,j]:=s; end; refreshtable; end;
procedure TForm1.Button2Click(Sender: TObject); var temp,i,j:byte; begin for i:=1 to n do for j:=0 to n do if mas[i,j]>mas[i-1,j] then begin temp:=mas[i-1,j]; mas[i-1,j]:=mas[i,j]; mas[i,j]:=temp; end; refreshtable; end; end.
Вылет за границу массива - достаточно веская причина, чтоб было "не так"?
Раз:
type a=array [1..5] of integer; m=array [1..5] of a; const n=5; var Form1: TForm1; mas:m; // <--- То есть, mas: array[1 .. 5] of array[1 .. 5] of integer ?
// Тогда здесь ... procedure TForm1.Button2Click(Sender: TObject); var temp,i,j:byte; begin for i:=1 to n do for j:=0 to n do if mas[i,j]>mas[i-1,j] then // <--- №1 begin temp:=mas[i-1,j]; // <--- №2 mas[i-1,j]:=mas[i,j]; // <--- №3 mas[i,j]:=temp; end; refreshtable; end;
... при i = 1 будет вылет за пределы массива. Чтобы увидеть это - даже запускать программу не надо, оно на поверхности лежит...