This repository was archived by the owner on Jan 8, 2026. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTask9.cpp
More file actions
196 lines (187 loc) · 4.81 KB
/
Task9.cpp
File metadata and controls
196 lines (187 loc) · 4.81 KB
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
#include <iostream>
#include <random>
#include "TStack.cpp"
#include "Task91.cpp"
#define MIN 1
#define MAX 100
#define DELIMITER "----------------------------"
using namespace std;
/// <summary>
/// Òèï - ïîåçä. Ïðåäñòàâëÿåò èç ñåáÿ ñòåê öåëûõ ÷èñåë.
/// </summary>
typedef TStack<int> Train;
void task912();
void task913();
void task93();
Train* create_rand_train(int);
void print_train(Train*);
Train* sort_train(Train*);
void train_transfer(Train*, Train*);
bool get_less_value(Train*, Train*);
/// <summary>
/// Âûâîä êàæäîãî èç çàäàíèé ÷åðåç ðàçäåëèòåëè
/// </summary>
/// <returns></returns>
int main()
{
cout << "TASK 9.1.2" << endl;
cout << DELIMITER << endl;
task912();
cout << DELIMITER << endl;
cout << "TASK 9.1.3" << endl;
cout << DELIMITER << endl;
task913();
cout << DELIMITER << endl;
cout << "TASK 9.3" << endl;
cout << DELIMITER << endl;
task93();
}
/// <summary>
/// Äîëæíà âûâåñòè 5 è 9
/// </summary>
void task912()
{
int i1 = 3, i2 = 5;
int arr[] = { 3, 9, 5, 7 };
std::cout << "Max int = " << get_max<int>(3, 5) << std::endl;
std::cout << "Max int = " << get_max<int>(arr, 4) << std::endl;
}
/// <summary>
/// Äîëæíà âûâåñòè âòîðóþ ñòðîêó, òàê êàê 's' > 'l'
/// </summary>
void task913()
{
char* s1 = const_cast<char*>("String long");
char* s2 = const_cast < char*>("String short");
std::cout << "max str = " << get_max<char*>(s1, s2) << std::endl;
}
/// <summary>
/// Ðàíäîìíî çàäà¸ò ïîåçä.
/// Âûâîäèò ïîåçä.
/// Ñîðòèòðóåò ïîåçä.
/// Âûâîäèò ïîåçä.
/// </summary>
void task93()
{
Train* train = create_rand_train(11);
cout << "Created train:" << endl << '\t';
print_train(train);
cout << DELIMITER << endl;
train = sort_train(train);
cout << "Sorted train:" << endl << '\t';
print_train(train);
}
/// <summary>
/// size ðàç çàòàëêèâàåòü ðàíäîìíîå ÷èñëî â ïîåçä
/// </summary>
/// <param name="size">ðàçìåð ïîåçäà - êîëè÷åñòâî ÷èñåë</param>
/// <returns></returns>
Train* create_rand_train(int size)
{
Train* res = new Train();
for (int i = 0; i < size; i++)
{
int num = MIN + (rand() % (MAX - MIN + 1));
res->push(num);
}
return res;
}
/// <summary>
/// Âûòàëêèâàåò èç ïîåçäà âñå ÷èñëà âî âðåìåííûé ïîåçä, ïîïóòíî âûâîäÿ èõ â êîíñîëü.
/// Çàòåì èç âðåìåííîãî ïîåçà âñå ÷èñëà çàòàëêèâàþòñÿ îáðàòíî â ïåðâîíà÷àëüíûé ïîåçä.
/// </summary>
/// <param name="train"></param>
void print_train(Train* train)
{
Train* temp_train = new Train();
bool res_marker = (train->count() > 0);
cout << "START\t";
while (res_marker)
{
int number = train->try_pop(&res_marker);
if (res_marker)
{
cout << number << '\t';
temp_train->push(number);
}
}
cout << "END" << endl;
res_marker = true;
while (res_marker)
{
int number = temp_train->try_pop(&res_marker);
if (res_marker)
{
train->push(number);
}
}
}
/// <summary>
/// Ñîðòèðóåò ñòåê ñ ïîìîùüþ äîïîëíèòåëüíîãî ñòåêà(òóïèêà).
/// Ïîðÿäîê äåéñòâèé òàêîé:
/// <para/>Åñëè â ðåçóëüòèðóåùåì ñòåêå íè÷åãî íåò - çàïèñûâàåì òóäà íàèìåíüøåå ÷èñëî èç òóïèêà è âõîäíîãî ñòåêà
/// <para/>Åñëè â ðåçóëüòèðóåùåì ñòåêå ÷òî-òî åñòü:
/// <para/>Âûáèðàåì íàèìåíüøåå ÷èñëî èç òóïèêà è âõîäíîãî ñòåêà
/// <para/>Åñëè îíî ìåíüøå ÷èñëà èç ðåçóëüòèðóåùåãî ñòåêà - âûâîäèì ÷èñëî èç ðåçóëüòèðóþùåãî ñòåêà â òóïèê
/// <para/>Èíà÷å - äîáàâëÿåì âûáðàííîå íàèìåíüøåå ÷èñëî â ðåçóëüòèðóþùèé ñòåê
/// </summary>
/// <param name="in_train">ñòåê äëÿ ñîðòèðîâêè</param>
/// <returns>îòñîðòèðîâàííûé ñòåê</returns>
Train* sort_train(Train* in_train)
{
Train* result = new Train();
Train* dead_end = new Train();
while (in_train->count() > 0 || dead_end->count() > 0)
{
if (result->count() == 0)
{
train_transfer(result, get_less_value(in_train, dead_end) ? in_train : dead_end);
}
else
{
Train* less_train = get_less_value(in_train, dead_end) ? in_train : dead_end;
if (get_less_value(less_train, result))
{
train_transfer(dead_end, result);
}
else
{
train_transfer(result, less_train);
}
}
///Çàêîììåíòèðîâàííûå ñòðîêè äëÿ äåáàãà
/*cout << "First train:" << endl << '\t';
print_train(in_train);
cout << "Dead end:" << endl << '\t';
print_train(dead_end);
cout << "Sorted train:" << endl << '\t';
print_train(result);
cout << DELIMITER << endl;*/
}
delete dead_end;
return result;
}
/// <summary>
/// Ïåðåâîäèò âåðõíåå ÷èñëî èç îäíîãî ïîåçäà â äðóãîé
/// </summary>
/// <param name="result">Êóäà ïåðåíåñòè ÷èñëî</param>
/// <param name="in_train">Îòêóäà ïåðåíå÷òè ÷èñëî</param>
void train_transfer(Train* result, Train* in_train)
{
result->push(in_train->pop());
}
/// <summary>
/// Âûáðàòü ïîåçä ñ íàèìåíüøèì âåðõíèì ÷èñëîì
/// </summary>
/// <returns>true åñëè â ïåðâîì ïîåçäå íàèìåíüøåå, false åñëè âî âòîðîì íàèìåíüøåå</returns>
bool get_less_value(Train* first_train, Train* second_train)
{
if (first_train->count() > 0)
{
return (second_train->count() == 0) || (first_train->peek() < second_train->peek());
}
else
{
return false;
}
}