26. Formátovaný výpis a prevody: PrintF, Str…, Val…

Na čo to je

Veta „Pedro is 12 years old.“ potrebovala doteraz štyri príkazy: Print, Print, PrintB, PrintE. PrintF to zvládne jedným. Druhá polovica kapitoly je o prevode čísla na text a späť.

PrintF: ako sa to píše

Action!
PrintF("text so značkami", hodnota1, hodnota2, …)

Prvý parameter je formát: text, v ktorom sú na miestach hodnôt značky začínajúce znakom %. Ďalšie parametre sú hodnoty, ktoré sa na miesta značiek dosadia – v poradí, v akom idú.

ZnačkaČo vypíše
%Učíslo bez znamienka (BYTE alebo CARD)
%Ičíslo so znamienkom (INT)
%Cznak
%Sreťazec
%Hčíslo šestnástkovo, so znakom $
%Ekoniec riadka
%%samotný znak %

Hodnôt môže byť najviac päť.

Prevody: ako sa to píše

RutinaSmerPríklad
StrB(číslo, reťazec)BYTE → textStrB(age, text)
StrC(číslo, reťazec)CARD → textStrC(score, text)
StrI(číslo, reťazec)INT → textStrI(change, text)
ValB(reťazec)text → BYTEage=ValB(text)
ValC(reťazec)text → CARDscore=ValC("1234")
ValI(reťazec)text → INTchange=ValI("-77")

Str… sú procedúry: výsledok uložia do reťazca, ktorý im dáš. Val… sú funkcie: vrátia číslo.

Celý program

Súbor examples/printf.act:

Action!
; PrintF and the conversions between numbers and strings

PROC Main()
  CHAR ARRAY name="Pedro", text(10)
  BYTE age
  CARD score, number
  INT  change

  age=12
  score=40000
  change=-25

  PrintF("%S is %U years old.%E", name, age)
  PrintF("Score %U, change %I%E", score, change)
  PrintF("%U in hexadecimal is %H%E", score, score)
  PrintF("A character: %C, a percent sign: %%%E", 'A)

  StrC(score, text)          ; a number into a string
  Print("As a string: ")
  PrintE(text)
  Print("It has ")
  PrintB(text(0))
  PrintE(" characters")

  number=ValC("1234")        ; a string into a number
  Print("ValC(""1234"") plus 1 is ")
  PrintCE(number+1)

  change=ValI("-77")
  Print("ValI(""-77"") times 2 is ")
  PrintIE(change*2)
RETURN

Preklad a spustenie

action26 printf.act --sim

Čo uvidíš

Pedro is 12 years old.
Score 40000, change -25
40000 in hexadecimal is $9C40
A character: A, a percent sign: %
As a string: 40000
It has 5 characters
ValC("1234") plus 1 is 1235
ValI("-77") times 2 is -154

Ako to funguje

Kedy prevody potrebuješ: keď chceš číslo zarovnať, vložiť do dlhšieho textu, alebo spracovať vstup znak po znaku. InputB() z kapitoly 8 nerobí nič iné ako InputS a potom ValB.

Časté chyby

Čo sa staloČo sa stane
menej hodnôt ako značiekna mieste chýbajúcej hodnoty sa vypíše nezmysel
zlá značka pre typ (%S pre číslo)číslo sa použije ako adresa reťazca – vypíše sa nezmysel
chýba %Eďalší výpis pokračuje na tom istom riadku
reťazec pre Str… je malýprepíše sa pamäť za ním; StrC potrebuje až 6 bajtov, StrI 7
Val… dostane text, ktorý nezačína číslomvráti 0

Val… číta číslice od začiatku textu a skončí pri prvom znaku, ktorý číslicou nie je. Medzery na začiatku preskočí.

Vyskúšaj si

  1. Vypíš jedným PrintF riadok malej násobilky: 3 x 7 = 21.
  2. Načítaj riadok cez InputS a preveď ho na číslo cez ValC. Správa sa to rovnako ako InputC()?
  3. Vypíš číslo zarovnané doprava na 5 miest: preveď ho cez StrC, zisti dĺžku a vypíš pred ním chýbajúce medzery.

Zhrnutie

Späť: 25. Strojový kód · Ďalej: 27. Grafika