BASIC-256 Глава 7
Методические материалыАвтор: Владимир Черный
Продолжаем публиковать перевод книги Джеймса Рено. Эту главу перевел Сергей Ирюпин.
Оглавление:
- Глава 1: Знакомство с BASIC-256 – cкажи «Привет»
- Глава 2: Рисуем основные фигуры
- Глава 3: Звуки и музыка
- Глава 4: Мыслить как программист
- Глава 5: Программа задает вам вопросы
- Глава 6: Сравнения, сравнения, сравнения
Глава 7: Циклы и счетчики — повторяем снова и снова
До сих пор наши программы после старта выполняли шаг за шагом инструкции и завершали свою работу. Пока это хорошо работало для простых программ, однако по большей части при программировании возникают задачи, требующие повторений или работы со счетчиком, или и то и другое вместе. В этой главе мы рассмотрим три вида оператора цикла, освоим режим «быстрой графики», и научимся замедлять выполнение программы.
Цикл For
Наиболее распространенный вид оператора цикла — это for. Цикл for повторяет блок операторов указанное число раз, отслеживая значение счетчика. Счетчик цикла может начинаться с любого значения и завершаться любым значением, шаг приращения счетчика также может быть любым. Программа 33 — простой пример использования цикла for, печатает и проговаривает цифры от 1 до 10 (включительно). Программа 34 считает по 2, начиная с нуля и заканчивая 10.
1 # for.kbs
2 for t = 1 to 10
3 print t
4 say t
5 next t
Программа 33: Оператор for
1
2
3
4
5
6
7
8
9
10
Вывод программы 33: Оператор for
1 # forstep2.kbs
2 for t = 1 to 10 step 2
3 print t
4 say t
5 next t
Программа 34: Оператор for вместе с step
0
2
4
6
8
10
Вывод программы 43: Оператор for вместе с step
for счетчик = выражение1 to выражение2 [step выражение3] оператор(ы) next счетчик Выполняет определенный блок кода указанное число раз. Переменная счетчик начинает со значения выражение1. После каждого выполнения блока операторовсчетчик увеличивается на значение выражение3 (или на единицу, если шаг — так переводится английское слово step — не указан). Цикл прекращается, когда значение счетчика превысит значение выражение2. |
Используя цикл, можно легко рисовать очень интересные картинки. Программа 35 рисует муаровый узор1. Это действительно интересное изображение возникает потому, что компьютер не в состоянии нарисовать абсолютно прямую линию2. Поскольку рисование происходит по точкам (пикселям), линия под наклоном выглядит как лесенка. И если вы внимательно посмотрите на линии, которые мы нарисовали, то увидите, что они на самом деле зубчатые.
1 # moire.kbs
2 clg
3 color black
4 for t = 1 to 300 step 3
5 line 0,0,300,t
6 line 0,0,t,300
7 next t
Программа 35: Муаровый узор
Вывод программы 35: Муаровый узор
Какие ещё муаровые узоры вы можете нарисовать? Начните с центра, используйте различные значения шага, накладывайте одно на другое, пробуйте разные цвета — развлекайтесь! |
Оператор for может быть также использован и для счета в обратном направлении. Для этого укажите после step отрицательное число.
1 # forstepneg1.kbs
2 for t = 10 to 0 step -1
3 print t
4 pause 1.0
5 next t
Программа 36: Оператор for – счет в обратном направлении
10
9
8
7
5
4
3
2
1
0
Вывод программы 36: Оператор for — счет в обратном направлении
pause секунды
Оператор pause говорит BASIC-256 приостановить выполнение текущей программы на указанное число секунд. Количество секунд может быть задано десятичной дробью, если необходима пауза меньше секунды. |
Делай, пока я не скажу остановиться
Следующий тип цикла — do/until — повторяет блок кода один или несколько раз. После каждого повтора проверяется логическое условие. Цикл повторяется до тех пор, пока условие ложно (false). Программа 37 использует цикл do/until, для проверки корректности ввода пользователем данных. Цикл будет повторяться до тех пор, пока пользователь не введет число от 1 до 10.
1 # dountil.kbs
2 do
3 input "введите число от 1 до 10?",n
4 until n>=1 and n<=10
5 print "вы ввели " + n
Программа 37: Введите число от 1 до 10
введите число от 1 до 10?66
введите число от 1 до 10?-56
введите число от 1 до 10?3
вы ввели 3
Пример вывода программы 37: Введите число от 1 до 10
do оператор(ы) until условие Выполняет блок операторов снова и снова, пока условие ложно. Оператор(ы) будут выполнены один или несколько раз. |
Программа 38 использует do/until для счета от 1 до 10 подобно программе 33, которая использовала для того же цикл for.
1 # dountilfor.kbs
2 t = 1
3 do
4 print t
5 t = t + 1
6 until t >= 11
Программа 38: Do/Until считает до 10
1
2
3
4
5
6
7
8
9
10
Вывод программы 38: Do/Until считает до 10
Делай, пока я говорю делать
Третий тип цикла — while/end while — проверяет условие перед выполнением каждого повтора, и если результат проверки условия принимает значение истина (true), то выполняется код в цикле. Цикл while/end while может выполнить внутренний код несколько раз или не выполнить ни разу.
Иногда нам нужна программа с бесконечным циклом, пока сам пользователь не остановит её. Это может быть легко сделано с помощью логической константы true (истина) (см. программу 39).
1 # whiletrue.kbs
2 while true
3 print "больше никогда";
4 end while
Программа 39: Вечный цикл
больше никогда
больше никогда
больше никогда
больше никогда
больше никогда
… выполняется пока вы её не остановите
Пример вывода программы 39: Вечный цикл3
while условие оператор(ы) end while Выполняет оператор(ы) в теле цикла снова и снова, пока условие истинно. Оператор(ы) будет выполнены нуль (0) или несколько раз. |
Программа 40 использует while/end while для счета от 1 до 10 подобно программе 33, которая использовала для того же цикл for.
1 # whilefor.kbs
2 t = 1
3 while t <= 10
4 print t
5 t = t + 1
6 end while
Программа 40: While считает до 10
1
2
3
4
5
6
7
8
9
10
Вывод программы 40: While считает до 10
Быстрая графика
Когда нам нужно быстро выполнить много графических операций, например, при создании анимации или в играх, BASIC-256 предлагает режим «быстрой графики». Такой режим включается командой fastgraphics. В этом режиме окно для вывода графики будет обновляться только при выполнении команды refresh.
fastgraphics refresh Команда fastgraphics включает режим «быстрой графики». В этом режиме окно для вывода графики будет обновляться только по команде refresh. Включив «быструю графику» во время выполнения программы, вы не сможете вернуться в стандартный (медленный) режим4. |
1 # kalidescope.kbs
2 clg
3 fastgraphics
4 for t = 1 to 100
5 r = int(rand * 256)
6 g = int(rand * 256)
7 b = int(rand * 256)
8 x = int(rand * 300)
9 y = int(rand * 300)
10 h = int(rand * 100)
11 w = int(rand * 100)
12 color rgb(r,g,b)
13 rect x,y,w,h
14 rect 300-x-w,y,w,h
15 rect x,300-y-h,w,h
16 rect 300-x-w,300-y-h,w,h
17 next t
18 refresh
Программа 41: Калейдоскоп
Пример вывода программы 41: Калейдоскоп
Запустите программу 41, предварительно удалив или закомментировав строку номер 3, с командой fastgraphics. Вы видите разницу? |
В «Большой программе» этой главы мы будем использовать цикл while для анимации подпрыгивающего мяча в окне для вывода графики. |
1 # bouncingball.kbs
2 fastgraphics
3 clg
4
5 # начальная позиция мяча
6 x = rand * 300
7 y = rand * 300
8 # size of ball
9 r = 10
10 # скорость по направлениям х и y
11 dx = rand * r + 2
12 dy = rand * r + 2
13
14 color green
15 rect 0,0,300,300
16
17 while true
18 # стираем старый мяч
19 color white
20 circle x,y,r
21 # вычисляем новую позицию
22 x = x + dx
23 y = y + dy
24 # столкновение с левой и правой границей
25 if x < 0 or x > 300 then
26 dx = dx * -1
27 sound 1000,50
28 end if
29 # столкновение с верхней и нижней границей
30 if y < 0 or y > 300 then
31 dy = dy * -1
32 sound 1500,50
33 end if
34 # рисуем новый мяч
35 color red
36 circle x,y,r
37 # обновляем окно графики
38 refresh
39 end while
Программа 42: Большая программа — прыгающий мяч
Пример вывода программы 42: Большая программа — прыгающий мяч
—————————
1 Узор, возникающий при наложении двух периодических сетчатых рисунков. Явление обусловлено тем, что повторяющиеся элементы двух рисунков следуют с немного разной частотой и то накладываются друг на друга, то образуют промежутки (прим. разработчика).
2 Разумеется, если только она не строго вертикальная или горизонтальная (прим. разработчика).
3 У автора используется слово «nevermore» — намек на стихотворение Эдгара Алана По «Ворон», в котором есть строчка: Quoth the Raven, “Nevermore.” — Каркнул: «Больше никогда!»(прим. редактора).
4 После завершения выполнения программы режим «быстрой графики» выключается автоматически (прим. разработчика).
Где скачать BASIC-256:
Для дистрибутивов ALT Linux
- ветка 4.0 basic256-0.9.6-alt0.M40.1.i586.rpm
- ветка 4.1 basic256-0.9.6-alt0.M41.1.i586.rpm
- ветка p5 basic256-0.9.6-alt3.M50P.1.i586.rpm
- ветка 5.1 basic256-0.9.6-alt0.M51.1.i586.rpm
Windows версия
http://basic256.org (http://www.sourceforge.net/projects/kidbasic)
Как установить BASIC-256 в Linux
Для Альт Линукс: настроить репозиторий и обновить/установить пакет через synaptic или apt
Для rpm-based дистрибутивов: rpm -Uvh <имя_пакета>.rpm
Декабрь 19, 2010, 9:51 дп
Подскажите пожалуйста, как заставить работать оператор SAY в AltLinux 5.0.1 School Юниор (gnome)
1. Установили basic-256 0.9.6.53
2. Установили espeak 1.44.05 (синтезатор english-речи)
3. Установили ru-tss и ru_tss-lexicon (синетзатор русской речи)
Декабрь 20, 2010, 1:56 пп
Пока, к сожалению, никак. Проблема в libportaudio, которая (на 5 платформе) не взаимодействует с espeak. Однако майнтейнер espeak в настоящий момент занимается решением этой проблемы. Нужно просто подождать. В 4й платформе (4.0, 4.1) espeak (и соответственно оператор say) «разговаривает» без проблем. А ru-tss или как там ещё — тут вообще не при чем.
Декабрь 20, 2010, 2:04 пп
Понятно. В Бейсик есть есть чем заниматься, подождем.
p.s. ru-tss ставили на всякий случай
Декабрь 23, 2010, 8:16 дп
Кстати, рекомендую скачать обновленный в p5 пакет BASIC-256, в нем проверена и исправлена подсветка ключевых слов и появились кнопки навигации (вперед-назад-домой) в окне справки — http://ftp.altlinux.org/pub/distributions/ALTLinux/p5/branch/files/i586/RPMS/basic256-0.9.6-alt4.M50P.1.i586.rpm