Форум: "Прочее";
Текущий архив: 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