Capitolul 3.4. Switch

Vezi subiectul anterior Vezi subiectul urmator In jos

Capitolul 3.4. Switch

Mesaj  zooky la data de Mier Mar 18, 2009 12:11 pm

Instructiunea switch este realizator special de decizii multiple care testeaza daca o expresie se potriveste cu una dintr-un numar de valori constante si ramifica corespunzator programul.
In capitolul 1 am scris un program care contorizeaza aparitiile fiecarei cifre, a spatiului, si a tuturor celorlalte caractere, folosind o secventa de if ...else. Dam in continuare acelasi program cu instructiunea switch.

main() /* contorizeaza cifre , blancuri , alte caractere */
{
int c, i, nwhite, nother, ndigit[10];
nwhite = nother = 0;
for (i = 0; i < 10; i++)
ndigit[i] = 0;
while ((c = getchar()) != EOF)
switch (c) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
ndigit[c-'0']++;
break;
case ' ':
case '\n':
case '\t':
nwhite++;
break;
default:
nother++;
break;
}
printf("digits =");
for (i = 0; i < 10; i++)
printf(" %d", ndigit[i]);
printf("\nwhite space= %d, other= %d\n", nwhite,nother);
}

Switch evalueaza expresia intreaga din paranteze (in acest program caracterul c) si compara valoarea ei cu toate cazurile. Fiecare caz trebuie sa fie etichetat cu o constanta intreaga sau caracter sau cu o expresie constanta. Daca un caz se potriveste cu valoarea expresiei, executia incepe la acel caz. Cazul etichetat "default" este executat daca nici unul din cazuri nu este satisfacut.
Un "default" este optional; daca el nu este prezent si nici unul din cazuri nu se potriveste nu se executa nici o actiune. Cazurile si "default" pot apare in orice ordine. Cazurile trebuie sa fie toate diferite.
Instructiunea break declanseaza o iesire imediata din switch.
Deoarece cazurile servesc doar ca etichete, dupa ce codul unui caz a fost executat, executia continua spre urmatoarea instructiune daca nu nu luati o actiune explicita spre a iesi. Break si return sint modurile cele mai uzuale de a parasi o instructiune switch. O instructiune switch poate fi deasemenea folosita si pentru a forta o iesire imediata dintr-o bucla while, for sau do, asa cum vom discuta mai departe in acest capitol.
Ramificarea in cazuri este si buna si rea. Pe partea pozitiva, ea permite mai multe cazuri pentru o singura actiune, asa cum sint cazurile pentru blanc, tab sau linie noua in acest exemplu. Dar implica deasemenea faptul ca, in mod normal, fiecare caz trebuie sa se termine cu un break, pentru a preveni ramificarea pe cazul urmator. Iesirea dintr-un caz in altul nu este buna, fiind inclinata spre dezintegrare atunci cind programul este modificat. Cu exceptia etichetelor multiple pentru un singur caz, aceste iesiri dintr-un caz in altul trebuie folosite cu economie.
Ca o problema de forma buna, puneti un break dupa ultimul caz (la noi, cazul default) chiar daca logic nu este necesar.
Intr-o zi cind veti adauga la sfirsit un caz nou, aceasta bucatica de programare defensiva va va salva.

Exercitiul 3.1. Scrieti o functie expand(s, t) care converteste caracterele de tipul lui "linie noua" si "tab" in secvente escape vizibile de tipul "\n" si "\t" in timp ce se copiaza sirul s in sirul t. Folositi instructiunea switch.
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