Воскресенье, 24 Ноября 2024, 08:20

Приветствую Вас Гость

Меню сайта
Категории каталога
Создание игр [358]
Статьи об общих понятиях связанных с созданием игр.
Программирование [83]
Гайды по программированию на разных ЯП.
Движки и Гейммейкеры [148]
Статьи о программах для создания игр, уроки и описания.
Софт [43]
Различные программы, в том числе в помощь игроделам.
2D-графика [14]
Уроки по рисованию, растр, пиксель-арт, создание спрайтов и пр.
3D-графика [17]
Уроки по моделированию, ландшафт, модели, текстурирование и пр.
Моддинг игр [5]
Модификация компьютерных игр, создание дополнений, перевод, хакинг.
Игры [167]
Статьи об играх, в том числе и сделанных на гейммейкерах.
Разное [132]
Статьи, которые не вошли в определённые разделы.
Наш опрос
Сколько часов подряд вы обычно играете?
Всего ответов: 1446
Главная » Статьи » Программирование

Lua для всей семьи. Урок 3: циклы и математические функции
Содержание:
1. Урок 1: установка и первые программы
2.Урок 2: условные ветвления и логика

=== Урок №3 ===


В прошлый раз мы вяснили, как изменить ход программы с помощью управляющей конструкции 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.abs(<число>) -- Возвращает модуль числа (абсолютное значение). Например:
-- math.abs(0) -> 0
-- math.abs(5) -> 5
-- math.abs(-6.3) -> 6.3

math.ceil(<число>) -- Округляет число в большую сторону ("ceiling" - потолок)
-- math.ceil(9) -> 9
-- math.ceil(13.37) -> 14
-- math.ceil(1.999) -> 2
-- math.ceil(-5.3) -> -5

math.floor(<число>) -- Округляет число в меньшую сторону ("floor" - пол)
-- math.floor(6) -> 6
-- math.floor(5.99) -> 5
-- math.floor(1.04) -> 1
-- math.floor(-7.77) -> -8

math.sqrt(<число>) -- Возвращает квадратный корень числа ("square root")
-- math.sqrt(4) -> 2
-- math.sqrt(2) -> ~1.4142

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 - число Пи

math.rad(<угол_в_градусах>) -- Возвращает радианную меру угла, заданного в
  -- градусах
-- math.rad(0) -> 0
-- math.rad(180) -> ~3.14159265

math.deg(<угол_в_радианах>) -- Возвращает градусную меру угла, заданного
  -- в радианах
-- math.deg(0) -> 0
-- math.deg(math.pi) -> 180

math.sin(<угол_в_радианах>) -- Синус угла
-- math.sin(0) -> 0
-- math.sin(math.rad(90)) -> 1
-- math.sin(5.45) -> -0.74007731048889

math.cos(<угол_в_радианах>) -- Косинус угла
-- math.cos(0) -> 1
-- math.cos(math.rad(90)) -> 0
-- math.cos(5.45) -> 0.67252180224847

math.tan(<угол_в_радианах>) -- Тангенс угла
-- math.tan(0) -> 0
-- math.tan(math.rad(45)) -> 1
-- math.cos(5.45) -> -1.100451030754


Таблица умножения у нас уже есть - давайте теперь выведем таблицу синусов!

Код

-- 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 и т.д.), то его квадратный корень равен числу последовательных нечётных чисел, которые можно из него вычесть. Например:
Код

4 = 1 + 3 - два числа: 2*2=4
9 = 1 + 3 + 5 - три числа: 3*3=9
16 = 1 + 3 + 5 + 7 - четыре числа: 4*4=16

Основываясь на этом свойстве, попробуйте написать программу, которая приближённо вычисляла бы квадратный корень числа. Конечно, программа получится не совсем точной: корень из 5 у неё будет равен двум.
Категория: Программирование | Добавил: -l33t-h4xx- (12 Января 2014) | Автор: Андрей Липовалов
Просмотров: 21255 | Комментарии: 14 | Рейтинг: 4.8/20 |
Теги: Урок, Lua-скрипт, скриптинг, циклы, Урок 3, для начинающих, для всей семьи, математика, LUA
Дополнительные опции:
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:

Игровые объявления и предложения:
Если вас заинтересовал материал «Lua для всей семьи. Урок 3: циклы и математические функции», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела. Предлагаются такие схожие материалы: Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.

Всего комментариев: 14
+1-
14 GromsNN   (27 Декабря 2023 16:11) [Материал]
-- простое число--
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) -- для проверки по кол-ву

+1-
13 GromsNN   (25 Декабря 2023 16:37) [Материал]
--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 -- конец перебора

+1-
12 GromsNN   (15 Декабря 2023 14:59) [Материал]
"Конечно, придётся поднапрячь воображение..." (a.."x"..b.."="..a*b)

+1-
11 harm   (17 Июня 2021 09:56) [Материал]
"Конечно, придётся поднапрячь воображение, чтобы увидеть знак умножить между двумя первыми числами и знак равно после них, но использовать её всё равно можно."

print(a,'*',b,'=',a*b)

+1-
9 pl-by   (16 Октября 2020 18:36) [Материал]

+1-
7 Diablokiller   (22 Ноября 2014 03:42) [Материал]
DiablokillerИ еще - второе задание вообще никак не удается решить (. Совсем.

+1-
8 pet4566   (24 Июня 2018 17:25) [Материал]
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

print () --просто пустая строка
print ("Square root of", number, "equals", sqrt)
print ()

--также, попробуйте поставить "sqrt=sqrt+1" до проверки "if" - сразу после строки "sum=sum+i" и посмотрите как (неправильно)
--будут меняться значения результата (sqrt) от разных входных данных (number)

+1-
10 pl-by   (16 Октября 2020 18:42) [Материал]
Как по мне, слишком растянуто (и это - без учёта команд вывода и комментариев). У меня получилась программа всего в 6 строк (тоже без учёта комментариев и print'ов)

+1-
6 Diablokiller   (21 Ноября 2014 23:03) [Материал]
DiablokillerИ да, было бы шикарно, если бы задания можно было куда нибудь сдать для проверки. Что б сенсей поправил ошибки, подсказал пути решения и привел к успеху пацанов...

+1-
5 Diablokiller   (21 Ноября 2014 20:11) [Материал]
DiablokillerPi не переменная, а константа.
А уроки великолепны, то, что надо.

+1-
2 allxumuk   (15 Января 2014 23:29) [Материал]
allxumukСтоило упомянуть pairs()/ipairs(), очень полезные функции для обработки таблиц.

+1-
3 -l33t-h4xx-   (18 Января 2014 15:40) [Материал]
-l33t-h4xx-Безусловно. Я расскажу о них, когда непосредственно дойду то таблиц, так как без подходящего контекста должного впечатления они не произведут.

+1-
4 -l33t-h4xx-   (18 Января 2014 15:43) [Материал]
-l33t-h4xx-А вообще, твой коммент заставил меня вспомнить, что я совсем забыл про обобщённый цикл for. Жаль, его тоже придётся отложить до таблиц.

+3-
1 ant0N   (13 Января 2014 05:31) [Материал]
ant0NОтличные уроки! мне нравится. up

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск по сайту
10 случ. движков
  • Pyxel
  • LÖVR
  • Sandy3D
  • BlitzMax
  • Unigine
  • Retribution Engine
  • Axiom Engine
  • RTADS
  • Superpowers
  • Solar2D
  • Друзья сайта
    Игровой форум GFAQ.ru Перевод консольных игр
    Все права сохранены. GcUp.ru © 2008-2024 Рейтинг