Sunteți pe pagina 1din 8

PCLP Laboratorul 5

Asist.drd.ing. Ana-Maria SUDUC

Laboratorul 5
Instrucţiuni I
1. Noţiuni teoretice
Instrucţiunile din C/C++ sunt grupate în următoarele categorii:
■ Selecţie: if şi switch;
■ Iteraţie: while, for şi do-while;
■ Salt: break, continue, goto şi return;
■ Etichetă: case, default şi label;
■ Expresie – instrucţiuni compuse dintr-o expresie validă în C/C++;
■ Bloc – blocuri de cod.

1.1. Adevărat şi fals în C/C++


Multe instrucţiuni în C/C++ depind de o expresie condiţională care determină ce acţiune va trebui
efectuată. O expresie condiţională dă o valoare de adevărat sau de fals. În C/C++, spre deosebire de
majoritatea limbajelor de programare, o valoare „adevărat" poate fi orice valoare nenulă, inclusiv numere
negative. O valoare „fals" este egală cu zero. Această metodă de abordare a conceptelor de adevărat şi fals
permite codarea extrem de eficientă a unei mari varietăţi de rutine.

1.2. Instrucţiuni de selecţie


Limbajul C/C++ acceptă două tipuri de instrucţiuni de selecţie: if şi switch. În plus, operatorul ?
poate constitui, în anumite circumstanţe, o alternativă a instrucţiunii if.
a) Instrucţiunea if (dacă)
Forma generală a instructiunii if este:
if (expresie) instructiune;
else instructiune;
unde instructiune poate simboliza o singură instrucţiune, un bloc de instrucţiuni sau nimic (în cazul
instrucţiunilor vide). Componenta else este opţională.
Dacă expresie este evaluată ca adevărată (adică orice altceva în afară de zero), instrucţiunea sau
blocul care formează ţinta lui if este executată; dacă nu, se va executa instrucţiunea sau blocul care este
determinat de else. Nu uitaţi, se va executa fie codul asociat lui if, fie cel asociat lui else, dar niciodată
amândouă.

b) Instrucţiunea switch
C/C++ conţine o declaraţie de selecţie cu ramuri multiple, denumită switch, care confruntă succesiv
valoarea unei expresii cu o listă de constante de tip caracter sau întreg. Când a fost descoperită o
coincidenţă, vor fi executate instrucţiunile asociate acelei constante. Aspectul general al instrucţiunii switch
este:
switch (expresie) {
case constanta1:
secventa de instructiuni
break;
case constanta2:
secventa de instructiuni
break;
case constanta3:
secventa de instructiuni
break;

default
secventa de instructiuni
}
Valoarea expresiei expresie este comparată, pe rând, cu fiecare din valorile constantelor exprimate
în instrucţiunile case. La descoperirea unei egalităţi, secvenţa de instrucţiuni asociată acelei instrucţiuni

1
PCLP Laboratorul 5
Asist.drd.ing. Ana-Maria SUDUC

case este executată până la instrucţiunea break sau până se ajunge la finele declaraţiei switch. Instrucţiunea
default (implicit) este executată dacă nu este găsită nici o egalitate. Această instrucţiune este facultativă şi,
dacă nu se află în program şi nu este găsită nicio egalitate, nu are loc nicio acţiune.
O instrucţiune de tip switch admite mai mult de 257 de instrucţiuni case (majoritatea
compilatoarelor permit mult mai multe.) În practică, numărul de instrucţiuni case poate fi limitat, din
considerente de eficienţă. Deşi case este o instrucţiune de tip etichetă, nu poate exista de sine stătător, în
afara unei instrucţiuni switch.
Instrucţiunea break este una din instrucţiunile de salt ale limbajului de programare C/C++ şi se
poate folosi la cicluri, precum şi în instrucţiuni switch. La întâlnirea instrucţiunii break în interiorul unei
instrucţiuni switch, programul execută un salt la linia de program imediat următoare instrucţiunii switch.
Executarea unei secvenţe de instrucţiuni poate continua şi în cadrul următoarei instrucţiuni case
dacă nu există nici o instrucţiune de tip break.
Instrucţiunea switch este adesea folosită pentru a prelucra comenzi provenite de la tastatură, cum ar
fi selecţia meniurilor.

1.3. Instrucţiuni de iteraţie

În C/C++, ca şi în alte limbaje moderne de programare, instrucţiunile de iteraţie (cunoscute de


asemenea şi sub numele de cicluri) permit repetarea unui set de comenzi până la îndeplinirea unei anumite
condiţii. Condiţia respectivă poate fi nedefinită (ca în cazul ciclului for) sau cu final deschis (ca în cazul
ciclurilor while şi do-while).

a) Ciclul for
Aspectul general al unui ciclu for se regăseşte într-o formă sau alta în toate limbajele de programare
procedurale. În C/C++ acestea asigură o putere şi o flexibilitate neaşteptate.
Expresia generală a instrucţiunii este
for(iniţiaIizare; condiţie; increment) instrucţiune;
Ciclul for permite multe variaţii. Iniţializarea este în general o instrucţiune de atribuire folosită
pentru a stabili valoarea variabilei de control a ciclului. Condiţia este o expresie relaţională care determină
când se încheie ciclul. Incrementul defineşte modul de modificare a variabilei de control a ciclului pe
măsură ce acesta se repetă. Cele trei elemente majore enumerate mai sus trebuie separate prin punct şi
virgulă. Ciclul for continuă să se repete atâta vreme cât condiţia este adevărată. De îndată ce aceasta devine
falsă, programul îţi continuă execuţia cu instrucţiunea imediat următoare lui for.
Utilizarea operatorului virgulă permite existenţa a două sau a mai multor variabile de control a
ciclului.
Exemplu:
for (x=0, y=0; x+y<10; ++x) ...
Cicluri infinite
Deşi pentru crearea unui ciclu infinit poate fi folosită orice instrucţiune de ciclu, în mod tradiţional
se foloseşte instrucţiunea for. Deoarece nici una dintre cele trei expresii care formează ciclul for nu este
necesară, un ciclu infinit poate fi creat lăsând liberă zona rezervată expresiei condiţionale. Exemplu:
for ( ; ; ) cout<<"Acest ciclu va rula la infinit”;
Structura for(;;) nu asigură un ciclu infinit când se foloseşte instrucţiunea break în interiorul ciclului
care determină încheierea imediată a acestuia. Programul va continua cu linia imediat următoare ciclului.
Cicluri fără conţinut
În C/C++ o instrucţiune poate fi fără conţinut. Conţinutul ciclului for poate fi de asemenea vid.
Acest fapt poate fi folosit pentru a îmbunătăţi eficienţa anumitor algoritmi şi pentru a crea cicluri pentru
întârziere.
Linia de program următoare indică modul de folosire a unui ciclu de întârziere folosind instrucţiunea
for:

2
PCLP Laboratorul 5
Asist.drd.ing. Ana-Maria SUDUC

for (t=0; t<o_valoare; t++);

b) Ciclul while

Al doilea ciclu din C/C++ este ciclul while. Aspectul său general este:
while (conditie) instructiune;
unde instructiune este o instrucţiune fără conţinut, o singură instrucţiune sau un bloc de instrucţiuni.
Conditia poate fi orice expresie, iar “adevărat” poate fi orice valoare diferită de zero. Ciclul se reia atâta
vreme cât condiţia este adevărată. Atunci când condiţia devine falsă, execuţia programului continuă cu linia
program imediat următoare ciclului.
Exemplul următor prezintă o rutina de introducere a datelor de la tastatură care se execută până când
utilizatorul tastează A:

asteapta_caracterul(void)
{
char ch;
ch = ‘\0’; /* initializare a lui ch */
while (ch != ‘A’) ch = getchar();
return ch;
}
Asemănător cu ciclurile for, ciclurile while testează condiţia la începutul ciclului, ceea ce însemnă
că ciclul nu se va executa dacă condiţia de început este falsă. Această facilitate poate elimina necesitatea
efectuării unui test condiţional separat de ciclu.

c) Ciclul do-while

Spre deosebire de ciclurile for şi while, care testează condiţia executării ciclului la începutul
acestuia, ciclul do-while îşi verifică condiţia la sfârşit. Aceasta înseamnă că întotdeauna un ciclu do-while
este executat cel puţin o dată. Forma generală a unui ciclu do-while este:
do{
instructiune;
}while (conditie);
Deşi acoladele nu sunt necesare în cazul unei singure instrucţiuni, sunt folosite de obicei pentru a
evita confuzia cu instrucţiunea while. Ciclul do-while se reia până conditie devine falsă.
Următorul ciclu do-while va citi numere de la tastatură până când se introduce un număr mai mic
sau egal cu 100.
do {
cin>>nr;
} while (nr>100);

2. Aplicaţii
2.1.Lansaţi în execuţie aplicaţia Visual C++ 2010 Express Edition:
Din meniul Start-> All Programs-> Microsoft Visual Studio 2010 Express, executaţi clic pe
opţiunea Microsoft Visual C++ 2010 Express.
2.2. Creaţi un nou proiect, Proiect1 şi un nou fişier File1.cpp:
a) Din meniul File->New, alegeţi opţiunea Project;
b) În fereastra New Project selectaţi opţiunea Win32 şi verificaţi să fie selectat Win32 Console
Application;
c) În câmpul Name introduceţi Proiect1 şi apăsaţi OK;
d) În fereastra deschisă apăsaţi Next şi apoi selectaţi opţiunea Empty Project şi apăsaţi Finish;
e) În secţiunea Solution Explorer executaţi clic dreapta pe directorul Source File şi alegeţi opţiunea
New-> Item;

3
PCLP Laboratorul 5
Asist.drd.ing. Ana-Maria SUDUC

f) În fereastra Add New Item selectaţi categoria Code şi verificaţi să fie selectată opţiunea C++
File (.cpp);
g) În câmpul Name tastaţi numele File1 şi apăsaţi Add.

2.3. În fişierul File1.cpp introduceţi şi testaţi următorul program:


#include <iostream>
#include <ctime>
using namespace std;

void main()
{
int magic;
int ghiceste;
srand ( time(NULL) );
magic = (rand()%10+1); // genereaza un numar pseudoaleator
cout<<"Ghiceste numarul ascuns: ";
cin>>ghiceste;
if (ghiceste == magic) {
cout<<"**Corect** ";
cout<<magic<<" este numarul magic \n";
}
else {
cout<<"Gresit,";
if (ghiceste > magic) cout<<"prea mare \n";
else cout<<"prea mic \n";
}
}

a) Tastaţi programul dat, respectând liniile de cod;


b) Compilaţi programul executând clic dreapta pe numele fişierului din secţiunea Solution Explorer
şi executând clic pe opţiunea Compile sau executând combinaţia de taste Ctrl+F7;
c) Corectaţi eventualele erori semnalate în secţiunea Output;
d) După rezolvarea eventualelor erori, rulaţi programul selectând, din meniul Debug, opţiunea Start
Without Debugging sau executând combinaţia de taste Ctrl+F5.
Obs. Acest program conţine un exemplu de utilizare a instrucţiunii if. Programul este o versiune
simplificată a jocului “ghiceşte numărul” şi scrie pe ecran **Corect** atunci când jucătorul ghiceşte
numărul respectiv, în caz contrar furnizează o indicaţie pentru alegerea numărului (“prea mare” sau
“prea mic”). Numărul este generat folosind funcţia din C++ care generează pseudoaleator numere,
rand(), care returnează un număr între 0 şi rand_max (care defineşte o valoare întreagă egală cu 32767
sau mai mare).
2.4. Testaţi următorul program:
#include <iostream>
#include <ctime>
using namespace std;

void main()
{
int magic;
int ghiceste;
srand(time(NULL));
magic = (rand()%100+1); // genereaza un numar pseudoaleator
cout<<"Ghiceste numarul ascuns: ";
cin>>ghiceste;
while (ghiceste!=magic)
{
cout<<"Gresit,";
if (ghiceste > magic) cout<<"prea mare \n";

4
PCLP Laboratorul 5
Asist.drd.ing. Ana-Maria SUDUC

else cout<<"prea mic \n";


cout<<"Incearca alt numar: ";
cin>>ghiceste;
}
cout<<"**Corect** ";
cout<<magic<<" este numarul magic \n";
}

Obs. Acest program reprezintă o versiune îmbunătăţită a programului de la punctul anterior. Programul
conţine o instrucţiune while care permite testarea de către utilizator a mai multor valori pentru a găsi
numărul magic, ghidându-l cu ajutorul indicaţiilor “prea mare” şi “prea mic”. Programul se opreşte după
ghicirea numărului.
2.5. Modificaţi programul de la punctul 2.3. pentru a obţine un program similar celui de la 2.4 dar care
să folosească instrucţiunea repetitivă do{}while în locul celei while.
a) Tastaţi programul de la punctul 2.3;
b) Plasaţi setul de instrucţiuni de la instrucţiunea care afişează mesajul „Ghiceste numarul ascuns”
şi până la sfârşitul funcţiei main() în instrucţiunea do {} while, instrucţiunile repetându-se cât
timp ghiceste este diferit de magic.
c) Compilaţi şi rulaţi programul.
2.6. Testaţi următorul program:
#include <iostream>
using namespace std;

void main()
{
int varsta;
cout<<"Introduceti varsta: ";
cin>>varsta;
if (varsta <100) {
cout<<"Esti destul de tanar! \n";
}
else
if (varsta == 100)
{
cout<<"Esti batran! \n";
}
else
{
cout<<"Esti foarte batran! \n";
}
}
2.7. Testaţi următorul program:
#include <iostream>
using namespace std;

void main()
{
int alegere;
cout<<"Pentru ce curs optati? \n";
cout<<"Tastati 1 pentru Fizica \n";
cout<<"Tastati 2 pentru Matematica \n";
cout<<"Tastati 3 pentru Informatica \n";
cout<<"Tastati 4 pentru Desen tehnic \n";
cout<<"Introduceti optiunea dumneavostra: ";
cin>>alegere;
switch (alegere)
{
case 1:

5
PCLP Laboratorul 5
Asist.drd.ing. Ana-Maria SUDUC

cout<<"Ati ales cursul de Fizica\n";


break;
case 2:
cout<<"Ati ales cursul de Matematica\n";
break;
case 3:
cout<<"Ati ales cursul de Informatica\n";
break;
case 4:
cout<<"Ati ales cursul de Desen tehnic\n";
break;
default:
cout<<"Trebuie sa alegeti unul din cele patru cursuri\n";
}
}
2.8. Rescrieţi programul anterior folosind instrucţiunea if:
a) Înlocuiţi instrucţiunea switch cu 4 instrucţiuni if imbricate;
b) Compilaţi şi rulaţi programul.
2.9. Testaţi următorul program:
#include <iostream>
using namespace std;

void main()
{
int nr;
cout<<"Introduceti un numar de programe: ";
cin>>nr;
switch(nr)
{
case 0:
cout<<"Niciunul\n";
break;
case 1:
cout<<"Unul\n";
break;
case 2:
cout<<"Doua\n";
break;
case 3:
case 4:
case 5:
cout<<"Cateva\n";
break;
default:
cout<<"Multe\n";
break;
}
}
Obs. Acest program estimează un număr cu: niciunul, unul, două, câteva, multe.
2.10. Testaţi următorul exemplu de utilizare a instrucţiunii for
#include <iostream>
using namespace std;
void main()
{
int i;
for (i=1; i<=100; i++)
cout<<i<<" ";
}

6
PCLP Laboratorul 5
Asist.drd.ing. Ana-Maria SUDUC

Obs. Acest program afişează numerele de la 1 la 100, separate printr-un spaţiu:


2.11. Testaţi următorul program:
#include <iostream>
using namespace std;
void main()
{
int n;
do
{
cout <<"\nIntroduceti un numar pentru a fi ridicat la puterea a 3-a, ";
cout<<"terminati tastand 0: ";
cin >> n;
cout << n <<" la puterea a 3-a este: " << n*n*n;
} while( n > 0 );

}
Obs. Acest program ridică la puterea a treia numerele introduse de la tastatură cât timp numărul introdus
este mai mare decât zero.
2.12. Testaţi următorul program:
#include <iostream>
using namespace std;
void main()
{
int i, n, s;
cout<<"n=";
cin>>n;
s=0;
for(i=1; i<=n; i++)
{
s=s+i;
}
cout<<"Suma="<<s<<endl;
}
Obs. Acest program calculează şi afişează suma primelor n numere, pentru n citit de la tastatură.
2.13. Modificaţi programul anterior pentru a calcula şi afişa pe lângă suma primelor n numere şi
produsul acestora:
a) Se declară variabila p şi se iniţializează cu valoarea 1;
b) În instrucţiunea for se introduce instrucţiunea de calcul a produsului: p=p*I;
c) Se afişează valoarea produsului cu o instrucţiune similară celei de afişare a sumei;
d) Compilaţi şi rulaţi programul obţinut.
2.14. Realizaţi un program care să utilizeze instrucţiunea for pentru a afişa sumele a două numere,
i şi j, care iniţial au valorile 2, respectiv 4 şi care se incrementează astfel încât suma lor să nu
depăşească 25.
a) Se declară variabilele i, j;
b) În instrucţiunea for vor exista două variabile de test i şi j. Acestea vor fi iniţializate cu 2, respectiv 4.
Cele două iniţializări vor fi separate prin virgulă. Condiţia oprire a instrucţiunii for este ca suma
celor două să fie mai mică sau egal cu 25. Ambele variabile sunt incrementate.
c) În instrucţiunea for va exista o singură instrucţiune: cea de afişare a sumei valorilor curente ale
variabilelor i şi j.
Un exemplu de cum va fi afişată una dintre sume este:
2+4=6
2.15. Realizaţi un program care calculează şi afişează suma şi produsul a n numere, citite de la
tastatură, care sunt divizibile cu 5 şi cu 7.

7
PCLP Laboratorul 5
Asist.drd.ing. Ana-Maria SUDUC

a) În programul de la punctul 2.13, în instrucţiunile de calcul ale sumei şi produsului se plasează pe


latura adevărat a unei instrucţiuni if care testează dacă i este divizibil cu 5 şi cu 7.
2.16. Să se scrie un program care afişează câte numere divizibile cu 4 sunt în intervalul [x,y],
pentru x şi y introduse de la tastatură.