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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.07.2017, 08:04   #1
verka1
 
Регистрация: 04.02.2017
Сообщений: 8
По умолчанию Delphi, циклы, лаба

Подскажите красивый алгоритм (для лабы)

Дан диапазон стринговых переменных 100 штук

Код:
s001 := 'тест1'
s002 := 'тест2'
...
s100 := 'тест100'
диапазон разбит на 10 поддиапазонов по 10 переменных в каждом

Код:
s001 - s010
s011 - s020
...
s091 - s100
даны 10 булевых флагов каждый из которых разрешает работу в своем поддиапазоне

b1,b2...b10: Boolean;

т.е.
если b1=True То в диапазоне s001 - s010 можно выбирать

Задача:
осуществить случайный выбор, (Randomize) одного значения из всего доступного диапазона
(обходя запрещенные участки)

т.е.
если юзер указал (там чекеты на форме), например

Код:
b1:=True;
b2:=True;
b3:=False;
b4:=True;
b5:=True;
b6:=False;
b7:=True;
b8:=False;
b9:=True;
b10:=True;

то функция Randomize
должна выбирать одну переменную из списка:

[s001 - s020,s031 - s050,s061 - s070,s081 - s100]

т.е. возвращать значение Num:Integer = номер случайной переменной:

Num := Random(что-то хитрое)


...

Мной написан супер-пупер алгоритм, на 250 строк кода делающий все это, но препод заржал как коннь, сказал "это решается в несколько строк - хошь "трояк" - приму твое... а я трояк не хочу")

Мне хотя бы просто указать нужный путь, просто "кури циклы" мне не понятно)
verka1 вне форума Ответить с цитированием
Старый 14.07.2017, 08:21   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

А тут именно "кури цикл" - запускаете цикл, в котором выполняете рандом по всему диапозону, а в постусловии проверяете, что попали в допустимый.

Конечно, это простейший вариант. Есть всякие вариации, типа: если только один промежуток, то сужаем на него или сначала выбираем все допустимые промежутки, потом рандом по их номерам и рандом по полученному одному промежутку.

Последний раз редактировалось p51x; 14.07.2017 в 08:25.
p51x вне форума Ответить с цитированием
Старый 14.07.2017, 08:35   #3
verka1
 
Регистрация: 04.02.2017
Сообщений: 8
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
А тут именно "кури цикл" - запускаете цикл, в котором выполняете рандом по всему диапозону, а в постусловии проверяете, что попали в допустимый...
А если разрешен, скажем всего 1 из 10 поддиапазонов, представляете какая вероятность что этот цикл зациклится на проверке постусловия и будет крутиться в нем 500 лет? )
verka1 вне форума Ответить с цитированием
Старый 14.07.2017, 08:39   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В массивы строки и флажки:
Код:
var m: array[1..100] of String;
    b: array[1..10] of Boolean;
и
Код:
  k:=0;
  for i:=1 to 10 do k:=k+Ord(b[i]);
  if k>0 then begin
    j:=Random(k*10)+1;
    for i:=1 to 10 do
      if not b[i] then Inc(j,10)
      else if j<=i*10 then begin
        ShowMessage(m[j]);
        Break;
      end;
  end
  else ShowMessage('Все выключено');
Цитата:
будет крутиться в нем 500 лет
не будет ))
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 14.07.2017, 08:59   #5
verka1
 
Регистрация: 04.02.2017
Сообщений: 8
По умолчанию

Спасибо,
крутовато конечно написано, счас попытаюсь разобраться своим умишком что тут и где)
verka1 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Лаба по ассемблеру. Циклы. NewLamer&Programer Помощь студентам 4 05.05.2013 18:12
Циклы, лаба по C++. Mr.Voragus001 Помощь студентам 1 11.12.2011 09:05
Лаба на процедуры и функции Delphi Danis_ka Помощь студентам 5 11.06.2011 19:43
delphi Лаба на файлы и записи: Danis_ka Помощь студентам 1 11.06.2011 18:25
Лаба в Delphi сер4ей Помощь студентам 3 08.03.2009 13:44