Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.12.2012, 10:05   #1
mustaman
 
Регистрация: 07.04.2010
Сообщений: 5
По умолчанию Не могу выйти из цикла while

Суть: есть некий диапозон значений которые мне надо генерировать, каждое значение надо использовать не более одного раза, хочу затолкнуть значение в строку и проверить есть значение в строке, если значение уже есть, то сформировать новое, когда новые значения перестают формироваться, я зацикливаюсь, что то не могу понять, как из цикла выйти, если я использовал все числа от 0 до 9, пока для удобства диапозон от 0 до 9

Код:
i:=random(Number)+1;
 while ((pos(IntToStr(i),rep)<>0) and (flag=false)) do
  begin
   i:=random(Number)+1;
   flag:=false;
  end;
 rep:=rep+IntToStr(i);
 flag:=true;
mustaman вне форума Ответить с цитированием
Старый 12.12.2012, 11:21   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

В цикле:

Код:
if {условие} then begin
  rep:=rep+IntToStr(i);
  flag:=true;
end;
не?

Ну или так:

Код:
i:=random(Number)+1;
flag:=pos(IntToStr(i),rep)=0;
while not flag do
  begin
    i:=random(Number)+1;
    flag:=pos(IntToStr(i),rep)=0;
  end;
rep:=rep+IntToStr(i);
flag:=true;
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 12.12.2012 в 11:26.
Sciv вне форума Ответить с цитированием
Старый 12.12.2012, 11:39   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

во-первых, добавлять в строку - далеко не самый эффективный вариант (в качестве быстродействия).
во-вторых, если планируется диапазон больше, чем от 0 до 9, то обязательно нужно добавить разделитель.

в-третьих, Вам самостоятельно нужно позаботится, чтобы цикл не стал бесконечным. Для этого достаточно подсчитать, сколько всего значений может быть получено, в цикле при получении каждого нового значения увеличивать счётчик и, как только счётчик достиг максимума - в цикл НЕ ВХОДИТЬ!

ну и, наконец, в чётвёртых, если нужно получить определённный набор случайных значений без повторений, а количество элементов в наборе строго ограниченное число (например, 36 карт), то выбранный Вами алгоритм КРАЙНЕ сложен и неэффективен - чем больше значений уже сгенерировано, тем больше вероятность, что Вы будете получать случайные значений из тех, что уже были ранее. а последнюю, 36-карту можно и десятки/сотни раз выбрасывать случайное значени, до тех пор, пока не выпадет единственное, которого ещё не было.
В подобных случаях НАМНОГО удобнее и эффективнее поступать так:
заполняем массив нужными значениями (подряд). перемешиваем случайным образом. Берём по очереди значения из массива (это будут случайные значения без повторов). Это просто, быстро и эффективно.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.07.2013, 13:50   #4
Stertor
Заблокирован
 
Регистрация: 17.07.2013
Сообщений: 104
По умолчанию

Вы что, с ума все посходили?

Break;
Stertor вне форума Ответить с цитированием
Старый 18.07.2013, 14:18   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Stertor, Вы что с ума сошли, старую тему поднимать? Вам заняться больше нечем?!
тут Вас кормить не будут...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.07.2013, 14:38   #6
Stertor
Заблокирован
 
Регистрация: 17.07.2013
Сообщений: 104
По умолчанию

А я буду, буду поднимать, потому, что мне обидно и больно за таких быдлокодеров.
Еще и вновь пришедших путаете.
Stertor вне форума Ответить с цитированием
Старый 18.07.2013, 14:44   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от Stertor Посмотреть сообщение
А я буду, буду поднимать, потому, что мне обидно и больно за таких быдлокодеров.
Еще и вновь пришедших путаете.
если вы не заметили, то исправлен был исходный код ТС, или вы этого не заметили как и даты поста?
потому что это обрывок, и не видно зачем ему нужен и нужен ли flag.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.07.2013, 14:51   #8
Stertor
Заблокирован
 
Регистрация: 17.07.2013
Сообщений: 104
По умолчанию

Нет, не заметил. И сейчас не вижу.
Stertor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с циклами в Delphi 7. Выйти из цикла достигнув указанного условия. CONDOR* Помощь студентам 1 16.05.2012 18:59
C++ Как выйти из цикла при нажатии enter? Seede1 Помощь студентам 2 06.12.2011 14:50
Как выйти из цикла по нажатию горячей клавиши? suslik_ Помощь студентам 2 06.07.2011 16:20
Делфи выйти из цикла. S_Yevgeniy Помощь студентам 1 14.11.2009 09:41
Как выйти из бесконечного цикла! Эдуард Общие вопросы C/C++ 11 02.03.2008 19:15