Documente Academic
Documente Profesional
Documente Cultură
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ă.
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.
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”
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”
x int 9 -5 5
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.
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.
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”
a int 9 1
8
b int 7 17
max int 9 17
suma int 16 18
#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?
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.
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.
1 Coeficientul a - a int 9
2 Coeficientul b - b int 2
3 Rădăcina - x float -
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”
a int 0 0 2
b int 1 0 3
x float - - -1.5
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?
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);
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;
}
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;
}
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ă).
1 zi - zi int 3
2 numeleZilei - - - -
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”
zi int 1 4 10
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?
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:
#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?
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) …
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)
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
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