Documente Academic
Documente Profesional
Documente Cultură
Indrumar Laborator
Prezenta
Nr.
Prezente 0 1 2 3 4 5 6 7 8 9 10 11 12
Punctaj -30 -25 -20 -15 -10 -5 0 5 10 13 15 18 20
Activitate laborator
In fiecare ora de laborator este propusa cate o problema. Rezolvarea acesteia in timpul
laboratorului duce la obtinerea a unui punct (1p). Se pot obtine maximum 12 de puncte. Primul
si ultimul laborator nu se considera.
Partial
Prezenta este obligatorie. Acesta are loc in saptamana a 7-a sau a 8-a. Daca partialul nu este
promovat aceasta se poate repeta in ultima saptamana.
Partialul consta din rezolvarea (pe calculator) a unei probleme asemanatoare cu cele propuse si
rezolvate in prima parte a semestrului. Notarea se face cu punctaj intre 0 si 35. Trebuie sa se
obtina minum 20 puncte pentru a considera ca partialul a fost promovat.
Examen
Examenul consta din rezolvarea (pe calculator) a unei probleme asemanatoare cu cele propuse si
rezolvate in timpul semestrului. Notarea se face cu punctaj intre 0 si 45. Trebuie sa se obtina
minum 25 de puncte pentru a considera ca examenul a fost promovat.
Pentru promovarea laboratorului este necesara obtinerea unei punctaj mai mare de 50 de
puncte (corespunzatoare notei 5). Atentie! 45 de puncte nu inseamna nota 5 !
Introducere
Terminologie:
Cod masina: programele si datele sunt introduse in calculator folosind succesiuni de zero
si unu. Codul masina este limbajul pe care il intelege calculatorul. Indiferent de limbajul
folosit pentru programare, in cele din urma toate programele si datele sunt traduse in cod
masina.
Sintaxa: Reguli de construire a unor comenzi valide intr-un limbaj de progrmare. Daca
un program are erori de sintaxa atunci el nu se va compila si vor rezulta erori de
compilare.
Erori de rulare si de logica: O eroare de rulare apare atunci cand un program nu poate
executa ceea ce i s-a cerut. De exemplu, deschiderea unui fiser care nu exista. Erorile de
logica sunt cel mai dificil de detectat si rezolvat; sunt cauzate de erori de logica din partea
programatorului. De exemplu, sa presupunem ca dorim sa scriem un program care sa
ofere o reducere daca se realizeaza cumparaturi in valoare mai mare de 1000 de RON, dar
programul rezultat ofera reducerea pentru valori mai mici de 1000 de RON.
C/C++: Limbajul C (Dennis Ritchie) reprezinta o modificare a unui limbaj numit BCPL
(Ken Thompson). Limbajul C a fost scris pentru programarea in sistemul de operare Unix
care continua sa fie foarte popular in mediul universitar. Limbajul C++ (Bjarne
Stroustrup) reprezinta versiunea orientata obiect a limbajului C.
Constanta: un element de tip data care nu isi schimba valoarea pe parcursul executiei
programului.
/********************************
Program 1-1
Program Hello World
Obiectiv: studirea structurii unui program C
********************************/
#include <iostream> //directiva preprocesor
using namespace std; //spune compilatorului ca anumite obiecte se
gasesc in namespace-ul standard
int main () //functia principala
{
cout << "Primul meu program in C! Bravo!\n";
getchar(); //asteapta apararea unei taste. De testat programul si fara
aceasta linie
return 0;
}
Se salveaza programul pe hard disk prin accesarea meniului File -> Save cu numele
Hello.cpp.
Un program C este o colectie de una sau mai multe functii. Acest program are doar o
functie care se numeste main. Functia main este necesara in toate programele scrise in
limbajul C. Daca exista mai multe functii in program, functia main este cea care le
lanseaza.
Descrirea programului: Liniile care incep cu /* si se termina cu */ sunt comentarii.
Compilatorul ignora aceste linii. Comentariile sunt necesare pentru a descrie rolul
comenzilor in cadrul programului. // pot fi folosite pentru a comenta o linie.
Directiva preprocesor: Limbajul C foloseste anumite functii aflate in diverse
module/librarii pentru operatiile de intrare si iesire. Programul scrie o linie pe ecran.
Ecranul reprezinta iesirea standard iar tastatura intrarea standard. Semnul # arata ca
restul liniei reprezinta o instructiune/directive pentru processor.
#include <iostream.h> spune compilatorului sa adauge codul care se gaseste in fisierul
iostream.h la inceputul acestui program.
Functiile: int main () este o functie. O functie primeste unul sau mai multi
parametrii(argumente) de la functia care o apeleaza si poate sa nu intoarca nimic sau
poate sa intorca un singur rezultat. Cuvantul int inainte de numele functie (main) arata ca
functia intoarce un intreg catre modulul apelant. Modulul care apeleaza functia main este
sistemul de operare. Acest program intoarce zero sistemului de operare, indicand o
executie normal a programului. Parantezele () de dupa numele functiei arata ca functia nu
primeste nici un parametru de la modulul apelant.
Inceputul si sfarsitul blocului de instructiuni: Inceputul blocului de intructiuni este
indicat de { iar sfarsitul de }.
Separarea comenzilor: O linie de comanda este separata de o alta prin punct si virgula ;
cout si cin: cout afiseaza pe ecran iar cin primeste caractere de la tastatura. Caracterele
<< sau >> arata directia fluxului de date. In programul de mai sus, " Primul meu
program in C! Bravo!\n”, reprezinta datele care sunt trimise catre ecran. Observati ca
textul este inclus intre ghilimele. Ultimele doua caractere \n fac ca cursorul sa coboare o
linie.
Recomandari:
http://www.youtube.com/watch?v=jTSvthW34GU
http://www.youtube.com/watch?v=b00HsZvg-V0
5. Urmatorul pas este important: click dreapta pe fisierele sursa in Solution Explorer
si click pe Add new item.
6. Click in partea stanga pe C++ file. Alegeti un nume si click Add.
7. Scrieti programul.
Laborator 2
Exemplul 2-1
Se citesc 2 valori numerice reale, care reprezintă dimensiunile (lungimea şi lăţimea unui
dreptunghi). Să se calculeze şi să se afişeze aria dreptunghiului.
ALGORITM aflare_arie_drept
INCEPUT
START CITEŞTE L,l
aria <- L*l
AFIŞEAZA aria
void main( )
AFISEAZA aria { double L, l;
AFIŞEAZĂ aria
cout<<"Lungime="; cin>>L;
cout<<"Laţime="; cin>>l;
double aria = L * l;
STOP cout << "Aria="<< aria;
}
STOP
Exemplul 2-2
ALGORITM max_2_nr
INCEPUT Sau:
ALGORITM max_2_nr
CITESTE a, b
DACA a >= b ÎNCEPUT
ATUNCI max<-a CITEŞTE a, b
ALTFEL max<-b DACA a >= b
AFISEAZA max ATUNCI AFISEAZA a
SFARŞIT ALTFEL
Implementare în limbajul C++: AFISEAZA b
#include <iostream> SFARŞIT
#include <iostream>
using namespace std; using namespace std;
Proiectaţi un algoritm care să rezolve o ecuaţie de gradul I (de forma ax + b = 0), unde
a,b sunt numere reale. Discuţie după coeficienţi.
Proiectaţi un algoritm care să testeze dacă un număr întreg dat este număr prim.
Laborator 3
Tipuri de date
Tipul unei date determină dimensiunea zonei de memorie ocupate şi valorile pe care le
poate lua.
Tipurile de date fundamentale cuprind tipurile aritmetice de bază şi tipul void. Există
patru tipuri aritmetice de bază, specificate prin cuvintele cheie: char, int, float şi double.
Gama de valori poate fi extinsă prin modificatori de tip desemnaţi prin cuvintele cheie:
signed, unsigned, short, long. Tipurile întregi ce se obţin prin combinarea tipurilor de
bază cu modificatorii de tip sunt prezentate mai jos:
Iată câteva exemple de expresii care returnează ca valoare spaţiul de memorie ocupat de
date de diferite tipuri:
Variabile
Declaraţii de variabile
Sintaxa unei declaraţii de variabilă impune specificarea tipului, având forma generală:
tip_var nume_var;
tip_var este un specificator de tip de date oarecare, standard, pointer sau definit de
utilizator.
sau se pot declara mai multe variabile de acelaşi tip utilizând sintaxa:
Exemplul 3-1
/********************************
Program 1-2
Program Operatii artimetice
Obiectiv: studirea operatiilor in C
********************************/
#include <iostream> //directive preprocesor
using namespace std;
int main () //functie principala
{
int i,j,k,l, m,n;
float a,b,c;
//intregi
cout << "Operatii cu intregi\n \n";
i = 6 + 3;
l = 6.5;
m = 3.5;
j = l + m;
k = 10 /3;
n = 10 % 3;
cout << "6 + 3 = " << i << "\n";
cout << "l = 6.5, m = 3.5 --------->l + m = " << j << "\n";
cout << "10 / 3 = " << k << "\n";
cout << "10 % 3 = " << n << "\n";
//operatii cu numere reale si operatii mixte
a = 10 / 3;
b = 10.0 / 3.0;
c = 10.0 /3;
cout << "10 / 3 = " << a << "\n";
cout << "10.0 / 3.0 = " << b << "\n";
cout << "10.0 / 3 = " << c << "\n";
getchar();
return 0;
Daca l=6.5 si m =3.5 atunci l+m ar trebui sa fie 10, de ce este 9? Se atribuie aceste
numere unor variable de tip intreg, ceea ce duce la pierderea partii fractionale adica
raman 6 si 3, iar rezulatul este 9.
De ce 10/3 da 3? Aceasta operatie se numeste impartire intreaga. Urmatoarea operatie 10
% 3 are ca rezultat 1, care reprezinta restul impartirii.
Exercitiul 3-1
Sa se scrie un program care sa afiseze media a trei note pentru un student. Notele se vor
citi de la tastatura.
Exemplu:
Se citeste: 9 9.5 10
Se afiseaza: Media este 9.5
Sa se scrie un program C care sa determine cifra miilor, sutelor, zecilor si unitatilor dintr-un
numar citit de la tastatura.
Instructiuni decizionale
Cand instructiunile dintr-un program sunt executate una dupa alta in mod secvential se
spune ca programul are o structura liniara. De multe ori insa programele presupun luarea
unor decizii. De exemplu, daca scriem un program care sa trimita emailuri persoanelor
care au nume incepand cu litera A, atunci va trebui sa se verifice nume persoanelor si
daca corespund criteriului stabilit atunci se ia decizia de a trimite email-ul.
Exemplu 4-1 prezinta un exemplu simplu de program care calculeaza media a 3 note
citite de la tastatura si afiseaza daca studentul/elevul a obtinut medie de trecere.
/****************************************
Exemplu 4-1
*****************************************/
#include <iostream>
using namespace std;
int main ()
{
int n1, n2, n3;
double medie;
cout << "Introduceti 3 note : ";
cin >> n1 >> n2 >> n3;
medie = (n1 + n2 + n3)/3.0;
cout << "Media este : " <<medie <<endl;
if (medie >= 5.0) cout << "Studentul a promovat!";
else cout << "Studentul a picat!";
cin.ignore();
getchar();
return 0;
}
Putem adauga instructiuni suplimentare pentru if sau pentru else sau pentru ambele cum
se vede mai jos:
if (medie >=5.0)
{
cout << "Studentul a promovat!\n";
cout << "Studentul va avea o vara linistita.";
}
else
{
cout << "Studentul a picat!\n";
cout << "Studentul va trebui sa se prezinte si in sesiunea de toamna!";
}
Operatori relationali
Simbolurile folosite >= sunt numiti operatori relationali. Exista urmatorii operatori
relationali:
== egal cu
> mai mare decat
< mai mic decat
!= diferit de
>= mai mare sau egal
<= mai mic sau egal.
Rezultatul unei operatii relationale este false (fals) sau true (adevarat). Variabilele care
contin valori de tip true/false se numesc variabile bool.
Sa rescriem programul 3-1 astfel incat sa aiba loc o decizie intre mai multe alternative:
/****************************************
Exemplu 4-2
*****************************************/
#include <iostream>
using namespace std;
int main ()
{
int n1, n2, n3;
double medie;
cout << "Introduceti 3 note : ";
cin >> n1 >> n2 >> n3;
medie = (n1 + n2 + n3)/3.0;
cout << "Media este : " <<medie <<endl;
cin.ignore();
getchar();
return 0;
}
Operatori logici
Operatori logici sunt folositi cu cand se lucreaza cu valori Boolean-e sau ca rezultat al unor
operatii relationale. Operatorii logici sunt:
AND (&&)
OR (||)
NOT(!)
Prima expresie, medie >=9.0, este adevarata. A doua expresie, medie <=10.0, este si ea
adevarata. In concluzie, expresia medie>=9.0 && medie <=10.0 este si ea adevarata si se
va afisa “Rezultat excelent!”
Instructiunea switch
switch (optiune)
{
case 1:
cout << "A fost selectata optiunea 1";
break;
case 2:
cout << "A fost selectata optiunea 2";
break;
case 3:
cout << "A fost selectata optiunea 3";
break;
default:
cout << "Optiune invalida";
}
Important! Comanda switch nu poate fi folosita decat pentru valori de tip intreg sau
char.
/****************************************
Exemplu 4-3
*****************************************/
#include <iostream>
using namespace std;
int main ()
{
int n1, n2, n3;
int optiune;
cout << "Introduceti 3 valori : ";
cin >> n1 >> n2 >> n3;
cout << "Alegeti o operatie: 1. Adunare 2. Inmultire 3. Medie" <<endl;
cin >> optiune;
switch (optiune)
{
case 1:
cout << "Adunare: " << n1+n2+n3;
break;
case 2:
cout << "Inmultire: " << n1*n2*n3;
break;
case 3:
cout << "Medie: " << (n1+n2+n3)/3.0;
break;
default:
cout << "Optiune invalida";
}
cin.ignore();
getchar();
return 0;
}
Exercitiul 4-1
Sa se scrie un program C care sa afiseze numele unei luni pentru un numar de la 1 la 12 citit de
la tastatura. Sa se foloseasca mai intai if/else si apoi instructiunea switch.
Daca analizam problema mai in amanunt observam ca fiecare numar este, de fapt,
numarul anterior la care se adauga 1. Asadar, problema se reduce la a aduna 1 la numarul
precendent si de il afisa pana se atinge valoarea 100.
Numarul ia valoarea 1.
Se afiseaza numarul
Se adauga 1 la numar
Se repeta cele 2 instructiuni.
Cand numarul este egal cu 101 atunci Stop.
Numar = 1
Atat timp Numar este mai mic sau egal cu 100
{
afiseaza Numar
incrementeaza Numar
}
Exemplul 5-1
/******************************************
Afiseaza numerele de la 1 la 100 pe ecran
Obiectiv - invatarea instructiunii while
*****************************************/
#include <iostream>
using namespace std;
int main()
{
int number;
number = 1;
while (number <= 100)
{
cout << number << " "; //afiseaza numarul
number ++; //incremeteaza number
}
getchar();
return (0);
}
Instructiunea while poate fi controlata si o “santinela” asa cum se vede in Exemplul 5-2.
/******************************************
Accepta si afiseaza nume
Obiectiv – exemplificarea instructiunii while cu santinela
*****************************************/
#include <iostream>
#include <string>
using namespace std;
int main()
{
string name;
cout << "Enter a name ";
cin >> name;
while (name !="quit")
{
cout << "Hello, " << name <<"\n";
cout << "Enter another name or type 'quit' to exit ";
cin >> name ;
}
getchar();
return (0);
}
Exemplul 5-2A
/******************************************
Accepta si afiseaza nume
Obiectiv – exemplificarea instructiunii while cu santinela
*****************************************/
#include <iostream>
using namespace std;
int main()
{
string name;
int count;
count = 1;
cout << "Enter a name_ ";
cin >> name;
while (name !="quit" && count <= 5)
{
count ++;
cout << "Hello, " << name <<"\n";
cout << "Enter another name or type 'quit' to exit_ ";
cin >> name ;
}
count --;
cout << count << " names were entered " << "\n";
getchar();
return (0);
}
Instructiunea for
Exemplul 5-3
/******************************************
Afiseaza numerele de la 1 la 100 pe ecran
Obiectiv - instructiunea for
*****************************************/
#include <iostream>
using namespace std;
int main()
{
int number;
for (number =1; number <= 100; number++)
{
cout << number << " "; //afiseaza numarul si un spatiu
}
getchar();
return 0;
}
Exemplul 5-3A
/*************************************************************
Afisarea numerelor pare de la 2 pana la 100
Obiectiv – instructiunea for
**************************************************************/
#include <iostream>
int main()
{
int number;
for (number =2; number <= 100; number=number+2)
{
cout << number << " "; //display number and put some spaces
}
getchar();
return (0);
}
Instructiunea do..while
Exemplul 5-4
#include <iostream>
using namespace std;
int main()
{
int number;
number = 1;
do
{
cout << number << " ";
number ++;
}
while (number <=100);
getchar();
return (0);
}
Exercitiul 5-1
Sa se scrie un program C care sa calculeze salarul unei persoane care lucreaza un numar
oarecare de zile.
Exemplu:
Exercitii
1. Să se citească de la tastatură un număr real. Daca acesta se află în intervalul [-1000, 1000], să
se afiseze 1, dacă nu, să se afiseze -1.
2. Să se calculeze valoarea funcţiei f(x), ştiind că x este un număr real introdus de la tastatură:
- 6x + 20 , dacă x [- , -7 ]
f(x) = x + 30 , dacă x (-7, 0]
x , dacă x>0
3. Se citeşte un caracter reprezentând un operator aritmetic binar simplu. În funcţie de caracterul
citit, se afişează numele operaţiei pe care acesta o poate realiza.
4. Să se calculeze suma şi produsul primelor n numere naturale, n fiind introdus de la tastatură.
Se vor exemplifica modalităţile de implementare cu ajutorul instrucţiunilor do-while,
n n
while, şi for. (Se observă că: S= k , P = k ).
k 1 k 1
5. Să se citească un numar natural n. Să se scrie un program care afişează dacă numărul n citit
reprezintă sau nu, un an bisect (anii bisecţi sunt multipli de 4, exceptând multiplii de 100, dar
incluzând multiplii de 400).
6. Să se citească un şir de numere reale, până la întâlnirea numărului 900. Să se afişeze maximul
numerelor citite.
7. Să se citească un şir de numere reale, până la întâlnirea numarului 800 şi să se afişeze
valoarea minimă introdusă, suma şi produsul elementelor şirului.
8. Să se scrie un program care calculează şi afişează maximul a 3 numere reale (a, b şi c) citite
de la tastatură.
9. Să se afişeze literele mari ale alfabetului şi codurile aferente acestora în ordine crescătoare,
iar literele mici şi codurile aferente în ordine descrescătoare. Afişarea se va face cu pauză
după fiecare ecran.
10. Să se calculeze seria următoare cu o eroare mai mică decât EPS (EPS introdus de la
xk
tastatură): 1+ , x [0,1], x citit de la tastatură. Vom aduna la sumă încă un termen cât
k 1 k
timp diferenţa dintre suma calculată la pasul curent şi cea calculată la pasul anterior este mai
mare sau egală cu EPS.
Laborator 7
Do-While
In cazul instructiunii do-while testarea conditiei de continuare are loc dupa blocul de
intructiuni. De exemplu, pentru validarea unor date de intrare putem folosi:
do
citire date de la tastura
while datele de intrare sunt corecte
Exemplul 7-1
#include <iostream>
using namespace std;
int main()
{
int monthNum;
do
{
cout <<"Introduceti o luna (numar intre 1 si 12) -- >";
cin >> monthNum;
if (monthNum <1 || monthNum >12) cout <<"Eroare! Luna introdusa
nu este corecta!\n";
}
while (monthNum <1 || monthNum >12);
return 0;
}
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int tableFor =2;
int multiplier=1;
while (multiplier <=12)
{
cout << setw(3)<<tableFor << " x " <<setw(3)<< multiplier
<< " = " << setw(4)<<tableFor * multiplier <<endl;
multiplier ++;
}
getchar();
return 0;
}
Urmatorul exemplu afiseaza tabla inmultirii pentru toate numerele intre 2 si 10.
Exemplul 7-3
#include <iostream>
#include<iomanip>
using namespace std;
int main()
{
int tableFor =2;
int multiplier=1;
while (tableFor <= 10)
{
while (multiplier <=12)
{
cout << setw(3)<<tableFor << " x " <<setw(3)<<
multiplier << " = " << setw(4)<<tableFor * multiplier
<<endl;
multiplier ++;
}
cout << endl;
multiplier =1; //se reseteaza pentru urmtoarea iteratie
tableFor++;
}
getchar();
return 0;
}
#include <iostream>
#include<iomanip>
using namespace std;
int main()
{
int tableFor;
int multiplier;
for (tableFor = 2;tableFor <=10;tableFor++)
{
for (multiplier =1; multiplier <= 12; multiplier++)
cout << setw(3)<<tableFor << " x " <<setw(3)<<
multiplier << " = " << setw(4)<<tableFor * multiplier
<<endl;
cout << endl;
}
getchar();
return 0;
}
Exercitiul 7-1
Sa se scrie un program C care sa calculeze costul salarial (= suma tuturor salariilor) pentru mai
multor persoane care lucreaza un numar oarecare de zile.
Exemplu:
Functii
Exemplul 8-1
/***************************************
Program: Apelare functie
**************************************/
#include <iostream>
using namespace std;
int main ()
{
float c, f; //Grade Celsius and Fahrenheit
cout << "Introduceti temperature in grade Fahrenheit ";
cin >> f;
c = celsius(f); //apelarea functiei
cout << "Asta inseamna " << c << " grade Celsius!\n" ;
cout << “Apasati Enter pentru a se iesi din program!”;
getchar();
return 0;
}
Pentru a putea folosi o functie, mai intai, trebuie declarat prototipul acesteia. Acesta se
gaseste intotdeauna inaintea functiei main. Prototipul contine urmatoarele informatii: (1)
numele functiei, (2) tipul de data retunat de functie, (3) numarul, tipul si ordinea
parametrilor functiei.
Exercitiu propus
Functii (II)
Intr-un program pot exista mai multe variabile cu acelasi nume in diferite functii. Exista
cateva reguli de care trebuie sa tinem seama in astfel de situatii pentru a intelege
domeniul de valabilitate al fiecarei variabile.
Exemplul 9-2
/*****************************
Program: Domeniul de valabilitate
*****************************/
#include <iostream>
using namespace std;
int main ()
{
int x;
x = 5;
cout << "In main, valoarea lui x inainte de prima apelare ----> "
<< x <<"\n";
schimbarex (x);
cout << " In main, valoarea lui x dupa prima apelare -----> " <<
x <<"\n";
x = 1;
cout << " In main, valoarea lui x inainte de a doua apelare ---->
" << x <<"\n";
schimbarex (x);
cout << " In main, valoarea lui x dupa a doua apelare -----> " <<
x <<"\n";
return 0;
}
Cand rulam acest program observam ca lui x i se atribuie mai intai valoarea 5 si ca
aceasta valoare este trecuta in functia schimbarex. Variabila x este modificata in functie
si devine 15. Totusi, dupa ce functia este executa, tot ce s-a intamplat in functia
schimbarex este sters si x are valoarea 5. La fel se intampla si pentru a doua apelare a
functiei.
Cand o functie este apelata si copii ale parametrilor sunt transmisi in functie se cheama ca
transmiterea parametrilor se face prin valoare (call-by-value). O alta posibilitate o
reprezinta apelarea functiei prin referinta (call-by-reference) in care se transmite adresa
variabilei nu doar o copie a valorii acesteia.
Variabile globale
O variabila care poate fi accesata de toate functiile unui program se numeste variabila
globala.
Exemplul 9-3
/*****************************************
Program: Variabile globale
******************************************/
#include <iostream>
using namespace std;
int x;
int main ()
{
x = 1;
getvalue();
cout << "Valoarea lui x este: " << x <<"\n";
return 0;
}
void getvalue()
{
cout << "Introduceti o valoare pentru x ";
cin >> x;
}
Observatie: daca modificam o variabila globala intr-o functie, acest lucru se va reflecta
si in alte functii in care se foloseste variabila respectiva. De aceea, folosirea variabilelor
globale trebuie, pe cat posibil evitata.
Variabile locale
Exemplul 9-4
/*****************************
Program: Variabile locale
*****************************/
#include <iostream>
using namespace std;
int x;
void getvalue()
{
int x;
cout << "Introduceti o valoare pentru x ";
cin >> x;
}
Asadar, in acest program avem o variabila global x si o variabila locala tot x. Atunci cand
atribuim lui x o valoare in functia getvalue (unde x este variabila locala), valoarea
variabilei globale x nu se modifica.
Exercitiul 9-1
Sa se scrie si sa se apeleze of functie care verifica daca un numar este par sau impar.
Exercitiul 9-2
Exercitiu propus
Sa se scrie un program C cu 2 functii, una care citeste 2 valori de tip intreg, iar cea de a doua
care interschimba cele doua valori daca prima valoare este mai mare decat cea de a doua.
Exemplu:
Introduceti 2 valori 90 80
Valorile sunt --> 90 80
Dupa interschimbare --> 80 90
Introduceti 2 valori 40 50
Valorile sunt --> 40 50
Interschimbarea nu este necesara.
Laborator 10
Functii (III)
O functie este un subprogram care executa o actiune specifica. O functie poate primi
zero, unul sau mai multi parametrii si poate intoarce una sau nici o valoare.
Daca o functie nu intoarce nici un rezultat acest lucru este specificat prin cuvantul
rezervat void.
De retinut este faptul ca functia exista doar atat timp cat se executa. Dupa ce se termina
executia functiei, aceasta si toate variabilele folosite in functie nu vor mai exista.
Din moment ce functia returneaza o valoare de tip float, putem salva valoarea returnata in
variabila medie. Mai simplu, rezultatul poate fi afisat pe ecran folosind intructiunea:
Este de multe ori necesar folosim functii care sa citeasca valorile mai multor variabile si
sa le returneze in programul principal. Folosind transferul prin valoare (call-by-value)
acest lucru nu este posibil.
In loc de aceasta, transferul parametrilor se poate face prin referinta. In acest caz, in loc
ca functia sa intoarca un rezultat, scrie in variabilele care au fost trimse in functie (prin
referinta) . In exemplul urmator, chiar daca functia nu returneaza o valoare, apelarea
functiei are ca rezultat modificarea valorii celor trei parametrii:
/*************************************
Program ce calculeaza media a trei note
**************************************/
#include <iostream>
using namespace std;
int main ()
{
float medie;
int nota1, nota2, nota3;
citesteNote(nota1, nota2, nota3);
medie = calcMedie(nota1, nota2, nota3);
afisare(nota1, nota2, nota3, medie);
getchar();
getchar();
return 0;
}
void citesteNote (int &c, int &b, int &a) // schimbare de nume a
variabilelor
{
cout << "Introduceti prima nota ----------> ";
cin >> c;
cout << "Introduceti a doua nota -----------> ";
cin >> b;
cout << "Introduceti a treia nota ---------- > ";
cin >> a;
}
float calcMedie (int unu, int doi, int trei) // schimbare de nume a
variabilelor
{
int total;
float a;
total = unu+doi+trei;
a = (total)/3.0;
return a;
}
void afisare (int nota1, int nota2, int nota3, float medie)
{
cout << "\nCele trei note sunt: " << nota1 << " " <<nota2 << " "
<< nota3;
cout << "\nMedia este " << medie <<endl;
}
Exemplul 10-2
/*************************************
Program ce calculeaza media a trei note
**************************************/
#include <iostream>
using namespace std;
int main ()
{
float medie;
int nota1, nota2, nota3;
citesteNote(nota1, nota2, nota3);
medie = calcMedie(nota1, nota2, nota3);
afisare(nota1, nota2, nota3, medie);
getchar();
getchar();
return 0;
}
void citesteNote (int &c, int &b, int &a) // schimbare de nume a
variabilelor
{
cout << "Introduceti prima nota ----------> ";
cin >> c;
cout << "Introduceti a doua nota -----------> ";
cin >> b;
cout << "Introduceti a treia nota ---------- > ";
cin >> a;
}
void afisare (int nota1, int nota2, int nota3, float medie)
{
cout << "\nCele trei note sunt: " << nota1 << " " <<nota2 << " "
<< nota3;
cout << "\nMedia este " << medie <<endl;
}
Supraincarcarea functiilor
Este posibil ca o functie care calculeaza media unor numere reale si sa returneze o
valoare reala si sa calculeze media a unor numere intregi si sa returneze o valoare
intreaga. Pentru a realize acest lucru trebuie sa declaram 2 functii cu acelasi nume dar cu
parametri diferiti. Aceste functii se numesc functii supraincarcate (overloaded). Atunci
cand o functie supraincarcata este apelata, compilatorul alege functia potrivita in functie
de parametrii cu care se apeleaza functia.
Exemplul 10-3
#include <iostream>
using namespace std;
int main ()
{
double medie;
//se apeleaza calcMed cu trei parametrii de tip intreg
medie = calcMed(80,82,95);
cout << "\n S-a apelat functia cu trei intregi. Media este: "
<<medie;
//se apeleaza calcMed cu trei parametrii de tip double
medie = calcMed(82.5,89.4,95.88);
cout << "\n S-a apelat functia cu trei valori de tip double.
Media este: " <<medie;
//se apeleaza calcMed cu patru parametrii de tip double
medie = calcMed(82.5,89.4,95.88, 99.89);
cout << "\n S-a apelat functia cu patru valori de tip double.
Media este: " <<medie;
getchar();
return 0;
}
Exercitiu 10-1
Exercitiu 10-2
Exemplu de apelare:
Exercitii facultative
#include <iostream>
using namespace std;
int main ()
{
double medie;
medie = calcMed(80,82,95);
cout << "\nMedia este: " <<medie;
getchar();
return 0;
}
#include <iostream>
using namespace std;
int main ()
{
double medie;
medie = calcMed(80,82,95);
cout << "\nMedia este: " <<medie;
getchar();
}
#include <iostream>
using namespace std;
int main ()
{
double medie;
medie = calcMed(80.5,82,95);
cout << "\nMedia este: " <<medie;
getchar();
return 0;
}
Siruri (Arrays)
Un sir (array) este folosit pentru a stoca si procesa o colectie de date de acelasi
tip. E important de retinut ca un sir poate lucra doar cu date de acelasi tip; un sir nu poate
stoca date de tipuri diferite (asa cum este cazul pentru structuri). Un sir mai poate fi
numit “lista”.
Declararea sirurilor
Un sir este de fapt o lista statica pentru care trebuie sa specificam din momentul
declararii dimensiunea. Pentru a declara un sir care sa poata stoca 90 de valori de tip
intreg vom scrie:
int sir[90];
Exemplul 11-1
#include <iostream>
using namespace std;
int note[90]; //sirul este declarat global.
int getnote (void);
int main ()
{
int n, i; // n este numarul de note
n = getnote(); //se citesc notele si se intoarce in n numarul de
// note citite
for (i=1; i<=n; i++)
cout<<note[i]<<endl; //afisarea notelor.
getchar();
getchar();
return(0);
}
int getnote()
{
int n=1;
cout << "Introduceti un numar si apasati Enter. Pentru a iesi
introduceti un numar negativ!\n";
cout << "Introduceti nota# " << n << " ";
cin >> note[n];
while (note[n] >= 0)
{
n++;
cout << "Introduceti nota# " << n <<" ";
cin >> note[n];
}
return n-1;
}
Un sir poate fi trimis ca si parametru in cadrul unei functii. Mai intai, prototipul
functiei trebuie sa indice ca parametru trimis este un sir/array, fara sa se specifice
dimensiunea sirului. Functia este declarata in mod similar.
Exemplul 11-2
#include <iostream>
using namespace std;
int main ()
{
int note[90];
int n, i; // n este numarul de note
n = getnote(note); //se citesc notele si se intoarce in n numarul
de note citite
for (i=1; i<=n; i++)
cout<<note[i]<<endl; //afisarea notelor.
getchar();
getchar();
return(0);
}
int getnote(int note[])
{
int n=1;
cout << "Introduceti un numar si apasati Enter. Pentru a iesi
introduceti un numar negativ!\n";
cout << "Introduceti nota# " << n << " ";
cin >> note[n];
while (note[n] >= 0)
{
n++;
cout << "Introduceti nota# " << n <<" ";
cin >> note[n];
}
return n-1;
}
In exemplele care urmeaza vom scrie un program care sa calculeze deviatia standard
(http://en.wikipedia.org/wiki/Standard_deviation). Aceasta se realizeaza in urmatorii
pasi:
1. Se calculeaza media tututor elementelor sirului.
2. Se calculeaza diferenta fata de medie a tuturor elementelor sirului.
3. Se ridica la patrat diferentele.
4. Se calculeaza suma valorilor calculate la punctul 3.
5. Se imparte suma la numarul de elemente minus unul.
6. Se calculeaza radical din din valoarea rezultata la punctul 5.
#include <iostream>
using namespace std;
int getnote (int note[]);
float calcMedie (int note[], int);
void afisare(int, int note[], float);
int main ()
{
int note[90];
int n;
float medie;
n = getnote(note);
medie = calcMedie(note, n);
afisare(n,note,medie);
return(0);
}
Exemplul 11-4
#include <iostream>
#include <iomanip>
#include <math.h>
using namespace std;
int getnote (int note[]);
float calcMedie (int note[], int);
float sumPatrate (int, int note[], float dif[], float difPtr[],float);
float stdDeviere(int, float);
void tabel(int, int note[], float dif[], float difPtr[], float, float);
int main ()
{
int note[90];
float dif[90], difPtr[90];
int n;
float medie, sumPtr, stDev;
n = getnote(note);
medie = calcMedie(note, n);
sumPtr = sumPatrate (n, note,dif,difPtr,medie);
stDev = stdDeviere(n, sumPtr);
tabel(n, note, dif,difPtr, medie, stDev);
getchar();
getchar();
return(0);
}
void tabel(int n, int note[], float dif[], float difPtr[], float medie,
float stDev)
{
int i; float ss=0;
cout << "\nDeviatia standard pentru " << n<<" note. Media:
"<<medie
<<endl;
cout <<"---------------------------------------------------\n";
cout <<setw(10) <<"Note"<<setw(10) <<"Dev" <<setw(10) << "Dev
Ptr"
<<" Suma dev2)\n";
cout <<"-----------------------------------------------------\n";
for (i = 1; i<=n; i++)
{
ss += difPtr[i];
cout << setw(10) << setprecision(2) << note[i]
<< setw(10) << setprecision(2) << dif[i]
<< setw(10) << setprecision(2) << difPtr[i]
<< setw(10) << setprecision(2) << ss << endl;
}
cout <<"-----------------------------------------------------\n";
cout <<"Deviatia standard "<< setprecision(2) <<stDev <<endl;
}
Exercitiu 11-1
Exercitiu 11-2
Exemplu:
Exercitii facultative
1. De citit: http://www.augustcouncil.com/~tgibson/tutorial/arr.html
2. Sa se scrie un program care sa citeasca 10 valori de tip intreg de la tastatura. Sa se
afiseze elementele mai mari de 5.
3. Sa se scrie un program care sa citeasca 10 valori de tip intreg de la tastatura si o
valoare suplimentara V. Programul trebuie sa verifice daca valoarea V exista
printre elementele sirului si sa afiseze rezultatul.
4. Sa se scrie un program care sa citeasca 10 valori de tip intreg. Sa se sorteze sirul
si sa se afiseze.
Laborator 12
Sortare
Una din cele mai importante proprietati pe care le are un sir (array) este ca acesta
poate fi sortat. Sortarea este procesul prin care fiecare valoare din sir este arajant / asezat
in ordine crescatoare sau descrescatoare.
Sortarea se poate programa in multe moduri, din acestea studiem sortarea prin
selectie si bubble sort.
In programul de mai jos (12-1), sortare se face prin doua bucle, prima in functia
sortare, iar cea de a doua in gasireMinim.
#include <iostream>
using namespace std;
int citireNote (int note[]);
int gasireMinim(int note[],int, int);
void sortare(int note[], int);
void afisare(int note[], int);
int main ()
{
int note[90];
int ultim; // numarul de note citite.
ultim = citireNote(note); //se citesc notele
cout <<"\nSirul nesortat este:\n";
afisare(note,ultim);
sortare(note, ultim);
cout <<"\nSirul sortat este:\n";
afisare(note,ultim);
getchar();
getchar();
return(0);
}
Algoritmul de sortare prin selectie are cateva dezavantaje, unul din acestea fiind
faptul ca nu se detecteaza daca sirul este gata sortat inainte de incepe operatiunea de
sortare.
O alta metoda de a sorta un sir o reprezinta bubble sort. Acest algoritm presupune
compararea a doua elemente vecine din cadrul sirului si interschimbarea lor daca este
cazul.
#include <iostream>
using namespace std;
int citireNote (int note[]);
void sortare(int note[], int);
void afisare(int note[], int);
int main ()
{
int note[90];
int ultim; // numarul de note citite.
ultim = citireNote(note); //se citesc notele
cout <<"\nSirul nesortat este:\n";
afisare(note,ultim);
sortare(note, ultim);
cout <<"\nSirul sortat este:\n";
afisare(note,ultim);
getchar();
getchar();
return(0);
}
Exercitiul 12-1
Sa se rescrie procedura de sortarea de la Exemplul 12-2 astfel incat sa se foloseasca doua
instructiuni for.
Exercitiul 12-2
Exercitiu 12-1
Exemplu:
Se citesc:
Popescu Ion – 10
Ionescu Pop – 7
Oprea Vasile - 9
Sirul studentilor dupa sortare este: Ionescu Pop, Oprea Vasile, Popescu
Ion
Sirul notelor inainte de sortare este: 7, 9, 10
Laborator 13
Recapitulare
Exercitii
#include <iostream>
using namespace std;
int main ()
{
double medie;
medie = calcMed(80,82,95);
cout << "\nMedia este: " <<medie;
getchar();
return 0;
}
**
****
******
********
4. Să se scrie un program care citeşte câte două numere, până la întâlnirea perechii
de numere 0, 0 şi afişează, de fiecare dată, cel mai mare divizor comun al
acestora, folosind o funcţie care îl calculează.
5. Se introduce de la tastatura un număr întreg. Să se afişeze toţi divizorii numărului
introdus. Se va folosi o funcţie de calcul a celui mai mare divizor comun a 2
numere.
6. Scrieţi o funcţie găseşte_cifra care returnează valoarea cifrei aflate pe poziţia k în
cadrul numărului n, începând de la dreapta (n şi k vor fi argumentele funcţiei).
7. Să se scrie un program care generează toate numerele palindrom, mai mici decât o
valoare dată, LIM. Un număr palindrom are cifrele simetrice egale (prima cu
ultima, a doua cu penultima, etc). Se va folosi o funcţie care testează dacă un
număr este palindrom.
8. Sunt urmatoarele programe echivalente?
#include <iostream>
using namespace std;
int main()
{
int count = 1;
for (; count <= 5 ; count++)
{
int count = 1;
cout << count << "\n";
}
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int count = 1;
while (count <= 5)
{
int count = 1;
cout << count << "\n";
count++;
}
return 0;