-
Notifications
You must be signed in to change notification settings - Fork 0
/
arrays_extended_functions.os
244 lines (199 loc) · 12.5 KB
/
arrays_extended_functions.os
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
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
Функция МассивВыбрать(ИсходныйМассив)
ДлинаМассива = ИсходныйМассив.Количество();
Если ДлинаМассива < 1 Тогда
ВызватьИсключение("Желаемое количество элементов больше кол-ва элементов в массиве.");
КонецЕсли;
ГСЧ = Новый ГенераторСлучайныхЧисел;
СлучайныйИндекс = ГСЧ.СлучайноеЧисло(0, ДлинаМассива - 1);
ВыбранныйЭлемент = ИсходныйМассив[СлучайныйИндекс];
Возврат ВыбранныйЭлемент;
КонецФункции
Функция МассивВыбратьНесколько(ИсходныйМассив, КолЭлементов)
ДлинаМассива = ИсходныйМассив.Количество();
Если КолЭлементов > ДлинаМассива Тогда
ВызватьИсключение("Желаемое количество элементов больше кол-ва элементов в массиве.");
КонецЕсли;
МассивСлучайных = МассивПеремешать(ИсходныйМассив);
ИтоговыйМассив = Новый Массив;
Для Индекс = 0 По КолЭлементов - 1 Цикл
ИтоговыйМассив.Добавить(МассивСлучайных[Индекс]);
КонецЦикла;
Возврат ИтоговыйМассив;
КонецФункции
Функция МассивКолВхождений(Элемент, ИсходныйМассив)
КопияМассива = МассивКопировать(ИсходныйМассив);
Количество = 0;
ИндексЭлемента = -1;
Пока ИндексЭлемента <> Неопределено Цикл
ИндексЭлемента = КопияМассива.Найти(Элемент);
Если ИндексЭлемента <> Неопределено Тогда
Количество = Количество + 1;
КопияМассива.Удалить(ИндексЭлемента);
КонецЕсли;
КонецЦикла;
Возврат Количество;
КонецФункции
Функция МассивКопировать(ИсходныйМассив)
СписЗнач = Новый СписокЗначений;
СписЗнач.ЗагрузитьЗначения(ИсходныйМассив);
Возврат СписЗнач.ВыгрузитьЗначения();
КонецФункции
Функция МассивКлонировать(ИсходныйМассив)
Результат = Новый Массив(Новый ФиксированныйМассив(ИсходныйМассив));
Возврат Результат;
КонецФункции
Функция МассивМаксЗначение(ИсходныйМассив)
Макс = ИсходныйМассив[0];
Для Каждого Элемент Из ИсходныйМассив Цикл
Если Элемент > Макс Тогда
Макс = Элемент;
КонецЕсли;
КонецЦикла;
Возврат Макс;
КонецФункции
Функция МассивМинЗначение(ИсходныйМассив)
Мин = ИсходныйМассив[0];
Для Каждого Элемент Из ИсходныйМассив Цикл
Если Элемент < Мин Тогда
Мин = Элемент;
КонецЕсли;
КонецЦикла;
Возврат Мин;
КонецФункции
Функция МассивНайтиЭлемент(ИсходныйМассив, Элемент, ИндексСтартовый = -1)
Если ИндексСтартовый > ИсходныйМассив.ВГраница() Тогда
Возврат Неопределено;
КонецЕсли;
КопияМассива = МассивКопировать(ИсходныйМассив);
ИндексЭлемента = 0;
Пока ИндексЭлемента <> Неопределено Цикл
ИндексЭлемента = КопияМассива.Найти(Элемент);
Если ИндексЭлемента <> Неопределено Тогда
Если ИндексЭлемента > ИндексСтартовый Тогда
Возврат ИндексЭлемента;
Иначе
// Просто меняем значение, чтобы оно больше не попадалось нам при поиске.
Если Элемент = 0 Тогда
КопияМассива[ИндексЭлемента] = 3;
Иначе
КопияМассива[ИндексЭлемента] = 0;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат ИндексЭлемента;
КонецФункции
Функция МассивПеревернуть(ИсходныйМассив)
Если ИсходныйМассив.Количество() < 2 Тогда
Возврат ИсходныйМассив;
КонецЕсли;
ИтоговыйМассив = МассивКопировать(ИсходныйМассив);
ИндексСередина = Цел(ИтоговыйМассив.Количество() / 2) - 1;
Для Индекс = 0 По ИндексСередина Цикл
ИндексДляОбмена = ИтоговыйМассив.ВГраница() - Индекс;
ВремПеременная = ИтоговыйМассив[Индекс];
ИтоговыйМассив[Индекс] = ИтоговыйМассив[ИндексДляОбмена];
ИтоговыйМассив[ИндексДляОбмена] = ВремПеременная;
КонецЦикла;
Возврат ИтоговыйМассив;
КонецФункции
Функция МассивПеремешать(ИсходныйМассив)
СтарыйМассив = МассивКопировать(ИсходныйМассив);
НовыйМассив = Новый Массив;
ГСЧ = Новый ГенераторСлучайныхЧисел;
Пока СтарыйМассив.Количество() > 0 Цикл
СлучайныйИндекс = ГСЧ.СлучайноеЧисло(0, СтарыйМассив.ВГраница());
НовыйМассив.Добавить(СтарыйМассив[СлучайныйИндекс]);
СтарыйМассив.Удалить(СлучайныйИндекс);
КонецЦикла;
Возврат НовыйМассив;
КонецФункции
Функция МассивРасширить(ИсходныйМассив, СтрокаЗначений)
СтрокаЗначений = СтрЗаменить(СтрокаЗначений, ",, ", Символы.ПС);
Для Счетчик = 1 По СтрЧислоСтрок(СтрокаЗначений) Цикл
ИсходныйМассив.Добавить(СтрПолучитьСтроку(СтрокаЗначений, Счетчик));
КонецЦикла;
Возврат ИсходныйМассив;
КонецФункции
Функция МассивСлучайныхЧисел(Мин, Макс, Длина)
ГСЧ = Новый ГенераторСлучайныхЧисел;
СлучайныеЧисла = Новый Массив;
Если Мин < 0 Тогда
Разница = 0 - Мин;
Для Счетчик = 0 По Длина - 1 Цикл
НовоеЧисло = ГСЧ.СлучайноеЧисло(0, Макс + Разница);
СлучайныеЧисла.Добавить(НовоеЧисло - Разница);
КонецЦикла;
Иначе
Для Счетчик = 0 По Длина - 1 Цикл
Попытка
СлучайныеЧисла.Добавить(ГСЧ.СлучайноеЧисло(Мин, Макс));
Исключение
ВызватьИсключение("Не удалось сгенерировать случайное число по указанным параметрам.");
КонецПопытки;
КонецЦикла;
КонецЕсли;
Возврат СлучайныеЧисла;
КонецФункции
Функция МассивСортировать(ИсходныйМассив, Направление = "Возр")
СписЗнач = Новый СписокЗначений;
СписЗнач.ЗагрузитьЗначения(ИсходныйМассив);
Если НРег(Направление) = "убыв" Тогда
СписЗнач.СортироватьПоЗначению(НаправлениеСортировки.Убыв);
Иначе
СписЗнач.СортироватьПоЗначению(НаправлениеСортировки.Возр);
КонецЕсли;
Возврат СписЗнач.ВыгрузитьЗначения();
КонецФункции
Функция МассивСтрока(ИсходныйМассив)
Попытка
РезСтрока = СтрСоединить(ИсходныйМассив, ", ");
Исключение
ВызватьИсключение("Один из элементов массива не удалось преобразовать в тип Строка.");
КонецПопытки;
Возврат РезСтрока;
КонецФункции
Функция МассивСтрокиВЧисла(ИсходныйМассив, Строго = Истина)
НовыйМассив = Новый Массив;
Для Индекс = 0 По ИсходныйМассив.ВГраница() Цикл
Попытка
НовыйМассив.Добавить(Число(ИсходныйМассив[Индекс]));
Исключение
Если Строго Тогда
ВызватьИсключение("Один из элементов массива не удалось преобразовать в тип Число.");
Иначе
НовыйМассив.Добавить(ИсходныйМассив[Индекс]);
КонецЕсли;
КонецПопытки;
КонецЦикла;
Возврат НовыйМассив;
КонецФункции
Функция МассивУдалитьДубликаты(ИсходныйМассив)
МассивУникальных = Новый Массив;
Для Каждого Элемент Из ИсходныйМассив Цикл
Если МассивУникальных.Найти(Элемент) = Неопределено Тогда
МассивУникальных.Добавить(Элемент);
КонецЕсли;
КонецЦикла;
Возврат МассивУникальных;
КонецФункции
// Тестируем функции на работоспособность и правильность выполнения.
МассивА = Новый Массив;
МассивК = Новый Массив;
МассивРасширить(МассивА, "10,, -10,, 32,, 36,, -10,, 102,, 102,, -10,, 34,, 18,, 200");
МассивК = МассивСтрокиВЧисла(МассивА);
Сообщить("Массив А: " + МассивСтрока(МассивА));
Сообщить("Массив К: " + МассивСтрока(МассивК));
Сообщить("");
МассивД = МассивСлучайныхЧисел(-10, 10, 10);
Сообщить("Массив Случайных: " + МассивСтрока(МассивД));
МассивД = МассивСортировать(МассивД);
Сообщить("Случайные Отсортированные: " + МассивСтрока(МассивД));
МассивД = МассивУдалитьДубликаты(МассивД);
Сообщить("Случайные Без Повторений: " + МассивСтрока(МассивД));
Сообщить("");
МассивК = МассивПеремешать(МассивК);
Сообщить("Массив К Перемешанный: " + МассивСтрока(МассивК));
МассивК = МассивПеревернуть(МассивК);
Сообщить("Массив К Перемешанный Перевернутый: " + МассивСтрока(МассивК));
Сообщить("Количество вхождений элемента -10: " + Строка(МассивКолВхождений(-10, МассивК)));