|
арифметическая прогрессия в 1с | ☑ | ||
---|---|---|---|---|
0
sv201
01.07.13
✎
01:33
|
добрый вечер
помогите разобраться со следующей задачей значит есть массив значениями которого являются числовые значения, пример Массив = новый массив(); массив.Добавить(1); массив.Добавить(2); массив.Добавить(3); массив.Добавить(4); массив.Добавить(5); массив.Добавить(6); массив.Добавить(8); массив.Добавить(10); Задача состоит в том чтобы сформировать строку из значении массива, при нашем примере получается таким образом 1-6;8;10 то есть если цифры чередуются как арифметическая прогрессия(АП) то берется значения первого и последнего значения АП как только происходит обрыв АП то ставится точка запятой и так дальше по циклу.... |
|||
1
Красный рассвет
01.07.13
✎
01:38
|
У той задачи даже и жизненная ценность есть?
|
|||
2
sv201
01.07.13
✎
01:40
|
конечно есть, если бы не бы не написал в два часа ночи
|
|||
3
Denyk
01.07.13
✎
01:41
|
(0) Что-то подобное (немного сложнее) решают сейчас в школе на VB, только вот недавно школьнику помогал.. М-да.
|
|||
4
sv201
01.07.13
✎
01:44
|
ну значит я буду из ряда школьников,
|
|||
5
hhhh
01.07.13
✎
03:56
|
(4) а в чем сложность? Ну идешь по-порядку, если следующее значение не соответствует, ставишь точку с запятой. Это же элементарно, действительно задача для 3-го класса.
|
|||
6
razlagator
01.07.13
✎
04:08
|
(0) прибавляй к элементу массива 1, и сравнивай со следующим, если равно то последовательность не нарушена
|
|||
7
MiniMuk
01.07.13
✎
07:12
|
На всякий случай пересортируй перед формированием
|
|||
8
Fragster
гуру
01.07.13
✎
08:07
|
если не массив, а ТЗ - то можно запросом
|
|||
9
aMz
01.07.13
✎
08:27
|
предыдущиеЗначение = 0;
Для каждого Значение из Массив Цикл Если предыдущиеЗначение+1 <> Значение Тогда Массив.Добавить(";"); КонецЕсли; предыдущиеЗначение = Значение; КонецЦикла; |
|||
10
sv201
01.07.13
✎
12:21
|
??
|
|||
11
sv201
01.07.13
✎
12:24
|
(9) этот вариант не подходит, пропушена важная часть если числовые значения повторяются то берется первое и последнее значение 1-8 а после ставиться точка запятая
|
|||
12
sv201
01.07.13
✎
12:28
|
Можно также допустить что данные находиться в ТЗ, (8)
|
|||
13
lamesnake
01.07.13
✎
12:32
|
НачалоПрогрессии = 0;
ПредыдущееЗначение = 0; Для каждого Значение из Массив Цикл Если НачалоПрогрессии=0 Тогда НачалоПрогрессии = Значение; Продолжить(); КонецЕсли; Если ПредыдущееЗначение+1 <> Значение Тогда Массив.Добавить(НачалоПрогрессии + "-" + ПредыдущееЗначение + ";"); НачалоПрогрессии=0; КонецЕсли; ПредыдущееЗначение = Значение; КонецЦикла; |
|||
14
AlexTim03
01.07.13
✎
12:44
|
Причем задачу можно усложнить,
например последовательность 1,2,4,5 будет некрасиво выглядеть: "1-2;4;5" в таком случае тоже должно быть: "1;2;4;5" |
|||
15
sv201
01.07.13
✎
12:54
|
Результат запроса (13)
Индекс Значение элемента Тип элемента 0 "1-0;" 1 "3-2;" 2 "5-4;" 3 "7-6;" |
|||
16
anddro
01.07.13
✎
13:24
|
ЭлементовВМассиве = массив.Количество();
ПервыйЭлемент = ?(ЭлементовВМассиве = 0, 0, массив[0]); Накопитель = Новый Структура("НижняяГраница, ВерхняяГраница, Результат", ПервыйЭлемент, ПервыйЭлемент, ""); Для Сч = 1 По ЭлементовВМассиве Цикл Если Сч = ЭлементовВМассиве ИЛИ Накопитель.ВерхняяГраница + 1 <> массив[Сч] Тогда Накопитель.Результат = Накопитель.Результат + ";" + ?(Накопитель.НижняяГраница = Накопитель.ВерхняяГраница, Накопитель.НижняяГраница, ""+Накопитель.НижняяГраница+"-"+Накопитель.ВерхняяГраница); Если Сч < ЭлементовВМассиве Тогда Накопитель.НижняяГраница = массив[Сч]; Накопитель.ВерхняяГраница = массив[Сч]; КонецЕсли; ИначеЕсли Сч < ЭлементовВМассиве Тогда Накопитель.ВерхняяГраница = массив[Сч]; КонецЕсли; КонецЦикла; Накопитель.Результат = Сред(Накопитель.Результат, 2); Сообщить(Накопитель.Результат); |
|||
17
sv201
01.07.13
✎
13:36
|
(16)
результат 1;2;3;4;5;6;8;11 |
|||
18
lamesnake
01.07.13
✎
13:40
|
(15) с "продолжить()" погорячился
НачалоПрогрессии = 0; ПредыдущееЗначение = 0; Для каждого Значение из Массив Цикл Если НачалоПрогрессии=0 Тогда НачалоПрогрессии = Значение; ИначеЕсли ПредыдущееЗначение+1 <> Значение Тогда Массив.Добавить(НачалоПрогрессии + "-" + ПредыдущееЗначение + ";"); НачалоПрогрессии=0; КонецЕсли; ПредыдущееЗначение = Значение; КонецЦикла; |
|||
19
sv201
01.07.13
✎
13:42
|
(16) все сработало
|
|||
20
sv201
01.07.13
✎
13:43
|
(16) спасибо большое
|
|||
21
sv201
01.07.13
✎
13:43
|
всем участникам темы тоже спасибо за подсказки.....
|
|||
22
Deon
01.07.13
✎
13:47
|
не за подсказки, а за готовое решение
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |