Sunteți pe pagina 1din 32

Laborator 13 - Referat

STRUCTURA DE DECIZIE

1. Suport teoretic
Structurile fundamentale (tip) care pot fi utilizate pentru a reprezenta algoritmul unui
program sunt de trei tipuri:
- structura secvențială;
- structura de decizie;
- structura repetitivă.

Structura de decizie (ramificată)


Structura de decizie (se mai numește și structură alternativă sau structură ramificată)
introduce în algoritm operația de ramificare, stabilirea valorii adevărat sau fals a acesteia și
adoptarea unei decizii privind modul în care se continuă calculele.
Luarea deciziilor este un proces fundamental în cadrul limbajelor de programare. Se
întâlnesc foarte des situații în care trebuie executată o serie de instrucțiuni în cazul în care una
sau mai multe condiții sunt/ nu sunt îndeplinite. Exemplu: afișarea unui mesaj sau pornirea unei
alarme în cazul în care o valoare măsurată iese dintr-un anumit interval.
Structura de decizie poate fi utilizată sub mai multe forme: structură simplă, dublă sau
imbricată.

A. Structura de decizie simplă


Acest tip de structură de decizie se utilizează mai mult în cazul în care se dorește
verificarea unor coduri de eroare. Forma generală de reprezentare a structurii de decizie simplă
este prezentată în fig.1. În figură se identifică blocul de decizie dublă (rombul) în interiorul
căruia se află expresia care urmează a fi testată. Expresia ”test” poate fi simplă (o operație

1
relațională) sau compusă (operații logice). Rezultatul expresiei ”test?” se va interpreta ca valoare
de adevăr (Adevărat sau Fals). Reamintim faptul că în limbajul de programare C orice valoare
nenulă este considerată ca valoare de adevăr Adevărat și numai zero (0) sau ”null” sunt
considerate ca fiind de tip Fals. Blocul ”set instrucțiuni” reprezintă instrucțiunea sau setul de
instrucțiuni/expresii care se doresc a se executa în cazul în care rezultatul evaluării expresiei
”test” este Adevărat.

Fig. 1 Forma generală a structurii de decizie simplă


Pentru schema logică de mai sus, reprezentarea în pseudocod este următoarea:
| ...
| dacă (test?) atunci
| set instrucțiuni
| sfârșit dacă
| ...
Setul de instrucțiuni reprezintă o instrucțiune sau mai multe instrucțiuni delimitate
de acolade { … } care se vor executa în cazul în care testul returnează valoare de adevăr
Adevărat.

Exemplu 1:
a. Formularea problemei
Să se afişeze modulul unui număr x dat de utilizator.

2
b. Precizarea datelor de intrare, a rezultatelor şi a variabilelor intermediare
Datele de intrare/inițiale:
- x - numărul introdus;
Datele de ieşire/finale:
- x - valoarea în modul a numărului x.
Variabilele programului “modulX”

Parametrul Unitatea Valoarea


Nr.crt. Identificator Tipul variabilei
reprezentat de măsură atribuită

1 Numărul introdus - x int 9

c. Alcătuirea modelului matematic


x = x dacă x > 0 și x = (- x) dacă x < 0
d. Alcătuirea algoritmului programului
Schema logică “modulX” este prezentată în fig.2.

3
Fig. 2. Schema logică a algoritmului de rezolvare a problemei “modulX”
Pseudocodul :

| - - program modulX - -
| citeşte x
| dacă ( x < 0 ) atunci
| x = -x
| sfârșit dacă
| afişează x
| - - sfârşit modulX - -

e. Verificarea algoritmului
Tabelul de verificare al variabilelor programului “modulX”

Identific Tipul Valoarea atribuită


ator variabilei Varianta 1 Varianta 2

x int 9 -5 5

În tabelul precedent, în cazul Variantei 2, valoarea variabilei x se actualizează, vechea


valoare fiind tăiată cu o linie. Pasul acesta se execută atunci când în tabelul de verificare al
algoritmului (tabelul de mai jos) se ajunge în cazul Variantei 2, la instrucțiunea x = - x. Acest
lucru reprezintă faptul că din acest punct înainte programul va citi ultima valoare atribuită (în
cazul de față 5).
Tabelul de verificare al algoritmului programului “modulX”

4
f. Alcătuirea programului sursă / codul aplicației
Fișierul sursă corespunzător algoritmului din fig. 2 este:

#include <stdio.h>
int main(){
int x;
printf("Dati x:");
fflush(stdout); // numai daca nu afiseaza mesajul inainte de citire
scanf("%d",&x);
if( x < 0 )
x = -x;
printf("|x| = %d", x);
return 0;
}

g. Executarea programului

a) b)
Fig. 3. Conţinutul consolei la rularea programului “modulX”.

5
a) Varianta 1, b) Varianta 2
h. Verificarea programului
Este obligatoriu ca rezultatele afișate la Console să fie verificate prin comparare cu valorile
obținute în tabelul de verificare a algoritmului.
Exercițiu: Adăugați încă o coloană în tabelele de verificare (variabile și program) și
completați cu valorile corespunzătoare pentru x = 0. Verificați dacă ceea ce afișează Eclipse în
consolă corespunde cu ceea ce ați completat în tabele.

B. Structura de decizie dublă


Această formă a structurii de decizie este cel mai des utilizată. Forma generală de
reprezentare este prezentată în fig.3. Ca și în cazul structurii de decizie simplă, dacă rezultatul
”test?” este Adevărat se va executa setul de instrucțiuni care se află pe ramura cu ”DA”, în cazul
în care rezultatul testului nu este Adevărat se va executa setul de instrucțiuni situat pe ramura
”NU”.

Fig. 3 Schema logică pentru reprezentarea structurii de decizie


Pentru schema logică de mai sus, reprezentarea în pseudocod este următoarea:
| ...
| dacă (test?) atunci
| set instrucțiuni 1
| altfel

6
| set instrucțiuni 2
| sfârșit dacă
| ...

Exemplu 2:
a. Formularea problemei
Fie a şi b două numere date de utilizator. Se cere să se afişeze maximul şi suma acestora.

b. Precizarea datelor de intrare, a rezultatelor şi a variabilelor intermediare


Datele de intrare/inițiale:
- a, b - numerele introduse;
Datele de ieşire/finale:
- max - valoarea maximă
- suma - suma celor două numere.
Variabilele programului “maxSuma”

Parametrul Unitatea Valoarea


Nr.crt. Identificator Tipul variabilei
reprezentat de măsură atribuită

1 Primul număr - a int 9

2 Al doilea număr - b int 2

3 Nr. maxim - max int -

4 Suma - suma int -

c. Alcătuirea modelului matematic


dacă a > b => max = a
dacă b > a => max = b
suma = a + b
d. Alcătuirea algoritmului programului
Schema logică “maxSuma” este prezentată în fig.4.

7
Fig. 4. Schema logică a algoritmului de rezolvare a problemei “maxSuma”
Pseudocodul :

| - - program maxSuma - -
| citeşte a, b
| dacă ( a > b ) atunci
| max = a
| altfel
| max = b
| sfârșit dacă
| suma = a + b
| afişează max, suma
| - - sfârşit maxSuma - -

e. Verificarea algoritmului
Tabelul de verificare al variabilelor programului “maxSuma”

Identific Tipul Valoarea atribuită


ator variabilei Varianta 1 Varianta 2

a int 9 1

8
b int 7 17

max int 9 17

suma int 16 18

Tabelul de verificare al algoritmului programului “maxSuma”

f. Alcătuirea programului sursă / codul aplicației


Fișierul sursă corespunzător algoritmului “maxSuma” este:

#include <stdio.h>
int main(){
int a, b;
int max, suma;
printf("Dati a si b:");
fflush(stdout);

9
scanf("%d%d", &a, &b);
if( a > b )
max = a;
else
max = b;
suma = a + b;
printf("max = %d\n", max);
printf("suma = %d", suma);
return 0;
}

g. Executarea programului

a) b)
Fig. 3. Conţinutul consolei la rularea programului “maxSuma”
a) Varianta 1, b) Varianta 2
h. Verificarea programului
Exercițiu: Adăugați încă o coloană în tabelele de verificare (variabile și program) și
completați cu valorile corespunzătoare pentru a = b = 5. Verificați dacă ceea ce afișează Eclipse
în consolă corespunde cu ceea ce ați completat în tabele.
Întrebare: Cum trebuie modificat programul pentru a funcționa corect și în cazul numerelor
negative?
Modificați programul astfel încât să afișeze suma numerelor numai dacă primul număr este
mai mare (se va folosi un singur if). Ce trebuie modificat pentru a afișa suma numai în cazul în
care al doilea număr este mai mare?

C. Structura de decizie imbricată (nested if())


Această formă a structurii de decizie se utilizează mai rar, dar în unele cazuri este necesară
pentru a obține pași de execuție mai puțini. Presupune testarea unei expresii, iar în funcție de
valoarea de adevăr a răspunsului se poate parcurge o instrucțiune/set de instrucțiuni sau se poate

10
apela o altă structură de decizie. Un mod de reprezentare este prezentat în fig.5. Utilizarea
structurilor de decizie imbricate poate fi reprezentată sub diferite forme, în funcție de problema
care se dorește a se rezolva.

Fig. 5 Schema logică pentru reprezentarea structurii de decizie imbricate


Pentru schema logică de mai sus, reprezentarea în pseudocod este următoarea:
| ...
| dacă (test1?) atunci
| set instrucțiuni 1
| altfel
| dacă (test2?) atunci
| set instrucțiuni 2_1
| altfel
| set instrucțiuni 2_2
| sfârșit dacă // final test2
| sfârșit dacă // final test1
| ...

11
Exemplu 3:
a. Formularea problemei
Să se rezolve ecuaţia de gradul I ( a * x + b = 0 ) în ipoteza considerării tuturor variantelor
posibile ale datelor de intrare.

b. Precizarea datelor de intrare și ieșire


Datele de intrare/inițiale:
- a, b - coeficienții;
Datele de ieşire/finale:
- x - rădăcina ecuației.
Variabilele programului “ecGradI”

Parametrul Unitatea Valoarea


Nr.crt. Identificator Tipul variabilei
reprezentat de măsură atribuită

1 Coeficientul a - a int 9

2 Coeficientul b - b int 2

3 Rădăcina - x float -

c. Alcătuirea modelului matematic


Se alcătuieşte relaţia: x = - b / a
dacă a ≠ 0 atunci x= - b / a
dacă a = 0 atunci sunt două cazuri:
dacă b = 0, ecuaţia devine 0 * x + 0 = 0 (x poate lua orice valoare)
dacă b ≠ 0, ecuaţia nu are soluţii (imposibilitate)

d. Alcătuirea algoritmului programului


Schema logică “ecGradI” este prezentată în fig.6.

12
Fig. 6. Schema logică a algoritmului de rezolvare a problemei “ecGradI”
Pseudocodul :

| - - program ecGrI - -
| citeşte a, b
| dacă ( a == 0 ) atunci
| dacă ( b == 0 ) atunci
| afişează “Infinitate de soluţii”
| altfel
| afişează “Imposibil!”
| sfârşit dacă
| altfel
| x = - b / a
| afişează x
| sfârşit dacă
| - - sfârşit ecGrI - -

13
e. Verificarea algoritmului
Tabelul de verificare al variabilelor programului “ecGradI”

Identific Tipul Valoarea atribuită


ator variabilei Varianta 1 Varianta 2 Varianta 3

a int 0 0 2

b int 1 0 3

x float - - -1.5

Tabelul de verificare al algoritmului programului “ecGradI”

14
f. Alcătuirea programului sursă / codul aplicației
Fișierul sursă corespunzător algoritmului “ecGradI” este:

#include <stdio.h>
int main(){
int a, b;
float x;
printf("Dati a si b ( a * x + b ):");
fflush(stdout);
scanf("%d%d", &a, &b);
printf("Ecuatia este: %d x + %d = 0\n", a, b);
if( a == 0 )
if ( b == 0)
printf("Infinitate de solutii!");
else
printf("Imposibil!");
else
{
x = - (float) b / a;
printf("x = %.2f", x);
}
return 0;
}

g. Executarea programului

a) b)

c)
Fig. 7. Conţinutul consolei la rularea programului “ecGradI”
a) Varianta 1, b) Varianta 2, c) Varianta 3

15
h. Verificarea programului
Întrebare: Cum trebuie modificat programul pentru a funcționa corect și în cazul numerelor
negative?

D. Operatorul ternar (ternary): (?:)


Datorită faptului că structura de decizie este foarte importantă, majoritatea limbajelor de
programare permit o utilizare prescurtată a acesteia, prin operatorul ternar. Operatorul ternar se
notează ?: și poate fi utilizat sub următoarele forme:

Expresie ?: Echivalență if-else

if ( expr1 )
expr2;
expr1 ? expr2 : expr3
else
expr3;

if ( expr1 )
var = expr2;
var = expr1 ? expr2 : expr3
else
var = expr3;

if ( a )
x = a;
x = a ? : b;
else
x = b;

Varianta prescurtată a operatorului ternar (ultima linie din tabelul de mai sus) este permisă
în limbajul de programare C, în cazul altor limbaje de programare trebuie verificat standardul
respectivului limbaj.

16
În laboratorul despre precedența operatorilor s-a specificat faptul că asociativitatea acestui
operator este de la dreapta la stânga, ceea ce înseamnă că dacă sunt utilizați doi astfel de
operatori în cadrul aceleași expresii prima dată se va executa ultimul (cel din dreapta).
ex:

int a = 1, b = 2 , c = 3;
int x, y, z;
x = a ? b : c ? a : b;
y = (a ? b : c) ? a : b; // asociativitate de la stanga la dreapta
z = a ? b : (c ? a : b); // asociativitate de la dreapta la stanga
printf("%d %d %d", x, y, z);

Programul va afișa 2 1 2, ceea ce înseamnă că expresia decalcul a lui x se execută în


aceeași ordine cu expresia de calcul pentru z, care este explicit executată cu asociativitate de la
dreapta la stânga.

Exemple:
Pentru a înțelege mai bine aplicarea operatorului ternar se vor lista în continuare
programele din exemplele anterioare, scrise utilizând operatorul ternar.
1. Programul ”modulX” devine:

#include <stdio.h>
int main(){
int x;
printf("Dati x:");
fflush(stdout);
scanf("%d",&x);
x = x > 0 ? x : -x;
printf("|x| = %d", x);
return 0;
}

sau poate se poate folosi operatorul ternar direct în printf(), astfel:


printf("|x| = %d", x > 0 ? x : - x);
2. Programul ”maxSuma” se poate scrie:
// se poate înlocui instrucțiunea if-else cu

17
max = a > b ? a : b;
// sau se poate înlocui atât if-else cât și afișarea maximului cu:
printf("max = %d", a > b ? a : b);
3. Programul ”ecGrI” se poate scrie:
// după citirea variabilelor de la tastatură
a == 0 ?
b == 0 ?
printf("Infinitate!") :
printf("Imposibil!") :
printf("%.2f",-(float)b/a);

E. Instrucțiunea switch()
Instrucțiunea switch() se mai numește și switch-case și reprezintă o alternativă pentru
blocurile de instrucțiuni if imbricate. Instrucţiunea switch este folosită pentru a selecta o ramură
de execuţie funcţie de valoarea unei variabile întregi (selector).
Forma generală a instrucțiunii switch este:

switch (selector) {
case valoare1 : set instrucţiuni1; break;
case valoare2 : set instrucţiuni2; break;
case valoare3 : set instrucţiuni3; break;
default: instrucţiuni4;
}

Corpul instrucțiunii switch este delimitat de acolade. Mărimea evaluată de switch


(selectorul) este de tip întreg (tip char sau int), utilizarea unei variabile de tip float sau double
reprezintă eroare de sintaxă. După evaluarea valorii selectorului, programul ”sare” la cazul
corespunzător, acolo unde după case este exprimată valoarea întreagă respectivă. Valorile
prevăzute folosind case trebuie să fie unice.
Schema logică reprezentativă a instrucțiunii switch este prezentată în fig.8.

18
Fig. 8 Forma generală a instrucțiunii switch
În mod uzual, ultima posibilitate listată în cadrul unui switch este cazul default. Acest
lucru reprezintă faptul că instrucțiunea sau setul de instrucțiuni din cazul default se execută în
cazul în care selectorul nu a fost întâlnit în niciuna din valorile prevăzute anterior cu case.
default și case sunt cuvinte cheie ale limbajului C și nu pot fi folosit decât în interiorul unei
instrucțiuni switch.
Cuvântul cheie break se folosește pentru a face programul să termine evaluarea setului de
instrucțiuni {...} în care se găsește. Utilizarea lui break pentru fiecare case din instrucțiunea
switch este recomandată, neutilizarea acesteia poate introduce erori de funcționare mai ales în
cazul modificărilor ulterioare ale programului.

19
Exemplu 4:
a. Formularea problemei
Să se scrie un program care va citi de la tastatură un număr întreg (între 1 și 7) și va afișa
ziua corespunzătoare a săptămânii (luni … duminică).

b. Precizarea datelor de intrare și ieșire


Datele de intrare/inițiale:
- zi - numărul zilei;
Datele de ieşire/finale:
- luni, marti … duminica - ziua corespunzătoare a săptămânii
Variabilele programului “ziSaptamana”

Parametrul Unitatea Valoarea


Nr.crt. Identificator Tipul variabilei
reprezentat de măsură atribuită

1 zi - zi int 3

2 numeleZilei - - - -

c. Alcătuirea modelului matematic


dacă zi este 1 afiează ”luni”,..., pentur zi = 7 afișează ”duminica”.
pentru orice alt număr afișează ”număr gresit”

d. Alcătuirea algoritmului programului


Schema logică “ziSaptamana” este prezentată în fig.9.

20
Fig. 9. Schema logică a algoritmului de rezolvare a problemei “ziSaptamana”
Pseudocodul :

| - - program ziSaptamana - -
| citeşte zi
| dacă ( zi == 1 ) atunci afișează ”Luni”
| altfel dacă ( zi == 2 ) atunci afișează ”Marti”
| altfel dacă ( zi == 3 ) atunci afișează ”Miercuri”
| altfel dacă ( zi == 4 ) atunci afișează ”Joi”
| altfel dacă ( zi == 5 ) atunci afișează ”Vineri”
| altfel dacă ( zi == 6 ) atunci afișează ”Sambata”
| altfel dacă ( zi == 7 ) atunci afișează ”Duminica”
| altfel afișează ”Numar gresit!”
| sfârşit dacă
| sfârşit dacă

21
| sfârşit dacă
| sfârşit dacă
| sfârşit dacă
| sfârşit dacă
| sfârşit dacă ……
| sfârşit dacă
| - - sfârşit ziSaptamana - -

e. Verificarea algoritmului
Tabelul de verificare al variabilelor programului “ziSapatamana”

Identific Tipul Valoarea atribuită


ator variabilei Varianta 1 Varianta 2 Varianta 3

zi int 1 4 10

Tabelul de verificare al algoritmului programului “ziSapatamana”

22
f. Alcătuirea programului sursă / codul aplicației
Fișierul sursă corespunzător algoritmului “ziSaptamana” este:

#include <stdio.h>
int main(){
int zi;
printf("Dati un numar:");
fflush(stdout);
scanf("%d", &zi);
switch(zi){
case 1:
printf("Luni");
break;
case 2:
printf("Marti");
break;
case 3:
printf("Miercuri");
break;
case 4:
printf("Joi");
break;

23
case 5:
printf("Vineri");
break;
case 6:
printf("Sambata");
break;
case 7:
printf("Duminica");
break;
default:
printf("Ati introdus un numar gresit!");
}
return 0;
}

g. Executarea programului

a) b)

c)
Fig. 10. Conţinutul consolei la rularea programului “ziSaptamana”
a) Varianta 1, b) Varianta 2, c) Varianta 3
h. Verificarea programului
Întrebare: Cum trebuie modificat programul pentru a afișa în plus și dacă este Weekend
pentru zilele Sambata si Duminica?

Switch fără break:


În unele cazuri break poate lipsi pentru unele cazuri (case) ale instrucțiunii switch, ceea ce
înseamnă că se vor executa toate instrucțiunile până la întâlnirea unui break sau până se termină
instrucțiunea switch.
Sintaxa instrucțiunii switch fără break este:

24
switch (selector) {
case valoare1 : set instrucţiuni1;
case valoare2 : set instrucţiuni2;
case valoare3 : set instrucţiuni3;
default: instrucţiuni4;
}

Pentru cazul în care nu se utilizează break în cadrul unui switch, schema logică devine:

Fig. 11 Instrucțiunea switch fără break


Un exemplu de utilizare a instrucțiunii switch fără break este:

#include <stdio.h>
int main(){
int luna;
printf("Dati luna (1-12):");

25
fflush(stdout);
scanf("%d", &luna);
switch(luna){

case 3:
case 4:
case 5:
printf("Primavara");
break;
case 6:
case 7:
case 8:
printf("Vara");
break;
case 9:
case 10:
case 11:
printf("Toamna");
break;
case 12:
case 1:
case 2:
printf("Iarna");
break;
default:
printf("Ati introdus un numar gresit!");
}
return 0;
}

2. Întrebări de autocontrol
1. Sub ce forme se poate utiliza structura de decizie?
2. Reprezentați sub formă de schemă logică instrucțiunea if.
3. Ce se întâmplă dacă expresia test din cadrul expresiei if returnează numărul întreg 2?
4. Ce fel de expresii se pot folosi ca test în instrucțiunea if-else?
5. Considerăm un program în care liniile de declarație conțin:
int a = 1, b = 2;
float c = 2.5;

26
Următoarele expresii vor fi interpretate ca Adevărat sau Fals?

if ( a ) … if ( a % b ) … if (a>b && b>c) …


if ( a = b ) … if ( a - b ) … if (a<b || c) …
if ( !a ) … if ( a / b ) … if (a-b-c) …
if ( !a + b ) … if ( a * !b ) … if (a+b/c) …
if ( c ) … if ( a && b ) … if (c=0) …
if ( c - c ) … if ( a ^ b ) … if (c/100) …
if ( a / c ) … if ( ~a ) … if (a==0) …
6. În ce interval de valori trebuie să se încadreze variabila x (de tip int) din instrucțiunile de
mai jos astfel încât condiția să fie interpretată ca Adevărat?
if ( x % 2 == 1 ) …
if ( 5 < x || x ) …
if ( 5 <= x && x < 11 ) …
if ( x > 0 && x % 2 == 0 ) …
if ( x % 100 ) …

7. Dați un exemplu de valoare a lui int x astfel încât instrucțiunile următoare să fie
interpretate ca Fals:
if ( x > 1 || x < -1) …
if ( x % 3 == 1 ) …
if ( x + 5 ) …
if ( x % 3 || x % 5 || x % 4 ) …
if ( x % 3 && x % 5 && x % 4 ) …
if ( x > 100 || x % 2 == 1) …

3. Exerciții propuse pentru fixarea cunoștințelor


1. Verificarea parității unui număr se face prin testarea restului împărțirii la 2.
Folosind o instrucțiune if() verificarea dacă un număr este par se scrie:

27
if( n % 2 == 0)
// n este par
else
// n este impar
Scrieți un program care afișează dacă un număr introdus de la tastatură este par sau impar.
2. Scrieți un program care afișează dacă un număr introdus de la tastatură este par
sau impar și pozitiv sau negativ (Programul va afișa ”Numarul … este par/impar
și pozitiv/negativ”).
3. Să se scrie un program care va testa dacă două numere introduse de la tastatură
sunt divizibile (dacă primul se împarte - fără a obține rest - la al doilea).
4. Să se scrie un program care verifică dacă trei numere introduse de la tastatură pot
reprezenta laturile unui triunghi. (oricare dintre cele trei numere trebuie să fie mai
mic decât suma celorlalte două).
5. Se dă un număr pozitiv de la tastatură (max 9999). Să se scrie un algoritm care să
afişeze numărul de cifre ale numărului, folosind numai structura ramificată.
6. Să se scrie algoritmul și programul care va permite citirea unei valori de
temperatură de la tastatură și va afișa starea de agregare a apei corespunzătoare
temperaturii respective. (sub 0 grade apa este sub forma de gheață, între 0 și 100
de grade apa este sub formă lichidă, iar peste 100 de grade este sub formă de
vapori).
7. Să se scrie un program care va citi de la tastatură trei numere și va afișa valoarea
maximă dintre cele trei numere.
8. Să se scrie un program care va citi trei numere întregi care reprezintă notele unui
student și va afișa media celor trei note, iar în cazul în care media este sub 5 va
afișa un mesaj de atenționare (ex: ”Medie sub 5!”).
9. Să se citească două numere de la tastatură și să se afișeze numerele respective în
ordine descrescătoare.

28
10. Să se scrie un program care citește de la tastatură anul nașterii unei persoane și
afișează vârsta și dacă este copil (< 14 ani) sau major (> 18 ani).
11. Să se scrie un program care citește trei numere întregi de la tastatură și afișează un
mesaj care informează:
- câte din aceste numere sunt peste 5;
- câte numere sunt pare;
- câte numere sunt negative;
- numărul maxim;
- numărul minim;
- media, suma și produsul celor mai mari două numere introduse.
12. Să se scrie un program care va permite introducerea coeficienților unei ecuații de
gradul 2 (a,b,c) și va afișa rădăcinile respectivei ecuații.
13. Să se scrie un program care citește de la tastatură valorile a trei unghiuri (de tip
întreg) și afișează tipul triunghiului pe care îl formează (oarecare, isoscel,
dreptunghic, echilateral, obtuzunghic, precum și combinații ale acestora:
dreptunghic-isoscel, obtuzunghic-isoscel)

4. Exerciții propuse pentru aprofundarea cunoștințelor


1. Se citește de la tastatură CNP-ul (char cnp[14]) unei persoane. Se cere să se
afișeze dacă:
- persoana este de sex masculin sau feminin (link)
- persoana este majoră sau nu (se poate determina numai după an, sau se pot
lua în calcul și luna și ziua)
2. Se citește de la tastatură un număr între 1 și 12 (numărul lunii dintr-un an) și se
cere să se afișeze anotimpul din care face parte luna respectivă (12,1,2:iarna,
6,7,8:vara). Programul va valida inițial numărul introdus, iar în cazul în care nu
este în intervalul corect va cere reintroducerea numărului.

29
3. Pentru a genera un număr aleator se poate folosi funcția rand(). Pentru aceasta
trebuie incluse bibliotecile stdlib.h și time.h. În program, înainte de a folosi
funcția rand() trebuie activat generatorul de numere aleatoare srand(). Un
exemplu de program care generează un număr aleator este:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(){
int n;
srand(time(NULL));
n = rand() % 50; // se obtine un numar intre 0 si 49
printf("Numarul generat este: %d",n);
return 0;
}

Scrieți un program care să genereze un număr aleator între 0 și 4 după care utilizatorul va
trebui să ghicească numărul generat din două încercări. Prima dată utilizatorul va introduce un
număr, programul va afișa dacă numărul a fost ghicit (caz în care va executa return 0) sau dacă
numărul este mai mare sau mai mic decât numărul generat, după care utilizatorul va mai putea
introduce un număr. Programul va afișa dacă numărul a fost ghicit sau va afișa mesaj de
consolare și numărul corect.
4. Scrieţi un program (folosind if-else imbricate) care va afişa în litere cifra primită
ca mărime de intrare (între 1 şi 5).
5. Scrieți un program care va citi trei numere de la tastatură și le va afișa în ordine
crescătoare sau descrescătoare. Încercați prin folosirea a doar 5 if-uri în care
testele să fie doar o operație relațională (ex. if(a>b) ...).
6. Se dau trei numere de la tastatură. Să se scrie un algoritm care să afişeze dacă
numerele sunt într-o progresie aritmetică. Să se repete algoritmul pentru patru
numere.
7. Se dă un număr pozitiv de la tastatură (max 9999). Să se scrie un algoritm care să
afişeze numărul de cifre ale numărului, folosind numai structura ramificată.

30
Switch

8. Să se scrie un program care va citi un număr întreg (între 1 și 12) reprezentând


numărul lunii și va afișa numărul de zile corespunzătoare lunii respective.
9. Să se scrie un program care va citi un număr întreg de la tastatură (între 1 și 10)
care reprezintă nota unui student la examen și va afișa o serie de mesaje astfel:
̄ dacă nota este 1, 2 sau 3 afișează ”Mai ai mult de învățat!”
̄ dacă nota este 4 afișează ”La limită!”
̄ dacă nota este sub 5 (1,2,3,4) afișează ”Ai picat!”
̄ dacă nota este 8 sau 9 afișează ”Nota de bursa!”
̄ dacă nota este 10 afișează ”Perfect!”
̄ dacă nota este peste 5 (5,6,7,8,9,10) afișează ”Ai promovat!”
Programul se va scrie folosind o singură instrucțiune switch.
10. Să se scrie un program care după citirea a două numere întregi (primul
reprezentând numărul zilei din săptămână în care a început luna respectivă și al
doilea reprezentând data curentă), prin folosirea unei singuri instrucțiuni switch
va afișa numele zilei din săptămână corespunzătoare datei introduse. De exemplu
dacă luna a început într-o zi de Miercuri, prima valoare introdusă va fi 3, iar dacă
se dorește afișarea zilei din săptămână care va fi pe data de 28, atunci al doilea
număr introdus va fi 28, iar programul va afișa Marti. Pentru setul 2, 15 va afișa
Marti, etc.
11. Să se scrie un program care va citi de la tastatură două numere întregi și un
operator (un caracter sau un string: +,-,*,/,%) și va afișa rezultatul respectivei
operații. (Hint: pentru a citi numerele și operatorul se poate utiliza instrucțiunea:
scanf("%d%c%d", &n1, &op, &n2);, în acest caz expresia se va introduce fără
spații, ex: 23-2 sau scanf("%d %c %d", &n1, &op, &n2);, caz în care expresia se
va introduce cu spații: 23 - 2).

31
Să se modifice astfel încât programul va permite introducerea unui singur șir de
caractere care va conține relația de calcul și va afișa rezultatul.
12. Să se scrie un program care va permite evaluare unei expresii cu 2 operatori și trei
operanzi. Atenție la prioritatea operațiilor.

32

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