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
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) |
%C | znak |
%S | reťazec |
%H | číslo šestnástkovo, so znakom $ |
%E | koniec riadka |
%% | samotný znak % |
Hodnôt môže byť najviac päť.
Prevody: ako sa to píše
| Rutina | Smer | Príklad |
|---|---|---|
StrB(číslo, reťazec) | BYTE → text | StrB(age, text) |
StrC(číslo, reťazec) | CARD → text | StrC(score, text) |
StrI(číslo, reťazec) | INT → text | StrI(change, text) |
ValB(reťazec) | text → BYTE | age=ValB(text) |
ValC(reťazec) | text → CARD | score=ValC("1234") |
ValI(reťazec) | text → INT | change=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:
; 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)
RETURNPreklad 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 -154Ako to funguje
- V prvom
PrintFsú dve značky a dve hodnoty:%Sdostanename,%Udostaneage.%Ena konci ukončí riadok –PrintFto sám nespraví. %Ua%Isa líšia tým, ako číslo čítajú. −25 vypísané cez%Uby bolo 65511.%Hvypíše to isté číslo šestnástkovo. Hodí sa pri práci s adresami.StrC(score, text)uloží dotextreťazec"40000". Od tej chvíle je to obyčajný reťazec: má dĺžku 5 vtext(0)a dá sa s ním robiť všetko z kapitoly 19.ValC("1234")vráti číslo 1234, s ktorým sa dá počítať.
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čiek | na 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 číslom | vrá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
- Vypíš jedným
PrintFriadok malej násobilky:3 x 7 = 21. - Načítaj riadok cez
InputSa preveď ho na číslo cezValC. Správa sa to rovnako akoInputC()? - Vypíš číslo zarovnané doprava na 5 miest: preveď ho cez
StrC, zisti dĺžku a vypíš pred ním chýbajúce medzery.
Zhrnutie
PrintF(formát, hodnoty…)vypíše text s dosadenými hodnotami.%Učíslo,%Ičíslo so znamienkom,%Cznak,%Sreťazec,%Hšestnástkovo,%Ekoniec riadka.StrB,StrC,StrImenia číslo na reťazec.ValB,ValC,ValImenia reťazec na číslo.
Späť: 25. Strojový kód · Ďalej: 27. Grafika