Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
runer74
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 13
#1

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

23.07.2013, 12:21. Просмотров 653. Ответов 7
Метки нет (Все метки)

Задача:
Кликните здесь для просмотра всего текста
Методические рекомендации по лабораторной работе №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.
Помогите пожалуйста
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.07.2013, 12:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Из delphi в С++: создать приложение, визуально демонстрирующее работу разных алгоритмов сортировки (C++):

Разработать иерархию классов, демонстрирующее работу с коллекцией объектов разных классов - C++
Задание: Разработать в соответствии с индивидуальным заданием иерархию классов и приложение, демонстрирующее работу с коллекцией объектов...

Разработать приложение, демонстрирующее работу с текстовыми файлами - C++ Builder
Добрый день. Помогите решить две задачи на C++ Builder 6. Задача 1: Разработать приложение, демонстрирующее работу с текстовыми...

Разработать приложение демонстрирующее работу с одномерный массивом - C#
Массив вводить в DateGridView. Разработать приложение демонстрирующее работу с одномерный массивом, заполнение массива на форме...

Создать визуальное приложение, демонстрирующее операции над матрицами - C#
Создать визуальное приложение, которое выполняет арифметические действия с матрицами: сложение двух матриц, произведение матрицы на число,...

Программа, демонстрирующую работу различных алгоритмов сортировки - Java
Дано задание: разработать программу на языке Java, демонстрирующую работу различных алгоритмов сортировки. Программа должна быть написана с...

Разработайте приложение, демонстрирующее гимнаста, вращающегося на турнике - Delphi
Разработайте приложение, демонстрирующее: Гимнаста, вращающегося на турнике.

7
runer74
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 13
25.07.2013, 06:19  [ТС] #2
Никто не знает?
0
SatanaXIII
Супер-модератор
Эксперт С++
5620 / 2655 / 247
Регистрация: 01.11.2011
Сообщений: 6,555
Завершенные тесты: 1
25.07.2013, 08:42 #3
Цитата Сообщение от runer74 Посмотреть сообщение
Никто не знает?
Никаких идей. Если только взять какую-нибудь среду разработки типа билдера или студии, в них переписать предоставленный код, а затем подправить косяки с переполнением.
У вас какие-нибудь идеи, наработки есть?
0
Kukurudza
105 / 86 / 6
Регистрация: 29.08.2012
Сообщений: 539
25.07.2013, 08:43 #4
я знаю.
0
runer74
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 13
26.07.2013, 21:36  [ТС] #5
Пока не знаю

Добавлено через 3 часа 54 минуты
Ув. Kukurudza, буду рад, если поделитесь решением задачи
0
nonedark2008
26.07.2013, 23:36
  #6

Не по теме:

runer74, слишком многабукаф. Никто по доброте душевной в это дерьмо не полезет.

0
runer74
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 13
27.07.2013, 11:45  [ТС] #7
Хорошо, кто поможет не за спасибо? пишите в ЛС
0
nonedark2008
931 / 670 / 147
Регистрация: 28.07.2012
Сообщений: 1,828
27.07.2013, 12:49 #8
Цитата Сообщение от runer74 Посмотреть сообщение
кто поможет не за спасибо?
Создавай тему в разделе Фриланса.
0
27.07.2013, 12:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.07.2013, 12:49
Привет! Вот еще темы с ответами:

Приложение, демонстрирующее сложение, умножение матриц, сортировку столбцов матрицы - C#
мне срочно нужен код и форма в window forms visual studio на C# на тему Приложение матрица, демонстрирующее сложение, умножение матриц,...

Создать приложение иллюстрирующее работу операторов And, Or, Xor, Not, Is - Visual Basic .NET
Создать приложение иллюстрирующее работу операторов And, Or, Xor, Not, Is каким оно может быть?

Создать Windows приложение для сортировки массива в возрастающем и убывающем порядке, методом, указанным в варианте - C#
Здравствуйте, помогите пожалуйста с делегатами. Вот задание: Создать Windows приложение для сортировки массива в возрастающем и убывающем...

Как создать консольное приложение в Delphi 7? - Delphi
Добрый день!Подскажите в Delphi 7 есть просто консольное приложение без кнопок всяких форм итд? Никогда не сталкивался с делфи просто,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru