U vetsiny mobilních telefonu se pro psaní textové zprávy pouzívá opakované stisknutí numerické klávesy (1x klávesa 2 znamená A, 2x 2 je B, 3x 2 predstavuje C, 1x 3 je D atd.) Kazdá numerická klávesa odpovídá 3 az 4 ruzným písmenum, prípadne speciálním znakum. Mezera se podle typu telefonu kóduje bud klávesou 1 nebo 0. Kódování ostatních znaku je velmi nejednotné a v této úloze se jím nebudeme zabývat.
Vytvorte program, který po zadání textu (skládajícího se výhradne z písmen a mezer) vygeneruje potrebnou posloupnost kláves telefonu, jímz je tento text reprezentován. Naopak pri zadání posloupnosti císlic prevede tuto posloupnost na text.
Pri prevodu textu na císlice ignorujte vsechny zadané znaky krome (malých a velkých) písmen anglické abecedy a mezer.
Pri prevodu císlic na text podobne ignorujte vsechny znaky krome císlic (viz vsak následující bod).
Následují-li za sebou dve písmena kódovaná stejnou císlicí, delá se pri zadávání do klávesnice mezi nimi casová prodleva. Toto prodlevu budeme v posloupnosti císlic naznacovat mezerou: 222 predstavuje písmeno C, 22 2 je slovo BA. Slovo PRSTU podobne kódujeme jako 7 777 77778 88. Mezi ruznými císlicemi se pauza (mezera) delat muze, ale nemusí).
Je-li prvním zadaným znakem písmeno, prevádí se text na císlice, je-li jím císlice, prevádí se posloupnost císlic na text. Pokud jsou na zacátku vstupních dat jiné znaky, ignorují se a o smeru prevodu rozhodne první písmeno nebo císlice.
Mezera jako textový znak je na nekterých telefonech zadávána klávesou 1, na jiných klávesou 0. Program bude v rade císlic na vstupu povazovat i 0 i 1 za mezeru. Pri konverzi text -> císlice bude program mezeru kódovat císlicí 1.
Vsechny bílé znaky - tak, jak je
klasifikuje standardní funkce isspace() - povazujte za
ekvivalentní mezere.
Na vstupu musí program akceptovat velká i malá písmena (anglické abecedy). Na výstupu bude generovat vzdy písmena malá.
Veskeré dalsí znaky bude program ignorovat bez chybové zprávy.
Bude-li ve vstupní rade císlic následovat za sebou více stejných
císlic, nez odpovídá nejakému písmenu (napr. 4444 nebo 77777), ohlásí program
chybu a ihned skoncí. Chybové hlásení musí obsahovat údaj, která císlice se
opakovala a kolikátý výskyt byl nadbytecný. Pritom main vrátí nenulový výsledkový kód.
Nekolik mezer (0 nebo 1) za sebou vsak není duvodem k ohlásení chyby, opakující
se císlice 0 nebo 1 znamená proste nekolik mezer po sobe.
Bezné SMS mají délku omezenu na 160 znaku. Soucasné telefony vsak vetsinou dovolují posílat i delsí zprávy (EMS), Vás program proto nesmí délku vstupu omezovat (vstup proto nectete do retezce, ale po znacích). Na druhé strane je vsak treba zamezit tomu, aby text vystupující na monitor obsahoval rádky delsí nez 80 znaku. Pokud se budete blízit této hranici, pokracujte ve výstupu na dalsím rádku, nerozdelujte vsak rádek mezi jednotlivými císlicemi kódujícími totéz písmeno.
Nekteré implementace omezují délku vstupního rádku napr. na 256 znaku. Proto pri zadávání delsích vstupu delte vstupní text do neprílis dlouhých rádku.
Program skoncí pri stavu "konec souboru" na standardním vstupu (Ctrl D). Tento koncový signál vydávejte vzdy na zacátku rádku.
S ohledem na charakter úlohy nebude tento program opisovat vstupní data (docházelo by k nepríjemnému promíchání vstupního a výstupního textu).
Program nazvete
sms.c
.
#include
#include<stdio.h>
#include<ctype.h>
int i,j,k,l=-1,pocet=0,out=0;
char a,b=' ',znak[3][8]={"adgjmptw","behknqux","cfilorvy"};
int main()
{
printf("\nZadaj prevadzany retezec:\n");
/*-------------------nacitanie prveho znaku----------------------------------*/
if (scanf("%c",&a)==EOF) {printf("Neni co prevest\n");return 0;}
if (!isalnum((int)a)) main();
if (isalpha((int)a))
{ /* --------------------Znak->Cislo----------------------------------------*/
for(;;)
{
if ((isalpha((int)a))||isspace((int)a))
{a=tolower(a);
for(i=0;i<3;i++)
{for(j=0;j<8;j++)
if (znak[i][j]==a) {if (j==l) {printf(" ");++out;} l=j;
for(k=0;k<i+1;k++) {printf("%d",j+2);++out;};
if (out>75) {printf("\n");out=0;};
}
}
}
if(a=='s') {if(l==5) {printf(" ");}printf("7777"); l=5;out+=5;}
if(a=='z') {if(l==7) {printf(" ");}printf("9999"); l=7;out+=5;}
if (isspace((int)a)) {printf("1"); l=-1;++out;}
if (out>75) {printf("\n");out=0;};
if (a=='\n') out=0;
if (scanf("%c",&a)==EOF) {printf("\n");return 0;}
}
}
else /*-----------------------Cislo->Znak------------------------------------*/
{
for(;;)
{if((isdigit((int)a))||(isspace((int)a)))
{
if (isspace((int)b)) pocet=0;
if((b=='1')||(b=='0')) {++out;printf(" ");}
if ((a!=b)&&(!isspace((int)b))&&(b!='1'||b!='0')&&(pocet<=2))
{printf("%c",znak[pocet][((int)b)-50]);
++out;
pocet=0;
}
if((b=='7')&&(pocet==3)&&(a!=b)){printf("s");++out;pocet=0;}
if((b=='9')&&(pocet==3)&&(a!=b)){printf("z");++out;pocet=0;}
if(((pocet>2)&&((b!='7')&&(b!='9')))||(pocet>3))
{printf("\n pocet:%d. vyskyt cislice %c za sebou - konec \n",pocet+1,b);
return 1;
}
if((a==b)&&(!isspace((int)b))&&(b!='1')&&(b!='0'))pocet++;
b=a;
}
if (out>78) {printf("\n");out=0;}
if (a=='\n') out=0;
if (scanf("%c",&a)==EOF) {printf("\n");return 0;}
}
/*-----------------------------END-------------------------------------------*/
}
return 0;
}