Capitolul 1.6. Tablouri

Vezi subiectul anterior Vezi subiectul urmator In jos

Capitolul 1.6. Tablouri

Mesaj  zooky la data de Mier Mar 18, 2009 12:46 am

Vom scrie acum un program care va contoriza aparitiile fiecarei cifre, a fiecarui caracter de spatiere (blanc, tab, linie noua) si a tuturor celorlalte caractere. Desigur, este un program artificial, dar ne va permite sa ilustram mai multe aspecte ale lui C intr-un singur program.

Exista 12 categorii de intrari, asa ca ne este mai convenabil sa folosim un tablou pentru a tine numarul de aparitii a fiecarei cifre, decit sa folosim 10 variabile individuale. Iata acum o versiune a acestui program:

main() /* contorizeaza cifre, spatii albe, alte caractere */
{
int c, i, nwhite, nother;
int, ndigit[10];
nwhite = nother = 0;
for (i = 0; i < 10; ++i)
ndigit[i] = 0;
while ((c = getchar()) != EOF)
if (c >= '0' && c <= '9')
++ndigit[c-'0'];
else if (c == ' ' || c == '\n' || c == '\t')
++nwhite;
else
++nother;
printf("digits =");
for (i = 0; i < 10; ++i)
printf(" %d", ndigit[i]);
printf("\nwhite space = %d, other = %d\n",
nwhite, nother);
}

Declaratia

int ndigit[10];

spune ca ndigit este un tablou de 10 intregi. Indicii de tablou intodeauna incep de la zero in C (spre deosebire de FORTRAN sau PL/1 unde incepe de la unu), asa ca elementele tabloului sint ndigit[0], ndigit[1] , ...,ndigit[9]. Acestea se reflecta in buclele "for", care initializeaza si tiparesc tabloul.
Un indice poate sa fie orice expresie intreaga, inclusiv desigur variabilele intregi ca "i", sau constantele intregi.
Acest program particular se bazeaza mult pe proprietatile reprezentarii drept caractere a cifrelor. De exemplu, testul

if (c >= '0' && c <= '9') ...

determina daca un caracter din c este cifra. Daca el este cifra, valoare numerica a acelei cifre este

c - '0'

Acest algoritm functioneaza bine numai daca '0', '1', etc sint pozitive si in ordine crescatoare, si intre '0' si '9' nu se gaseste altceva decit cifre. Din fericire, aceasta este adevarul pentru toate seturile de caractere onventionale.

Prin definitie, calculele aritmetice care implica tipuri "char" si "int", convertesc totul in tipul "int" inainte de prelucrare, asa ca variabilele si constantele de tip "char" sint esential identice cu tipul "int" in contexte aritmetice. Acest fapt este aproape natural si convenabil; de exemplu: c-'0' este o expresie intreaga cu o valoare intre 0 si 9 corespunzatoare caracteruluidintre '0' si '9' depus in c, si deci este un indice valid pentru tabloul ndigit.

Decizia se ia asupra caracterului (daca el este o cifra, un caracter de spatiere sau altceva) in secventa:

if (c >= '0' && c <= '9')
++ndigit[c-'0'];
else if (c == ' ' || c == '\n' || c == '\t')
++nwhite;
else
++nother;

Constructia de tipul

if (conditie)
instructiune
else if (conditie)
instructiune
else
instructiune

apare frecvent in programe ca o modalitate de a exprima deciziile multiple. Codul se citeste simplu de sus in jos pina cind o conditie este indeplinita; in acest punct, se executa partea corespunzatoare de "instructiune" si intreaga constructie este terminata. (Desigur ca "instructiune" pot fi mai multe instructiuni incluse intre paranteze). Daca nici una din conditii nu este indeplinita, instructiunea care urmeaza dupa ultimul "else" este executata daca este prezenta. Daca "else" final si "instructiune" lipsesc (ca in programul nostru), nu are loc nici o actiune. Pot exista un numar arbitrar de constructii de tipul

else if (conditie)
instructiune

grupate intre "if"-ul initial si "else"-ul final. Ca o chestiune de stil, va sfatuim sa formati aceste constructii asa cum le-am facut si noi, astfel incit deciziile lungi sa nu ajunga pe marginea din dreapta a paginii.

Instructiunea "switch", care va fi prezentata in Capitolul 3, reprezinta un alt mod de a scrie o decizie multipla si este potrivita, in particular, cind conditia care se testeaza este simpla sau cind o expresie de caractere sau de intregi se potriveste cu o constanta dintr-un sir dat. Prin contrast, vom prezenta o versiune "switch" a acestui program in Capitolul 3.

Exercitiul 1.12. Scrieti un program pentru a tipari histograma lungimilor cuvintelor care apar la intrare. Este cel mai usor sa desenati histograma orizontal; o orientare verticala este mai laborioasa.
avatar
zooky
Moderator
Moderator

Numarul mesajelor : 147
Data de inscriere : 15/03/2009
Varsta : 24
Localizare : Cernatesti City

Vezi profilul utilizatorului http://e-learning.forumhit.ro

Sus In jos

Vezi subiectul anterior Vezi subiectul urmator Sus


 
Permisiunile acestui forum:
Nu puteti raspunde la subiectele acestui forum