Jestliže nevidíte správně česká písmena, zvolte potřebné kódování češtiny manuálně.
U většiny mobilních telefonů se pro psaní textové zprávy používá opakované stisknutí numerické klávesy (1x klávesa 2 znamená A, 2x 2 je B, 3x 2 představuje C, 1x 3 je D atd.) Každá numerická klávesa odpovídá 3 až 4 různým písmenům, případně speciálním znakům. Mezera se podle typu telefonu kóduje buď klávesou 1 nebo 0. Kódování ostatních znaků je velmi nejednotné a v této úloze se jím nebudeme zabývat.
Vytvořte program, který po zadání textu (skládajícího se výhradně z písmen a mezer) vygeneruje potřebnou posloupnost kláves telefonu, jímž je tento text reprezentován. Naopak při zadání posloupnosti číslic převede tuto posloupnost na text.
Při převodu textu na číslice ignorujte všechny zadané znaky kromě (malých a velkých) písmen anglické abecedy a mezer.
Při převodu číslic na text podobně ignorujte všechny znaky kromě číslic (viz však následující bod).
Následují-li za sebou dvě písmena kódovaná stejnou číslicí, dělá se při zadávání do klávesnice mezi nimi časová prodleva. Toto prodlevu budeme v posloupnosti číslic naznačovat mezerou: 222 představuje písmeno C, 22 2 je slovo BA. Slovo PRSTU podobně kódujeme jako 7 777 77778 88. Mezi různými číslicemi se pauza (mezera) dělat může, ale nemusí).
Je-li prvním zadaným znakem písmeno, převádí se text na číslice, je-li jím číslice, převádí se posloupnost číslic na text. Pokud jsou na začátku vstupních dat jiné znaky, ignorují se a o směru převodu rozhodne první písmeno nebo číslice.
Mezera jako textový znak je na některých telefonech zadávána klávesou 1, na jiných klávesou 0. Program bude v řadě číslic na vstupu považovat i 0 i 1 za mezeru. Při konverzi text -> číslice bude program mezeru kódovat číslicí 1.
Všechny bílé znaky - tak, jak je
klasifikuje standardní funkce isspace()
- považujte za
ekvivalentní mezeře.
Na vstupu musí program akceptovat velká i malá písmena (anglické abecedy). Na výstupu bude generovat vždy písmena malá.
Veškeré další znaky bude program ignorovat bez chybové zprávy.
Bude-li ve vstupní řadě číslic následovat za sebou více stejných
číslic, než odpovídá nějakému písmenu (např. 4444 nebo 77777), ohlásí program
chybu a ihned skončí. Chybové hlášení musí obsahovat údaj, která číslice se
opakovala a kolikátý výskyt byl nadbytečný. Přitom main
vrátí nenulový výsledkový kód.
Několik mezer (0 nebo 1) za sebou však není důvodem k ohlášení chyby, opakující
se číslice 0 nebo 1 znamená prostě několik mezer po sobě.
Běžné SMS mají délku omezenu na 160 znaků. Současné telefony však většinou dovolují posílat i delší zprávy (EMS), Váš program proto nesmí délku vstupu omezovat (vstup proto nečtěte do řetězce, ale po znacích). Na druhé straně je však třeba zamezit tomu, aby text vystupující na monitor obsahoval řádky delší než 80 znaků. Pokud se budete blížit této hranici, pokračujte ve výstupu na dalším řádku, nerozdělujte však řádek mezi jednotlivými číslicemi kódujícími totéž písmeno.
Některé implementace omezují délku vstupního řádku např. na 256 znaků. Proto při zadávání delších vstupů dělte vstupní text do nepříliš dlouhých řádků.
Program skončí při stavu "konec souboru" na standardním vstupu (Ctrl D). Tento koncový signál vydávejte vždy na začátku řádku.
S ohledem na charakter úlohy nebude tento program opisovat vstupní data (docházelo by k nepříjemnému promíchání vstupního a výstupního textu).
Program nazvěte
sms.c
a uložte ho do adresáře /export/e1/pb071/
váš_login/cvic6
#include
/home/jkucera/pb071/cvic6/sms
; jeho zdrojový tvar má včetně komentářů
64
řádků (2044 bajtů), studentům však není k dispozici.![]() |
![]() |
![]() |