Показать сообщение отдельно
  #1  
Старый 27.09.2012, 10:17
Аватар для alexusankov
alexusankov alexusankov вне форума
Новичок
 
Регистрация: 27.08.2012
Сообщения: 78
Версия Delphi: C++/Delphi 2010
Репутация: 10
По умолчанию Непростая задачка с listbox

Доброго дня. Помогите реализовать алгоритм. Я не буду описывать всю программу, напишу чуть иначе. Есть алгоритм, как реализовать в коде - не хватает ума.
Итак. Имеется массив чисел. Числа положительные и отрицательные. Массив мы представим в виде listbox1 на форме.
Так же на форме будет listbox2 и listbox3 - для запихивания значений из массива. Итак поехали :
Массив представляет собой последовательность чисел в listbox1. В итоге массив должен начинаться с положительного числа, и заканчиваться отрицательным. Числа должны чередоваться, НЕчетные - положительны, четные элементы отрицательны. Это то что должно получиться в итоге. Сразу мы имеем массив чисел, которые идут по нарастающей :
+35
-42
+96
-112
+186
-740
Вот в этом примере массив шикарен и все правильно.
Но бывает такое :
1. Два числа подряд идут отрицательных
2. Два числа идут положительных
3. Массив начинается НЕ с положительного
4. Массив заканчивается НЕ отрицательным
- это вещи с которыми будем бороться
Пример :
-15
+35
-42
+78
-116
-182
+350
-360
+620
+630
-700
+730
В этом массиве имеется все 4 описанных косяка. Что программа должна с ними делать.
1. В первую очередь, обязательно проверить начинается ли и заканчивается ли массив сотв-но положительным и отрицательными. Если нет - в начало listbox сунуть положительное (0) в конец отрицательное (-800).
2. Далее если программа в списке находит два подряд идущих отрицательных (-116,-182) то :
2.1 Если ВТОРОЕ отрицательное отличается от первого отричательно меньше чем на 2 - удалить ил listbox первое отрицательное.
Если второе(otr2) отрицательное отличается от первого(otr1) БОЛЬШЕ чем на два - между этими числами нужно вставить положительное - которое будет равно отрицательному(переведенному в положительное) плюс 2. Получится -116, + 118, -182
3. Если в списке два плюса(+620,+630) - почти то же самое : Если второе положительное отличается от первого положительного менее чем на 2 - второе положительное нужно удалить.
Если второе положительное больше первого более чем на 2 - между ними нужно воткнуть отрицательное число, которое будет равно второму положительному минус два, перевернутое в отрицательное. т.е. мы получим 620,-628,630.
Итак в listbox1 был кривоватый массив который программа исправила.
Было бы идеально, если бы пары чиле которые НЕ исправлялись - ушли в listbox2 а те что исправлены - в listbox3. На нашем примеремы получим исправленный массив :
0
-15
+35
-42
+78
-116
+118
-182

+350
-360
+620
-628

+630
-700
+730
-800
т.е. все числа пойду в листбокс2, кроме : отмечных красным.
Если логика непонятна - поясню боллее развернуто.
Спасибо заранее))
Ответить с цитированием