Добавлен , опубликован

Lua-программирование для чайников

Содержание:
Название говорит само за себя. Каждая функция начинается с «math.» (сокр. от англ. «mathematics» — 'математика'), затем следует имя функции и в скобках выражение.
Таких выражений достаточно много. О них будет сказано ниже.

11.1. Виды математических выражений.

математическая библиотека луа:
math.abs
math.abs (x):
Возвращает модуль x.
a = -1;
print(math.abs(a)); -- 1
Модуль — это положительное значение числа.
math.acos
math.acos(x):
Возвращает арккосинус x (в радианах).
math.asin
math.asin(x):
Возвращает арксинус x (в радианах).
math.atan
math.atan(x):
Возвращает арктангенс x (в радианах).
math.atan2
math.atan2(x,y):
Возвращает арктангенс x/y (в радианах), но использует знаки обоих параметров для вычисления «четверти» на плоскости. (Также корректно обрабатывает случай, когда y равен нулю.)
math.cos
math.cos(x):
Возвращает косинус x (угол — в радианах).
math.cosh
math.cosh(x):
Возвращает косинус (гиперболический косинус) x.
math.deg
math.deg(x):
Переводит угол, заданный в радианах (x) в градусы.
math.exp
math.exp(x):
Возвращает ex.
math.floor
math.floor(x):
Возвращает наибольшее целое число, меньшее или равное x. (Округление «вниз».)
Пример:
--lua
local a = math.floor(123.1)       -- округлит до 123
print(a)
Пример:
--lua
local a = math.floor(123.7)       -- округлит до 123
print(a)
Пример:
--lua
local x = math.floor(math.sqrt(137))   -- округлит корень из 137 (11.7) до 11 
print(x)   -- вывести результат в правом нижнем углу
math.ceil
math.ceil(x):
Возвращает наименьшее целое число, большее или равное x. (Округление «вверх».)
Пример:
--lua
local a = math.ceil(123.1)       -- округлит до 124
print(a)
Пример:
--lua
local a = math.ceil(123.7)       -- округлит до 124
print(a)
Пример:
--lua
local a = math.ceil(math.sqrt(137))   -- округлит корень из 137 (11.7) до 12
print(a)
math.fmod
math.fmod(x,y):
Возвращает остаток от деления x на y.
Пример:
--lua
local a = math.fmod(100, 7)    -- 100 / 7 = 14 и остаток 2
print(a)
Пример:
--lua
-- узнать чётность числа
local a = 105       -- число должно быть целым
local b = math.fmod(a, 2)
if b == 0 then
    print(a .. " чётное")     
else
    print(a .. " нечётное")    
end
Пример:
--lua
-- выполнять скрипт в 1, 11, 21, 31, 41, 51 секунду
while true do                                     -- бесконечный цикл
    while math.fmod(os.date("%S"), 10) ~= 1 do    -- пока остаток от деления не будет равен 1
        wait (10)
    end
    -- тут действия
    print(os.date("%X"))    -- показать текущее время
    wait (1100)    -- ждать 1.1 секунды
end
Пример:
--lua
-- выполнять скрипт в 3, 13, 23, 33, 43, 53 минуты
while true do                                     -- бесконечный цикл
    while math.fmod(os.date("%M"), 10) ~= 3 do    -- пока остаток от деления не будет равен 3
        wait (10)
    end
    -- тут действия
    print(os.date("%X"))    -- показать текущее время
    wait (61000)           -- ждать 61 секунду
end
math.frexp
math.frexp(x):
Возвращает m и e такие, что x = m2e, e — целое, а модуль m находится в интервале [0.5,1) (либо ноль, если x равен нулю). (Разложение числа с фиксированной запятой.)
math.huge
math.huge:
Значение HUGE_VAL, значение большее, либо равное любому числовому значению.
math.ldexp
math.ldexp(m,e):
Возвращает m2e (e должно быть целым). (Восстановление значения по мантиссе и показателю.)
math.log
math.log(x):
Возвращает натуральный логарифм x.
math.log10
math.log10(x):
Возвращает логарифм x по основанию 10.
math.max
math.max(x,...):
Возвращает максимальный из аргументов.
a = 1;
b = 2;
c = 3;
d = 4;
e = 5;

print(math.max(a,b,c,d,e)); -- 5, то есть e
Возвращает максимальное число из выбранных
math.min
math.min(x,...):
Возвращает минимальный из аргументов.
math.min:
Код
a = 1;  
b = 2;  
c = 3;  
d = 4;  
e = 5;  

print(math.min(a,b,c,d,e)); -- 1, то есть a
Возвращает минимальное число из выбранных
math.modf
math.modf(x):
Возвращает два числа, целую часть x и дробную часть x.
--lua
local a, b = math.modf(123.48) -- вернёт целую часть в переменную 'a' и дробную в переменную 'b'
print(a, b)
Пример:
--lua
local a = math.modf(123.4)       -- вернёт только целую часть
print(a)
Пример:
--lua
local x, y = math.modf(math.sqrt(45))    -- вернёт целую часть = 6 и дробную = 70820393249937, т. к. корень из 45 (6,708203932499369)
print(x, y)
Пример:
--lua
local x, y = math.modf(math.sqrt(45))    -- вернёт целую часть = 6 и дробную = 70820393249937, т. к. корень из 45 (6,708203932499369)
y = tonumber(string.format("%.6f", y))    -- округлить дробную часть до 6 знаков после точки
print(x, y)
math.pi
math.pi:
Значение pi, то есть 3,14159....
print(math.pi); -- 3,1415926535898
вернет всегда число Пи.
math.pow
math.pow(x,y):
Возвращает x^y. (Также можно использовать запись x^y для вычисления значения этой функции.)
Тут происходит возведение в степень.
a = 5;
b = 2;

print(math.pow(a,b)); -- 25
Можно и так:
Код
print(a^b); -- 25
Пример 1:
--lua
local a = math.pow(2, 5)       -- вернёт 32, 2 в 5й степени
print(a)
local b = 2^5     -- также вернёт 32, 2 в 5й степени    
print(b)
Пример 2:
--lua
local a = 3
local b = 4
local c = math.pow(a, b)      -- вернёт 81, 3 в 4й степени
print(c)
Пример 3:
--lua
local a, b = 3, 4
local c = math.pow(a, b)      -- вернёт 81, 3 в 4й степени
print(c)
math.rad
math.rad(x):
Конвертирует угол x, заданный в градусах, в радианы.
math.random
math.random([m [, n]]):
Эта функция является интерфейсом к простейшему генератору псевдослучайных чисел rand, предоставляемому ANSI C. (Нет никаких гарантий по поводу его статистических свойств.)
При вызове без аргументов возвращает псевдослучайное действительной число в интервале [0,1). При вызове с аргументом m math.random() возвращает псевдослучайное целое число из отрезка [1, m].
При вызове с двумя аргументами — m и n math.random() возвращает псевдослучайное целое число из отрезка [m, n].
Примеры:
print(math.random()); -- рандомная десятичная дробь в интервале от 0 до 1.
print(math.random(10)); -- рандомное число в отрезке от 1 до 10
print(math.random(5,10)); -- рандомное число в отрезке от 5 до 10
math.randomseed
math.randomseed(x):
Инициализирует генератор псевдослучайных чисел параметром x («seed»): каждый параметр порождает соответствующую (но одну и ту же) последовательность псевдослучайных чисел.
math.sin
math.sin(x):
Возвращает синус x (аргумент — в радианах).
math.sinh
math.sinh(x):
Возвращает шинус (гиперболический синус) x.
math.sqrt
math.sqrt(x):
Возвращает квадратный корень x. (Также можно использовать выражение x^0.5 для вычисления этого значения.)
Пример 1:
--lua
local a = math.sqrt(123)
log (a)
Пример 2: можно заменить как x^0.5
--lua
local a = 123^0.5 --возвести в 0.5 степень, тоже самое что и возвести в квадратный корень
print(a)
Пример 3:
--lua
local a = 16
log (math.sqrt(a))
math.tan
math.tan(x):
Возвращает тангенс угла x (аргумент — в радианах)
math.tanh
math.tanh(x):
Возвращает гиперболический тангенс x.
Можно создать из имеющего арсенала свои функции:
определить четность
if math.fmod(сс,2)~=0 then
  print("Нечетное")
else 
  print("Четное")
end
округить до ближайшей целой
--округление в большую/меньшую сторону
--в большую: 0.5 => 1.0 or 0.3 => 0.0
--в меньшую: -0.5 => -1. or -0.3 => 0.0
function RoundEx(num)
  local inv = math.floor(math.abs(num) + 0.5)
    return num < 0 and inv * -1 or inv
end

function round(x, n)
    n = math.pow(10, n or 0)
    x = x * n
    if x >= 0 then x = math.floor(x + 0.5) else x = math.ceil(x - 0.5) end
    return x / n
end
определить знак
function math.sign(value) 
return value < 0 and -1 or value > 0 and 1 or 0 
end
отсечь дробь tointeger
это тупо конверт из плаваюшего числа в целое. В луа есть несколько функции для конверта из действительного числа в целое.
tointeger()
существует такая функция как tointeger(r) которая конвентирует из плавающей точки в целое. Однако, эта функция не везде работает. Даже, в варике может не заработать (честно не помню как в рефордже)
второй способ
можно использовать двойной обратный флэш
local a = 2.5//1 --превращает из 2.5 в целое 2
Однако, тоже не везде работает.
тректий способ
local a, b = math.modf(123.48) -- вернёт целую часть в переменную 'a' и дробную в переменную 'b'
четвертый способ
--конверт float в integer
--по факту отсекает/отбрасывает дробную часть
--а можно использовать math.tointeger(float)
function toint(n)
    local s = tostring(n)
    local i, j = s:find('%.')
    if i then
        return tonumber(s:sub(1, i-1))
    else
        return n
    end
end
коверт строки в 256-сс
в рефордже есть готовая функция, которая переводит из 4 символов равкода - FourCC(str)
посмотреть можно тут
или тут
Однако, функция варика FourCC(str) не работает в онлайн калькуляторе. И в мемхаке.
function ascii2decimal(str)
    str = string.reverse(str)
    local result = 0
    local pw = 1
    for i=1, #str do
        local c = str:sub(i,i)
        result = result + string.byte(c)*pw
        pw = pw*256
    end
    return result
end
print(ascii2decimal('e0EU')) --ПЕЧАТАЕТ 1697662293
Если надо перевести из десятичной в 256-ричную систему (по остатку от деления находим номер чара):
function decimalToAscii(num,base)
    
    local base = base or 256
    local s = '' --инициируем строку
    repeat
        num_char = num%base --номер чара находит по остатку от деления
        
        --с помщотю string.char(num_char) записываекм а строку символ по номеру чара
        s=s..string.char(num_char)
        
        --делим на основание
        num = math.modf(num/base)
        print(#s ..') num char: '..num_char)
        print(#s ..') mod: '..num)
    
        
    until num<base --делит число num до сих пор, пока число num не станет меньше основания base
    
    num_char = num%base
    s=s..string.char(num_char)
    print(#s..') num char: '..num_char)
    
    s = string.reverse(s) --переворачиваем пример 123 => 321
    print(s)
	return s
end

print(decimalToAscii(1697662293)) --вовзращает 'e0EU'

`
ОЖИДАНИЕ РЕКЛАМЫ...