Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.07.23;
Скачать: CL | DM;

Вниз

Визуальное моделирование внутренней сортировки   Найти похожие ветки 

 
Lexmark ©   (2006-05-24 03:50) [0]

Люди добрые, помогите пожалуйста. Нужно написать прогу на делфи, а я в нем тока начинающий(после Паскаля перехожу на Делфи),а вам скорее всего это не составит труда сделать(наверное?), програмка нужна позарез, друг посоветовал ваш сайт! Вопрос такой:

Требуется разработать программу, при выполнении которой на экране монитора демонстрируется работа выбираемого пользователем алгоритма внутренней сортировки. В текущий момент времени пользователь может выбрать для демонстрации один из следующих алгоритмов:
1) пузырьковая сортировка,
2) шейкерная сортировка.
Сортируемые ключи – целые положительные числа. Значения ключей генерируются датчиком равномерно-распределенных случайных чисел из диапазона [0, 100]. Длина сортируемой последовательности – до 20 ключей. Значения ключей в сортируемой последовательности не повторяются.

Буду благодарен за любую помощь!

Тут выложено полное задание,вся фишка в этих кружочках, нихрена немогу доехать как это сделать, помогите кто знает пожалуйста

http://eng.webfile.ru/959831


 
Сергей М. ©   (2006-05-24 11:21) [1]

За образец возьми демо-проект threads.dpr, поставляемый в составе Делфи.


 
mike-d ©   (2006-05-24 11:23) [2]

Смотри ...\Demos\Threads\ - работа с потоками на примере сортировок
И будет тебе щастье...


 
mike-d ©   (2006-05-24 11:24) [3]


> Сергей М. ©   (24.05.06 11:21) [1]

Не видел поста когда писал :)


 
Lexmark ©   (2006-05-25 13:02) [4]

Пасиба хлопцы)))


 
Kolan ©   (2006-05-25 13:10) [5]

Вот на евровидении сортируется списочек забавно...


 
Lexmark ©   (2006-05-25 13:25) [6]

Оперативно действуете))

Ребята, возникла маленькая проблемка((:
я в делфи новичок и в примере(Threads) дофига новых слов(~50-60%), которых я еще раньше не встречал. У меня просьба, не могли бы вы написать пояснения сбоку от самого кода типа:
writeln("введите значение");\\ вывод на экран текста
readln(i);\\ запись значения в переменную

Вот сам код:

---------------------------------------------

unit ThSort;

interface

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

type
 TThreadSortForm = class(TForm)
   StartBtn: TButton;
   BubbleSortBox: TPaintBox;
   SelectionSortBox: TPaintBox;
   QuickSortBox: TPaintBox;
   Label1: TLabel;
   Bevel1: TBevel;
   Bevel2: TBevel;
   Bevel3: TBevel;
   Label2: TLabel;
   Label3: TLabel;
   procedure BubbleSortBoxPaint(Sender: TObject);
   procedure SelectionSortBoxPaint(Sender: TObject);
   procedure QuickSortBoxPaint(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure StartBtnClick(Sender: TObject);
 private
   ThreadsRunning: Integer;
   procedure RandomizeArrays;
   procedure ThreadDone(Sender: TObject);
 public
   procedure PaintArray(Box: TPaintBox; const A: array of Integer);
 end;

var
 ThreadSortForm: TThreadSortForm;

implementation

uses SortThds;

{$R *.dfm}

type
 PSortArray = ^TSortArray;
 TSortArray =  array[0..20] of Integer;

var
 ArraysRandom: Boolean;
 BubbleSortArray, SelectionSortArray, QuickSortArray: TSortArray;

{ TThreadSortForm }

procedure TThreadSortForm.PaintArray(Box: TPaintBox; const A: array of Integer);
var
 I: Integer;
begin
 with Box do
 begin
   Canvas.Pen.Color := clRed;
   for I := Low(A) to High(A) do PaintLine(Canvas, I, A[I]);
 end;
end;

procedure TThreadSortForm.BubbleSortBoxPaint(Sender: TObject);
begin
 PaintArray(BubbleSortBox, BubbleSortArray);
end;

procedure TThreadSortForm.SelectionSortBoxPaint(Sender: TObject);
begin
 PaintArray(SelectionSortBox, SelectionSortArray);
end;

procedure TThreadSortForm.QuickSortBoxPaint(Sender: TObject);
begin
 PaintArray(QuickSortBox, QuickSortArray);
end;

procedure TThreadSortForm.FormCreate(Sender: TObject);
begin
 RandomizeArrays;
end;

procedure TThreadSortForm.StartBtnClick(Sender: TObject);
begin
 RandomizeArrays;
 ThreadsRunning := 3;
 with TBubbleSort.Create(BubbleSortBox, BubbleSortArray) do
   OnTerminate := ThreadDone;
 with TSelectionSort.Create(SelectionSortBox, SelectionSortArray) do
   OnTerminate := ThreadDone;
 with TQuickSort.Create(QuickSortBox, QuickSortArray) do
   OnTerminate := ThreadDone;
 StartBtn.Enabled := False;
end;

procedure TThreadSortForm.RandomizeArrays;
var
 I: Integer;
begin
 if not ArraysRandom then
 begin
   Randomize;
   for I := Low(BubbleSortArray) to High(BubbleSortArray) do
     BubbleSortArray[I] := Random(170);
   SelectionSortArray := BubbleSortArray;
   QuickSortArray := BubbleSortArray;
   ArraysRandom := True;
   Repaint;
 end;
end;

procedure TThreadSortForm.ThreadDone(Sender: TObject);
begin
 Dec(ThreadsRunning);
 if ThreadsRunning = 0 then
 begin
   StartBtn.Enabled := True;
   ArraysRandom := False;
 end;
end;

end.

--------------------------------------------------------------


 
Lexmark ©   (2006-05-25 13:29) [7]

С самой сортировкой я уже разобрался, осталось разобраться с кодом и переделать пример в свое задание


 
Lexmark ©   (2006-05-26 12:06) [8]

Люди хелп плз!


 
han_malign ©   (2006-05-26 12:14) [9]


> Люди хелп плз!

- пожалуста - F1 - Delphi Help...


 
Lexmark ©   (2006-05-26 12:16) [10]

ага)), оч помогает)) а если серьезно??


 
Сергей М. ©   (2006-05-26 12:20) [11]


> Lexmark ©   (26.05.06 12:06) [8]


Пример дан не для "переделки", а для как раз для того чтобы разобраться, что, где, зачем и как происходит ..


 
Lexmark ©   (2006-05-26 23:50) [12]

> Пример дан не для "переделки", а для как раз для того чтобы разобраться, что, где, зачем и как происходит ..

Ну вообщето я разобрался с примером, даже написал нечто свое, программка сначала сгенерирует случайные числа в массиве(и выводит их на экран), а потом сортирует  его и тоже выводит на экран, тока уже отсортированным! Так вот, у меня возникла проблема с заданием - нужно показать (СМОДЕЛИРОВАТЬ) сам процесс сортировки, в задании все расписано!


 
TUser ©   (2006-05-27 09:53) [13]

К КвикБейсику идет демка с визуализацией разных (в т.ч. этих) алгоритмов сортировки.


 
Lexmark ©   (2006-05-31 03:50) [14]

Не могли бы вы выслать мне эту демку на электронный адрес [email protected]! Заранее благодарен


 
Lexmark ©   (2006-06-02 20:10) [15]

Люди еще раз хелп :
 
http://eng.webfile.ru/975032

Там все описано что надо сделать! Немогу пошагово сортировать элементы массива(что бы на одну кнопку жать и постоянно один элемент изменял позицию(по принципу пузырьковой сортировки)) Подскажите плз, очень нужно!


 
Lexmark ©   (2006-06-02 20:13) [16]

кстати вот что у меня пока получилось-  

помогите плз довести до ума


 
Lexmark ©   (2006-06-02 20:16) [17]

Блин забыл ссылку кинуть))

http://eng.webfile.ru/975039


 
Kolan ©   (2006-06-02 20:35) [18]

Так ничего визуального не увидел... Просто цифры изменились.. Я думал там если пузырьковая сортировка то пузырёк будет всплывать...


 
Lexmark ©   (2006-06-02 20:41) [19]

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


 
Lexmark ©   (2006-06-02 20:43) [20]

Всмысле показать на кружочках сам процесс обменной сортировки


 
Kolan ©   (2006-06-02 20:45) [21]


> Lexmark ©   (02.06.06 20:43) [20]

Всю конф. не читал.

Но видя то что ты уже сделал скажу:
Ты должен рисовать массив каждую итерацию. Те передвинул элемент отрисовал , передвинул отрисовал...

И делай жадержку по 300-500 мс, чтобы было видно.
Плюс перемешаемый в текущий момент элемент делай другого цвета.. тогда будет почти супер :)


 
Kolan ©   (2006-06-02 20:46) [22]

Кроме того Unit1 ты не дал....


 
Lexmark ©   (2006-06-03 11:43) [23]

Сорри за Unit1 - вот он http://eng.webfile.ru/975529

>> Ты должен рисовать массив каждую итерацию. Те передвинул элемент отрисовал , передвинул отрисовал...

можно немного по подробней?

А задержку Тimer"ом? А то я думал, что как в паскале Delay(задержка).


 
Kolan ©   (2006-06-03 12:23) [24]


> А задержку Тimer"ом? А то я думал, что как в паскале Delay(задержка).

Можно казать, что наналог Delay это Sleep.
Но учти сделав слип ты усыпишь гл. поток и значит твоя форма как-бы зависнет на это время. Хотя за 300мс ничего не заметишь..

> можно немного по подробней?

Можно.
Ты же как-то нарисовал уже отсортированный массив? - Да.
В чем смысл пузырька - он как-бы всплывает. Те ты в цикле поднимешь каждый элемент.

Раз ты умеешь рисовать, теперь вставь рисование внутри сортировки, что бы было так: Передвинул массив - нарисовал итд...

Но тк компьютеры сейчас мошные те не увидишь эффект. Всё произойдет слишком быстро.
Поэтому нужна задержка. Простейший вариант - Sleep(300);.

Форма будет подвисать, но я думаю для начала это нестрашно...

PS
 Зачем код в *.doc сувать? Проект тат и не компьльнулся....


 
Kolan ©   (2006-06-03 12:42) [25]

[Error] File not found: "Unit1.dfm"
Все надо выкладывать....


 
Lexmark ©   (2006-06-03 13:08) [26]

попробуй  в самом Делфи-  View,Units там все есть


 
Kolan ©   (2006-06-03 13:15) [27]


> dfm


 
Kolan ©   (2006-06-03 13:15) [28]

Да х с ним. Идея то ясна?


 
Lexmark ©   (2006-06-03 13:16) [29]

http://eng.webfile.ru/975611   вот, все Unit"ы, попробуй может у тебя получится?


 
Lexmark ©   (2006-06-03 13:19) [30]

Млин, я ж новичок ;)) ,я впринципе понял, но реализовать это -

>> Раз ты умеешь рисовать, теперь вставь рисование внутри сортировки, что бы было так: Передвинул массив - нарисовал итд...
  ...немогу((


 
Kolan ©   (2006-06-03 13:36) [31]

Ну вот получилось.
Кстати советую каждый проект держать в одной и только одной папке.    

for i:=1 to 20 do    // заполняем массив случайными,
  a[i]:=random(100);    // неповторяющимися числами.

Никакой гарантии, что тут будут неповторяющиеся числа. Если нужна такая функциональность нужно проверять.

Или как выриант заполнить массив по возрастанию от 0 до 100, а потом перемешать его, или случ. образов выбрать из него.. Ну да ладно..

Image2.Canvas.TextOut(17,18,IntToStr(a[2]));
  Image3.Canvas.Pen.Color:=RGB(0,0,0);
  Image3.Canvas.Brush.Color:=RGB(0,198,


Конечно все это не нужно столько раз писать. А если элементов 10000? Тут нужен цикл. Номер итерации используй для вычисления координат рисунков.

Пример(1) для 2 х кружков:
for I := 0 to 1 do
begin
  X := I*10;
  Canvas.Ellipse(X,10,X + 20,35);
end;

Смысл думаю понятен.

Потом зачем Image"эй столько? Рисуй прям на форме. У неё тоже есть св-во Canvas

Если код примера 1 вставить в форму, ну как у тебя. То Canvas.Ellipse(X,10,X + 20,35); как раз на форме и нарисует...

Еще посмотрю на ....

PS
 Да и еще, найди, скачай и выучи "Стандарты стилевого оформления". Будь твой код чуть сложнее низачто не стал бы разбирать его...


 
Kolan ©   (2006-06-03 13:51) [32]

Я тебе пример чик накропал. С рисованием и скоментами. Нужно?Мыло давай..
Ну и тут вылажу весь модуль:

unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   BitBtn1: TBitBtn;
   XPManifest1: TXPManifest;
   procedure BitBtn1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
   FArrayForSort: array of Integer;
   {Функция нарисует заданный массив на заданной канве.}
   procedure DrawArray(Arr: array of Integer; Canvas: TCanvas);
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
var
 {Используем дин. массив.}
 Arr: array of Integer;
 I, K: Integer;
begin
 Randomize;
 {Пример визуализации.}
 {Выделеяем массив.}
 SetLength(Arr, 10);
 for K := 0 to 99 do
 begin
   {Заполняем случ. числами.}
   for I := Low(Arr) to High(Arr) do
     Arr[I] := Random(10);
   {Рисуем на форме.}
   DrawArray(Arr, Canvas);
   {Делаем жадержку, чтобы его увидеть.}
   Sleep(300);
 end;
end;

procedure TForm1.DrawArray(Arr: array of Integer; Canvas: TCanvas);
const
 Width = 20;
var
 I: Integer;
 X, Y, X1, Y1: Integer;
begin
 {Проверяем существует ли данная нам конва.}
 if Assigned(Canvas) then
   for I := Low(Arr) to High(Arr) do
   begin
     {Вычисляем координаты}
     X := I*Width + 2;
     Y := Width ;
     X1 := X + Width;
     Y1 := Y + Width;
     {Рисуем}
     Canvas.Rectangle(X, Y, X1, Y1);
     Canvas.TextOut(X + 2, Y + 2, IntToStr(Arr[I]));
   end;
end;

end.


 
Lexmark ©   (2006-06-03 14:41) [33]

[email protected]     Млин, ну ты прям гений какой то))


 
Kolan ©   (2006-06-03 14:44) [34]

Таши.
Это тебе начальный приер. Как-бы идея. Дальше думать самому...


 
Lexmark ©   (2006-06-03 14:48) [35]

ок ща проверю


 
Lexmark ©   (2006-06-03 15:54) [36]

Колян, а не могли бы вы попробовать мою задачу сделать?
Тот пример оч. долго разбирать, а прога нужна уже к завтрешнему дню(к вечеру)

Я пробовал писать так

for I := 1 to 20 do
begin
 X := I*40;
 Canvas.Ellipse(X,15,X + 35,50);
 Canvas.Brush.Color:=RGB(0,198,240);
 Canvas.TextOut(55,25,IntToStr(a[1]));
end;  

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


 
Lexmark ©   (2006-06-04 14:30) [37]

Колян хелп ми плз


 
boriskb ©   (2006-06-04 14:52) [38]

Прокоментируй каждую строчку из фрагмента своего кода и поймешь почему
Lexmark ©   (03.06.06 15:54) [36]
первый элемент вообще не закрашивается((


Lexmark ©   (03.06.06 15:54) [36]
Canvas.Ellipse(X,15,X + 35,50);
Canvas.Brush.Color:=RGB(0,198,240);
Canvas.TextOut(55,25,IntToStr(a[1]));


Коментируй - что делает каждый оператор?

PS
Коментировать можно и не сюда. Для себя коментируй :)


 
Kolan ©   (2006-06-04 15:18) [39]


> Тот пример оч. долго разбирать, а прога нужна уже к завтрешнему
> дню(к вечеру)

Господи да что там разбирать 10 строк всего....

Забыл код на работе...


>  SetLength(Arr, 10);
>  for K := 0 to 99 do
>  begin
>    {Заполняем случ. числами.}
>    for I := Low(Arr) to High(Arr) do
>      Arr[I] := Random(10);
(*) <--- Сюда вставь сортировку.      
>    {Рисуем на форме.}
>    DrawArray(Arr, Canvas);

Что нужно изменить под твою задачу:
1.  for I := Low(Arr) to High(Arr) do
Arr[I] := Random(10);
- это нужно вынести за цикл, чтобы один раз заполнил случайными и всё.
2. Внутри цикла втавляешь свою сортировку. Незнаю правильно или нет у тебя. Вообщем пример но это:
       IF a[j-1]>a[j] THEN    // если последний элем. массива меньше предпоследнего,
               BEGIN          // то происходит перестановка местами этих элементов
...

Все.


 
Lexmark ©   (2006-06-04 20:07) [40]


>  SetLength(Arr, 10);
>  for K := 0 to 99 do
>  begin
>    {Заполняем случ. числами.}
>    for I := Low(Arr) to High(Arr) do
>      Arr[I] := Random(10);
begin
for I:= 2 to 20 do
        FOR j:=20 DOWNTO i DO
       IF arr[j-1]>arr[j] THEN
               BEGIN
                x:=arr[j-1];
                arr[j-1]:=arr[j];
                arr[j]:=x;
                END;
end;      
>    {Рисуем на форме.}
>    DrawArray(Arr, Canvas);


Ну вот вставил сортировку, но ничего революционного не происходит((



Страницы: 1 2 вся ветка

Текущий архив: 2006.07.23;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.033 c
15-1150977103
TUser
2006-06-22 15:51
2006.07.23
USB-вентиляторы


15-1151096439
SlyHide
2006-06-24 01:00
2006.07.23
Как зделать компонент содержащий два других


2-1152114853
Elfebet
2006-07-05 19:54
2006.07.23
Как граммотно вывести список файлов?


15-1148976478
pasha_golub
2006-05-30 12:07
2006.07.23
ЧМ-2006. Турнир прогнозов.


1-1149670151
Creative_ltd
2006-06-07 12:49
2006.07.23
загрузка картинки из DLL