Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #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, кроме : отмечных красным.
Если логика непонятна - поясню боллее развернуто.
Спасибо заранее))

Последний раз редактировалось alexusankov, 27.09.2012 в 10:19.
Ответить с цитированием
  #2  
Старый 27.09.2012, 10:45
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от alexusankov
Если логика непонятна - поясню боллее развернуто.
Логика понятна. Единственно непонятно что не получается?
Ответить с цитированием
  #3  
Старый 27.09.2012, 10:57
Аватар для alexusankov
alexusankov alexusankov вне форума
Новичок
 
Регистрация: 27.08.2012
Сообщения: 78
Версия Delphi: C++/Delphi 2010
Репутация: 10
По умолчанию

Как это в коде реализовывается.
Как искать в массиве сочетания ++, или --.
Если я воткнуть изменения в массив, между ++ один - например.
Ответить с цитированием
  #4  
Старый 27.09.2012, 11:04
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от alexusankov
Как это в коде реализовывается.
Как искать в массиве сочетания ++, или --.
В цикле проверяешь знак текущего элемента со знаком следующего. Так как массив изменяется, то лучше использовать цикл while, а не for.
Цитата:
Сообщение от alexusankov
Если я воткнуть изменения в массив, между ++ один - например.
Так можно "воткнуть" в позицию 7 элемент "-":
Код:
  ListBox1.Items.Insert(7, '-');
Ответить с цитированием
  #5  
Старый 27.09.2012, 12:55
Аватар для alexusankov
alexusankov alexusankov вне форума
Новичок
 
Регистрация: 27.08.2012
Сообщения: 78
Версия Delphi: C++/Delphi 2010
Репутация: 10
По умолчанию

Хоть убиться, не могу представить как это в коде реализовать
Ответить с цитированием
  #6  
Старый 27.09.2012, 12:59
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от alexusankov
Хоть убиться, не могу представить как это в коде реализовать
Тогда покажи ту часть кода которую смог представить и реализовать.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:20.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025