В прошлый раз мы вяснили, как изменить ход программы с помощью управляющей конструкции if.
Очень часто при написании программы необходимо сделать так, чтобы один фрагмент кода выполнялся несколько раз подряд. Для такой цели в языке служат управляющие конструкции while и repeat. Их синтаксис выглядит так:
Код
while <условие> do <инструкции> end
repeat <инструкции> until <условие>
Сперва рассмотрим while, так как он внешне очень похож на if, который уже хорошо известен нам. Как и if, while принимает логическое выражение в качестве условия, только если if выполняет свои инструкции один раз, то while будет выполнять их снова и снова до тех пор, пока условие не станет ложным. Попробуйте записать в своей программе такие конструкции:
Код
while true do print("INFINITE") -- Этот цикл будет исполняться бесконечно, -- так как его условие всегда истинно. end
while false do print("NEVER") -- Этот цикл не будет исполнен ни разу, -- так как его условие всегда ложно. end
x = 1 while x < 10 do print(x) x = x + 1 -- Цикл исполнится 9 раз. -- На экран будет выведена последовательность чисел -- от 1 до 9 end
Таким образом, если условие while изначально ложно, то тело цикла (инструкции между do и end) будет проигнорировано интерпретатором. Однако иногда это не то, что нужно: порой необходимо исполнить тело цикла хотя бы один раз, для чего используется repeat. В repeat условие указывается в конце конструкции, в отличие от while, где условие указывается в начале, поэтому конструкцию while часто называют циклом с предусловием, а repeat - циклом с постусловием.
Код
x = 9 repeat print(x) x = x - 1 until x == 0
Обратите внимание, что в repeat, в отличие от while, тело будет повторяться до тех пор, пока условие ложно. Чтобы вам проще было запомнить это, возьмите на заметку дословный перевод каждой из этих конструкций:
Код
while <условие> do <действие> end -- Пока <условие> верно, делать <действие>, конец конструкции.
repeat <действие> until <условие> end -- Повторять <действие>, до тех пор, пока <условие> не станет истинным, -- конец конструкции. -- (как только условие стало истинным, цикл прекращается, пока оно ложно - цикл -- повторяется)
При написании программ цикл repeat применяется гораздо реже. Обычно его всегда удаётся заменить циклом while.
Ситуации, подобные тем, что были выше - когда мы сперва присваиваем переменной некоторое значение, затем в цикле выполняем с ним какие-либо операции и прибавляем к нему единицу, возникают настолько часто, что для этого дела был придуман специальный цикл for:
Код
for <имя_переменной> = <число1>, <число2> do <инструкции> end
Например:
Код
for i = 1, 9 do print(i) end
-- Эквивалентен коду: -- i = 1 -- while i <= 9 do -- print(i) -- i = i + 1 -- end
Запись в виде цикла for гораздо короче, и в этом её главное достоинство. Переменную в цикле for очень часто называют не иначе как i, но вы вправе дать ей любое другое имя.
Если вы хотите использовать в цикле for приращение, не равное единице, вы можете указать его через запятую после второго числа:
Код
for i = 1, 9, 2 do print(i) end
-- Выводит нечётные числа от 1 до 9. -- Эквивалентен коду: -- i = 1 -- while i <= 9 do -- print(i) -- i = i + 2 -- end
for x = 10, 0, -1 do print(i) end
-- Обратный отсчёт! -- Эквивалентен коду: -- x = 10 -- while x >= 0 do -- print(i) -- x = x - 1 -- end
Иногда циклы используются для того, чтобы искать определённое значение среди некоторой совокупности. Тогда требуется остановить поиск сразу, как только нужный элемент найден. Для этого используется инструкция break: как только интерпретатор встречает эту инструкцию, выполнение цикла немедленно останавливается. Например:
Код
-- search.lua --
-- Ищем среди чисел от 100 до 1000 первое число, -- которое без остатка делится и на 11, и на 7. -- Для этого используется оператор "%", который -- вычисляет остаток от деления.
num = 0 -- искомый номер будет записан сюда
for i = 100, 1000 do if i % 11 == 0 and i % 7 == 0 then -- Число найдено num = i -- Присвоить его переменной num break -- Прекратить поиск. Цикл прервётся, не доходя до 1000 end end
print(num)
А теперь, когда мы узнали столько всего нового, поразвлекаемся! Для начала, вот программа, печатающая таблицу умножения:
Код
-- multipl.lua --
for a = 2, 9 do for b = 2, 9 do print(a, b, a*b) end print "" -- Печатает пустую строку. -- Попробуйте удлить её и посмотреть, -- как изменится вывод end
Конечно, придётся поднапрячь воображение, чтобы увидеть знак умножить между двумя первыми числами и знак равно после них, но использовать её всё равно можно.
Раз уж речь зашла о математике, давайте я вам расскажу о кое-каких математических функциях, которые могут вам очень пригодиться, если вы школьник или студент. Эти функции, подобно print, принимают в скобочках некоторое значение, но в отличие от него они возвращают значение, которое возможно использовать в математических выражениях. Все эти функции расположены в модуле math - пока для нас это проявляется только в том, что их имена начинаются с символов "math.". Внизу приведён список некоторых полезных функций и указания, как их применять.
math.exp(<число>) -- Возвращает e^<число>, где e - число Эйлера, -- равное ~2.718281828 (математики называют -- эту функцию "экспонентой")
math.log(<число>, <основание>) -- Возвращает логарифм от <числа> по заданному -- <основанию>. Если <основание> не задавать, то оно будет -- принято равным e (который ~2.7183) -- math.log(100, 10) -> 2 -- math.log(4) -> 1.3862943611199
math.pow(<число>, <степень>) -- Возвращает <число>, возведённое в <степень>. -- Совершенно аналогична записи <число>^<степень>. -- math.pow(2, 3) -> 8 -- С другой стороны: -- 2^3 -> 8
math.pi -- Не функция, а переменная, равная ~3.14159265 - число Пи
Таблица умножения у нас уже есть - давайте теперь выведем таблицу синусов!
Код
-- sintable.lua --
for degree = 0, 90 do -- От нуля до 90 градусов print(degree, math.sin(math.rad(degree)) ) -- Обратите внимение, как угол сперва преобразуется из -- градусов в радианы end
Чудесно! Теперь никакой Брадис не нужен. Точно таким же образом можно вывести таблицы других функций - займитесь этим на досуге. Также попробуйте такой фрагмент:
Код
x = <какое-нибудь_число> print (math.sin(x)^2 + math.cos(x)^2)
Если вы даже не запуская программу можете сказать точный ответ, то в школе вы балду не пинали.
Резюме 1. Мы научились создавать циклы с помощью управляющих конструкций while, repeat и for. 2. Мы узнали о модуле math и какие в нём есть полезные функции.
Упражнения, которые можно не выполнять. Сегодня они достаточно сложные, но вы много приобретёте, если справитесь с ними: 0. Посчитайте сумму синусов чисел от 1 до 50. Реализуйте три разные версии программы: с циклом for, с циклом while и циклом repeat. 1. С помощью двух циклов for (один из которых вложите в другой) выведите список всех простых чисел от 1 до 1000. Простое число - это такое число, которое без остатка делится только на само себя и на единицу. 2. Как известно, если число является квадратом (квадратные числа: 4, 9, 16, 25, 36 и т.д.), то его квадратный корень равен числу последовательных нечётных чисел, которые можно из него вычесть. Например:
Основываясь на этом свойстве, попробуйте написать программу, которая приближённо вычисляла бы квадратный корень числа. Конечно, программа получится не совсем точной: корень из 5 у неё будет равен двум.
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:
Игровые объявления и предложения:
Если вас заинтересовал материал «Lua для всей семьи. Урок 3: циклы и математические функции», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела.
Предлагаются такие схожие материалы:
Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.
-- простое число-- b=0 -- проверочное число for i=2,1000 do a=0 for j=1,1000 do if i%j==0 then --print ("chislo "..i.." delitsya bez ostatka na "..j) --для проверки и наладки a=a+1 elseif a<=2 and j==1000 then print ("prostoe chislo "..i) b=b+1 end end end print ("vsrgo chisel "..b) -- для проверки по кол-ву
--SQRT-- print ("vvedite chislo:") x=io.read("*n") -- ввод числа d2=0 -- сумма посл-х нечетных чисел d=1 -- нечетное число for c=0,x do -- цикл на определение количества нечетных чисел if x<=d2 then -- условие перебора до нашего числа print("Koren' kvadratny iz nego budet:"..c) -- количество циклов будет нашим корнем из зад. чис. break -- число найдено останов else d2=d2+d -- считаем сум посл-х неч. чисел d=d+2 -- шаг для нечетных чисел начиная с единицы end -- конец блока проверки end -- конец перебора
"Конечно, придётся поднапрячь воображение, чтобы увидеть знак умножить между двумя первыми числами и знак равно после них, но использовать её всё равно можно."
number=16 -- число, корень которого нужно определить sqrt=0 -- здесь будет храниться искомый корень, число последовательных нечетных чисел, -- сумма которых не превышает исходное значение (16, в примере) sum=0 -- переменная - сумма последовательных нечетных чисел, служит для проверки выхода из цикла "for" -- В проверке "if" важно указать знак ">", а не ">=", иначе выход из цикла будет произведен раньше -- и кв. корень из 16 будет не 4, а 3, что не верно print ("i","Sum","Sqrt") --просто заголовки for i=1, number, 2 do sum=sum+i if sum>number then break end sqrt=sqrt+1 print (i, sum, sqrt) --вывод промежуточных результатов end
--также, попробуйте поставить "sqrt=sqrt+1" до проверки "if" - сразу после строки "sum=sum+i" и посмотрите как (неправильно) --будут меняться значения результата (sqrt) от разных входных данных (number)
Как по мне, слишком растянуто (и это - без учёта команд вывода и комментариев). У меня получилась программа всего в 6 строк (тоже без учёта комментариев и print'ов)
И да, было бы шикарно, если бы задания можно было куда нибудь сдать для проверки. Что б сенсей поправил ошибки, подсказал пути решения и привел к успеху пацанов...