Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.07.23;
Скачать: [xml.tar.bz2];

Вниз

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

 
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]

Не могли бы вы выслать мне эту демку на электронный адрес bender_b@mail.ru! Заранее благодарен


 
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]

bender_b@mail.ru     Млин, ну ты прям гений какой то))


 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.014 c
2-1151913621
ZZZ_ZZZ
2006-07-03 12:00
2006.07.23
Алгоритм работы архиваторов


3-1147931584
KinnOk
2006-05-18 09:53
2006.07.23
Сохранение или отмена изменений


2-1151951452
Ivolg
2006-07-03 22:30
2006.07.23
Handle


2-1151946511
Александра
2006-07-03 21:08
2006.07.23
FreeLibrary


15-1151405560
Excel222
2006-06-27 14:52
2006.07.23
Вопрос про Excel





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский