Форум программистов, компьютерный форум CyberForum.ru

Из delphi в С++: создать приложение, визуально демонстрирующее работу разных алгоритмов сортировки - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Почему не добавляется элемент в вектор? http://www.cyberforum.ru/cpp-beginners/thread927504.html
продолжение этой темы, но с другой проблемой. http://www.cyberforum.ru/cpp-beginners/thread927463.html Пишу программу, которая принимает произвольное количество файлов с записями на вход и в конечном счете выводит эти записи отсортированные в последний принятый файл. Это неокончательный вариант программы, тут я пытаюсь загнать все записи в один контейнер-вектор. tempset заполняется нормально,...
C++ умные указатели у меня например есть куча юнитов, у каждого из них есть указатель на игровой ресурс (допустим камень). Есть такая задумка: когда камень иссякнет, юнит который истощил этот камень удаляет этот ресурс из памяти. Как сделать так чтобы при этом удалении все указатели указывающие на это камень обнулились? http://www.cyberforum.ru/cpp-beginners/thread927500.html
Как эффективно изучать программирование? C++
Всем привет, хотелось бы услышать рекомендации по эффективному изучению языка C++. Изучаю его по книге Дейтелов, пишу и разбираю примеры из книги. Прошёл 7 глав, а дальше уже очень сложно понимать информацию. Осознаю, что теория это хорошо, но не хватает практических навыков. 1) Может нужно учить какие-то алгоритмы или разделы математики? Посоветуйте литературу. 2) Подскажите книгу, где есть...
Виртуальные деструкторы C++
Можно ли вызвать деструктор базового класса вместо использования виртуальных деструкторов? class CBase { public: CBase(const char *str1) { mStr1 = new char; strcpy(mStr1, str1); }
C++ Как обмануть указатель? http://www.cyberforum.ru/cpp-beginners/thread927474.html
Я бы хотел сделать так, чтобы функция my_function могла менять значение value, а alien_function - нет. Вносить изменения в код alien_function и Alien_class я не могу, поелику они написаны не мной. My_class { Alien_class value; } Alien_class my_function(Alien_class x) { }
C++ Ошибка в программе, читающей файлы Пишу программу, которая принимает произвольное количество файлов с записями на вход и в конечном счете выводит эти записи отсортированные в последний принятый файл. Естественно, у меня ничерта не работает и я отлаживаю программу кусками (так что позже, скорей всего, задам не один вопрос по ней же). Вот в этом куске я пытаюсь понять почему не удается нормально записать содержимое файла в... подробнее

Показать сообщение отдельно
runer74
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 13
23.07.2013, 12:21     Из delphi в С++: создать приложение, визуально демонстрирующее работу разных алгоритмов сортировки
Задача:
Кликните здесь для просмотра всего текста
Методические рекомендации по лабораторной работе №2

Процессы. Потоки.

Часть 1.

Задача: создать многопотоковое приложение, в котором можно менять приоритеты потоков. Программа DreadedSorts создает два потока. Один поток запускает пузырьковую сортировку (bubble sort), другой – быструю сортировку (quick sort). С помощью соответствующих ползунков на главной форме можно изменять приоритеты потоков, чтобы они получали разнойе количество тактовой частоты. При этом, можно так настроить приоритеты, чтобы более медленная сортировка выполнялась даже быстрее.

Ход работы.

1. Запустить Delphi. Открыть новое приложение командой File|New Application.

2. Сохраните проект, дав модулю имя main.pas, проекту – DreadedSorts.dpr.

3. Перенести на пустую форму, кнопку BitBtn со страницы Additional палитры компонентов, два компонент Label со страницы Standard, 2 компонента TrackBar со страницы Win32. Свойства Name компонентов TrackBar установите соответственно как BubbleTrackBar и QuickTrackBar.

Установите свойства компонентов формы:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
object Form1: TForm1
 
Caption = 'Пример многопоточного приложения'
 
object Label1: TLabel
 
Left = 40
 
Top = 8
 
Width = 129
 
Height = 33
 
Alignment = taCenter
 
Caption = 'Приоритет пузырьковой сортировки'
 
WordWrap = True
 
end
 
object Label2: TLabel
 
Left = 232
 
Top = 8
 
Width = 129
 
Height = 39
 
Alignment = taCenter
 
Caption = 'Приоритет быстрой сортировки'
 
WordWrap = True
 
end
 
object BitBtn1: TBitBtn
 
Left = 136
 
Top = 88
 
Width = 153
 
Height = 25
 
Caption = 'Запустить сортировку'
 
end
 
object BubbleTrackBar: TTrackBar
 
Left = 32
 
Top = 40
 
Width = 150
 
Height = 45
 
Max = 2
 
Min = -2
 
end
 
object QuickTrackBar: TTrackBar
 
Left = 224
 
Top = 40
 
Width = 150
 
Height = 45
 
Max = 2
 
Min = -2
 
end
 
end
4. Форма должна приобрести вид указанный на рис. 1.

Рис.1.

5. Теперь добавьте в проект две пустых формы, сохраните модули этих форм соответственно secform и thform.

6. Вернитесь к главной форме приложения и создайте обработчик события OnCreate:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
procedure TForm1.FormCreate(Sender: TObject);
 
begin
 
// получить размер рабочего стола
 
ScreenWidth := GetSystemMetrics (SM_CXSCREEN);
 
ScreenHeight:= GetSystemMetrics (SM_CYSCREEN);
 
// переместить основную форму сверху центральной части рабочего стола
 
form1.top := 0;
 
form1.left := (ScreenWidth-form1.width) div 2;
 
// определить, сколько элементов можно отобразить в двух окнах
 
SortWindowSize := (ScreenHeight - form1.height) div 2;
 
if SortWindowSize > (ScreenWidth div 2) then
 
SortWindowSize := ScreenWidth div 2;
 
end;
7. Создайте обработчик события OnClick кнопки BitBtn1 главной формы:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
// обработчик события щелчка мыши на кнопке - создает формы сортировки,
 
// генерирует данные сортировки и запускает потоки
 
procedure TForm1.BitBtn1Click(Sender: TObject);
 
var
 
i: integer;
 
ThreadID: dWord;
 
begin
 
// помещает форму пузырьковой сортировки на рабочий стол
 
form2.free;
 
form2 := TForm2.Create (self);
 
form2.top := form1.top + form1.Height+formgap;
 
form2.left := (ScreenWidth-(SortWindowSize*2)) div 2;
 
// помещает окно пузырьковой сортировки в левой половине экрана
 
form2.width := SortWindowSize;
 
form2.height := SortWindowSize;
 
form2.color := formcolor;
 
form2.caption := 'Bubble Sort';
 
form2.show;
 
// помещает форму быстрой сортировки на рабочем столе
 
form3.free;
 
form3 := TForm3.Create (self);
 
form3.top := form1.top + form1.Height+formgap;
 
form3.left := form2.left + form2.width;
 
// помещает окно пузырьковой сортировки в левой половине экрана
 
form3.width := SortWindowSize;
 
form3.height := SortWindowSize;
 
form3.color := formcolor;
 
form3.caption := 'Quick Sort';
 
form3.show;
 
// присваивает число элементов сортировки равным форме
 
NumItems := form2.ClientHeight - pixeloffset*2;
 
//выделение динамических массивов для хранения данных сортировки
 
SetLength (a, NumItems);
 
SetLength (b, NumItems);
 
// генерирование случайных чисел для сортировки
 
Randomize;
 
for i:=0 to NumItems-1 do
 
begin
 
a[i] := random (NumItems);
 
b[i] := a[i];
 
form2.canvas.pixels[a[i]+pixeloffset,i+pixeloffset] := pixelcolor;
 
form3.canvas.pixels[b[i]+pixeloffset,i+pixeloffset] := pixelcolor;
 
end;
 
// запуск потока пузырьковой сортировки
 
T1:= CreateThread (nil, 0, @BubbleThread, nil, 0, threadID);
 
// установка потока быстрой сортировки для отслеживания позитивного значения
 
setThreadPriority (T1, BubbleTrackBar.Position);
 
// запуск потока быстрой сортировки
 
T2:= CreateThread (nil, 0, @QuickThread, nil, 0, threadID);
 
// установка потока быстрой сортировки для отслеживания позитивного значения
 
setThreadPriority (T2, QuickTrackBar.Position);
 
// замечание: для просмотра рекурсивной быстрой сортировки в действии
 
// установите приоритет потока к значению -1 или -2. Для того,
 
// чтобы посмотреть может ли пузырьковая сортировка подавлять
 
// быструю сортировку, установите приоритет потока пузырьковой сортировки
 
// к значению +2, а быстрой сортировки к значению -2.
 
end;
8. Добавьте в раздел interface модуля main нижеследующий код:

8.1. описание констант

Delphi
1
2
3
4
5
6
7
8
9
10
11
const
 
pixeloffset = 5; // смещение пикселов обеспечивает рамку внутри окон
 
formgap = 10; // количество пиксельных промежутков между основной формой
 
// и окнами сортировки
 
formcolor = clBlack; // цвет фона для формы сортировки окон
 
pixelcolor = clWhite; // цвет пикселов для элементов данных сортировки
8.2. в описание типа TForm1 код, выделеный жирным шрифтом.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
type
 
TForm1 = class(TForm)
 
Label1: TLabel;
 
Label2: TLabel;
 
BitBtn1: TBitBtn;
 
BubbleTrackBar: TTrackBar;
 
QuickTrackBar: TTrackBar;
 
procedure BitBtn1Click(Sender: TObject);
 
procedure FormCreate(Sender: TObject);
 
private
 
{ Private declarations }
 
T1, T2: THandle;
 
ScreenWidth, ScreenHeight,
 
SortWindowSize : Word;
 
NumItems: Word;
 
a, b: array of integer;
 
public
 
{ Public declarations }
 
end;
9. Добавьте в раздел implementation модуля main нижеследующий код:

9.1. ссылки на модули других форм приложения

Delphi
1
2
3
uses
 
secform, thform;
9.2. процедуру пузырьковой сортировки

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// процедура пузырьковой сортировки - вызывается процедурой BubbleThread
 
procedure BubbleSort (var ia: array of integer; items: integer);
 
var
 
i, j, t: integer;
 
DC: HDC;
 
begin
 
DC := GetDC (Form2.Handle);
 
for i:= items downto 0 do
 
begin
 
for j:=0 to items -1 do
 
if ia[j] < ia[j+1] then
 
begin
 
t:= ia[j];
 
//
 
SetPixel (DC, ia[j+1]+pixeloffset, j+1+pixeloffset, formcolor);
 
SetPixel (DC, ia[j]+pixeloffset, j+pixeloffset, formcolor);
 
ia[j] := ia[j+1];
 
ia[j+1] := t;
 
SetPixel (DC, ia[j+1]+pixeloffset, j+1+pixeloffset, pixelcolor);
 
SetPixel (DC, ia[j]+pixeloffset, j+pixeloffset, pixelcolor);
 
end;
 
end;
 
ReleaseDC (Form2.Handle, DC);
 
end;
9.3. процедуру быстрой сортировки

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// процедура быстрой сортировки - вызывается процедурой QuickThread
 
procedure QuickSort (var ia: array of integer; iLo, iHi: integer);
 
var
 
Lo, Hi, Mid, T: integer;
 
DC: HDC;
 
begin
 
Lo := iLo;
 
Hi := iHi;
 
mid := ia[(Lo+Hi) div 2];
 
DC := GetDC (Form3.Handle);
 
repeat
 
while ia[Lo] < mid do Inc(Lo);
 
while ia[Hi] > mid do Dec(Hi);
 
if Lo <= Hi then
 
begin
 
T:= ia[Lo];
 
//
 
SetPixel (DC, ia[Lo]+pixeloffset, Lo+pixeloffset, formcolor);
 
SetPixel (DC, ia[Hi]+pixeloffset, Hi+pixeloffset, formcolor);
 
ia[Lo] := ia[Hi];
 
ia[Hi] := T;
 
SetPixel (DC, ia[Lo]+pixeloffset, Lo+pixeloffset, pixelcolor);
 
SetPixel (DC, ia[Hi]+pixeloffset, Hi+pixeloffset, pixelcolor);
 
inc (Lo);
 
dec (Hi);
 
end;
 
until (Lo > Hi);
 
if Hi > iLo then QuickSort (ia, iLo, Hi);
 
if Lo < iHi then QuickSort (ia, Lo, iHi);
 
ReleaseDC (Form3.Handle, DC);
 
end;
9.4. две функции потоков

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// функция потока пузырьковой сортировки
 
function BubbleThread (parms: pointer): LongInt; far;
 
begin
 
BubbleSort (form1.a, form1.numItems-1);
 
end;
 
// функция потока быстрой сортировки
 
function QuickThread (parms: pointer): LongInt; far;
 
begin
 
QuickSort (form1.b, 0, form1.numItems-1);
 
end;
10. Приложение готово можно скомпилировать и выполнить его.



Задание: Задача выше - это указания, с помощью которых можно создать приложение, визуально демонстрирующее работу разных алгоритмов сортировки. нужно взяв код приложение на Делфи за основу, переписать его на С/С++ с возможностью задавать количество сортируемых элементов (менять NumItems). Сейчас, NumItems := form2.ClientHeight - pixeloffset*2. Если вместо этой строки написать, например, NumItems := 1000000, программа начинает глючить. Т.О. надо переписать код на С/С++ и устранить баг с NumItems.
Помогите пожалуйста
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 16:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru