INSTRUCTIUNI DE CONTROL
ALE PROGRAMULUI
In acest
capitol se prezinta instructiunile de control ale unui program C: instructiunea
expresie, instructiunile decizie (sau de selectie), instructiunile iterative
(repetitive sau de ciclare) si instructiunile se salt. In situatia in care
sintaxa limbajului impune utilizarea unei singure instructiuni, dar logica
programului cere folosirea unei secvente de instructiuni, secventa de instructiuni
se organizeaza ca o instructiune bloc (sau instructiune compusa).
O instructiune bloc incepe cu A si se
termina cu I
instruc|iuni expresie
Instructiunea expresie are forma generala:
expresie;
unde expresie are efect lateral (contine o atribuire sau reprezinta un apel de functie).
Secventa de program urmatoare contine exemple de instructiuni expresie:
xs(a+b)*c;
x+s2;
p++;
getch();
instruc|iuni de decizie
Instruc|iunea if
Forma generala a instructiunii if este:
if(expresie)
instructiune_1;
else
instructiune_2;
Efectul
instructiunii este urmatorul: daca expresie
este adevarata (diferita de zero) se executa instructiune_1 in caz contrar (expresie este egala
cu zero) se executa instructiune_2 Figura
13.1 ilustreaza modul de executie al instructiunii if.
Exemplul 13.1
Programul calculeaza si afiseaza radicalul dintr-un numar.
#include 'stdio.h'
#include 'conio.h'
#include 'math.h'
void main(void)
A
float x,y;
printf('tn Introduceti xs');
scanf('%f',&x);
if (x<s0)
printf('tn Calcul imposibil');
else
A
yssqrt(x);
printf('tn ys%f',y);
I
getch();
I
Observatii:
Sintaxa generala a instructiunii if cere pe ambele alternative cate o instructiune. In situatia in care pe o alternativa sunt necesare mai multe instructiuni acestea vor fi grupatecu ajutorul acoladelor intr-o instructiune bloc. Astfel, in exemplul de mai sus, secventa
A
yssqrt(x);
printf('tn ys%f',y);
I
este o instructiune bloc.
Daca alternativa else a instructiunii if este vida atunci se poate scrie:
if(expresie)
instructiune_1
else;
sau si mai simplu
if(expresie)
instructiune;
forma cunoscuta sub numele de if cu ramura vida.
Instructiunea instructiune se executa numai daca expresia este adevarata, adica
se executa conditionat. Modul de executie al instructiunii if
cu ramura vida este ilustrat in Figura 13.2.
Exemplul 13.2.
Programul calculeaza maximul dintre doua numere.
#include 'stdio.h'
#include 'conio.h'
void main(void)
A
float x,y,max;
printf('tn xs');
scanf('%f',&x);
printf('tn ys');
scanf('%f',&y);;
maxsx;
if (max<y)
maxsy;
printf('tn Maximul dintre xs%.2f si ys%.2f
estes%.2f',x,y,max);
getch();
I
Daca in structura unei instructiuni if intervin alte instructiuni if avem de a face cu o structura de instructiuni if incluse sau imbricate. Forma generala a unei astfel de structuri este urmatoarea:
if(expr1)
instr1;
else
if(expr2)
instr2;
else
if(exprn)
instrn;
else
instrn+1
Efectul executiei unei instructiuni if imbricate este urmatorul: daca nu exista i is1,,n astfel incat expresia expri sa fie adevarata, se executa instrn+1, in caz contrar se executa prima instructiune (considerand evaluarea de sus in jos), instri pentru care expri este adevarata, iar restul instructiunilor se ignora.
Pentru n >mare>, folosind o aliniere stricta, se ajunge la o structura cu adancime mare (mult deplasata spre dreapta). Din acest motiv se foloseste de obicei forma:
if(expr1)
instructiune1;
else if(expr2)
instructiune2;
else if(expr3)
instructiune3;
else
instructiunen+1;
numita si scara if-else-if.
Exemplul 13.3
Programul citeste coordonatele unui numar si stabileste in ce cadran se afla acesta.
#include 'stdio.h'
#include 'conio.h'
void main(void)
A
float x,y;
printf('tn abscisa xs');
scanf('%f',&x);
printf('tn ordonata ys');
scanf('%f',&y);
if (x>s0 && y>s0)
printf('tn Numarul apartine cadranului I');
else if (x<0 && y>s0)
printf('tn Numarul apartine cadranului II');
else if(x<0 && y<0)
printf('tn Numarul apartine cadranului III');
else
printf('tn Numarul apartine cadranului IV');
getch();
I
|inand cont ca in limbajul C orice expresie diferita de zero este adevarata, o secventa de genul
if(expr!s0)
instructiune;
este echivalenta cu
if(expr)
instructiune;
forma care va fi intotdeauna preferata.
Cuvantul else se asociaza intotdeauna cu cel mai apropiat if incomplet care nu este deja asociat cu un else si care este in acelasi bloc cu el.
De exemplu, in secventa
if(x)
if(y)
printf("tn x si y nenuli");
else
printf("tn x nul");
alinierea si mesajele sugereza asocierea lui else cu primul if. In realitate, else se asociaza cu cel de-al doilea if, fiind adecvata alinierea
if(x)
if(y)
printf("tn x si y nenuli");
else
printf("tn x nul");
Daca totusi vrem sa punem in practica prima intentie putem folosi una din formele echivalente:
a) if(x)
A
if(y)
printf("tn x si y nenuli");
I
else
printf("tn x nul");
b) if(x)
if(y)
printf("tn x si y nenuli");
else;
else
printf("tn x nul");
c) if(x&&y)
printf("tn x si y nenuli");
else
if(!x)
printf("tn x nul");
In ideea creerii unor programe >dense> se pot scrie constructii de genul
if( (csgetch() ) ss 'a')
putch('a');
else
printf("tn caracter diferit de a");
unde expresia conditionala contine o atribuire.
Constructiile "dense" trebuie facute insa cu grija, deoarece este posibil sa avem surprize neplacute. Secventa de mai jos
xsys7;
as5;bs6;
if((xsa)½½(ysb))
printf("tnxs%i si ys%i",x,y);
va produce xs5, ys7 si nu xs5 ys6 cum ne-am fi asteptat. Pentru ca expresia
xsa ½½ ysb
sa fi adevarata este suficient ca numai una din expresiile (xsa) sau (ysb) sa fie adevarata. Cu alte cuvinte, se executa atribuirea xs5, expresia (xs5) ia valoarea adevarat, valoarea expresiei (ysb) nu mai are importanta si deci atribuirea ys6 nu mai are loc.
13.2.2. Operatorul condi|ional ? :
Operatorul conditional ?: este un operator ternar, iar forma sa generala este:
expr1?expr2:expr3;
Efectul executiei unei astfel de secvente este echivalent cu efectul executiei secventei:
if expr1
expr2;
else
expr3;
In plus, expresia expr1 expr2 expr3 va lua valoarea expr2 sau expr3 dupa cum expr1 este adevarata sau nu.
Exemplul 13.4
Programul afiseaza maximul dintre doua numere a si b citite de la tastatura.
#include 'stdio.h'
#include 'conio.h'
void main(void)
A
int a,b;
printf('tn as');
scanf('%i',&a);
printf('tn bs');
scanf('%i',&b);
printf('tn Maximul dintre as%i si bs%i este
%i',a,b,a<b?b:a);
getch();
I
13.2.3. Instruc|iunea switch
Instructiunea switch permite selectia unei alternative din mai multe posibile intr-o forma comoda si eleganta.
Forma generala a instructiunii este:
switch(expresie)
A
case c1:secventa de instructiuni1;break;
case c2:secventa de instructiuni2;break;
case cn:secventa de instructiunin;break;
default:secventa de instructiunin+1;break;
I
unde:
expresie este expresia selectoare care trebuie sa fie de tip intreg;
c1,c2,,cn sunt constante de tip intreg distincte intre ele;
default este o eticheta optionala;
secventa instructiunii, pentru orice is1,,n+1 se poate constitui sau nu intr-un bloc de instructiuni, poate sa fie vida sau nu;
break este o instructiune care permite saltul la prima instructiune aflata dupa structura switch. Prezenta sa este optionala.
Efectul instructiunii este urmatorul:
Daca exista un i astfel incat expresia selectoare este egala cu ci se executa secventa instructiunik,k>si pana la primul break intalnit sau pana la sfarsitul instructiunii switch.
Daca pentru orice is1,,n constantele ci sunt diferite de expresia selectoare se executa instructiunen+1, daca exista optiunea default sau se iese direct din switch, daca aceasta lipseste.
Exemplul 13.5.
Programul citeste una din literele a,A,m,M,p,P de la tastatura si afiseaza o lista de nume care incep cu una din aceste litere, fara sa tina cont daca litera este mare sau mica. Daca se tasteaza alt caracter se afiseaza un mesaj de eroare.
#include 'stdio.h'
#include 'conio.h'
void main(void)
A
printf('tn Tastati una din literele:a,A,m,M,p,P ');
switch(getch())
A
case 'a':
case 'A':printf('tn Aurel,Ana,Andrei'); break;
case 'm':
case 'M':printf('tn Maria,Mihai,Marin'); break;
case 'p':
case 'P':printf('tn Paula,Petre,Pavel'); break;
default :printf('tn Ati tastat gresit !');
I
getch();
I
Observatie. In programul de mai sus, indiferent daca s-a tastat a sau A se afiseaza aceeasi lista de nume: Aurel Ana Andrei Explicatia este urmatoarea. Daca se tasteaza a se >intra> in switch, prin case 'a'. Secventa de prelucrari corespunzatoare fiind vida si neantalnindu-se nici o instructiune break se trece si se executa secventa de prelucrari corespunzatoare constantei case 'A' (adica afisarea listei). Deoarece secventa se incheie cu break se >iese> din switch. Analog se intampla si cu grupurile de litere m,M si p,P
13.3. Instruc|iuni iterative
Instructiunile iterative (repetitive sau de ciclare) permit ca una sau mai multe instructiuni sa fie repetate. Numarul de iteratii depinde de indeplinirea unei conditii. Daca testul asupra conditiei se face inaintea instructiunilor care se repeta, se spune ca iteratia e cu test initial; in caz contrar iteratia e cu test final.
In limbajul C exista doua instructiuni cu test initial, while si for si o instructiune cu test final, do - while.
13.3.1. Instruc|iunea while
Forma generala a instructiunii while este:
while(conditie)
instructiune;
unde:
conditie poate fi orice expresie;
instructiune poate fi o instructiune simpla, vida sau o instructiune compusa (numita si corpul ciclului).
Efectul instructiunii este urmatorul: se executa instructiune cat timp conditie e adevarata
(diferita de zero). Atunci cand conditie devine falsa
(egala cu zero), executia programului continua cu instructiunea imediat urmatoare.
Organigrama de mai jos ilustreaza sugestiv modul de lucru al instructiunii while.
Observatii:
Daca din start conditia este falsa instructiune nu se executa niciodata.
Iesirea din ciclu se poate face normal (ca efect al prelucrarilor din instructiune, dupa un numar de pasi, conditie devine falsa), anormal (printr-o instructiune de salt care transfera executia programului din interiorul ciclului in afara lui) sau >niciodata> (conditie ramane mereu adevarata - se obtine asa zisa bucla eterna).
Prezentam mai jos un exemplu de program unde apare foarte naturala prezenta testului initial in bucla si deci folosirea instructiunii while.
Exemplul 13.6
Calculul lungimii unui sir de caractere citit de la tastatura; sfarsitul sirului este marcat de tasta Enter (caracterul 'tr'
#include 'stdio.h'
#include 'conio.h'
void main(void)
A
int is0;
printf('tn Tastati un sir:tn');
while (getche()!s'tr')
i++;
printf('tn Lungimea sirului s%d',i);
getch();
I
13.3.2. Instruc|iunea for
In C, instructiunea for prezenta si in alte limbaje, are implementarea cea mai flexibila. Ea depaseste cadrul traditional in care este plasata de obicei: instructiune cu contor (variabila de control) recomandata spre a fi folosita ori de cate ori se cunoaste numarul de iteratii.
Forma generala a instructiunii for este:
for(initializare;conditie;actualizare)
instructiune;
Semnificatia traditionala a celor trei componente este urmatoarea:
initializare este de regula o instructiune de atribuire folosita pentru initializarea contorului ciclului;
conditie este o expresie care determina sfarsitul ciclului;
actualizare se refera la felul in care se modifica variabila contor.
Instructiunea for este echivalenta cu secventa de instructiuni
initializare
while(conditie)
A
instructiune
actualizare
I
De aici rezulta si efectul executiei sale: se executa blocul instructiune actualizare cat timp conditia este indeplinita.
Exemplul 13.7
Programul realizeaza suma a n numere reale.
#include 'stdio.h'
#include 'conio.h'
void main(void)
A
float ss0,x;
int i,n;
printf('tn ns');
scanf('%i',&n);
for (is0;i<n;i++)
A
printf('tn xa%iis',i);
scanf('%f',&x);
s+sx;
I
printf('tn Suma este s%f',s);
getch();
I
Observatii:
Componenta initializare a instructiunii for poate contine atribuiri care nu se refera neaparat la variabila contor. In exemplul de mai sus initializarea variabilei s se poate face in componenta initializare a ciclului for cu ajutorul operatorului virgula, astfel:
for(ss0,is0;i<n;++i)
A
I
Componenta actualizare a instructiunii for poate sa contina mai multe variabile contor.
Variabila contor nu trebuie sa fie prezenta obligatoriu in componenta conditie a unei instructiuni for.
Exemplul 13.8
Afisarea termenilor sirului lui Fibonacci mai mari ca si mai mici ca un numar dat m. +irul are forma , ., adica primii doi termeni sunt egali cu , iar orice alt termen se obtine ca suma a celor doi termeni care-l preced.
#include 'stdio.h'
#include 'conio.h'
void main(void)
A
int a,b,c,m,i;
printf('tn Limita de afisare s');
scanf('%i',&m);
printf('tn Termenii sirului Fibonacci < %itn',m);
printf('tn 1 1 ');
for (is3,asbs1,cs2;c<m;i++)
A
printf('%i ',c);
asb;bsc;
csa+b;
I
getch();
I
Exemple:
Daca in programul precedent renuntam la ideea de a afisa numarul de ordine al termenilor putem folosi secventa.
for(asbs1,cs2;c<m;)
A
printf("tn Termenul s%i",c)
asb;bsc;
csa+b;
I
Se observa absenta componentei actualizare
Secventa de program
int is50000;
for(;i;i--);
are ca efect introducerea unei temporizari egala cu timpul necesar decrementarii contorului i de la voloare la . Aici se observa absenta componentei initializare si totodata ciclarea unei instructiunii vide.
Oricare din componentele initializare,conditie, actualizare ale instructiunii for poate sa lipseasca, insa delimitatorii ; trebuie sa fie prezenti. Lipsa componentei conditie este interpretata ca fiind echivalenta cu prezenta unei expresii conditionale adevarate. Din acest motiv, secventa
for(;;);
creeaza un ciclu infinit sau o bucla eterna.
13.3.3. Instruc|iunea do-while
Este recomandabil sa se foloseasca instructiunea do-while cand instructiunea care reprezinta corpul ciclului trebuie executata cel putin o data.
Forma generala a acestei instructiuni este:
do
A
instructiuni
I
while(conditie);
Cand corpul ciclului este format dintr-o singura instructiune acoladele pot sa lipseasca. Totusi, este recomandabil sa se pastreze chiar si in aceasta situatie pentru a distinge mai usor o instructiune while care incepe, de o instructiune do-while care se termina.
Efectul instructiunii este urmatorul: se executa secventa de instructiuni cat timp expresia conditionala conditie este adevarata. Organigrama de mai jos ilustreaza cu claritate modul de executie al ciclului do-while.
Observatii:
Datorita asezarii testului de conditie dupa corpul ciclului, este evident ca grupul de instructiuni se executa cel putin o data.
Daca in corpul ciclului nu se afla instructiuni care sa conduca la o conditie falsa dupa un numar finit de ciclari (iesire normala din ciclu) sau instructiuni de salt din interiorul ciclului (iesire anormala) se obtine un ciclu infinit (bucla eterna).
Exemplul 13.9
Programul citeste doua numere a si b de la tastatura si afiseaza suma lor. Procesul continua cat timp la intrebarea "Continuati?" se apasa una din tastele care contin literele d sau D
#include 'stdio.h'
#include 'conio.h'
void main(void
A
float a,b;
char c;
do
A
printf('tn as');
scanf('%f',&a);
printf('tn bs');
scanf('%f',&b);
printf('tn Suma a+bs%.2f',a+b);
printf('tn Continuati? (d/n) ');
csgetch();
I
while (c ss 'D' || c ss 'd');
I
Exemplul 13.10
Programul implementeaza un meniu simplu. Pentru doua numere citite de la tastatura se efectueaza una din urmatorele operatii: suma, diferenta produsul sau impartirea (atunci cand este posibil) sau se iese din meniu.
#include 'stdio.h'
#include 'conio.h'
void main(void)
A
float a,b;
char ch;
printf('tn as');scanf('%f',&a);
printf('tn bs');scanf('%f',&b);
printf('tn + Adunare');
printf('tn - Scadere');
printf('tn * Inmultire');
printf('tn / Impartire');
printf('tn r Renunta!');
printf('tn Introduceti optiunea dvs:');
do
A
chsgetchar();
switch(ch)
A
case '+' :printf('tn a+bs%.2f',a+b); break;
case '-' :printf('tn a-bs%.2f',a-b); break;
case '*' :printf('tn a*bs%.2f',a*b); break;
case '/' :if (b)
printf('tn a/bs%.2f',a/b);
else
printf('tn Impartire
imposibila!');
break;
case 'r' :
case 'R' :exit(0);
I
I
while (ch !s '+' && ch !s '-'
&& ch !s '*' &&
ch !s '/');
getch();
I
Observatie. Functia exit() provoaca intreruperea programului si revenirea in sistemul de operare. Functia are forma generala:
void exit(int cod_retur);
De obicei, cod_retur are valoarea la iesire normala din program si o valoare diferita de in caz contrar.
Exemplul 13.11
Programul calculeaza si afiseaza radicalul dintr-un numar. Noutatea fata de Exemplul 13.1 este aparitia unei bucle iterative de validare: iesirea din bucla urmata de calculul radicalului se face doar atunci cand numarul citit de la tastatura este pozitiv.
#include 'stdio.h'
#include 'conio.h'
#include 'math.h'
void main(void)
A
float x;
do
A
printf('tn xs');
scanf('tn %f',&x);
I
while (x<0);
printf('tn Radical din xs%.2f este ys%.4f',x,sqrt(x));
getch();
I
13.3.4. Cicluri imbricate (incluse)
Exista posibilitatea ca o instructiune de ciclare sa includa o alta instructiune de ciclare; in acest caz se spune ca ciclurile sunt imbricate sau incluse.
Exemplul 13.12
Programul ilustreaza folosirea ciclurilor imbricate:
#include 'stdio.h'
#include 'conio.h'
void main(void)
A
int i,j;
for (is1;i<s5;i++)
A
for (js1;j<si;j++)
printf('%2d',j);
printf('tn');
I;
getch();
I
Rezultatul executiei programului de mai sus este:
Pentru o valoare a variabilei contor i, variabila contor j a ciclului interior variaza de i ori; se spune ca indicele interior variaza mai repede ca indicele exterior.
Evident, o structura de cicluri incluse poate sa contina oricare din instructiunile de ciclare permise in C. Iata un exemplu de acest gen:
Exemplul 13.13
Programul rezolva urmatoarea problema: cat timp se citeste de la tastatura o valoare x diferita de zero se afiseaza sirul de numere x,x+1, x+2, x+3, x+4. Acest proces continua sau se intrerupe la cerere.
#include 'stdio.h'
#include 'conio.h'
void main(void)
A
int x,i;
char ch;
do
A
printf('tn xs');
scanf('%i',&x);
while (x)
A
for (is0;i<5;i++)
printf('%5d',x+i);
printf('tn xs');
scanf('%i',&x);
I
printf('tn Continuati ? (d/n)');
chsgetch();
I
while (ch ss 'd' || ch ss 'D');
I
13.4. Instruc|iuni de salt
In limbajul C exista patru instructiuni care executa un salt neconditionat in program: break, continue, goto, return. Deoarece instructiunea return se refera la revenirea din functia apelata la punctul unde s-a facut apelul, ea va fi tratata mai tarziu in capitolul dedicat functiilor in C.
13.4.1. Instruc|iunea break
Dupa cum s-a vazut la prezentarea instructiunii switch, instructiunea break poate incheia executia unei prelucrari case si forta trecerea executiei la prima instructiune aflata dupa switch. O alta situatie unde instructiunea break isi dovedeste utilitatea este atunci cand se doreste incheierea fortata a unui ciclu. In acest caz intalnirea instructiunii break in corpul ciclului determina intreruperea ciclarii si trecerea controlului la prima instructiune care urmeaza dupa ciclu.
Exemplul 13.14
Programul >extrage> si afiseaza cel mult de numere aleatoare folosind functia rand(). Daca s-a >extras> numarul programul nu mai efectueaza restul >extragerilor>.
#include 'stdio.h'
#include 'conio.h'
#include 'stdlib.h'
void main(void)
A
int i,x;
for (is0;i<20;i++)
A
xsrand()%20+1;
printf('tn %i. S-a extras numarul %i',i+1,x);
if (xss10) break;
I
getch();
I
Precizari. O instructiune break are efect numai asupra ciclului cel mai interior in care se afla. Aceeasi precizare e valabila si la instructiuni switch imbricate sau incluse in cicluri: instructiunea break va afecta numai prima instructiune switch in care se afla, nu si eventualele instructiuni switch sau de ciclare in care ar putea fi inclusa prima.
Exemplul 13.15
Programul tipareste de ori cate numere extrase aleator.
#include 'stdio.h'
#include 'conio.h'
#include 'stdlib.h'
void main(void)
A
int i,j;
for (is0;i<10;i++)
A
printf('tn');
for (js0;j<10;j++)
A
printf('%5d',rand()%10+1);
if (j>s7) break;
I
I
getch();
I
13.4.2. Instruc|iunea continue
Instructiunea continue se foloseste numai in corpul unui ciclu; ea forteaza executia urmatoarei iteratii a ciclului, omitandu-se instructiunile prezente intre cele doua iteratii (locul unde se afla plasata in corpul ciclului si sfarsitul acestuia). Efectul instructiunii este urmatorul:
Cand continue este intalnita intr-un ciclu for se continua cu executia componentei de actualizare si apoi a testului conditional.
Cand este intalnita intr-un while sau do-while, se trece la executia expresiei conditionale.
Exemplul 13.16
Programul citeste de la tastatura numere intregi insumandu-le doar pe cele strict pozitive.
#include 'stdio.h'
#include 'conio.h'
void main(void)
A
int i,x,s;
for (isss0;i<10;i++)
A
printf('tn xs');
scanf('%i',&x);
if (x<s0) continue;
s+sx;
I
printf('tn Suma estes%d',s);
getch();
I
13.4.3. Instruc|iunea goto
Forma generala a instructiunii goto este:
goto eticheta;
eticheta:instructiune;
unde eticheta este numele de identificare al instructiunii instructiune
Efectul executiei instructiunii goto este saltul neconditionat la instructiunea identificata prin eticheta. Saltul poate fi facut inainte sau dupa instructiunea goto. Folosirea frecventa a acestei instructiuni in programe afecteaza claritatea acestora, ingreunand intelegerea lor. Ea poate fi insa evitata in orice situatie utilizand celelalte structuri de control din C. Dam mai jos un exemplu tipic de folosire a instructiunii goto: iesirea fortata dintr-un ciclu sau dintr-o instructiune switch.
Exemplul 13.17
Programul reprezinta o alta implementare a Exemplului 13.10.
#include 'stdio.h'
#include 'conio.h'
void main(void)
A
float a,b;
char ch;
for(;;)
A
clrscr();
printf('tn as');
scanf('%f',&a);
printf('tn bs');
scanf('%f',&b);
printf('tn + Adunare');
printf('tn - Scadere');
printf('tn * Inmultire');
printf('tn / Impartire');
printf('tn r Renunta');
printf('tn Introduceti optiunea dvs:');
chsgetche();
switch (ch)
A
case '+' :printf('tn a+bs%.2f',a+b); break;
case '-' :printf('tn a-bs%.2f',a-b); break;
case '*' :printf('tn a*bs%.2f',a*b); break;
case '/' :if (b)
printf('tn a/bs%.2f', a/b);
else
printf('tn Impartire
imposibila');
break;
case 'r' :
case 'R' :goto STOP;
I
getch();
I
STOP:printf('tn Am renuntat!');
getch();
I
13.4.4. Instruc|iunea return
Instructiunea return realizeaza intoarcerea din functia apelata in functia care a facut apelul (functia apelanta). O discutie detaliata despre instructiunea return se va face in Capitolul 17, capitol dedicat functiilor C.
TESTE DE CONTROL
Secventa de program
int xs-3,ys7;
if (x>0)
printf("tn xs%i",x);
else
if (y)
printf("tn ys%i",y);
else
printf("tn ys0");
a) afiseaza ys7
b) este gresita deoarece o instructiune if contine o alta instructiune if
c) afiseaza xs-3
Secventa de program
if(x)
if(y)
ys3;
else
ys5;
este echivalenta cu
a) if(x)
if(y)
ys3;
else;
else
ys5;
b) if(x&&y)
ys3;
else
ys5;
c) if(x)
A
if(y)
ys3;
I
else
ys5;
d) nici una din secventele a), b), c)
Secventa de program
int xs1,ys2;
if ((xs0)&&(ys4))
printf("tn xs%i ys%i",x,y);
a) afiseaza xs1 ys2
b) afiseaza xs0 ys4
c) nu afiseaza nimic deoarece printf() nu se executa
Secventa de program
if(x)
ys1/x;
a) este gresita
b) este echivalenta cu
if (x!s0)
ys1/x;
c) este chivalenta cu
if x!s0
ys1/x;
Secventa de program
if (x>s3)
yssqrt(x-3);
else;
a) este gresita deoarece contine semnul ; inainte de else
b) este gresita deoarece dupa else lipseste o instructiune C
c) este corecta si este echivalenta cu secventa
if(x>s3)
yssqrt(x-3);
Secventa de program
int xs3,ys6;
if (x>0)
printf("tn xs%i",x);
else
ysx+3;
printf("tn ys%i",y);
afiseaza
a) xs3
b) ys6
c) xs3
ys6
Secventa de program
int xs3,ys4;
printf("tn %i",x>y?x:y);
a) afiseaza
b) afiseaza
c) este gresita deoarece argumentul functiei printf() este o expresie, nu o variabila.
Secventa de program
char xs'a';
switch(x)
A
case 'a':printf("tn amic");
case 'A':printf("tn Amare");
I
afiseaza
a) amic
b) Amare
c) amic
Amare
Secventa de program
int xs3;
if (xs4)
printf("tn xs%i",x);
a) este gresita
b) este corecta, dar nu afiseaza nimic
c) este corecta si afiseaza valoarea
d) este corecta si afiseaza valoarea
Secventa de program
char xs'a';
switch(x)
A
case 'a':printf("tn amic");break;
case 'A':printf("tn Amare");
I
a) afiseaza amic
b) afiseaza Amare
c) afiseaza
amic
Amare
d) este gresita deoarece al doilea case nu se termina cu break
Secventa de program
int is3;
while(i)
i--;
printf("%3i",i);
a) afiseaza 2 1 0
b) contine o bucla eterna
c) afiseaza 0
Secventa de program
int is3;
while(i)
printf("%3i",i);
i--;
a) afiseaza valoarea de ori
b) afiseaza valoarea de o infinitate de ori (bucla eterna)
c) afiseaza
Secventa de program
int is3;
while(i);
printf("%3i",i);
i--;
a) afiseaza valoarea de ori
b) afiseaza valoarea de o infinitate de ori (bucla eterna)
c) contine o bucla eterna si nu afiseaza nimic
d) afiseaza 3 2 1
Secventa de program
int is3;
while(i)
A
printf("%3i",i);
i--;
I
a) afiseaza 3 2 1 0
b) afiseaza 3 2 1
c) contine o bucla eterna
Secventa de program
int is0;
while(i)
printf("%3i",i);
a) afiseaza valoarea
b) afiseaza valoarea de o infinitate de ori (bucla eterna)
c) nu afiseaza nimic
Secventa de program
int is0;
for (;i<3;i++);
printf("%3i",i);
a) este gresita sintactic deoarece lipseste componenta de initializare a instructiunii for
b) afiseaza valorile 0 1 2 3
c) afiseaza valorile 0 1 2
d) afiseaza valoarea
e) contine o bucla eterna afisandu-se permanent valoarea
f) contine o bucla eterna si nu afiseaza nimic
Secventa de program
int i,j;
for (is1,js10;i<s5;i++,j--)
printf("tn %i %2i",i,j);
a) este gresita deoarece instructiunea for contine doua variabile contor i,j
b) este gresita deoarece componenta initializare a instructiunii for contine doua initializari
c) este corecta si afiseaza
Secventa de program
int i;
for (is1;-3<si&&i<1;i--)
printf("tn%3i",i);
a) nu afiseaza nimic
b) afiseaza 0 -1 -2 -3
c) contine o bucla eterna
In secventa de program
int xs1,i;
for(is1;x<s3;i++)
scanf("%i",&x);
a) functia scanf() se executa de 3 ori
b) functia scanf() se executa de o infinitate de ori
c) instructiunea for este gresita deoarece contorul i nu se testeaza niciodata
d) se iese din bucla numai dupa ce s-a citit o valoare x>3
Secventa de program
int i;
for(is1,i<s3;i++)
printf("%3i",i)
a) este gresita
b) contine o bucla eterna
c) afiseaza 1 2 3
Secventa de program
int i;
for (is1,i<s3;i++)
printf("%3i",i)
a) contine o instructiune for gresita sintactic
b) afiseaza 1 2 3
c) contine o bucla for eterna
Secventa de program
for();
a) este o bucla for eterna
b) este gresita sintactic
c) apeleaza functia for()
Secventa de program
float xs-3.2;
do
scanf("%f",&x);
while (x>0);
a) citeste x pana cand x>0
b) citeste x cat timp x>0
c) este gresita deoarece functia scanf() nu este pusa intre acolade
d) nu executa nici o citire a lui x
Secventa de program
int j;
do
js3;
while (j<s4);
A
printf("%3i",j);
j++;
I
a) afiseaza valoarea
b) afiseaza valorile
c) contine o bucla do-while eterna
d) contine o bucla while eterna
e) este gresita
Secventa de program
int is1;
do
printf("tn%i",i);
i++;
while(i<s2);
a) afiseaza
b) este gresita deoarece instructiunile dintre do si while trebuie sa fie cuprinse intre acolade
Secventa de program
int i,j;
for(is1;i<s2;i++)
for(js1;j<s2;j++)
printf("tn is%i js%i",i,j);
afiseaza
a) is1 js1
is2 js2
b) is1 js1
is1 js2
is2 js1
is2 js2
c) is1 js1
is2 js1
is1 js2
is2 js2
Secventa de program
int i,j;
for(is1;i<s3;i++)
A
printf("tn");
for(js1;j<si;j++)
printf("%3i",j);
I
a) este gresita deoarece limitele de variatie ale contorului j depind de contorul i al primului ciclu
b) este corecta si afiseaza
c) este corecta si afiseaza
Secventa de program
int i;
for(is1;i<s5;i++)
A
printf("%3i",i);
if(iss3)break;
I
a) este gresita deoarece instructiunea break se foloseste numai asociata cu switch
b) este corecta si afiseaza 1 2 3
c) este corecta si afiseaza deoarece instructiunea break cuprinsa in corpul unui ciclu for nu are nici un efect
Secventa de program
int i,j;
for(is1;i-3;i++)
for(js0;j-9;j++)
A
printf("tn Sunt aici!");
if (!j)break;
I
a) afiseaza mesajul Sunt aici! de ori
b) afiseaza mesajul Sunt aici! de ori
c) afiseaza mesajul Sunt aici! o data
Secventa de program
int s,i;
for(ss0,is10;i;i--)
A
s+si;
if(i-5)continue;
I
a) calculeaza suma ss10+9+8+7+6+4+3+2+1
b) calculeaza suma ss10+9+8+7+6+5+4+3+2+1
c) calculeaza suma ss5
Secventa de program
int s,i;
for(ss0;is10;i;i--)
A
if(i-5)continue;
s+si;
I
a) calculeaza suma ss10+9+8+7+6+4+3+2+1
b) calculeaza suma ss10+9+8+7+6+5+4+3+2+1
c) calculeaza suma ss5
Secventa de program
int s,i;
for(ss0;is10;i;i--)
A
if(iss5)continue;
s+si;
I
a) calculeaza suma ss10+9+8+7+6+4+3+2+1
b) calculeaza suma ss10+9+8+7+6+5+4+3+2+1
c) calculeaza suma ss5
Secventa de program
int is1;
while(i<3)
A
if!(iss2)continue;
printf("%3i",i);
i++;
I
a) afiseaza si intra intr-o bucla eterna
b) afiseaza
c) afiseaza
Secventa de program
int is1,ss0;
et1:if(i>10)
goto et2;
s+si;
i++;
goto et1;
et2:printf("tn ss%d",s);
a) este gresita deoarece contine salturi inapoi
b) este corecta si realizeaza o iteratie pentru calculul primelor numere naturale
c) este corecta si este echivalenta cu secventa
int s,i;
for(ss0,is1;i<11;i++)
s+si;
printf("tn ss%d",s);
d) este corecta si este echivalenta cu secventa
int is1,ss0;
while(i<11)
A
s+si;
i++;
I
printf("tn ss%d",s);
RASPUNSURI
13.1-a 13.2-d 13.3-c 13.4-b 13.5-c
13.6-c 13.7-b 13.8-c 13.9-c 13.10-a
13.11-c 13.12-b 13.13-c 13.14-b 13.15-c
13.16-d 13.17-c 13.18-a 13.19-d 13.20-a
13.21-a 13.22-b 13.23-b 13.24-c 13.25-b
13.26-b 13.27-b 13.28-b 13.29-a 13.30-b
13.31-c 13.32-a 13.33-a 13.34-b, c, d
|