PB071 - 6. cvičení

Zadávání SMS prostřednictvím posloupnosti číslic

Úvod:

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.

Zadání:

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.

Požadavky:

  1. 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).
  2. 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í).
  3. Je-li prvním zadaným znakem ve vstupním souboru 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.
  4. 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.
  5. Všechny bílé znaky - tak, jak je klasifikuje standardní funkce isspace() - považujte za ekvivalentní mezeře.
  6. Na vstupu musí program akceptovat velká i malá písmena (anglické abecedy). Na výstupu bude generovat vždy písmena malá.
  7. Veškeré jiné znaky bude program ignorovat bez chybové zprávy.
  8. 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ě.
  9. 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, 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. Při převodu číslic na text je povoleno řádkovat i tam, kde byl nový řádek na vstupu, i když kvůli tomu budou výsledné řádky kratší.
  10. 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ů.
  11. Program skončí při stavu "konec souboru" na standardním vstupu (Ctrl D). Tento koncový signál vydávejte jen na začátku řádku.
  12. 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).
  13. Program nazvěte sms.c a uložte ho do adresáře /export/e1/pb071/váš_login/cvic6

Poznámky:


Předchozí Předchozí cvičení Další Další cvičení Hlavní stránka Hlavní stránka