7. Počítanie: výrazy a priradenie
Na čo to je
Program počíta: sčíta skóre, zistí, koľko ostáva životov, prepočíta súradnice. Zápis výpočtu sa volá výraz a jeho výsledok sa zvyčajne uloží do premennej.
Ako sa to píše
premenná = výrazZnak = tu neznamená „rovná sa“ ako v matematike. Znamená „vypočítaj to, čo je vpravo, a ulož to do premennej vľavo“. Preto dáva zmysel aj x=x+1: zober x, pripočítaj 1 a ulož späť do x.
| Operátor | Význam | Príklad | Výsledok |
|---|---|---|---|
+ | sčítanie | 17+5 | 22 |
- | odčítanie | 17-5 | 12 |
* | násobenie | 17*5 | 85 |
/ | delenie bez zvyšku | 17/5 | 3 |
MOD | zvyšok po delení | 17 MOD 5 | 2 |
( ) | zátvorky – počíta sa najprv to, čo je v nich | (2+3)*4 | 20 |
Poradie: najprv zátvorky, potom *, / a MOD, nakoniec + a -. Operátory rovnakej sily sa počítajú zľava doprava.
Skrátené priradenie
Zmeniť premennú o nejakú hodnotu je také časté, že má vlastný zápis:
| Skrátene | Znamená |
|---|---|
x==+5 | x=x+5 |
x==-1 | x=x-1 |
x==*2 | x=x*2 |
x==/2 | x=x/2 |
Celý program
Súbor examples/expr.act:
; Counting with numbers
PROC Main()
BYTE a, b, small
CARD result
INT x, y, diff
a=17
b=5
result=a+b Print("17 + 5 = ") PrintCE(result)
result=a-b Print("17 - 5 = ") PrintCE(result)
result=a*b Print("17 * 5 = ") PrintCE(result)
result=a/b Print("17 / 5 = ") PrintCE(result)
result=a MOD b Print("17 MOD 5 = ") PrintCE(result)
result=2+3*4 Print("2 + 3 * 4 = ") PrintCE(result)
result=(2+3)*4 Print("(2 + 3) * 4 = ") PrintCE(result)
diff=b-a Print("5 - 17 with BYTE = ") PrintIE(diff)
x=5 y=17
diff=x-y Print("5 - 17 with INT = ") PrintIE(diff)
small=250
small=small+10 Print("250 + 10 in a BYTE = ") PrintBE(small)
result=100
result==+5 Print("100, then ==+5: ") PrintCE(result)
result==*2 Print("then ==*2: ") PrintCE(result)
RETURNPreklad a spustenie
action26 expr.act --simČo uvidíš
17 + 5 = 22
17 - 5 = 12
17 * 5 = 85
17 / 5 = 3
17 MOD 5 = 2
2 + 3 * 4 = 14
(2 + 3) * 4 = 20
5 - 17 with BYTE = 244
5 - 17 with INT = -12
250 + 10 in a BYTE = 4
100, then ==+5: 105
then ==*2: 210Ako to funguje
Delenie je celočíselné. 17 delené 5 je 3 a zvyšok 2. Výsledok delenia je 3, zvyšok dá MOD. Desatinné čísla Action! nemá.
Násobenie má prednosť pred sčítaním. 2+3*4 je 2 + 12 = 14. Ak chceš najprv sčítať, daj sčítanie do zátvoriek.
Dve pasce, ktoré treba poznať
1. Typ výsledku určujú typy vo výraze, nie premenná, do ktorej ukladáš.
diff=b-a počíta 5 − 17. Obe premenné sú BYTE, preto sa aj výsledok počíta ako BYTE – a ten záporný byť nemôže. Vyjde 244 a až táto hodnota sa uloží do diff. To, že diff je INT, už nepomôže.
V druhom výpočte sú x a y typu INT, výsledok je INT a vyjde správnych −12.
Pravidlo:
| Vo výraze je | Výsledok je |
|---|---|
len BYTE | BYTE |
BYTE a INT, alebo len INT | INT |
aspoň jeden CARD | CARD |
Keď výsledok môže vyjsť mimo 0 až 255, musí byť aspoň jedna premenná vo výraze väčšieho typu.
2. Pretečenie sa nehlási.
small=250 a small=small+10 dá 4, nie 260. BYTE má len 256 hodnôt a po 255 nasleduje znova 0 – ako počítadlo kilometrov, ktoré sa pretočí. Program nezastane ani nič nevypíše. Rovnako pretečie CARD za 65535 a INT za 32767.
Časté chyby
| Čo sa stalo | Čo povie prekladač alebo program |
|---|---|
delenie nulou v zdrojáku (a=10/0) | warning ACT217: division by zero in a constant expression |
| delenie premennou, v ktorej je nula | program beží ďalej s nezmyselným výsledkom |
| výsledok sa nezmestí do typu | nič – hodnota sa pretočí |
x=+5 namiesto x==+5 | error ACT017: bad expression: unexpected '+' |
Vyskúšaj si
- Koľko je
7/2*2? A7*2/2? Vypočítaj si to najprv na papieri (pozor na celočíselné delenie) a over programom. - Vypíš počet hodín a minút v 200 minútach pomocou
/aMOD. - Zmeň typ
aabnaCARDa pozri, čo sa stane s výpisom5 - 17 with BYTE.
Zhrnutie
premenná=výrazvypočíta výraz a uloží výsledok./delí bez zvyšku, zvyšok dáMOD.- Najprv zátvorky, potom
* / MOD, potom+ -. - Výraz zo samých
BYTEsa počíta vBYTE. Ak má vyjsť viac ako 255 alebo menej ako 0, použi vo výrazeCARDaleboINT. - Pretečenie program nehlási.
x==+1je skratka zax=x+1.
Späť: 6. Premenné · Ďalej: 8. Vstup