Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на языке Pascal


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Pascal

Выпуск № 437
от 11.08.2007, 10:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 244, Экспертов: 52
В номере:Вопросов: 1, Ответов: 6


Вопрос № 97468: Друзья, помогите пожалуйста! Есть 20 вопросов и мне необходимо их представлять пользователю в хаотичном порядке. Предложите пожалуйста алгоритм пересортировки номеров вопросов. ..

Вопрос № 97.468
Друзья, помогите пожалуйста! Есть 20 вопросов и мне необходимо их представлять пользователю в хаотичном порядке. Предложите пожалуйста алгоритм пересортировки номеров вопросов.
Отправлен: 06.08.2007, 09:59
Вопрос задал: Berkut55544 (статус: 7-ой класс)
Всего ответов: 6
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Delph
Здравствуйте, Berkut55544!

Загрузите вопросы в массив, а затем используйте функцию Random(MaxValue). Предположим, что у Вас вопросы в массиве Questions. Тогда Вы можете выбирать вопрос таким образом:

Write(Questions[Random(20)]);
... { какие-то ещё действия }

В самом начале программы запустите процедуру Randomize, чтобы инициировать генератор псевдослучайных чисел непредсказуемым значением (точнее, счётчиком системных часов, который увеличивается на единицу 18.2 раза за каждую секунду). Randomize достаточно запустить один раз.
Ответ отправил: Delph (статус: 5-ый класс)
Ответ отправлен: 06.08.2007, 10:14

Отвечает: Omickron
Здравствуйте, Berkut55544!

Вопросы лучше всего хранить в текстовом файле. Думаю, Вы с этим согласитесь.
Каждый вопрос в отдельной строке.
Далее в процессе работы создайте объект класса TStringList и загрузите в него методом LoadFromFile вопросы из файла. Вы получите массив строк, коим является объект класса TStringList. И обращаться к каждой строке вы можете через индекс.

Как именно перемешать элементы в этом объекте писать не буду. Думаю, разберётесь сами. Вот один из алгоритмов:
- при помощи функции Random выбираете случайный индекс этого массива;
- при помощи временной строки обмениваете первую строку объекта TStringList с выбранной случайно;
- повторяете этот цикл несколько десятков раз.
В результате получите элементы, расположенные в случайном порядке.

Надеюсь, смог Вам помочь. Удачи.
Ответ отправил: Omickron (статус: 3-ий класс)
Ответ отправлен: 06.08.2007, 10:30

Отвечает: Vassea
Здравствуйте, Berkut55544!
Просто использовать random нельзя, так как нет гарантии, что номер не будет повторяться. Поэтому я предлагаю два алгоритма 1) Выбираем случайное число от 1 до 20. Выводим вопрос с этим номером. Выведенный вопрос перемещаем в конец списка вопросов, а вместо него самый последний вопрос. Выбираем номер от 1 до 19 и делаем все то же самое, только меняем местами выбранный вопрос и 19 и т.д.
Второй способ Записываем в множество все номера вопросов. В цикле выбираем случайное число. Если оно есть в множестве, то выводим вопрос и вычитаем этот номер из множества (этот вопрос уже выводился). А если этого номера нет в множестве, то значит этот вопрос уже был выведен один раз. Так продолжаем, пока множество не станет пустым. Программа в приложении.

Приложение:

Ответ отправил: Vassea (статус: 4-ый класс)
Ответ отправлен: 06.08.2007, 11:39

Отвечает: Карабанов Алексей
Здравствуйте, Berkut55544!

На мой взгляд, лучше всего использовать генератор случайных чисел RND, задав диапазон генерируемых чисел.
Так как числа по умолчанию генерируются в диапазоне от 0 до 1, то задать нужный диапазон можно по формуле:
нижняя_граница+RND*верхняя_граница
В вашем случае (от 1 до 20) RND*20+1.
---------
Дорогу осилит идущий!
Ответ отправил: Карабанов Алексей (статус: 5-ый класс)
Ответ отправлен: 06.08.2007, 12:04

Отвечает: Дмитрий С.
Здравствуйте, Berkut55544!
Предлагаю поступить следующим образом: занести текст вопросов в массив и потом вызывать вопросы в RANDOM-ном порядке, например:

writeln(Massiv[random(20)]);

но есть риск что выскочит 0 и поэтому можно подстраховаться:

var temp: integer;
begin
{--------------}
Repeat tmp := random(20); until not (tmp = 0);

Чтобы значения не повторялись, можно заносить номера в множество:

var mnog: set of byte;
temp: integer;
begin
{--------------}
mnog := [];
Repeat
tmp := random(20);
until not (tmp = 0) and not (tmp in mnog);
mnog := mnog + [tmp];
writeln(massiv[tmp]);

---------
Наши программисты самые программистые программисты!..
Ответ отправил: Дмитрий С. (статус: 3-ий класс)
Ответ отправлен: 06.08.2007, 12:30

Отвечает: Багиев Александр
Здравствуйте, Berkut55544!
Это не сложно:
1. Заводите массив A из 20 элементов типа boolean: A: array[0..19]of boolean
2. Заполняете этот массив значениями true.
3. Заводите переменную: NumberOfQuestions:=20
4. Далее для получения очередного вопроса пишете:

Приложение:

Ответ отправил: Багиев Александр (статус: 1-ый класс)
Ответ отправлен: 06.08.2007, 14:45


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Email: support@rusfaq.ru, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.54 beta от 01.08.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное