Sunteți pe pagina 1din 17

Programare în C/C++ : structuri de control auxiliare

Unitatea de învățare nr. 11

INSTRUCŢIUNILE LIMBAJULUI C/C++


STRUCTURI DE CONTROL AUXILIARE

Cuprins Pagina

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


11.1 Selecţia multiplă (dintre mai multe alternative posibile) 2

11.2 Ciclul cu test final (verificat după executarea operaţiilor din ciclu) 5

11.3 Ciclul for (cu număr cunoscut de paşi) 6

11.4 Exemple și aplicații ce utilizează structurile prezentate 7

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

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

Recapitulare 16

Bibliografie – unitatea de învățare nr. 11 16

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

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

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

 Familiarizarea cu structurile de control auxiliare: selecția


multiplă, ciclul cu test final și repetiția cu număr cunoscut de pași.

 Scrierea unor programe C++ simple, utilizând structurile auxiliare


prezentate.

11.1. Selecţia multiplă (dintre mai multe alternative posibile)

Structurile de selecție care conțin mai multe variante sunt denumite structuri de selecție
cu multiple alternative sau structuri de selecție extinse. Pentru a codifica o astfel de structură de
selecție, în loc de a utiliza instrucțiunea if, se poate utiliza instrucțiunea switch:

Instrucţiunea SWITCH
permite selecţia unei variante din mai multe posibile.
Forma: switch (expresie)
{
case c1: secvenţă instrucţiuni1; break;
case c2: secvenţă instrucţiuni2; break;
............................................................
case cn: secvenţă instrucţiunin; break;
[default: secvenţă instrucţiunin+1];
}

unde: expresie este o expresie de tip întreg


c1, c2, ……, cn sunt constante de tip întreg
instrucţiuni1, instrucţiuni2,......, instrucţiunin sunt secvenţe oarecare de instrucţiuni

Funcţionare: se evaluează expresia. Dacă aceasta produce o valoare egală cu ci, se execută
secvenţă instrucţiunii şi se trece la instrucţiunea următoare instrucţiunii switch, altfel se execută
secvenţă instrucţiunin+1.
2
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Programare în C/C++ : structuri de control auxiliare

În absenţa alternativei default, dacă valoarea expresiei nu coincide cu valoarea nici uneia dintre
constantele c1, c2, ……, cn , instrucţiunea switch nu are nici un efect şi se trece la execuţia
instrucţiunii următoare.

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

k=2; k=2;
switch ((k-1)*3)) switch(3<4)
{ {
case 4-1 : k=k+1; case 1 : k++;
case (5-3)%2 : k=k+2; case (3<=5)&&(2>3) : k=k+2;
default: : cout<<”sfarsit”; case ‘a’ : k--;
} default: : cout<<”10”;
}

k=’a’; k=’a’;
switch (k+1) switch(k<’4’)
{ {
case ‘d’ : k=k+1; case ‘d’<=’9’ : k++;
case ‘1’ : k=k+2; case ‘1’>=’4’ : k=k+2;
default: : cout<<1; default :;
} }

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


k=2; k=2;
switch ((k/2.1)) switch((k<4)+3.5)
{ {
case sqrt(k) : k=k+1; ‘1’ : k++;
case 2 : k=k+2; ‘2’ : k=k+2;
default: : k=k+3; default: k=k+3;
} }

3
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Programare în C/C++ : structuri de control auxiliare

Exemplu de program care citeşte un număr natural şi precizează dacă el reprezintă codul
ASCII al unui caracter alfanumeric (literă mică, literă mare, cifră), în acest caz afişându-se şi
caracterul:

#include <iostream.h>
void main()
{
int n, a=0;
cin>>n;
if ((n>=97)&&(n<=122)) a=1;
else if ((n>=65)&&(n<=90)) a=2;
else if ((n>=48)&&(n<=57)) a=3;
swich(a)
{
case 1 : cout<<n<<”e codul ASCII al literei mici”<< (char) n;
case 2 : cout<<n<<”e codul ASCII al literei mari”<< (char) n;
case 3 : cout<<n<<”e codul ASCII al cifrei”<< (char) n;
default : cout<<n<<” nu e codul ASCII al unui caracter alfanumeric”;
}
}

Obs: Atunci când pentru anumite valori ale expresiei din cadrul instrucțiunii switch trebuie
executată aceeași secvență de instrucțiuni, alternativele se pot grupa.
De exemplu, în codul de mai jos, considerăm că se introduce de la tastatură numărul lunii din an
și dorim să obținem câte zile are acea lună:

switch (nr_luna_an)
{
case 2 : cout<<"are 28 de zile"; break;
case 4 : case 6 : case 9 : case 11:
cout<<"are 30 de zile"; break;
default : cout<<"are 31 de zile"; break;
}

4
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Programare în C/C++ : structuri de control auxiliare

11.2. Ciclul cu test final (verificat după executarea operaţiilor din ciclu)

Instrucţiunea DO WHILE
instrucţiune ciclică ce defineşte o structură repetitivă condiţionată posterior.

Forma: do
instrucţiune
while(expresie);

Funcţionare: Se execută instrucţiunea subordonată. Apoi se evaluează expresie;


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

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>


main() main()
{ {
int n, i=1, s=0; int n, i=1, s=0;
cout<<”n=”; cin>>n; cout<<”n=”; cin>>n;
do do
{ s+=i++;
s=s+i; while(i<=n);
i=i+1; cout<<”varianta 2”<<” “<<s;
} }
while(i<=n);
cout<<”varianta 1”<<” “<<s;
}

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

11.3. Ciclul for (cu număr cunoscut de paşi)

Instrucţiunea FOR
instrucţiune ciclică ce defineşte structura repetitivă condiţionată anterior, cu număr cunoscut de
paşi.

Forma: for (exp1;exp2;exp3)


instrucţiune;

unde exp1, exp2, exp3 sunt expresii: exp1 iniţializare, exp2 testare, exp3 reiniţializare
(incrementare)

Funcţionare: - se execută secvenţa de iniţializare definită de exp1.


- se evaluează exp2. Dacă e adevărată se execută instrucţiune, altfel se termină
execuţia instrucţiunii for şi se trece la execuţia instrucţiunii următoare instrucţiunii
for.
- se execută secvenţa de reiniţializare definită de exp3 şi se trece la pasul anterior.

Obs: 1) În secţiunea de iniţializare, exp1, se pot declara şi iniţializa variabile.


2) În cadrul instrucţiunii for, variabila de ciclare poate fi şi de un tip real.
3) dacă trebuie folosite mai multe instrucţiuni în cadrul celor trei secţiuni, exp1, exp2, exp3,
în cadrul fiecărei secţiuni, acestea se separă prin virgulă.
4) instrucţiunea poate fi instrucţiune compusă sau repetitivă sau de decizie.

Exemple de instrucţiuni definite corect d.p.d.v. sintactic:

for (float i=1;i<=10.5;i=i+0.5) j=5;


cout<<i<<” “; for(int i=5,j++;i<=10;i++,j++)
cout<<i<<” “<<j;

for(int i=1;i<=10;i++); /* deoarece dupa for am pus ‘;’ in ciclu nu se va executa nici o*/
cout<<i<<” “; /* instructiune, iar valoarea tiparita pentru i va fi 11 */

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

Exemplu de program în care expresiile din cadrul instrucțiunii pot conține condiții asupra mai
multor variabile:

#include<iostream.h>
void main()
{
int n, m ;
for (n=3,m=0;n<=10,m<=3 ;n++,m++)
cout<<“n = “<<n<<“, m = “<<m<<“, produs = “ <<n*m<<endl;
}

Rezultatul execuției va fi:


n = 3, m = 0, produs = 0
n = 4, m = 1, produs = 4
n = 5, m = 2, produs = 10
n = 6, m = 3, produs = 18

Obs: În acest caz, ciclarea se termină la m <= 3 și nu continuă până la n <= 10.

11.4. Exemple și aplicații ce utilizează structurile prezentate

1. Să se scrie un program care citeşte de la tastatură zece numere întregi şi afişează


numărul cu valoarea maximă dintre acestea.

#include<iostream.h>
#include<conio.h>
void main()
{
int A[10], maxim;
clrscr();
for(int i=0;i<10;i++)
{
cout<<"A["<<i<<"]=";
cin>>A[i];
7
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Programare în C/C++ : structuri de control auxiliare

};
maxim=A[0];
for(i=1;i<10;i++)
if(maxim<A[i])
maxim=A[i];
cout << "Numarul maxim este: " << maxim << endl;
cout << endl << "Apasati o tasta...";
getch();
};

2. Să se scrie un program care citeşte de la tastatură n numere întregi, n<=50 şi afişează


numerele în ordine crescătoare a valorilor.

#include<iostream.h>
#include<conio.h>
void main()
{
int A[50], tmp;
// preia de la consola elementele
do
{
clrscr();
cout<<"Introduceti numarul de elemente (2-50): "; cin>>n;
}while((n<2)||(n>50));
cout<<"Introduceti valorile"<<endl;
for(int i=0;i<n;i++)
{
cout<<"A["<<i<<"]= ";
cin>>X[i];
};
// sorteaza crescator elementele
for(int i=0;i<n-1;i++) // bucla incepe de la primul element si se
// termina la penultimul
for(int j=i+1;j<n;j++) // bucla incepe de la elementul din
8
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Programare în C/C++ : structuri de control auxiliare

// dreapta celui cu index si se termina la ultimul


if(A[i]>A[j]
{
tmp=A[i];
A[i]=A[j];
A[j]=tmp;
};
// afiseaza elementele sortate
for(int i=0;i<n;i++)
cout<<A[i]<<" ";
cout<<endl<<"Apasati o tasta...";
getch();
};

3. Se citeşte de la tastatură un vector v cu n elemente reale, n≤100. Să se scrie un program


care să genereze un nou vector prin intercalarea între oricare două componente
consecutive a vectorului v a mediei lor aritmetice.

#include<iostream.h>

#include<conio.h>

void main()

int i,j;

float x[100], y[200];

cout<<”se citeste dimensiune vector”; cin>>n;

for(i=1;i<=n;i++)

cout<<”x[”<<i<<”]=”;

cin>>x[i];

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

i=1; j=1;

while (i<=n-1)

y[j]=x[i];

y[j+1]=(x[i]+x[i+1])/2;

j=j+2; i++;

for(i=1;i<=j;i++)

cout<<y[i]<<” ”;

cout<<endl<<"Apasati o tasta...";

getch();

};

4. Se citeşte de la tastatură un vector v cu n elemente reale, n≤100. Să se scrie un program


care să elimine din vector elementul de pe poziţia k, k citit de la tastatură. Celelalte
elemente, începând cu poziţia k+1 să fie deplasate la stânga.
#include<iostream.h>
#include<conio.h>
void main()
{
int i,n,k;
float x[100];
cout<<”se citeste dimensiune vector”; cin>>n;
cout<<”se citeste pozitia elementului ce va fi eliminat”; cin>>k;
for(i=1;i<=n;i++)
{
cout<<”x[”<<i<<”]=”;
cin>>x[i];
}
for(i=k;i<=n-1;i++)
10
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Programare în C/C++ : structuri de control auxiliare

x[i]=x[i+1];
cout<<”noul vector obtinut:”;
for(i=1;i<=n-1;i++)
cout<<x[i]<<” ”;
cout<<endl<<"Apasati o tasta...";
getch();
};

5. Să se scrie un program care primeşte de la consolă temperatura exprimată în grade


Celsius şi afişează valoarea acesteia în grade Fahrenheit. În final utilizatorul poate relua
conversia.
Formula pentru conversia din grade Celsius în grade Fahrenheit este:
o 9 o
F = × C +32
5
#include<iostream.h>
#include<conio.h>
void main()
{
float tempC, tempF;
char r;
do
{
clrscr(); // sterge ecranul
cout << "Introduceti temperatura in grade Celsius: "; cin >> tempC;
tempF = tempC * 9 / 5 + 32;
cout << "Temperatura in grade Fahrenheit este: " << tempF << endl;
cout << "Repetati conversia? (d/n)"; cin >> r;
} while ( (r=='d') || (r=='D') );
};

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

Test de autoevaluare 1

1. Este posibil ca instrucțiunile din corpul instrucțiunii ________________să nu fie


executate în timpul rulării.
a. while b. for
c. do while d. atât b și c

2. În secvenţa de mai jos, de câte ori are loc ciclarea?


int a=10, b=10, c=20, contor=0, suma=0;
do
{
if (a>=b) suma++;
cout<<suma;
contor++;
} while (a<c);

a) 0 b) infinit c) 10 d) 1

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


int i;
for(i = 1; i<= 1; i++)
cout<<i<<” “;
cout<<i<<endl;
a) 1 0 b) 1 1 c) 1 2 d) 0 0

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


int x = 2;
do
{
cout<<x<<" ";
x--;

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

cout<<endl;
} while(x<0);

a) 2 b) 2 1 0 -1 c) 2 1 d) 2 1 0 -1 -2

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


int i=0, j=0;
for (i =20 ; i>= 5; i -= 5)
{
cout << i << endl;
for (j=0; j < 1;j++)
{
cout << (i + j) <<" ";
}
}
a) 20 b) 20 c) 20 d) 20
20 15 15 10 20 10 15 10
15 10 10 5 10 5 10 5
10 5 5 5 0
5

6. Care dintre instrucţiunile „for” de mai jos produc acelaşi rezultat ca


următoarea secvenţă de instrucţiuni?
int a = 1;
do
cout << a++;
while ( a <= 10 );

a) for(int a=1; a<10; a++) cout<<a;


b) for(int a=0; a<10; ) cout<<++a;
c) for(int a=0; a<11; a++) cout<<a;
d) for(int a=0; a<11; a++)cout<<++a;

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

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


int i = 1, suma = 0;
for ( ; i <= 10; i *= 2, suma += i);
cout << suma;

a) 0 b) 30 c) 100 d) 20

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

1. Se consideră următoarea secvență de instrucțiuni:


int nr;
cout<<”Introduceti numarul : ”; cin>>nr;
switch (nr)
{
case 1:
case 2: nr *= 4; break;
case 3:
case 4: nr += 4; break;
default: nr -= 20;
}
cout<<”Numarul obtinut este : “<<nr<<endl;

Dacă se introduc numerele 3, 4 și respective 20, ce se va afișa în urma


rulării acestei secvențe?

2. Următoarea secvență de instrucțiuni ar trebui să afișeze unul dintre cele


patru mesaje. Mesajul corespunzător se bazează pe nivelul introdus de
utilizator.
Corectați erorile astfel încât mesajele să fie afișate corespunzător:

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

xy  ( x  y ) 2
Programare în C/C++ : structuri de control auxiliare

Nivel Mesaj
1 sau 2 incepator
3 mediu
4 sau 5 avansat
altul ID gresit

int nivel;
cout<<” Nivelul de la 1 la 5 este : “; cin>>nivel;
switch (nivel)
{
case 1:
case 2: cout<<”incepator”;
case 3: break; cout<<”mediu”;
case 4: cout<<”avansat”;
case 5: break;
default: cout<<”Id gresit”;
}

3. Scrieți un program care citește două numere, considerate operanzi, iar


între ele un operator, și afișează rezultatul operației. De exemplu:

se citește: se afișează:
5*4 20
17 / 3 5
25 – 40 - 15

4. Fiind dată matricea A(nxm) şi matricea B (mxp), să se calculeze în


matricea C(nxp) produsul celor două matrici.

5. Fiind dat un interval [a,b] cu a şi b numere naturale citite de la


tastatură, a < b şi un alt număr c citit de la tastatură, să se afişeze toate
numerele din intervalul dat care sunt divizibile cu numărul c.

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

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

1. a)
2. b)
3. c)
4. a)
5. a)
6. b)
7. b)

Recapitulare

Instrucţiunea SWITCH permite selecţia unei variante din mai multe


posibile. Atunci când pentru anumite valori ale expresiei din cadrul
instrucțiunii switch trebuie executată aceeași secvență de instrucțiuni,
alternativele se pot grupa.
Instrucţiunea DO WHILE este instrucţiunea ciclică ce defineşte o
structură repetitivă condiţionată posterior.
Instrucţiunea FOR este instrucţiunea ciclică ce defineşte structura
repetitivă condiţionată anterior, cu număr cunoscut de paşi.

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,

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

2016.
5. Farrell, J. ”Programming Logic and Design”, Ed. Cengage Learning, 2012.

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

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