PC Laborator 5
Obiective
în urma acestui laborator, studentul va fi capabil să:
- înțeleagă cum funcționează o structură decizională;
- scrie programe în C folosind construcții decizionale.
Structura decizională
Se întâmplă adesea ca evoluția unui program să depindă de un moment prezent. Acel moment prezent poate lua însă diverse forme, rolul programatorului fiind să conducă execuția programului pe calea corectă, pe baza unor condiții. Apare astfel structura decizionala if, care ramifică evoluția programului în funcție de valoarea de adevăr a condiției testate.
Schema logică
Prima etapă din parcurgerea unei structuri decizionale de tipul if-else o reprezintă testarea condiției logice. în cazul în care aceasta este evaluată ca adevărată se execută instructiunea1, cea asociată ramurii if. în cazul în care condiția logică este evaluată ca falsă se execută instructiunea2, cea asociată ramurii else. După executarea instrucțiunii asociate, structura if-else se încheie și programul se continuă cu linia următoare corpului decizional.
Sintaxă generală
a)
if (conditie) instructiune;
b)
if (conditie)
instructiune1;
else
instructiune2;
c)
if (conditie1)
instructiune 1;
else if (conditie2)
instructiune 2;
else if (conditie 3)
instructiune3;
................................
else
instructiune;
Asocierea ramurilor if-else
Această observație ne conduce la următoarele două cazuri:
- dacă nu există corpuri de instrucțiuni, un else este legat de if-ul imediat anterior;
if (a > 5)
if (b > a)
printf ("b este mai mare ca 5");
else
printf ("b este intre 5 si a");
- dacă există corpuri de instrucțiuni, un else este legat de ultimul if fără pereche.
if (a > 5) {
if (b > a)
printf ("b este mai mare ca 5");
}
else
printf ("a nu este mai mare ca 5");
Exemplu:
Ce va afișa acest program prost indentat?
int number = 4;
double alpha = -1.0;
if (number > 0)
if (alpha > 0)
printf( "Here I am!\n");
else
printf( "No, I’m here!\n");
printf("No, actually, I’m here!\n");
Condiția logică
Am stabilit deja că o condiție logică, prin valoarea ei de adevăr, ramifică evoluția programului.
În C, condiția poate avea mai multe reprezentări, după cum urmează
Operandul
Exemplu: Verificați că un număr citit de la tastatură poate fi numitorul unei fracții.
Operația cu operatori relaționali (==, !=, <=, <, >, >=)
Exemplu: Asociați o valoare variabilei cost în funcție de valoarea variabilei distance după cum urmează:
distance | cost |
Intre 0 si 100 | 5.50 |
Peste 100, dar mai putin de 500 | 8.00 |
Peste 500, dar nu mai mult de 1000 | 10.50 |
1000 sau mai mult | 13.00 |
Operația cu operatori logici (&&, ||, !, ^)
Exemplu: Folosind operatori logici, aduceți următoarea structură decizională la forma cea mai simplă:
if (doesSignificantWork) {
if (makesBreakthrough)
nobelPrizeCandidate = true;
else
nobelPrizeCandidate = false;
}
else if (!doesSignificantWork)
nobelPrizeCandidate = false;
Tabelul operatorilor logici | ||||
---|---|---|---|---|
a | b | !a | a && b | a ll b |
1 | 1 | 0 | 1 | 1 |
0 | 0 | 1 | 0 | 0 |
0 | 1 | 1 | 0 | 1 |
Alternative la if-else
Operatorul condițional ( ? : )
Singurul operator ternar din C, operatorul condițional funcționează asemenea unui if cu o singură ramură de tip else if. Sintaxa operatorului condițional este următoarea:
(conditie) ? (instructiune1) : (instructiune2)
Aşadar, blocul decizional
if (a>b)
printf ("a este mai mare decat b");
else
printf ("a este mai mic sau egal cu b");
poate fi înlocuit astfel:
(a>b) ? ( printf ("a este mai mare decat b")) : ( printf ("a este mai mic sau egal cu b"));
Structura decizională switch-case
Această instrucțiune de decizie este similară unui if cu mai multe ramuri de tip else-if. Sintaxa este următoarea:
switch (variabilaTestata) {
case valoare1: { instructiune1;
[break;]
}
case valoare2: { instructiune2;
[break;]
}
case valoare3: { instructiune3;
[break;]
}
.........................................................................
default: {instructiune;
}
}
Valorile valoare1, valoare2 etc. sunt proprii tipului de dată întreg, la fel ca variabilaTestata. Ne reamintim însă că întreg nu înseamnă doar variabile de tip int, astfel că variabilaTestata poate fi de tip char.
a) se compară valoarea variabilei variabilaTestata cu valoarea1;
b) dacă cele două sunt egale, se execută instructiune1. Apoi există două cazuri:
i. dacă există break; structura switch-case se încheie și se sare pe linia urmatoare întregului corp decizional;
ii. dacă nu există break; execuția se continuă până se întalnește un break; sau până când se încheie structura switch-case. Până la acel moment se vor executa toate instrucțiunile întâlnite pe parcurs (instructiune2, instructiune3 etc.);
c) dacă valoarea variabilei variabilaTestata nu este egală cu niciuna dintre valorile valoare1, valoare2 etc atunci se execută instructiune, asociată etichetei default.
Pentru a verifica echivalența dintre if-else și switch-case, rezolvați folosind ambele structuri decizionale următoarea problemă:
Exemplu: Un microbist vrea să afle situația Grupei F de calificare la EURO2016. Astfel, el va introduce o cifră pentru a vedea ce "națională" ocupă acel loc. Folosind următoarea listă, informați-l corect pe suporter.
1. Irlanda de Nord 2. România 3. Ungaria 4. Finlanda 5. Insulele Feroe 6. Grecia
Exerciții
1. Ce va afișa următorul program?
void main(){
int a=100;
if(a>10)
printf("Tiberiu Soare ");
else if(a>20)
printf("Horia Andreescu ");
else if(a>30)
printf("Iosif Ion Prunner ");
}
a) Tiberiu Soare b) Horia Andreescu c) Tiberiu Soare Horia Andreescu Iosif Ion Prunner d) Compilation error: More than one conditions are true e) Niciuna dintre cele de mai sus.
2. Ştiind că un student primește 350 lei/lună dacă are media cel puțin 8.50, 450 lei/lună pentru o medie mai mare sau egală cu 9.50 și 600 lei/lună dacă are media cel puțin 9.70, scrieți un program prin care studentul să afle ce bursă urmează să primească (media va fi citită de la tastatură).
3. Ce va afișa următorul program?
#include<stdio.h>
void main(){
int m=5,n=10,q=20;
if(q/n*m)
printf("Bill Gates ");
else
printf("Amancio Ortega ");
printf("Carlos Slim Helu ");
}
a) Bill Gates b) Amancio Ortega Carlos Slim Helu c) Run time error d) Compilation error e) Niciuna din cele de mai sus
4. Ce va afișa următorul program?
#include<stdio.h>
void main(){
int a=5,b=10;
if(++a||++b)
printf("%d %d",a,b);
else
printf("Wayne Rooney");
}
a) 5 10 b) 6 11 c) 6 10 d) 5 11 e) Wayne Rooney
5. Scrieți un program care citește de la tastatură notele unui elev la limba română, matematică și informatică și afișează dacă elevul a promovat sau nu bacalaureatul.
6. Scrieți un program care afișează toate numerele pare de la 1 la un număr citit de la tastatură.