Documente online.
Zona de administrare documente. Fisierele tale
Am uitat parola x Creaza cont nou
 HomeExploreaza
upload
Upload




INSTRUCTIUNI DE CONTROL ALE PROGRAMULUI

c


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



Document Info


Accesari: 4013
Apreciat: hand-up

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site


in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate | Termenii si conditii de utilizare




Copyright © Contact (SCRIGROUP Int. 2024 )