(Не)простая последовательность. Найти ошибку в коде - QBasic
Формулировка задачи:
Задача
Написать программу, которая распечатывает 20 членов
случайной последовательности, обладающей следующими
свойствами
1. последовательность состоит из чисел 1, 2, 3, 4
2. числа 1 и 3 не могут стоять рядом
3. числа 2 и 4 тоже не могут стоять рядом
4. каждое число может стоять в последовательности
не более трёх раз подряд
пример 1, 1, 1, 2, 3, 4, 4, 3, 3, 2, 1, 1, 4, 4, 4, 1, 4, 1, 2, 2
программа работает не совсем верно: она может
выдать и 4 числа подряд. Проблему не решает даже
второй счётчик (k, k2 - счётчики призванные
контролировать повторение чисел)...
подумал: может поставить счётчики на каждое число?
нет, глупо, но где-то прокол?
Листинг программы
- CLS
- RANDOMIZE TIMER
- n1 = INT(4 * RND) + 1
- PRINT n1;
- k = 1
- k2 = 1
- FOR i = 1 TO 19
- DO
- n2 = INT(4 * RND) + 1
- IF n1 = n2 AND k < 3 AND k2 < 3 THEN
- k = k + 1
- k2 = k2 + 1
- END IF
- LOOP UNTIL (ABS(n1 - n2) MOD 2 OR n1 = n2) AND k <= 3
- PRINT n2;
- k2 = k
- k = 1
- n1 = n2
- NEXT
- END
Решение задачи: «(Не)простая последовательность. Найти ошибку в коде»
textual
Листинг программы
- DIM i AS LONG, n AS LONG, n0 AS LONG, k AS LONG
- RANDOMIZE TIMER
- n = INT(RND * 4 + 1)
- PRINT n;
- FOR i = 2 TO 20
- n0 = n
- DO
- n = INT(RND * 4 + 1)
- LOOP WHILE ABS(n - n0) = 2 OR (n = n0 AND k >= 2)
- IF n = n0 THEN k = k + 1 ELSE k = 0
- PRINT n;
- NEXT i
Объяснение кода листинга программы
- Переменные i, n, n0, k инициализируются как LONG (целые числа).
- С помощью функции RANDOMIZE TIMER инициализируется генератор случайных чисел.
- Переменной n присваивается случайное число от 1 до 4.
- Выводится значение переменной n.
- Запускается цикл от i = 2 до i = 20.
- Внутри цикла переменной n0 присваивается текущее значение переменной n.
- Запускается цикл DO-LOOP, который будет выполняться, пока абсолютное значение разности между текущим значением переменной n и предыдущим значением переменной n0 не станет равным 2, или пока текущее значение переменной n не станет равным предыдущему значению переменной n0 и переменная k не станет больше или равной 2.
- Внутри цикла DO-LOOP проверяется, равно ли текущее значение переменной n предыдущему значению переменной n0. Если это так, то переменная k увеличивается на 1. Если нет, то переменная k сбрасывается до 0.
- Выводится текущее значение переменной n.
- Цикл NEXT i прекращает выполнение цикла от i = 2 до i = 20.
- Выводится символ новой строки (PRINT).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д