Sunteți pe pagina 1din 4

CURS NR.

9
Instrucţiuni (3)
INSTRUCŢIUNI DE ÎNTRERUPERE ŞI SALT.
INSTRUCŢIUNEA DE SELECŢIE MULTIPLĂ SWITCH
9.1. Instrucţiunea break
Instrucţiunea break are forma generală:
break;
Această instrucţiune se utilizează în corpul unei instrucţiuni de ciclare (for, while sau do…while)
pentru a întrerupe forţat ciclul şi a ieşi din acesta, execuţia continuând cu instrucţiunea care urmează după
ciclu.
O altă utilizare a acestei instrucţiuni este în cadrul instrucţiunii switch, la sfâşitul unui bloc de
instrucţiuni corespunzătoare unui caz, determinând ieşirea în afara instrucţiunii switch după efectuarea
acelui bloc.
Exemplu: Următorul program citeşte de la tastatură un şir de valori reale şi calculează (şi afişează)
sumele parţiale ale elementelor şirului. În cazul în care utilizatorul nu introduce o valoare numerică (ci un
caracter) atunci citira se întrerupe, se afişează numărul de elemente citite corect, apoi programul se opreşte.
#include<stdio.h>
#include<conio.h>
void main(void)
{ float a[11], s=0;
int n=0, i=0;
clrscr();
do{
printf("\n a[%d]=",i);
if(scanf("%f",&a[i])!=1)
break;
printf("\n Suma partiala %d = %f", i+1, s+=a[i]);
n=++i;
}while(i<=10);
printf("\n S-au citit corect %d elemente",n);
printf("\n Program terminat!");
getch();
}
Explicaţii:
Funcţia scanf returnează numărul de valori citite corect de la tastatură. În cazul în care s-a introdus
o valoare eronată (de exemplu un caracter) valoarea returnată de scanf este 0 şi prin urmare, condiţia din
instrucţiunea de decizie if este adevărată, deci se execută corpul acestei instrucţiuni (de decizie), adică
instrucţiunea break. Programul “sare” din ciclul do ... while şi se continuă cu instrucţiunea imediat
următoare ciclului adică:
printf("\n S-au citit corect %d elemente",n);

9.2. Instrucţiunea continue


Instrucţiunea continue are forma generală:
continue;
Această instrucţiune se poate utiliza numai în corpul unui ciclu şi are ca efect abandonarea iteraţiei
curente a ciclului respective, astfel:
- în corpul instrucţiuni de ciclare for determină abandonarea iteraţiei curente şi trecerea la execuţia
reiniţializării;
- în corpurile instrucţiunilor de ciclare while şi do…while determină abandonarea iteraţiei curente şi
trecerea la evaluarea expresiei test care determină continuarea sau terminarea ciclului.

Exemplu: Se consideră exemplul anterior, cu deosebirea că în acest caz dacă citirea unui element nu
s-a efectuat corect se va relua corpul ciclului pentru a citi din nou elementul respectiv, astfel că nu se va
trece mai departe până când elementul curent nu este citit corect. În acest caz nu mai este nevoie de variabila
“n” care contorizează numărul de elemente din şir citite corect deoarece toate elementele vor fi citite corect.

Observaţie: Deoarece în acest program se citeşte în mod repetat cu ajutorul instrucţiunii scanf este
posibil ca în fişierul tampon de citire să rămână nişte valori numite rsturi de citire, la un apel al funcţiei
scanf. În acest caz la următoarele apeluri ale lui scanf vor fi citite resturile din buffer, citirea făcându-se
incorect. Pentru a evita acest lucru se va introduce suplimentar în program citirea unui şir de caractere numit
resturi, prin intermediul funcţiei gets după fiecare apel al funcţiei scanf.

#include<stdio.h>
#include<conio.h>
void main(void)
{ float a[11], s=0;
int i=0; char resturi[80];
clrscr();
do{
printf("\n a[%d]=",i);
if(scanf("%f",&a[i])!=1)
{gets(resturi);
printf("\n Ai gresit!!! Reluam!!!");
getch();
continue;
}
printf("\n Suma partiala %d = %f", i, s+=a[i]);
++i;
}while(i<=10);
printf("\n Program terminat!");
getch();
}

9.3. Instrucţiunea goto


Este o instrucţiune de salt necondiţionat şi are următoarea sintaxă:

eticheta:

goto eticheta;

unde etichetă este un identificator al limbajului C.


Instrucţiunea are ca efect saltul necondiţionat în program la instrucţiunea în faţa căreia se găseşte
eticheta urmată de caracterul :. Saltul se execută numai în corpul funcţiei în care apare goto, de aceea se
spune că este o instrucţiune de salt locală. După executarea sltului nu se mai poate reveni la originea saltului
decât eventual cu o altă instrucţiune de salt deoarece programul “uită” de unde a pornit saltul.

Exemplu:

goto eti_1;

eti_1: scanf(“%d”,&a);

La întâlnirea instrucţiunii goto programul sare la eticheta eti_1, adică se apelează funcţia scanf.
După realizarea citirii valorii lui a execuţia se continuă cu instrucţiunile care urmează după scanf.

9.4. Instrucţiunea switch


Se foloseşte în cazul deciziilor multiple şi are forma generală:

switch(expresie)
{ case c1: bloc_1 break;
case c2: bloc_2 break;

case cn: bloc_n break;
default: bloc
}

unde: expresie este o expresie al cărei rezultat trebuie să fie de tip întreg sau caracter.; c1, c2, …, cn sunt
valori întregi sau caractere; bloc_1, bloc_2…bloc_n, bloc sunt succesiuni de instrucţiuni care nu trebuie
cuprinse între acolade.
Instrucţiunea switch se utilizează în program pentru a comuta execuţia la un anumit bloc de
instrucţiuni din cadrul structurii ei, în funcţie de rezultatul unui test. Pentru fiecare valoare posibilă a
expresiei test poate fi stabilit un caz, deci se poate asocia un bloc de instrucţiuni care va fi executat.

Funcţionare:
La întâlnirea cuvântului switch se evaluează expresia scrisă între paranteze rotunde de după
cuvântul cheie switch. Se compară pe rând valoarea expresiei cu c1, c2, … , cn. Dacă valoarea expresie
este egală cu valoarea uneia dintre constante, se execută blocul de instrucţiuni bloc_i, în caz se execută
blocul de instrucţiuni aferent variantei default: bloc.

Observaţii:
1. instrucţiunea break plasată la sfârşitul unui bloc_i determină părăsirea instrucţiunii switch la
sfârşitul execuţiei blocului bloc_i. În cazul în care lipseşte instrucţiunea break atunci, după execuţia
instrucţiunii i se trece la execuţia instrucţiunii i+1.
2. dacă alternativa default lipseşte şi valoarea expresie nu coincide cu nici una din constantele c1, .. ,
cn atunci instrucţiunea switch nu are niciun efect;
3. ieşirea din switch se poate face şi cu instrucţiunea goto sau return. În acest caz ieşirea din switch
nu se mai face la instrucţiunea de după acolada de închidere ci într-un alt loc din program;
4. structura switch cu instrucţiunea break inclusă pe fiecare variantă este similară cu
pseudoinstrucţiunea else … if:

if(expr == c1) switch(expr)


bloc_1; { case c1: bloc_1 break;
else if (expr == c2)
bloc_2 case c2: bloc_2 break;
… ↔ …
else if (expr == cn)
bloc_n case cn: bloc_n break;
else default: bloc
bloc
}
Exemplu:

În cadrul acestui program se citesc în mod repetat două valori numerice şi un operator (+, -,
*, /, $ sau ^). Programul afişează operaţia definită de cele două valori (operanzi) şi de operator.
Introducerea datelor se realizează în mod repetat (un ciclu cu test final), utilizatorul fiind
întrebat în fiecare etapă dacă doreşte să mai continue.

#include<stdio.h>
#include<conio.h>
#include<math.h>
void main(void)
{char c,op; float a,b,rez;

clrscr();
do {
printf("\n Introduceti variabila a:");scanf("%f",&a);
printf("\n Introduceti variabila b:");scanf("%f",&b);
printf("\n Introduceti operatorul :");op = getche();;

switch(op)
{ case '+': rez = a + b; // adunare
printf("\n %8.3f %c %8.3f = %8.3f",a,op,b,rez);
break;
case '-': rez = a - b; // scadere
printf("\n %8.3f %c %8.3f = %8.3f",a,op,b,rez);
break;
case '*': rez = a * b; // inmultire
printf("\n %8.3f %c %8.3f = %8.3f",a,op,b,rez);
break;
case '/': rez = a / b; // impartire
printf("\n %8.3f %c %8.3f = %8.3f",a,op,b,rez);
break;
case '$': rez = a * b / 2; // media aritmetica
printf("\n %8.3f %c %8.3f = %8.3f",a,op,b,rez);
break;
case '^': rez = pow(a,b); // a la puterea b
printf("\n %8.3f %c %8.3f = %8.3f",a,op,b,rez);
break;
default: printf("\n Operator gresit!!!! Repetati!!!!");
}
printf("\n Doriti sa continuati? <d> sau <D>");
c=getche();
}while(c=='d' || c=='D');

getch();
}

S-ar putea să vă placă și