Ну вот мы и узнали, как создавать переменные(написать имя переменной и присвоить ей значение), теперь надо добавить выполнению программы какую-то нелийность.
Что значит нелинейность? Это значит программа выполняется не построчно, а может повторять действия(циклы) и делать выбор между двумя ветвями выполнения(условное ветвление).
Итак, под ветвлением понимается такой момент в программе, когда в зависимости от текущих данных надо сделать одно из двух действий.
Все знают, что делить на ноль нельзя?
Правило можно записать так:
Code
Если знаменатель =0 тогда
нельзя делить!
иначе
Можно делить числитель на знаменатель
конец
Теперь это можно спокойно перевести на lua:
Code
chislitel = 10
znamenatel=5
if znamenatel==0 then
print("Division by zero!")
else
print(chislitel/znamenatel)
end
Выполнив этот код, вы увидите на экране 2, что равно 10/5
Теперь поменяйте znamenatel=0. На экране будет грозная надпись Division by zero!, что значит деление на ноль.
Вроде пример очень простой, всем должно быть понятно. Данную конструкцию можно использовать по-разному. Во-первых, число действий для каждой ветки ветвления может быть >1. Использовать else необязательно. Ещё в программе может быть цикл. Цикл - действие, повторяемое не 1 раз, а больше.
Для чего можно это использовать? Давайте сделаем глупую программку, которая выводит на экран 365 дней=)
Опять, сначала на русском, потом на lua-шном=):
Code
Для каждого дня от 1 до 365
Написать на экране номер дня
Конец
Вот как это выглядит в lua:
Code
for i=1,365 do
print("Day "..i)
end
Как видите, тут есть имя перенной i. У каждого такого цикла есть особая переменная-счётчик. Она изменяется от 1 до 365 каждый раз на 1.
При этом внутри цикла(эта внутренность называется телом цикла) переменную можно использовать как угодно.
Циклы можно вкладывать друг в друга. Выведем на экран таблицу умножения с помощью этого:
Code
stroka="" --тут будем хранить текущую строку таблицы, а потом, когда она готова выводить на экран
--Делаем заголовок таблицы
stroka=" "
for j=1,9 do
stroka=stroka.." "..j --Заголовок состоит из чисел от 1 до 9, разделённых 2-мя пробелами
end
print(stroka) --Выводим на экран
for i=1,9 do --выводим 9 строк
stroka=i --Пишем в первом столбике множитель
for j=1,9 do --для каждого столбика в строку выводим произведение
proizvedenie=i*j
if proizvedenie<10 then --если элемент таблицы имеет 1 цифру, то надо добавить перед числом 2 пробела, иначе 1
stroka=stroka.." "..proizvedenie
else
stroka=stroka.." "..proizvedenie
end
end
print(stroka)
end
У меня эта программа вывела следующий текст:
Code
1 2 3 4 5 6 7 8 9
1 1 2 3 4 5 6 7 8 9
2 2 4 6 8 10 12 14 16 18
3 3 6 9 12 15 18 21 24 27
4 4 8 12 16 20 24 28 32 36
5 5 10 15 20 25 30 35 40 45
6 6 12 18 24 30 36 42 48 54
7 7 14 21 28 35 42 49 56 63
8 8 16 24 32 40 48 56 64 72
9 9 18 27 36 45 54 63 72 81
Что ещё можно сказать по циклам со счётчикам? Можно указывать шаг(то есть насколько меняется значение переменной):
Code
for i=1,100,2 do
print(i)
end
Этот код выведет выведет все нечётные цифры от 1 до 99(то есть от 1 с шагом=2)
Шаг может быть отрицательным:
Code
for i=100,1,-1 do
print(i)
end
Этот код выводит числа от 1 до 100 в порядке убывания, то есть:
Чтобы досрочно прервать цикл есть оператор break:
Code
for i=1,100 do
print(i)
if i==50 then
break
end
end
Этот код выведет все числа от 1 до 50, но не до 100, потому что если i=50, то вызывается break. Кроме цикла со счётчиком есть ещё и условные циклы двух типов
1) Цикл с предусловием
Этот цикл выполняется пока некоторое логическое выражение истинно(true) - условие продолжения.
Пример:
Code
x=0.1
while math.sin(x)>0 do
print(x,math.sin(x))
x=x+0.1
end
Тут выведется значения синуса, которые больше 0:
Code
0.1 0.099833416646828
0.2 0.19866933079506
0.3 0.29552020666134
0.4 0.38941834230865
0.5 0.4794255386042
0.6 0.564642 47339504
0.7 0.64 421768723769
0.8 0.71735609089952
0.9 0.78332690962748
1 0.8414709848079
1.1 0.89120736006144
1.2 0.93203908596723
1.3 0 .9635581854171 9
1.4 0.98544972998846
1.5 0.99749498660405
1.6 0.99957360304151
1.7 0.99166481045247
1.8 0.9738476308782
1.9 0.9463 0008768741
2 0.90 929742682568
2.1 0.86320936664887
2.2 0.80849640381959
2.3 0.74570521217672
2.4 0.67546318055115
2.5 0.59847214410396
2 .6 0.5155013718 2146
2.7 0.42737988023383
2.8 0.3349881501559
2.9 0.23924932921398
3 0.14112000805987
3.1 0.041580662433289
Как только x стало больше 3.14 синус x стал меньше 0 и цикл прервался. Если в начале условие цикла не выполняется, то цикл ни разу не выполнится
2) Цикл с постусловием
Этот тип цикла даёт того, что тело цикла хотя бы 1 раз выполнится. При этом задаётся условие выхода из цикла(когда оно истинно, т.е. true, то цикл завершается)
Обычно его используют в такой ситуации, когда надо попробовать что-то сделать(хотя бы 1 раз), а если не вышло, то повторить ещё, и ещё, и ещё...)
Вот пример:
Code
n=6
math.randomseed(os.time())
math.random()
repeat
i=math.random(n)
print(i)
until i==n
print("After repeat .. until")
print(i)
Тут выводятся числа от 1 до 6, пока сичло не станет = 6. После цикла гарантированно i будет = 6
Code
math.randomseed(os.time())
math.random()
Этот код сбрасывает генератор случайных чисел(ибо при каждом запуске последовательность чисел будет повторяться и не будет случайной).
А этот записывает в i случайное число от 1 до 6 Ну всё, на это урок окончен. Самое важное я до вас донёс.
[Прошлый урок]|[Следующий урок]