Sunteți pe pagina 1din 16

Instrucțiunile if și if – else

Instrucțiunea if
Forma generală:
if (condiție) {
instrucțiune_1;
instrucțiune_2;
...
instrucțiune_n;
}
Funcționarea:
Pasul 1. Se stabilește valoarea de adevăr a condiției.
Pasul 2. Dacă condiția este falsă se trece la instrucțiunea următoare instrucțiunii if. Altfel, se
execută instrucțiunile 1, 2, ..., n, și abia apoi se trece la instrucțiunea următoare instrucținii if.
Atenție! Cea mai simplă formă a acestei instrucțiuni este if (condiție) instrucțiune; Aici,
instrucțiunea se execută doar dacă condiția este adevărată. Relativ la secvența formală de cod
if (condiție)
instrucțiune_1;
instrucțiune_2;
...
instrucțiune_n;
doar execuția instrucțiunii nr.1 este condiționată de valoarea de adevăr a condiției, celelalte executându-
se indiferent de valoarea de adevăr a condiției.
Exemplu. Să considerăm sevența de cod:
int i = 1;
if (i > 0) cout << "nr pozitiv";

În prima instrucțiune se declară variabila i – de tip int, și este inițializată cu 1. Cum în cea de-a doua
instrucțiune avem un if se stabilește, mai întâi, valoarea de adevăr a condiției (i > 0). Prin urmare se
afișează nr pozitiv.
Exemplul 2. Să considerăm secvența de cod:
int i = 1;
if (i < 0) cout << "nr negativ";

Condiția (i < 0) nu este adevărată. Deci, pe ecran nu va mai afișa nimic.


Instrucțiunea if – else
Forma generală:
if (condiție) {
instrucțiune_1;
instrucțiune_2;
...
instrucțiune_n;
}
else {
instrucțiune_1;
instrucțiune_2;
...
instrucțiune_m;
}
Funcționarea:
Pasul 1. Se stabilește valoarea de adevăr a condiției.
Pasul 2. Dacă condiția este adevărată atunci se execută instrucțiunile 1, 2, ..., n, și, apoi, se trece
la instrucțiunea următoare instrucțiunii if. Dacă condiția este falsă atunci se execută instrucțiunile 1, 2,
..., m, și, apoi se trece la instrucțiunea următoare instrucțiuii if.
Atenție! Condiția se încadrează obligatoriu între paranteze rotunde.
Atenție! Dacă instrucțiunile 1, 2, ..., m lipsesc atunci instrucțiunea if – else se reduce la o
instrucțiune if.
Atenție! Ramurile instrucțiunii if (sau if – else) pot conține la rândul lor alte instrucțiuni if sau if –
else, situație, în care se spune că avem if – uri imbricate.
Exemplu. Să considerăm secvența de cod:
int i = 0, j = 1;
if (i < j) cout << 1;
else cout << 0;

Aici, condiția (i < j) este adevărată. Prin urmare, se afișează 1.


Exemplu. Să considerăm secvența de cod:
int i = 0, j = 1;
if (i < 0) cout << 1;
else cout << 2;
if (j > 0) cout << 3;
else cout << 4;

Aici, avem două intrucțiuni if – else, neimbricate. Prima condiție este falsă (pentru că i = 0). Astfel, în
urma execuției primei instrucțiuni if – esle se afișează. Cea de-a doua condiție, în schimb, este adevărată
și, se afișează și 3. În concluzie, pe ecran, se afișează 13.
Exemplu. Să considerăm secvența de cod:
int a = -5, b = 5, c=2;
if (c > a)
if (c < b)
cout << c << " este cuprins intre " << a << " si " << b << "!" << endl;
Aici, avem două instrucțiuni if imbricate, adică valoarea de adevăr a primei condiții condiționează
execuția celei de-a doua instrucțiuni if, care condiționează afișarea unui mesaj. Astel, relativ la a, b și c,
se constată că prima și cea de-a doua condiție, în această ordine, sunt adevărate. Deci, se afișează: 2 este
cuprins intre -5 si 5.
Observație. Dacă, în secvența anterioară de cod, s-ar fi scris if (c > a); în loc de if (c > a) atunci
execuția celui de-al doilea if nu mai este condiționată de valoarea de adevăr a condiției primului if.
Exercițiul 1. Modificați secvența de cod de mai sus, încât să afișeze un mesaj coresunzător dacă,
inițializând variabilele a, b și c de la tastatură, are loc inegalitatea a ≤ c ≤ b .
Soluție. Se declară, variabilele a, b și c. Ulterior, li se atribuie, de la tastatură, câte o valoare.
Apoi, se testează dacă are loc inegalitatea dorită iar în caz afirmativ se afișează un mesaj corespunzător.
Concret, avem:
int a, b, c;
cout << "cele trei numere sunt: ";
cin >> a >> b >> c;
if (c > a)
if (c < b)
cout << c << " este cuprins intre " << a << " si " << b << "!" << endl;
Scrierea condițiilor elementare, în C/C++ se face folosind fie:
1. Operatorii de egalitate:
 Operatorul == se folosește pentru a determina dacă două variabile sau expresii au aceiași
valoare.
 Operatorul != se folosește pentru a determina dacă două variabile sau expresii au valori
distincte.
2. Operatorii relaționali uzuali:
 < (mai mic strict), > (mai mare strict),
 ≤ (mai mic sau egal), ≥ (mai mare sau egal).
Exercițiul 2. Să se scrie câte o condiție prin care se determină dacă:
a) un număr natural n este impar;
(n%2 == 1) // n este impar daca restul lui n la impărțirea cu 2 este egal cu 1

b) un număr natural n se divide cu 10;


(n%10 == 0) /* n se divide cu 10 dacă restul împărțirii lui n la 10 este egal cu 0*/

c) două numere naturale n și m dau același rest la împărțirea cu 7;


(n%7 == m%7)

d) pentru două numere naturale n și m, succesorul lui n coincide cu predecesorul lui m;


(n+1 == m-1) /* succesorul unui numar intreg n este n+1 iar predecesorul sau este n-1*/

e) două numere reale a și b sunt egale;


(a == b) // o concitie echivalenta cu (a == b) este (a-b==0)

f) două numere reale a și b sunt distincte;


(a != b) // o concitie echivalenta cu (a != b) este (a-b!=0)

g) pentru două numere reale x și y, expresia x*y+1 este nenulă;


(x*y+1 != 0)

h) pentru două valori reale x și y, expresia √ x+ y este bine definită;


(x+y >= 0) /* fiind vorba despre un radical, se știe că, acesta este bine definit daca
argumentul său este mai mare sau egal cu 0*/

Definiția 1. Complementara sau negația unei condiții C1 este o condiție C2 – adevărată atunci
când C1 este falsă, și respectiv falsă atunci când C1 este adevărată. În C/C++ determinarea
complementarei unei condiții C se face folosind operatorul ! – de negare logică, scriind !C.
Exemplul 1. Fie C1 - condiția prin care se verifică dacă un număr natural nr este impar sau nu, adică
(nr%2 == 1). Negația lui C1, !C1, se scrie !(nr%2 == 1). Folosind !C1 se determină dacă nr este un
număr natural par.
Exemplul 2. Fie C2 – condiția prin care se verifică dacă expresia √ x+ y este bine definită, adică
(x+y >= 0). !C2, negația condiției C2, se scrie !(x+y >= 0). Utilizând !C2 se poate stabili dacă pentru
două valori x și y, expresia √ x+ y nu este bine definită.
Exemplul 3. Fie a, b și c trei valori întregi, cu proprietatea că a < b < c, și să considerăm condiția C3 –
prin care se determină dacă cele trei valori sunt numere pitagoreice (i.e. sunt soluțiii ale Th. lui Pitagora),
adică (a * a + b * b == c * c). Negația acestei condiții, !C3, este !(a * a + b * b == c * c) și, este folosită
pentru a arăta că tripleta (a, b, c) nu este o soluție a ecuației lui Pitagora.
Până aici, toate condițiile prezentate sunt alcătuite dintr-un membru stâng, unul drept și un
operator ralațional sau de egalitate, adică au forma generală ( M S op M D ). O condiție echivalentă (egală)
cu ! ( M S op M D ) se obține modificând doar operatorul din condiția inițială astfel:

==  !=
!=  ==
<  >=
<=  >
>  <=
>=  <
Exemplu 1. Fie condiția (n != 0), prin care se determină dacă un număr natural n este nenul. Conform
tabelului de mai sus, negația acestei condiții este (n == 0) – prin care se stabilește dacă n este identic
nul.
Exemplul 2. Fie condiția (r > 0) prin care se determină dacă un număr real r este strict pozitiv. Negația
acestei condiții este (r <= 0) – prin care se verifică dacă r este mai mare sau egal cu 0.
Exercițiul 3. Să se scrie negațiile condițiilor din exercițiul precedent.
Până în acest moment am văzut cum se pot scrie unele condiții elementare dar și negațiile lor.
Vom vedea că, anumite probleme, fie nu se pot rezolva folosind condiții elementare fie este nevoie de
condiții mult mai complicate. Pentru a evita aceste obstacole, în C/C++, se pot folosi operatori && (și) și
|| (sau) pentru a scrie condiții compuse care pot simplifica lucrurile.
De exemplu, nu se poate scrie o singură condiție elementară pentru a determina dacă un număr
întreg n este impar și strict negativ. Totuși, în acest caz se pot imbrica if-uri cu condiții elementare pentru
a obține răspunsul căutat.
Definiția 2. Fie C1 și C2 două condiții elementare.
1. Condiția (C1 && C2), citită C1 și C2, este adevărată doar dacă C1 și C2 sunt simultan
adevărate. Altfel (C1 && C2) este falsă.
2. Condiția (C1 || C2), citită C1 sau C2, este adevărată dacă C1 este adevărată sau C2 este
adevărată. Altfel, dacă C1 și C2 sunt false atunci (C1 && C2) este falsă.
Atenție! Dacă C1 și respectiv C2 sunt simultan adevărate atunci condiția (C1 || C2) este adevărată.
Atenție! Pe baza regulilor de mai sus se pot scrie condiții compuse alcătuite dintr-un număr
arbitrar, dar finit, de condiții elementare.
Exemplul 1. Să se scrie o condiție compusă prin care se determină numărul întreg n este impar și
negativ.
Cele două condiții elementare necesare sunt (n< 0) – prin care se determină dacă valoarea
varibilei n este mai mică sau egală cu 0, și (n%2 == 1) – prin care se determină dacă valoarea variabilei
n este impară. Întrucât ambele condiții trebuie să fie simultan adevărate, condiția prin care se determină
dacă valoarea variabilei n este negativă și impară se scrie
(n< 0∧¿ n % 2=¿ 1).
Exemplul 2. Să se scrie o condiție compusă prin care se determină dacă valoarea cu care a fost
inițializată variabila întregă n – de tip int este multiplu de 2 sau 3.
Cele două condiții elementare sunt (n%2 == 0) și (n%3 == 0). Având în vedere cerința
exercițiului, condiția compusă căutată se scrie
(n%2 == 0 || n%3 == 0).
Exercițiul 4. Să se scrie câte o condiție compusă, așa ca:
a) pentru o variabilă întreagă n – de tip int, să se determine dacă valoarea cu care a fost inițializată
este pară și pozitivă.
b) pentru o variabilă întreagă m – de tip long int, să se determine dacă valoarea cu care a fost
inițializată este multiplu de 7 sau multiplu de 11;
c) pentru o variabilă întreagă p – de tip int, să se determine dacă valoarea cu care a fost inițializată
este multiplu de 2 și nu este multiplu de 3;
d) pentru o variabilă întreagă max – de tip long int, să se determine dacă valoarea cu care a fost
inițializată este mai mare decât 0 și mai mică decât 100;
e) pentru o variabilă întreagă min – de tip int, să se determine dacă valoarea cu care a fost inițializată
este mai mică decât 0 sau mai mare decât 100;
f) pentru două variabile reale a și b – de tip float, să se determine dacă valorile cu care au fost
inițializate au semne distincte; Ind.Cele două variabile au semne distuncte dacă a>0 și b<0 sau ?. Mai simplu, se poate folosi
urmatoarea afirmație: două numere reale a și b au semne distincte dacă a*b < 0.
g) pentru trei variabile reale a, b și c – de tip float, să se determine dacă valorile cu care au fost
inițializate satisfac fie a+b=2*c fie a+c=2*b fie b+c=2*a;
h) pentru trei variabile reale a, b și c – de tip float, să se determine dacă valorile cu care au fost
inițializate satisfac fie a*b=c2 fie a*c=b2 fie b*c=a2;
i) pentru trei variabile reale a, b și c – de tip float, să se determine dacă valorile cu care au fost
inițializate satifac simultan inegalitățile a+ b>c, a+ c> b, și c +b> a;
j) pentru trei variabile reale a, b și c – de tip float, să se determine dacă valorile cu care au fost
inițializate sunt pozitive și verifică și cele trei inegalităti de mai sus.
Atenție! Condițiile compuse se pot nega. Dacă C1 și C2 sunt două condiții (elementare), au loc
formulele lui DeMorgan:
!(C1 && C2) = (!C1) || (!C2),
!(C1||C2) = (!C1) && (!C2).
Exemplu. Fie n un număr pozitiv și fie (n ≥ 0∧¿ n % 2=¿ 0) – condiția prin care se determină dacă
n este pozitiv și par. Să determinăm complementara acesteia. Fie (n ≥ 0) și respectiv (n%2 == 0) -
condițiile cu ajutorul cărora se scrie condiția inițială. Folosind regulile lui DeMorgan avem:
! (n≥0 && n%2 == 0) = (n ≥ 0)) || (!(n % 2=¿ 0)) = (n < 0 || n %2 != 0).
Altfel spus, fie n este strict negativ fie n este impar.
Exercițiul 5. Să se scrie complementarele condițiilor din exercițiu precedent.
Observație. În C/C++ au loc următoarele echivalențe:
(x != 0)  (x),
(x==0)  (!x).
Exemplu. În baza echivalențelor de mai sus, condiția prin care se testează dacă un număr natural
n este par, adică (n%2 == 0), se mai scrie (!n%2), pe când condiția (m%2 == 1) – prin care se verifică
dacă numărul m este impar se scrie (m%2).
Atenție! În C/C++, în loc de (a == b) se mai întâlnește condiția atipică (a = b). Aceasta are la bază
o atribuire, care, în C/C++ este adevărată. În plus, valoarea variabilei (sau expresiei) din membrul drept
este atribuită variabilei din membrul stâng.
Problema 1. Să se scrie un program C/C++ care determină dacă o valoare întreagă n, citită de la
tastatură este pară sau nu și afișează un mesaj corespunzător în fiecare din cele două cazuri.
Soluție. Se știe că un număr întreg n este un par (respectiv impar) dacă se divide cu 2 (respectiv,
dacă nu se divide cu 2) sau, echivalent, dacă restul împărțirii la 2 lui n este nul (respectiv, nenul).
În programul următor, se declară o variabilă n - de tip long int, în care se citește o valoare de la
tastatură. Utilizând condiția (n%2 == 0) se determină dacă acea valoare este pară sau nu și se afișează un
mesajul corespunzător.
#include <iostream>
using namespace std;
int main() {
unsigned int n;
cout << "n = ";
cin >> n;
if (n % 2 == 0) // cum (x == 0)  (!x) avem echivalenta (n%2 == 0)  !(n%2)
cout << n << " este un numar par!" << endl;
else
cout << n << " este un numar impar!" << endl;
cout << endl;
return 0;
}
Analog, se poate rezolva și
Problema 2.1. Să se scrie un program C/C++ care determină dacă o valoare întreagă n citită de la
tastatură, se divide cu 3 sau nu, și, afișează un mesaj corespunzător.
Indicație. Pt. a stabili dacă n se divide cu 3 se poate utiliza condiția (n%3 == 0).
Problema 2.2. Să se scrie un program C/C++ care determină dacă o valoare întreagă n citită de la
tastatură, dă restul 3 la împărțirea cu 5.
Indicație. Se declară o variabilă n – de tip long int, în care se citește o valoare întreagă de la tastatură.
Utilizând condiția (n%5 == 3) se determină dacă valoarea citită satisface cerința problemei și se afișează mesajul
corespunzător. O altă condiție, echivalentă cu cea de mai sus este (!(n%5 – 3)) (de ce?).
Problema 3.1. Să se scrie un program C/C++ în care se citesc de la tastatură două valori întregi -
a și b, și, afișează cea mai mică valoare citită.
Prima soluție. În programul următor sunt declarate variabilele a, b și min – de tip long int, și, se
stochează în a și b câte o valoare citită de la tastatură. Folosind o instrucțiune if-else, cu condiția (a <= b)
se determină dacă cea mai mică valoare citită este a variabilei a și este atribuită variabilei min. Altfel,
variabilei min i se atribuie valoarea lui b. În final, se afișează valoarea variabilei min.
#include <iostream>
using namespace std;
int main() {
int a, b, min;
cout << "valorile celor doua variabile sunt : " << endl;
cin >> a >> b;
if (a <= b)
min = a;
else
min = b;
cout << "cea mai mica valoare preluata este " << min << endl;
cout << endl;
return 0;
}
Atenție! Variabila min, este folosită doar pentru a reține cea mai mică valoare întregă citită de la
tastatură. Se poate renunța la folosirea acesteia, afișând cea mai mică valoare citită.
Cea de-a doua soluție. Să presupunem că cea mai mica valoare citită este a lui a și să o atribuim
variabilei min. Folosind o instrucțiune if, cu condiția (a .
>= b), ne convinde. Dacă condiția anterioară este adevărată atunci nu valoarea lui a este cea mai
mică, ci valoarea lui b este. Prin urmare, este necesară atribuirea valorii lui b variabilei min. În caz
contrar, valoarea variabilei min rămâne neschimbată. În final se afișează valoarea variabilei min.
#include <iostream>
using namespace std;
int main() {
int a, b, min;
cout << "valorice celor doua variabile sunt : " << endl;
cin >> a >> b;
min = a;
if (min > b) min = b;
cout << " cea mai mica valoare preluata este " << min << endl;
cout << endl;
return 0;
}
Cea de-a treia soluție. Se știe că, dacă a și b sunt două numere oarecare atunci fie a > b fie a = b
fie a < b. Așadar, această problemă se reduce la implentarea funcției min : Z × Z ⟶ Z, dată prin,
a , dac ă a<b ,
{
min ( a , b ) = a , dac ă a=b ,
b , dac ă b <a ,
în C/C++.
Întrucât funcția anterioară are trei ramuri iar o instrucțiune if – else se folosește, în general, pentru
a implementa o funcție cu doar două ramuri, pentru a implementa funcția min se folosesc două
instrucțiuni if - else imbricate; astfel, cea de a doua instrucțiune if – este este utilizată pentru a alege
dintre ultimele două ramuri ale funcției min, în timp ce, prima instrucțiune if – else este utilizată pentru a
alege dintre prima ramură a funcței min și cea de-a două instrucțiune if – else. Condiția primei
instrucțiuni if – else este (a < b) iar condiția celei de-a doua instrucțiuni if – else este (a == b).
#include <iostream>
using namespace std;
int main() {
int a, b, min;
cout << "cele două valori sunt : " << endl;
cin >> a >> b;
if (a < b)
min = a;
else
if (a == b)
min = a;
else
min = b;
cout << "min = " << min << endl;
cout << endl;
return 0;
}
Modificând convenabil una din cele trei soluții de mai sus să se rezolve
Problema 4. Să se scrie un program C/C++ care se citesc de la tastatură două valori reale - a și b,
și, afișează cea mai mare valoare preluată.
Problema 5. Să se scrie un program C/C++ în care sunt citite de la tastatură trei valori reale a, b și
c și se afișează cea mai mică valoare preluată.
Soluție. În programul următor se declară variabilele min, a, b și c - de tip float. Se preiau valori,
de la tastatură, doar pentru a, b și c. Să presupunem că valoarea lui a este cea mai mică valoare citiă și, să
o atribuim variabilei min. Apoi, se compară valoarea variabilei min cu valoarea lui b. Dacă valoarea
variabilei min este mai mare decât valoarea lui b atunci variabilei min i se atribuie valoarea lui b. Altfel,
valoarea variabilei min rămâne nescimbată, ș. a. m. d. Comparând și acualizând valoarea variabilei min –
ori de câte ori este cazul, ultima valoare a variabilei min este cea mai mică valoare citită.
#include <iostream>
using namespace std;
int main() {
float min, a, b, c;
cout << "valorile celor trei variabile sunt : " << endl;
cin >> a >> b >> c;
min = a;
if (min > b)
min = b;
if (min > c)
min = c;
cout << "min= " << min << endl;
cout << endl;
return 0;
}
Similar, se poate rezolva
Problema 6.1 Să se scrie un program C/C++ în care în care se citesc de la tastatură patru valori
întregi a, b, c și d și se afișează cea mai mare valoare preluată.
Problema 6.2 Să se scrie un program C/C++ în care în care se citesc de la tastatură patru valori
întregi a, b, c și d și se afișează maximul dintre a+d și c+b.
Problema 7.1. Să se scrie un program C/C++ care afișează valoarea absolută a unei valori reale
citite de la tastatură.
Valoarea absolută a unui număr real x, notată cu |x|, este:
|x|= x , dacă x ≥ 0 ,
{ −x , dacă x< 0.
Prima soluție. În baza definiției anterioare, nu ne rămâne decât să preluăm de la tastatură acea
valoare reală și să îi afișăm valoarea absolută. Prin urmare, în programul următor sunt considerate două
variabile reale x și m – de tip float și, se citește de la tastatură o valoare în x. Folosind o instrucțiune if –
else, cu condiția (x > 0), se atribuie variabilei m fie valoarea lui x, fie valoarea expresiei (-1)*x - în caz
contrar. În final se afișează valoarea lui m.
#include <iostream>
using namespace std;
int main() {
float x, m;
cout << "x= ";
cin >> x;
if (x >= 0)
m = x;
else
m = (-1)*x;
cout << "m= " << m << endl;
cout << endl;
return 0;
}
Exercițiu. Să se modifice programul anterior, încât, fără a folosi variabila m, să afișeze valoarea
absolută a valorii variabilei x.
Cea de-a doua soluție. Să pornim de la următorul fapt: pentru orice valoare reală x are loc
inegalitatea |x|≥ 0. Astfel, putem presupune că valoarea atribuită variabilei x este pozitivă și să o atribuim
variabilei m. Folosind o instrucțiune if, cu condiția (x < 0), ne asigurăm că presupunerea făcută nu este
falsă. Mai precis, dacă condiția (x < 0) este falsă atunci presupunerea făcută anterior este adevărată, iar
valoarea atribuită variabilei m nu se modifică. Altfel, lui m i se atribuie valoarea expresiei (-1)*x. În final,
se afișează valoarea variabilei m.
#include <iostream>
using namespace std;
int main() {
float x, m;
cout << "x= ";
cin >> x;
m = x;
if (x < 0)
m = (-1)*x;
cout << "m= " << m << endl;
cout << endl;
return 0;
}
Cea de-a treia soluție. Se folosește funcția abs – care determină valoarea absolută a unei valori de
tip double (deci și float sau int). Aceasta este inclusă în biblioteca math.h. Prin urmare, în programul
următor se declară variabilele x și m– de tip float, și, se citește de la tastatură o valoare în x. Folosind
funcția abs se atribuie variabilei m valoaraea expresiei abs(x). În final, se afișează valoarea lui m.
#include <iostream>
#include <math.h>
using namespace std;
int main() {
float x, m;
cout << "x= ";
cin >> x;
m = abs(x);
cout << "m= " << m << endl;
cout << endl;
return 0;
}

Folosind, eventual funcția abs să se rezolve și


Problema 7.1. Să se scrie un program C/C++ în care se citesc de la tastatură două valori reale a și
x și afișează valoarea expresiei E(x) = x * |x – a|.
Indicație. Se declară variabilele x, a și m. Se citește câte o valoare în x și a și, folosind funcția abs() se
atribuie lui m valoare modulul expresiei x – a. În final, se afișează valoarea expresiei E.
Problema 7.2. Să se scrie un program C/C++ în care se citesc de la tastatură trei valori reale a, b și
x și afișează valoarea expresiei E(x) = (x - b) * |x – a| + (a - x)*|x-b|.
Indicație. Se declară variabilele x, a, b, m1 și m2. Se citește câte o valoare în x, a și b și, folosind funcția
abs() se atribuie lui m1 și m2 modulul expresiei x – a respectiv x-b. În final, se afișează valoarea expresiei E.
Problema 7.3. Să se scrie un program C/C++ care afișează valoarea funcției f : R ⟶ R, date prin
f ( x )=1−¿pentru o valoare reală x citită de la tastatură.
Prima soluție. În programul următor se declară doar două variabile, x și f - de tip float. Se citește
în x o valoare citită de la tastatură. Se atribuie lui f valoarea expresiei 1-abs(1-abs(1-x)). În final, această
valoare este afișată.
#include <iostream>
#include <math.h>
using namespace std;
int main() {
float x, f;
cout << "x= ";
cin >> x;
f = 1 - abs(1 - abs(1 - x));
cout << "f(" << x << ")= " << f << endl;
cout << endl;
return 0;
}
Cea de-a doua soluție. Fie x un număr real. Să notăm cu y expresia |1-x|, și respectiv cu z expresia
|1-y|, pentru că |1-y|=|1-|1-x||=1-f(x). Prin urmare, are loc f(x)=1-|z|. Pe baza acestor relații, în programul
următor, sunt declarate variabilele reale x, y, z și f. Se citește în x o valoare citită de la tastatură. Se
atribuie valori corespunzătoare variabilelor y, z și f. În final se afișează valoarea lui f.
#include <iostream>
using namespace std;
int main() {
float x, y, z, f;
cout << "x= ";
cin >> x;
if (1 - x >= 0)
y = 1 - x;
else
y = x - 1;
if (1 - y >= 0)
z = 1 - y;
else
z = y - 1;
if (z >= 0)
f = 1 - z;
else
f = 1 + (-1)*z;
cout << "f(" << x << ")= " << f << endl;
cout << endl;
return 0;
}

Problema 7.4. Să se scrie un program C/C++ în care se citesc de la tastatură două valori reale a și
x și afișează valoarea expresiei E(x) = x *|x- |x – a||.
Problema 8. Să se scrie un program C/C++ care determină și afisează valoarea mediei geometrice
a două valori reale a și b citite de la tastatură.
Soluție. Fie a și b două numere reale. Se știe că media lor geometrică, notată cu m g ( a , b ) , este
definită prin m g ( a , b ) =√ a∗b , orice de câte ori produsul a*b este mai mare sau egal cu 0.
Așadar, în programul următor sunt declarate variabilele mg, a și b – de tip float și, se citește de la
tastatură câte o valoare în a și b. Folosind o instrucțiune if - else, cu condiția (a*b >= 0), se determină
dacă are sens să se afișeze valoarea mediei geometrice. În caz afirmativ, folosind funcția sqrt – din
biblioteca math.h, cu argumentul a*b, se atribuie variabilei mg valoarea expreiei sqrt(a*b). În caz contrar,
se afișează fie valoarea variabilei mg fie un mesaj de eroare.
#include <iostream>
using namespace std;
int main() {
float a, b, mg;
cout << "a= ";
cin >> a;
cout << "b= ";
cin >> b;
if (a*b >= 0) {
mg = sqrt(a*b); // sqrt(a * b) = pow(a * b, 0.5)
cout << "mg(" << a << ", " << b << ")= " << mg << endl;
}
else
cout << "eroare!" << endl;
cout << endl;
return 0;
}

Problema 8.1. Să se scrie un program C/C++ în care se citesc două valori reale a și b și se afișează
valoarea expresiei E( a , b)=√ a2−b 2.
Indicație. Se poate considera folosirea identității a 2−b2= ( a−b )∗( a+b ) .
Problema 9. Să se scrie un program C/C++ în care este implementată funcția
f : R ⟶ R , data prin:
2

{
f ( x )=
1− ∗x , dacă x<1 ,
1
2
3
−x , dacă x ≥ 1.

Soluție. Având în vedere expresia funcției f, în programul următor sunt declarate variabilele x și f
- de tip float. Se citește de la tastatură o valoare în x. Folosind o instrucțiue if – else, cu condiția (x<1) se
atribuie o valoare variabilei f. În final, aceasta este afișată.
#include <iostream>
using namespace std;
int main() {
float x, f;
cout << "x = ";
cin >> x;
if (x < 1)
f = 1-(2./3)*x;
else
f = (1. / 2) - x;
cout << endl;
cout << "f = " << f << endl;
cout << endl;
return 0;
}
Problema 9.1. Să se scrie un program C/C++ în care este implementată funcția
f : R ⟶ R , data prin:
x∗x+ 1, dac ă x> 2,
{
f ( x )= 5 , dacă x ∈ [ −2 , 2 ] ,
−2∗x−1 , dacă x ←2.
Soluție. Aici, se declară variabilele x și f – de tip float, și, se citește în x o valoare de la tastatură.
Folosind două instrucțiuni if-else imbricate se atribuie variabilei f valoarea corespunzătoare. Cele două
condiții folosite sunt (x > 2) și respectiv (x < -2).
#include <iostream>
using namespace std;
int main() {
float x, f;
cout << "x=";
cin >> x;
if (x > 2)
f = x*x + 1;
else
if (x < -2)
f = -2 * x - 1;
else f = 5;
cout << "f(" << x << ")= " << f << endl;
cout << endl;
return 0;
}

Atenție! În programul anterior atribuirea valorii lui f se face relativ la ordinea în care sunt
prelucrate condițiile folosite. Folosind condiția simplă (x > 2) respectiv condiția compusă (x <= 2 && x
>= -2) atribuirea unei valori lui f se face în ordinea în care au fost scrie ramurile funcției f.
#include <iostream>
using namespace std;
int main() {
float x, f;
cout << "x=";
cin >> x;
if (x > 2)
f = x*x + 1;
else
if (x <= 2 && x >= -2)
f = 5;
else f = -2*x+1;
cout << "f(" << x << ")= " << f << endl;
cout << endl;
return 0;
}

Problema 9.2. Să se scrie un program C/C++ în care este implementată funcția


f : R ⟶ R , data prin
1− x , dac ă x >3 ,

{
f ( x )= x 2 , dacă x ∈ [ 0 , 3 ] ,
x+1 , dacă x <0.
Indicație. Se declară variabilele x și f – de tip float, iar în x se citește de la tastatură o valoare reală.
Folosind condițiile (x > 3) și (x <0) sau (x > 3) și (x>=0 && x<=3) se atribuie valoarea coresounzătoare lui f. În
final se afișează acea valoare.
Problema 9.3. Să se scrie un program C/C++ în care este implementată funcția
f : R ⟶ R , data prin
f ( x )= 1−3∗x , dacă x <1 ,
{ 2∗x+1 , dacă x >1.

Soluție. Funcția anterioară nu este definită în x = 1, deci se impune afișarea unui mesaj
corespunzător dacă valoarea atribuită lui x este 1.
#include <iostream>
using namespace std;
int main() {
float x;
cout << "x=";
cin >> x;
if (x > 1)
cout << "f(" << x << ")= " << 1 - 3 * x << endl;
else
if (x < 1)
cout << "f(" << x << ")= " << 2 * x + 1 << endl;
else
cout << "functia nu este definita in x = 1" << endl;
cout << endl;
return 0;
}

Problema 9.4. Să se scrie un program C/C++ în care este implementată funcția


f : R ⟶ R , data prin
f ( x )= √ x+1 , dacă x <0 ,
{
−x , dacă x> 0.
Indicație. Se procedează ca în problema precendentă.
Problema 9.5. Să se scrie un program C/C++ în care este implementată funcția
f : R ⟶ R , data prin
√ x 2−1 ,dacă x ∈(−∞ ,−1)∪ (1,+ ∞),
f ( x )=
{ 1−x 2 , dacă x ∈[−1 , 1].
Indicație. Se declară o variabilă x - de tip float, și se citește în x o valoare reală. Folosind fie
condiția (x <= 1 && x >= -1 ) fie (x < -1 || x > 1) se determină și afișează valoarea funcției f în x.
Problema 9.6. Să se scrie un program C/C++ în care este implementată funcția
f : R ⟶ R , data prin
√ x 2−4 , dacă x ∈(−∞ ,−2)∪ (2 ,+∞),
f ( x )=
{ 4−x2 , dacă x ∈(−2 , 2) .
Indicație. Pentru ce valori ale lui x funcția f nu este definită?
Problema 10. Să se scrie un program C/C++, în care sunt citite de la tastatură două valori reale – a
și b – coeficienții ecuației de gradul I ax+b=0, și afișează soluția acesteia, atunci când acest lucru este
posibil sau afișează un mesaj corespunzător altfel.
Soluție. Să considerăm următoarele cazuri particulare:
- pentru a = 1 și b = - √ 2 se obține ecuația x−√ 2=0, a cărei soluții este x=√ 2; deci în acest caz
−b
are sens să afișăm soluția; mai mult, dacă a ≠ 0atunci ecuația ax+b=0 are o unică soluție, x= .
a
- pentru a = 0 și b = 0 ecuația se scrie 0∗x+ 0=0; se observă orice valoare reală x este o soluție a
anterioare; de această dată nu mai are sens să afișăm soluția, dar se poate afișa, un mesaj
corespunzător.
- pentru a = 0 și b = 1 se obține ecuația 0∗x+ 1=0 dar aceasta nu are nici măcar o soluție; deci se
afișează un mesaj corespunzător.
Prin urmare, se disting următoarele cazuri: fie a ≠ 0 , fie a=b=0 , fie a=0 și b ≠0. Așadar, în
programul următor, se declară variabilele reale a și b – de tip float, și, li se atribuie câte o valoare de la
tastatură. Folosind două instrucțiuni if – else imbricate, având condițiile (a != 0) și respectiv (b != 0), se
determină natura și se rezolvă (când e cazul) ecuația de gradul I în cauză.
#include <iostream>
using namespace std;
int main() {
float a, b;
cout << "coeficientii ecuatiei de grd. I sunt: " << endl;
cout << "a= ";
cin >> a;
cout << "b= ";
cin >> b;
if (a != 0)
cout << "solutia este " << -b / a << endl;
else
if (b != 0)
cout << "nu exista solutii!" << endl;
else
cout << "ecuația are o infinitate de condiții! " << endl;
cout << endl;
return 0;
}

Problema 10.1. Să se scrie un program C/C++ în care se citesc trei valori reale a, b și x și se
afișează un mesaj corespunzător dacă valoarea lui x este soluția ecuației: a * x + b = 0.
Indicație. Condiția prin care se stabilește dacă x este soluție a ecuației a * x + b = 0 este (a * x +
b == 0).
Problema 10.2. Să se scrie un program C/C++ în care se citesc patru valori reale a, b, c și x și se
afișează un mesaj corespunzător dacă valoarea lui x este o soluție a ecuației: a∗x 2+ b∗x + c=0.
Indicație. Condiția folosită aici este (a∗x 2+ b∗x+ c=¿ 0).
Problema 10.3. Să se scrie un program C/C++ în care se citesc valorile reale a, b, c, x1 și x2 și se
afișează un mesaj corespunzător dacă x1 sau x2 este o soluție a ecuației: a∗x 2+ b∗x + c=0.
Problema 11. Condiția prin care se determină dacă o ecuație f(x) = 0 are măcar o soluție în
intervalul (a, b) este f ( a )∗f ( b ) ≤0. Să se scrie un program C/C++ în care se citesc de la tastatură două
valori reale distincte a și b și se determină dacă ecuația x 3+ x−1=0 are măcar o soluție în intervalul (a,
b).
Indicație. Se declară variabilele f1, f2, a și b – de tip float. În a și b se citesc, de la tastatură, cele
două valori reale iar variabilelor f1 și f2 li se atriuie, în ordine, valorile f(a) respectiv f(b). Folosind
condiția (f1 * f2 <= 0) se determină dacă ecuația dată are măcar o soluție în intervalul (a, b) și se
afișează un mesaj corespunzător.
Problema 12. Să se scrie un program C/C++ în care se citește de la tastatură o valoare reală r –
raza unui cerc C și se afișează perimetrul și aria lui C.
Indicație. Se declară variabila r – de tip float, în care se citește o valoare reală de la tastatură.
Folosind condiția (r >= 0) se stabilește dacă valoarea preluată poate fi raza unui cerc. În caz afirmativ
se afișează perimetru și aria cercului de raza r.
Problema 13. Să se scrie un program C/C++ în care se citesc două valori reale L și l – lungimea și
lățimea unui dreptunghi, și se afișează perimetrul, aria și diagonala acelui dreptunghi.
Indicație. Validarea valorilor preluate se poate face folosind condiția compusă (L > 0 && l >0).
Problema 14.1. Să se scrie un program C/C++în care se citesc de la tastatură trei valori reale a, b
și c și afișează un mesaj corespunzător dacă acestea sunt termenii unei progresii aritmetice.
Soluție. Se știe că a, b și c sunt termenii unei progresii aritmetice dacă fie 2*a = b+c fie 2*b = a+c fie 2*c
= a+b. Prin urmare, în programul următor sunt declarate variabilele reale a, b și c – de tip float, și, li se
atribuie câte o valoare, de la tastatură. Apoi, pe baza condițiilor elementare (2*a == b+c), (2*b == a+c) și
(2*a == b+c), se obține condiția compusă (2*a == b+c) || (2*b == a+c) || (2*a == b+c) – care, folosită
pentru a determina dacă cele trei valori sunt terminii unei progresii aritmetice sau nu.
#include <iostream>
using namespace std;
int main() {
float a, b, c;
cout << "cele trei valori sunt: " << endl;
cout << endl;
cout << "a= ";
cin >> a;
cout << "b= ";
cin >> b;
cout << "c= ";
cin >> c;
cout << endl;
if (a + b == 2 * c || c + b == 2 * a || c + a == 2 * b)
cout << "cele trei valori formeaza o progresie aritmetica!" << endl;
else
cout<<"cele trei valori nu formeaza o progresie aritmetica!" << endl;
cout << endl;
return 0;
}

Problema 14. Să se scrie un program C/C++în care se citesc de la tastatură trei valori reale a, b și
c și afișează un mesaj corespunzător dacă acestea sunt termenii unei progresii geometrice.
Indicație. Dacă cele trei valori ar fi ordonate, în valoare absolută, este suficient să se folosească condiția
(a*c == b*b). Cum, în general, aceasta din urmă nu este satisfăcută se poate folosi condiția compusă (a*c == b*b
|| a*b == c*c || b*c == a*a), care acoperă toate cazurile posibile.
Problema 15. Să se scrie un program C/C++, în care sunt preluate de la tastatură trei valori reale
a, b și c și afișează un mesaj corespunzător dacă acestea pot fi laturile unui triungi.
Soluție. Se știe că a, b și c pot fi laturile unui triunghi dacă, simultan, au loc inegalitătile: a<b+c,
b < a+c, c < a+b, a>0, b>0, și c>0. În consecință, în programul următor sunt declarate variabilele reale a,
b și c – de tip float, și, li se atribuie câte o valoare, de la tastatură. Ulterior, folosind condiția
(a + b > c && c + b >a && c + a > b && a>0 && b>a && c>0)
se determină dacă cele trei valori sunt laturile unui triunghi și în caz afirmati se afișează un mesaj
corespunzător. Se poate înlocui condiția compusă (a>0 && b>a && c>0) cu (a * b * c > 0)?
#include <iostream>
using namespace std;
int main() {
float a, b, c;
cout << "cele trei valori sunt: " << endl;
cout << endl;
cout << "a= ";
cin >> a;
cout << "b= ";
cin >> b;
cout << "c= ";
cin >> c;
cout << endl;
if (a + b > c && c + b >a && c + a > b && a*b*c>0 & a>0 && b>0 && c>0)
cout << "cele trei valori pot fi laturile unui triunghi!" << endl;
else
cout<<"cele trei valori nu pot fi laturile unui triunghi!" << endl;
cout << endl;
return 0;
}
Să se modifice convenabil programul anterior încât să se rezolve și
Problema 16. Să se scrie un program C/C++, în care sunt citite de la tastatură trei valori reale a, b
și c și dacă acestea pot fi laturile unui triunghi se afișează aria acelui triunghi.
Indicație. Dacă cele trei valori sunt laturile unui triunghi atunci aria acestuia se poate determina folosind
( a+b+ c)
formula lui Heron, adică A=√ p∗( p−a )∗( p−b )∗( p−b), unde p= .
2
Problema 17. Să se scrie un program C/C++, în care sunt preluate de la tastatură trei valori reale
a, b și c și dacă acestea pot fi laturile unui triunghi se afișează un mesaj corespunzător dacă triunghiul
respectiv este dreptunghic.
Indicație. Dacă cele trei valori pot fi laturile unui triunghi și a < b < c atunci condiția prin care se
determină dacă triunghiul respectiv este dreptunghic se scrie (a * a + b * b == c * c). Cum inegalitatea anterioară
nu are loc întotdeauna este nevoide de o condiție mai generală precum cea de la problema 15, dar scrisă
folosind operatorul ||.
*Problema 18. Să se scrie un program C/C++, în care sunt citite de la tastatură trei valori reale a,
b și c și dacă a ≠ 0afișează soluțiile ecuației de gradul al doilea a∗x 2+ b∗x + c=0.
Indicație. Se declară variabilele d, a, b și c de tip float iar în ultimele trei se citește de la tastatură câte o
valoare.
Dacă a ≠ 0 se trece la rezolvarea ecuației de gradul doi de coeficienți dați. Concret, mai întâi se atribuie lui d
valoarea expresiei b 2−4∗a∗c . Dacă d ≥ 0se afișează valorile rădăcinilor ecuației, altfel se afișează un mesaj
−b ± √ b2−4 ac
corespunzător. Cele două rădăcini, x 1 și x 2, ale ecuației de gradul al doilea de mai sus, sunt x 1,2=
2a
. Dacă a=0 atunci se afișează un mesaj corespunzător.
Exercițiul 6. Ce se va afișa la terminarea următoarelor secvențe de cod:
int i = 0; int i = 2;
if (i == 0) // cond. adv, (i==0) <=> (!i) if (i >= 0) // cond. adv,
cout << "corect!"; // instr. cond. de (i>=0) cout << 3; // instr. cond. de (i>=0)
// se afisează: corect cout << 4; // instr. necond. de (i >= 0)
// se afisează: 34
int i = 2; int i = 0, j=1;
if (i<0) // cond. falsă if (i<j) // cond. adv,
cout << 4; // instr. cond. de (i<0) cout << 1; // instr. cond. de (i<j)
cout << 2; // instr. necond. de (i<0) cout << 6; // instr. necond. de (i<j)
cout << 3; // instr. necond. de (i<0) if (i>=j) // cond. falsă
// se afișează: 23 cout << 3; // instr. cond. de (i<j)
// se afiseaza: 16
int i = 0, j=0; int i=1, j=2;
if (i<j) // cond. falsă if (i == 1) { // cond. adv,
cout << 1; // instr. cond. de (i<j) cout << 1; // instr. cond. de (i==1)
if (i>j) // cond. falsă cout << 2; // instr. cond. de (i==1)
cout << 2; // instr. cond. de (i>j) }
cout << 5; if (j<0) // cond. falsă
cout << 7; cout << 3; // instr. cond. de (j<0)
// se afișează: 57 cout << 4; // instr. necond. de (j<0)
// se afișează: 124
long int x = 1, y = 5; unsigned int x = 4, y = 3;
if (x % 2 == 0) { // cond. adv, if (x >= 5) // cond. falsă
cout << 1; // instr. cond. de (x % 2 == 0) cout << x*y; // instr. necond. de (x>=5)
cout << 2; // instr. cond. de (x % 2 == 0) else { // se exec. aceste instruc
} y = y - 2; //se atrib val 1 lui y
else cout << y; // nu se afiseaza valoarea lui y cout << y << endl;// se afis. val y
cout << endl; }
// nu se afiseaza nimic cout << endl;
// se afiseaza: 1
int x = 5, y; int x = 0, y = 2;
if (x = 4) { /* cond atipică, se atrib val 4 lui if (x = 3) {/* cond atipică, se atrib val
x */ 3 lui x */
x = x % 3; /* se atrib lui x val restului x = x / 7; /* se atrib lui x val
împ. lui x la 3, adică x = 1; */ câtului împ. lui x la 7, adică x = 0; */
y=1+(x++); /* lui y i se atrib val sumei x = x + (++y); /* se atrib lui x
dintre 1 si x; apoi x este incrementat cu 1; avem val. sumei dintre x si y, dar mai întâi y
este incrementat cu 1; avem x=3 si y=3 */
y=2 si x=2*/ }
cout << x << endl; /* se afișează val lui cout << x*y << endl;
x*/ // se afiseaza:9
}
// se afiseaza: 2
int i = 0, j=1; int x = 2, y = 3;
if (i++) /* cond falsa, (i++)<=>((i++) != 0) */ if (!(x % 2)) /* cond adv, (!(x % 2) <=>
j--; // instr. cond. de (i++) (x%2==0) */
else // instruct urm se exec cout << y*(y += (y + 3)) << endl;
if (j--) // cond adv, (j--)<=>((j--) != 0) /*se afiseaza patratul valorii lui y,
i++; // se incrementeaza val i cu 1 incrementand mai intai pe cu valoarea
cout << i*(j + 2) << endl; sumei dintre y si 3*/
// se afiseaza: 4 // se afiseaza 81

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