Sunteți pe pagina 1din 18

Programare în C/C++ : structuri algoritmice fundamentale

Unitatea de învățare nr. 10

INSTRUCŢIUNILE LIMBAJULUI C/C++


STRUCTURI ALGORITMICE FUNDAMENTALE

Cuprins Pagina

Obiectivele unității de învățare nr. 10 2


10.1 Structura secvențială 2

10.2 Structura decizională (de selecție) 3

10.3 Structura repetitivă 7

10.4 Exemple și aplicații ce utilizează structurile algoritmice fundamentale 10

Lucrare de verificare – unitatea de învățare nr. 10 14

Răspunsuri și comentarii la întrebările din testele de autoevaluare 16

Recapitulare 17

Bibliografie – unitatea de învățare nr. 10 18

1
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Programare în C/C++ : structuri algoritmice fundamentale

OBIECTIVELE unității de învățare nr. 10

Principalele obiective ale Unității de învățare nr. 10 sunt:

 Familiarizarea cu conceptele de bază - structurile logice: secvența,


selecția și repetiția.

 Înțelegerea rolului structurilor de control în rezolvarea


problemelor.

 Scrierea unor programe C++ simple, utilizând structuri


secvențiale, condiţionale și de repetiţie.

10.1. Structura secvențială

Orice program C/C++, indiferent de complexitatea sa, poate fi scris utilizând una, două
sau toate cele trei structuri de bază: secvența, selecția și repetiția. Aceste structuri sunt numite
structuri de control sau structuri logice, deoarece ele controlează fluxul logic al problemei și
astfel controlează ordinea în care computerul execută instrucțiunile programului.
Structura secvențială corespunde execuției într-o anumită ordine, a unui set de
instrucțiuni. Secvența poate conține oricâte instrucțiuni, dar acestea se execută pas cu pas, până
la terminarea secvenței, fără să existe o opțiune de ramificare sau salt peste anumite instrucțiuni.
Structura secvențială este utilizată în toate programele.

Figura 1: Structura secvențială


2
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Programare în C/C++ : structuri algoritmice fundamentale

Ex:
#include < iostream.h >
void main ()
{
float nota_proba1, nota_proba2;
cin>> nota_proba1;
cin>> nota_proba2;
medie= (nota_proba1+ nota_proba2)/2;
cout <<”medie examen =“<<medie;
}

Legat de structurile de control există un alt concept: instrucțiunea compusă sau bloc.
Instrucțiunea compusă este un grup de instrucțiuni care sunt separate prin punct și virgulă,
grupate împreună într-un bloc cuprins intre paranteze: {}

Forma: {
declaraţii şi definiţii locale blocului
instrucţiuni
}

Ex: presupunem că într-un punct al programului trebuie permutate valorile variabilelor a şi b:


{ Obs: după execuţia ultimei
int aux; instrucţiuni a instrucţiunii
compuse, variabila aux nu
aux = a; a = b; b = aux; mai este definită!
}

10.2. Structura alternativă

Structura decizională (de selecție) indică faptul că într-un anumit punct al programului
trebuie luată o decizie (în funcție de anumite condiții), urmată de o acțiune corespunzătoare
derivată din această decizie.
În C/C++ există trei tipuri de structuri decizionale:
if (decizia simplă)
if/else
3
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Programare în C/C++ : structuri algoritmice fundamentale

switch

Structura if (decizia simplă)


Formă: if (expresie) instrucţiune;

Nu Da

Figura 2: Structura if (decizia simplă)

Funcţionare: se evaluează expresia din paranteze. Apoi, dacă expresia are valoarea
diferită de 0 (adevărat) se execută instrucţiune. Altfel, se trece la instrucţiunea următoare
instrucţiunii if.

Obs: În unele cazuri, este necesar să se efectueze mai multe instrucțiuni atunci când
condiția este adevărată, în aceste situații, acele instrucțiuni simple pot fi scrise ca o singură
instrucțiune compusă (bloc).
Forma generală în acest caz este:

if (expresie)
{
instrucțiune 1;
...
instrucțiune N;
}

Ex 1:
int a = 10;
4
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Programare în C/C++ : structuri algoritmice fundamentale

if(a > 5)
{
a ++;
cout << a;
}

Ex 2: Ce se va afişa la terminarea execuţiei următoarei secvenţe de cod:


int x = 10, y = 0;
if (x)
cout<< 4;
cout<< 5;
if (y)
{
cout<< 6;
cout<< 7;
}

Răspuns: 4 5

Structura if/else

Formă: if (expresie) instrucţiune1;


else instrucţiune2;

Nu Da

Figura 3: Structura if/else


5
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Programare în C/C++ : structuri algoritmice fundamentale

Funcţionare: se evaluează expresia din paranteze. Apoi, dacă expresia are valoarea
diferită de 0 (adevărat) se execută instrucţiune1 şi apoi se trece la instrucţiunea următoare
instrucţiunii if; altfel, se execută instrucţiune2 şi apoi se trece la instrucţiunea următoare
instrucţiunii if.

Obs:
1) Înainte de cuvântul cheie else nu se pune ’;’ dacă instrucţiune1 este o instrucţiune compusă,
altfel se pune obligatoriu.
2) Ramurile instrucţiunii if pot conţine la rândul lor alte instrucţiuni if (se numesc if-uri
imbricate).
3) Ramurile instrucţiunii if pot conţine instrucțiuni compuse; forma generală este:
if (expresie)
{
instrucțiune 1;
...
instrucțiune N;
}
else
{
instrucțiune 1;
...
instrucțiune N;
}

Exemple de secvenţe scrise corect d.p.d.v. sintactic:


k=3; if (1) cout<<”da” k=3; if (0);
if (!0) k++; else cout<<”nu”; if (!k); else cout<<”nu”;
else k--; else;

Program ce exemplifică folosirea unei instrucţiuni if în corpul altei instrucţiuni if:

Se citesc trei variabile reale x, y , z. Să se calculeze:

6
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Programare în C/C++ : structuri algoritmice fundamentale

x+y, z>0
e= x*y, z=0
x-y, z<0

#include <iostream.h>
void main()
{
double x,y,z,e;
cout<<”x=”;cin>>x; cout<<”y=”;cin>>y; cout<<”z=”;cin>>z;
if (z>0) e=x+y;
else if (z= =0) e= x*y; // se poate scrie şi if (!z)
else e = x-y;
cout<<e;
}

10.3. Structura repetitivă: ciclul cu test iniţial (cu număr necunoscut de paşi,
condiţionată anterior)

Forma: while (expresie)


instrucţiune;

Funcţionare: se evaluează expresie;


Dacă valoarea obţinută este diferită de 0, se execută instrucţiune şi se revine la pasul anterior, iar
dacă se obţine o valoare egală cu 0, se trece la următoarea instrucţiune din cadrul programului.

Obs: 1) Instrucţiunea care depinde de expresia de la while poate să nu se execute niciodată.


Aceasta se întâmplă atunci când după evaluarea expresiei se obţine valoarea 0.
Ex: a=1; b=a+1;
Încă de la început condiţia este
while(a>=2) falsă şi deci expresia având
{ valoarea 0, instrucţiunea nu se
execută niciodată.
a+=b;
b++;
}

7
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Programare în C/C++ : structuri algoritmice fundamentale

2) Instrucţiunea care depinde de expresia de la while poate să se execute de o infinitate de


ori. Aceasta se întâmplă atunci când expresia are valoarea diferită de 0 întotdeauna.
Ex: a=1; b=b+1;
while(a<=2) Condiţia nu devine falsă
niciodată şi deci instrucţiunea
{ se execută de o infinitate de ori.
b+=a;
b++;
}
3) Dacă după expresie se pune ‘;’, avem două situaţii :
- dacă condiţia este adevărată, se intră în ciclu infinit
- dacă condiţia este falsă se execută următoarea instrucţiune din program
Ex: a=1; b=b+1;
while(a<=2); ciclu infinit

{
a--;
b++;
}

Ex: a=1; b=b+1;


while(a>=2); se execută următoarea
instrucţiune din program
{
a--;
b++;
}

Exemplu de secvenţe echivalente scrise corect:


1) secvenţele următoare calculează suma primelor n numere naturale, n se citeşte de la
tastatură.

#include <iostream.h> #include <iostream.h> #include <iostream.h>


main() main() main()
{ { {
int n, i, s; int n, i, s; int n, i, s;

8
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Programare în C/C++ : structuri algoritmice fundamentale

cout<<”n=”; cin>>n; cout<<”n=”; cin>>n; cout<<”n=”; cin>>n;


s=0; i=1; s=i=0; s=0; i=1;
while(i<=n) while(i<=n) while(s+=i++,i<=n);
{ s+=++i; cout<<”varianta 3”<<”
s+=i; cout<<”varianta 2”<<” “<<s; “<<s;
i++; } }
}
Obs: datorită multiplelor posibilităţi
cout<<”varianta 1”<<” “<<s; de lucru cu expresii, s-au folosit mai
multe expresii separate prin virgulă.
} Valoarea produsă de expresie este
dată de ultima din şirul lor.

2) secvenţele următoare calculează nr. obţinut prin inversarea cifrelor unui nr. n citit de la
tastatură.
#include <iostream.h> #include <iostream.h>
main() main()
{ {
int n, ninv=0; cout<<”n=”; cin>>n; int n, ninv=0; cout<<”n=”; cin>>n;
while(n) while(ninv=ninv*10 + n%10, n/=10);
{ cout<<”numarul inversat”<<ninv;
ninv=ninv*10 + n%10; n= n/10; }
Obs: datorită multiplelor posibilităţi
}
de lucru cu expresii, s-au folosit mai
cout<<”numarul inversat”<<ninv; multe expresii separate prin virgulă.
Valoarea produsă de expresie este
} dată de ultima din şirul lor.

3) Ce se va afişa la terminarea execuţiei următoarei secvenţe de cod:

int a=50, b=10;


while (a > b)
{
a -= 5;
b += 5;
}
cout << a << endl;

Răspuns: 30

9
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Programare în C/C++ : structuri algoritmice fundamentale

10.4 Exemple și aplicații ce utilizează structurile algoritmice fundamentale

1) Dacă se introduce de la tastatură pentru variabila a valoarea 100, ce se va afişa la


terminarea execuţiei secvenţelor de cod următoare:

i)
if (a >= 0)
if (a < 50)
cout << "valoarea lui a este mica"<<endl;
else
cout << "valoarea lui a este negativa"<<endl;

Răspuns: mesajul afişat va fi: "valoarea lui a este negativa" deoarece compilatorul asociază
cuvântul cheie “else” cu cel mai apropiat “if” care îl precede. Practic, aranjarea corectă a liniilor
de cod în acest caz este:

if (a >= 0)
if (a < 50)
cout << "valoarea lui a este mica"<<endl;
else
cout << "valoarea lui a este negativa"<<endl;

ii)
if (a >= 0)
{
if (a < 50)
cout << "valoarea lui a este mica"<<endl;
}
else
cout << "valoarea lui a este negativa"<<endl;

Răspuns: în acest caz nu va fi afişat nici un mesaj.

2) Care este valoarea variabilei i la terminarea execuţiei următoarei secvenţe de cod:


10
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Programare în C/C++ : structuri algoritmice fundamentale

i = 0;
while(i <=50)
i += 5;

Răspuns: 55

3) Ce se va afişa la terminarea execuţiei următoarei secvenţe de cod:

int a = 10;
if (a = 5)
a ++;
cout << a;

Răspuns: 6

4) Ce se va afişa la terminarea execuţiei următoarei secvenţe de cod:

num = 0;
while (num < 10)
{
cout<<num<<” “;
num = num + 1;
}

Răspuns: 0 1 2 3 4 5 6 7 8 9

5) Ce se va afişa la terminarea execuţiei următoarei secvenţe de cod:

int a = 15, b = 10, c = 5;


if (c >= b && a) b--;
else if (b <= c)
{
a--;

11
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Programare în C/C++ : structuri algoritmice fundamentale

if (a<b)
c--;
}
cout << a*b*c << endl;

Răspuns: 750

Test de autoevaluare 1

1. Care dintre următoarele concepte nu reprezintă o structură de control într-


un program C/C++?
a. repetiția c. secvenţa
b. selecția d. sortarea

2. Ce se va afişa la terminarea execuţiei următoarei secvenţe de cod:


int a = 20, b=85;
while((b - a) % 3)
{
cout<<b<<" ";
b -= 10;
}

a) 85 75 b) 85 75 65 55 c) 80 70 60 d) 80 70 60 50

3. Ce se va afişa la terminarea execuţiei următoarei secvenţe de cod:


int x = 10;
if(x = 5)
if (x == 10) cout << x;
else
cout << “ ”;
cout << 55;

12
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Programare în C/C++ : structuri algoritmice fundamentale

a) 10 55 b) 55 c) 5 d) 10

4. Ce se va afişa la terminarea execuţiei următoarei secvenţe de cod:


int a = 10, b = 20, c = 30;
if (a < 5)
if (b < 10) cout << "unu";
else cout << "doi";
else if (c > 20)
cout << "trei";
else
cout << "patru";

a) unu b) trei c) doi d) patru

5. Ce se va afişa la terminarea execuţiei următoarei secvenţe de cod:


int a = 10;
while ( a = 5 )
{
a--;
cout << a << " ";
}

a) 10 b) 4 4 4…………. c) 20 d) 1

6. Să se scrie un program simplu care citeşte de la consolă un număr natural n


şi afişează suma cifrelor acestui număr.

13
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Programare în C/C++ : structuri algoritmice fundamentale

Lucrare de verificare la Unitatea de învățare nr. 10

1. Care dintre următoarele structuri de control este utilizată în fiecare


program?
a) repetiția c) secvenţa
b) selecția d) permutarea

2. Structura secvențială poate conține:


a) o singură instrucțiune c) nu mai mult de trei instrucțiuni
b) oricâte instrucțiuni d) exact trei instrucțiuni

3. Un set de instrucțiuni care sunt executate împreună formează:


a) un grup c) un bloc
b) o familie d) o unitate

4. Într-o structură de selecție, expresia este solicitată:


a) o singură dată, la începutul structurii
b) o singură dată, la sfârșitul structurii
c) în mod repetat, până când devine falsă
d) în mod repetat, până când devine adevărată

5. Folosind o structură de tip if/else, scrieți un program în care să


verificați dacă un număr a se divide la un număr b, unde a și b sunt
numere naturale citite de la tastatură.

6. Scrieți un program care verifică dacă un caracter introdus de la


tastatură este este o literă sau nu. Mai mult, dacă este literă mică sau

xy  ( x  y ) 2

14
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Programare în C/C++ : structuri algoritmice fundamentale

majusculă.

7. Scrieți un program pentru a determina dacă un anumit an (citit de la


tastatură) este un an bisect.

8. Ce se va afişa la terminarea execuţiei următoarei secvenţe de cod:


int a = 0, b = 20, c;
if(a) c = 15;
else c = 20;
if(b) c = 5;
else c = 10;
cout << c;

a) 15 b) 5 c) 20 d) 10

9. Care dintre următoarele instrucţiuni C++ este corect scrisă din punct
de vedere sintactic?
a) if a==1 cout << ”corect” b) if(a==1) cout << ”corect”;
c) if(a==1) cin << ”corect” d) if(a==1) cout >> ”corect”;

10. Nivelul de pregătire al unui student la o anumită materie este stabilit


în urma unei testări, în funcție de numărul de puncte obținute. Astfel, se
consideră că:

Nr puncte Nivel
0 p - 20 p insuficient
21 p - 40 p suficient
41 p - 60 p bine
61 p - 80 p foarte bine
81 p - 100 p excelent

Următorul program alocă în mod corect nivelul de pregătire? Dacă nu,


corectați codul:

15
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Programare în C/C++ : structuri algoritmice fundamentale

if (nr_puncte > 0)
cout<< “nivel = insuficient”;
else if (nr_puncte > 20)
cout<< “nivel = suficient”;
else if (nr_puncte > 40)
cout<< “nivel = bine”;
else if (nr_puncte > 60)
cout<< “nivel = foarte bine”;
else if (nr_puncte > 80)
cout<< “nivel = excelent”;

Răspunsuri și comentarii la întrebările din testele de autoevaluare

1. d)
2. a)
3. b)
4. b)
5. b)
6.
#include<iostream.h>
#include<conio.h>
void main()
{
unsigned long n;
unsigned int suma = 0; // declarare si initializare variabila suma
clrscr(); // sterge ecranul
cout << "Introduceti numarul n: "; cin >> n;
while(n>0)

16
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Programare în C/C++ : structuri algoritmice fundamentale

{
suma += n % 10; // se mai poate scrie si suma = suma + n % 10;
n /= 10; // se mai poate scrie si n = n / 10;
};
cout << "Suma cifrelor numarului este " << suma << endl;
cout << endl << "Apasati o tasta...";
getch();
};

Recapitulare

Orice program C/C++, indiferent de complexitatea sa, poate fi scris


utilizând una, două sau toate cele trei structuri de bază: secvența, selecția și
repetiția.
Structura secvențială corespunde execuției într-o anumită ordine, a unui
set de instrucțiuni. Secvența poate conține oricâte instrucțiuni, dar acestea se
execută pas cu pas, până la terminarea secvenței, fără să existe o opțiune de
ramificare sau salt peste anumite instrucțiuni. Structura secvențială este
utilizată în toate programele.
Legat de structurile de control există un alt concept: instrucțiunea
compusă sau bloc. Instrucțiunea compusă este un grup de instrucțiuni care sunt
separate prin punct și virgulă, grupate împreună într-un bloc cuprins intre
paranteze: {}
Structura decizională (de selecție) indică faptul că într-un anumit punct
al programului trebuie luată o decizie (în funcție de anumite condiții), urmată
de o acțiune corespunzătoare derivată din această decizie.
În C/C++ există trei tipuri de structuri decizionale:
if (decizia simplă)
if/else
switch

17
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Programare în C/C++ : structuri algoritmice fundamentale

Structura repetitivă cu test iniţial (cu număr necunoscut de paşi,


condiţionată anterior) este structura while. Atâta timp cât expresia condițională
plasată între paranteze este evaluată ca fiind adevărată, adică este diferită de
zero, va fi efectuată instrucțiunea corespunzătoare.

Instrucţiunea care depinde de expresia de la while poate să nu se


execute niciodată. Aceasta se întâmplă atunci când după evaluarea expresiei se
obţine valoarea 0.

Instrucţiunea care depinde de expresia de la while poate să se execute


de o infinitate de ori. Aceasta se întâmplă atunci când expresia are valoarea
diferită de 0 întotdeauna.

Bibliografie:

1. Dinu, S., Pomazan, C. ”Programarea Caclulatoarelor”, Ed. Nautica, 2013.


2. Malik, D.S. ”Introduction to C++ programming”, Ed. Cengage South-
Western, 2009.
3. Chaudhary, H.H. ”Head First C++ Programming”, Ed. CreateSpace O-D
Publishing LLC, 2014.
4. Zak, D. ”An Introduction to Programming with C++”, Ed. Cengage Learning,
2016.
5. Farrell, J. ”Programming Logic and Design”, Ed. Cengage Learning, 2012.

18
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii

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