Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Массивы в Delphi

Автор: Pautina 9.11.2006 12:59

По условию задачи надо отсортировать одномерный массив, заданный случайным образом (n=100), а затем исходную и полученную матрицу вывести на форму (процесс сортировки выводится на экран пошагово).
Очень надеюсь на вашу помощь. Подскажите, как, с чего следует начинать.. какой элемент я должна использовать для ввода массива? Заранее большое спасибо!

Автор: volvo 9.11.2006 13:15

Цитата
Подскажите, как, с чего следует начинать
С поиска по форуму... Сначала надо думать не о том,
Цитата
какой элемент я должна использовать для ввода массива
, а об алгоритме решения задания. И только потом в соответствии с придуманным или найденным алгоритмом на него навешивается интерфейс...

Здесь было нечто подобное: http://forum.pascal.net.ru/index.php?s=&showtopic=7338&view=findpost&p=52540
и здесь: http://forum.sources.ru/index.php?showtopic=70949&view=findpost&p=497421

А вот теперь разбирайся в логике работы, выбирай подходящие компоненты, и пиши программу на Дельфи

Автор: Pautina 10.11.2006 23:55

Попыталась написать.. но прога не работает.. посмотрите, пожалуйста..
вывод массива написала в метку. подскажите, как организовать вывод на форму?
спасибо!


Прикрепленные файлы
Прикрепленный файл  ______.rar ( 7.2 килобайт ) Кол-во скачиваний: 223

Автор: мисс_граффити 11.11.2006 3:18

После исправления самых грубых ошибок:

unit Unit1;

interface

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

type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Label1: TLabel;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Label2: TLabel;
StringGrid2: TStringGrid;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
a:array[0..99] of integer; //чтобы нумерация совпала со стринггридовской. и чтобы не вводить 100 чисел!
i:integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
for i:=0 to 99 do //меняем счетчики
begin //не забывай про бегин/энд!
a[i]:=random(i);
//a[i]:=StrToInt(StringGrid1.Cells[i,0]); это не нужно - ты же заполнила массив рэндомом!
// А вот вывод пригодился бы. Допишем.
StringGrid1.Cells[i,0]:=IntToStr(a[i]);
end;
end;

//если ввод рэндомом - это вообще не нужно. тем более что ввод в стринггрид у тебя заблокирован.
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
case key of
#8,'0'..'9':;
#13:
if StringGrid1.Col<StringGrid1.ColCount-1 then
StringGrid1.Col:=StringGrid1.Col+1;
else key:=chr(0);
end;
end;



procedure TForm1.Button3Click(Sender: TObject);
const
size=100;
var
//a:array[1..size] of integer; это еще что такое?
// у нас есть глобальная переменная с тем же именем. вот с ней и работаем, раз объявили.
j,buf,i,k:integer;

begin
//for i:=1 to size do
//a[i]:=StrToInt(StringGrid1.Cells[i-1,0]) ; уже все давно заполнено. не повторяемся.
//стандартная пузырьковая сортировка. что ты делала - не поняла...
for i:=0 to size-1 do //с нуля
for j:=0 to size-2 do
if a[j]<a[j+1] then
begin //тут он нужнее, чем там, куда ты поставила.
buf:=a[j];
a[j]:=a[j+1];
a[j+1]:=buf;
end;
for k:=0 to size-1 do //интересно, а зачем тебе для этого цикла отдельная переменная к?
// Label2.Caption:=Label2.Caption+''+IntToStr(a[k]); вот изврат... может, все же в стринггрид?
//Label2.caption:=Label2.Caption+#13;
StringGrid2.Cells[k,0]:=IntToStr(a[k]);
end;



procedure TForm1.Button2Click(Sender: TObject);
begin
Form1.Close;
end;
end.


Автор: Pautina 11.11.2006 4:55

Спасибо! только сортировка не работает.. sad.gif((
подскажите,пожалуйста, что делать с выводом.. исходная матрица и пошаговая сортировка обязательно должны выводиться на форму! как это можно осуществить?

Автор: klem4 11.11.2006 12:58

Цитата
//стандартная пузырьковая сортировка. что ты делала - не поняла...
for i:=0 to size-1 do //с нуля
for j:=0 to size-2 do
if a[j]<a[j+1] then
begin //тут он нужнее, чем там, куда ты поставила.
buf:=a[j];
a[j]:=a[j+1];
a[j+1]:=buf;
end;



ohmy.gif


for i := size - 1 downto 1 do
for j := 0 to i - 1 do
if a[j] < a[j + 1] then begin
//swap
end;


Автор: мисс_граффити 11.11.2006 15:21

klem4, а ты уверен, что она теперь сможет объяснить, зачем нужны проходы в разных направлениях и откуда берутся границы циклов?
по-моему, не всегда нужно гнаться за оптимальностью - сначала объяснить самое простое, школьное. а потом уже при желании совершенствовать. а так можно и поразрядную написать - еще быстрее работать будет.

Цитата
только сортировка не работает.. ((

Правда?Прикрепленное изображение

Цитата
подскажите,пожалуйста, что делать с выводом.. исходная матрица и пошаговая сортировка обязательно должны выводиться на форму! как это можно осуществить?

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

Автор: klem4 11.11.2006 15:46

Цитата
а ты уверен, что она теперь сможет объяснить ...


Просто ты написала

Цитата
стандартная пузырьковая сортировка


Но она ведь выглядит не так как приведенный далее тобой код ? А то человек скажет что вот мол пузырек, а ему в ответ shok.gif

Если я что-то не так понял, то извиняюсь.

Автор: volvo 11.11.2006 16:33

Цитата
либо на каждом шаге выводить в новый стринггрид, либо изменять содержимое старого
Простите, а вариант с записью в следующую строку StringGrid-а что, уже отменили? blink.gif Кстати, самый нормальный для восприятия: надо просмотреть результаты - СкроллБар к твоим услугам...

Автор: мисс_граффити 11.11.2006 17:22

Цитата(klem4 @ 11.11.2006 11:46) *

Но она ведь выглядит не так как приведенный далее тобой код ? А то человек скажет что вот мол пузырек, а ему в ответ shok.gif
Если я что-то не так понял, то извиняюсь.

Специально посмотрела. blink.gif в школьном учебнике такой вариант идет как пузырьковая (да и нам его давали как базовую пузырьковую, а все остальное - уже модификации). У Вирта - описанный тобой. У Кнута - сразу с флажком.... То есть отслеживать, были ли вообще перестановки.

volvo, ой. фигня получилась. я это и хотела сказать....
написала в "новую стринггрида", (пропустив слово "строку"), потом перед отправкой просматривала на наличие опечаток - "исправила" на согласованное предложение. !mol1.gif mega_chok.gif надо было в смысл вникнуть. наляпать на форму несколько сот компонентов - это бы мне в голову вряд ли пришло.