lip 15, 2010 Posted Under: Kurs Lua, Lua

Kurs Lua cz. III – operatory

Dodawanie, odejmowanie, dzielenie, mnożenie. To tylko kilka z wielu podstawowych operacji na zmiennych w programowaniu. Dzisiaj poznamy operatory arytmetyczne, relacji i logiczne.

1. Operatory arytmetyczne

Operatory arytmetyczne służą krótko mówiąc do wykonywania działań znanych nam z matematyki, takich jak dodawanie, odejmowanie czy potęgowanie. Wyróżniamy:

  • Podstawowe 4 operatory: „+”, „-”, „*”, „/”, służące do dodawania, odejmowania, mnożenia i dzielenia oczywiście
  • Operator dzielenia modulo: „%”, służy do uzyskania reszty z dzielenia. Początkującym może się to wydać dziwne, ale uwierzcie mi na słowo, bardzo się przydaje :)
  • Tzw. unarny operator znaku liczby: „-”, zwróci nam liczbę przeciwną do argumentu
  • Operator potęgowania: „^”

Mały przykład użycia:

a = 5
b = 6
print(a+b)
print(a-b)
print(a*b)
print(a/b)
print(a%b)
print(-a)
print(a^b)

Oczywiście możemy to sobie bez problemu przypisać do zmiennej.

2. Operatory relacji

Operatory relacji służą do porównywania zmiennych (czyli określania jakie zachodzą między nimi relacje). To także nic trudnego, każdy zna to z matematyki. Operatory relacji zwracają nam wartość logiczną, true jeśli relacja zachodzi, false jeśli nie.

  • „<”, „<=”, „>”, „>=” – mniejszy, mniejszy lub równy, większy, większy lub równy
  • „==” – równy (true jeśli obie zmienne są identyczne)
  • „~=” – różny (true jeśli obie zmienne są różne)
a = 5
b = 6
print(a>b)
print(a=b)
print(a==b)
print(a~=b)
print("ala"<"ola")

Jak widać można porównywać też stringi, tu brana pod uwagę jest kolejność alfabetyczna (i niestety wielkość liter).

3. Operatory logiczne

Tym razem może być trochę trudniej, nie każdy miał już logikę w szkole, ale wydaje mi się że każdy da rade. Operatory logiczne służą do wykonywania działań na zmiennych logicznych (boolean), są bardzo istotne i trzeba je dogłębnie zrozumieć.

  • and - koniunkcja logiczna. And zwróci nam true tylko i tylko wtedy kiedy oba argumenty będą prawdziwe.
  • or - alternatywa logiczna. Or zwróci nam true tylko i tylko wtedy kiedy co najmniej jeden argument będzie prawdziwy
  • not - negacja logiczna. Zwróci nam argument przeciwny (true dla false i false dla true).

Opisany przykład:

print("and:")
print(true and true) --oba argumenty prawdziwe
print(true and false) -- jeden argument fałszywy
print(false and true) -- jeden argument fałszywy
print(false and false) -- oba argumenty fałszywe
print("or:")
print(true or true) --oba argumenty prawdziwe
print(true or false) -- jeden argument fałszywy
print(false or true) -- jeden argument fałszywy
print(false or false) -- oba argumenty fałszywe
print("not:")
print(not true) -- nie prawda
print(not false) -- nie fałsz
print("Inne przyklady:")
print(true and (false or true))
print(false or (not true))
print(not (true and true))
print(((true or false) and not(true and false)) or false)

Wiemy więc jak działają podstawowe operatory logiczne, jest to bardzo ważne i należy to zapamiętać.

and i or mają jeszcze jedną, dość specyficzną funkcję która przyda się w pewnej konstrukcji omawianej w następnym rozdziale. Mianowicie, jeśli użyjemy ich dla nie-logicznych zmiennych to:

  • and - jeśli jeden z argumentów jest fałszywy (lub nil) to and zwróci false (lub nil), jeśli oba są fałszywe/nil lub prawdziwe/nie-nil, zostanie zwrócony drugu argument
  • or - jeśli jeden z argumentów jest prawdziwy (true lub nie-nil) to or zwróci prawdziwy argument, jeśli oba są, zwróci pierwszy argument, jeśli wszystkie są fałszywe (lub nil) zwróci ostatni argument.

Trochę to zagmatwane ale przykład powinien wszystko rozjaśnić:

print("and")
print(false and 4)
print(5 and nil)
print(4 and 5)
print(nil or false)
print("or")
print(false or 4)
print(3 or nil)
print(3 or 5)
print(nil or false)

Polecam posiedzieć i przeanalizować to dobrze gdyż wielu moich znajomych widząc takie konstrukcje patrzy tylko w skrypt i mówi „WTF?” ;)

4. Inne operatory

Przedostatni operator który poznaliśmy już na poprzedniej lekcji, ale który dla zasady przedstawię to operator łączenia łańcuchów znaków. Dwa łańcuchy (nie koniecznie łańcuchy, jako że typ zmiennych ma małe znaczenie, możemy łączyć wszystko co da się przedstawić jako tekst) łączymy za pomocą dwóch kropek: „..”. Oczywiście przykład:

print("Ala".." ".."ma".." kota")
print("Ala ma ".. 5 .." kotow")
ile = 3
print("Policze do "..ile..".")
print(1 .. 2)
a = "Ola"
b = "Ali"
str = a.." nie lubi "..b
print(str)

Ostatni natomiast operator (i trzeci już unarny) to operator długości: „#”. Możemy go użyć by sprawdzić długość stringa lub rozmiar tablicy (o tablicach będzie wkrótce). Użycie jest bardzo proste, wystarczy dopisać # przed łańcuch znaków lub zmienną go zawierającą, np: print(#”ala ma kota”)

5. Wyjaśnienia

W tekście posługiwałem się takimi pojęciami jak argument czy „zwróci”. Argument to w tym wypadku zmienna/wartość po prawej lub lewej stronie operatora (po prawej dla operatorów unarnych działających dla jednego argumentu takich jak not, „#” czy „-”). Mówiąc że działanie nam coś zwróci, miałem na myśli oczywiście wynik. Pisząc „5 + 3″ możemy przyjąć że ta instrukcja zwróci nam wynik tego działania, czyli 8.

6. Priorytety operatorów
Z matematyki wiemy że pewne działania wykonujemy przed innymi, np. mnożenie przed dodawaniem. W Lua (jak w większości języków) działania nie są wykonywane od lewej do prawej, tylko w odpowiedniej kolejności zgodnej z priorytetem operatorów. Dzięki temu możemy mieć pewność że 2+2*2 wypisze nam 6.
Lista operatorów wg priorytetów, od najwyższego:
^
not, #, – (unarny)
*, /, %
+, -
..
<, >, <=, >=, ~=, ==
and
or
7. Podsumowanie
Dzisiaj nauczyliśmy się:
  • Jakie mamy operatory arytmetyczne
  • Jakie mamy operatory relacji
  • Jakie mamy operatory logiczne
  • Jak łączyć stringi i sprawdzić ich długość
  • Jakie są priorytety operatorów
8. Ćwiczenia
Dzisiaj pierwszy raz dam ćwiczenia które powinny być opanowane do perfekcji przed przejściem do kolejnej lekcji. Wiadomo że każdy by chciał się szybko nauczyć Lua, jednak bez pracy nie ma kołaczy ;)
a) Bez uruchamiania skryptu spróbuj przewidzieć co zostanie wypisane:
print(((5+5)*3)%3)
print(5^2+-2)
print(10%2 < 2%10)
print(5*5 ~= 5^2)

print(false or (not true))
print(not(false or false))
print((true or false) and (false and (true and true)) or (not false or true))

x = 20%11
str = [[Ala
ma ]]..x.." kotow"
print((#str%3 == 0) and (#str%5 == 0))

b) Korzystając z informacji z poprzedniej i dzisiejszej lekcji napisz kalkulator który pobierze od użytkownika 2 liczby i wypisze wszystkie działania na nich.

Leave a Reply