Имя: Пароль:
1C
1С v8
арифметическая прогрессия в 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
не за подсказки, а за готовое решение