struct Point bool start float Point start false 0f Point bool start_ f

 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
struct Point {
bool start;
float z;
Point (): start(false), z(0.0f) {}
Point (bool start_, float z_): start(start_), z(z_) {}
};
int ind, outsize = 0;
Point pointlist[MAX_PL_SIZE] = {
Point(true, 2), Point(false, 4),
Point(true, 6), Point(false, 8),
Point(true, 4), Point(false, 6)
}; // с этими значениями получаем [2 - 4] [4 - 8], а должны 2 - 8.
float z, outputlist[MAX_OL_SIZE];
/*
Вход: массив из 6 Z (pointlist)
Выход: массив из 4 Z, если получается больше, сообщаем об ошибке (outputlist)
A. Сортируем по возрастанию Z pointlist.
Б. Пока не в конце pointlist.
1. Вычисляем ind для текущей точки.
a. Если pointlist[i].start тогда ++ind (тут же сохраняем значение z = pointlist[i].z), иначе --ind.
2. Если ind == 0
a. Если length (outputlist) == MAX_OUTPUTLIST_SIZE, то сообщаем об ошибке
b. Добавляем в outputlist отрезок z - pointlist[i].z
*/
bubbleSort (pointlist, 6);
ind = 0;
for (int i = 0; i < MAX_PL_SIZE; ++i) {
if (pointlist[i].start) {
++ind;
if (ind < 2) {
z = pointlist[i].z;
}
} else {
--ind;
}
if (ind == 0) {
if (outsize == MAX_OL_SIZE) {
puts ("Error: Output list full");
break;
}
outputlist[outsize + 0] = z;
outputlist[outsize + 1] = pointlist[i].z;
outsize += 2;
}
}