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

Action!
premenná = výraz

Znak = 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átorVýznamPríkladVýsledok
+sčítanie17+522
-odčítanie17-512
*násobenie17*585
/delenie bez zvyšku17/53
MODzvyšok po delení17 MOD 52
( )zátvorky – počíta sa najprv to, čo je v nich(2+3)*420

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áteneZnamená
x==+5x=x+5
x==-1x=x-1
x==*2x=x*2
x==/2x=x/2

Celý program

Súbor examples/expr.act:

Action!
; 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)
RETURN

Preklad 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: 210

Ako 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 jeVýsledok je
len BYTEBYTE
BYTE a INT, alebo len INTINT
aspoň jeden CARDCARD

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 nulaprogram beží ďalej s nezmyselným výsledkom
výsledok sa nezmestí do typunič – hodnota sa pretočí
x=+5 namiesto x==+5error ACT017: bad expression: unexpected '+'

Vyskúšaj si

  1. Koľko je 7/2*2? A 7*2/2? Vypočítaj si to najprv na papieri (pozor na celočíselné delenie) a over programom.
  2. Vypíš počet hodín a minút v 200 minútach pomocou / a MOD.
  3. Zmeň typ a a b na CARD a pozri, čo sa stane s výpisom 5 - 17 with BYTE.

Zhrnutie

Späť: 6. Premenné · Ďalej: 8. Vstup