Sunteți pe pagina 1din 65

TEMA LABORATOR 2 1. Convertiti: - n baza 8 numarul 347; - n baza 16 numarul 2755; - n baza 2 numarul 20.

347(10)=533(8) 2755(10)=AC3(16) 20(10)=10100 2.Convertiti n baza 10 numerele: 10001012, 3578, C7A16 1000101(2)=69(10) 357(8)=239(10) C7A(16)=3194(10) 3. Efectuati urmatoarele operatii: a) FA16+2316= b) 1101 00102 + 1110 11012= c) 11768-7238= a) FA(16)+23(16) = 250(10)+35(10) = 285(10) = 11D(16) b) 11010010(2)+11101101(2) = 210(10)+237(10) = 447(10) = 110111111(2) c) 1176(8)-723(8) = 638(10)-467(10) = 171(10) = 253(8) 4.Convertiti numerele din baza 2 n baza 8 si apoi 16: a) 10101010,110010 b) 1100010,11101 a) 10101010,110010 (b2) = 252,62 (b8) = AA,C8 (b16) b) 1100010,11101 (b2) = 142,72 (b8) = 62,E8 (b16) 5.Convertiti numarul 0,63298510 n baza 16. 0.632985 (b10) = 0,A20B4E11DB (b16) 7.Considernd doua numere ntregi determinati cmmdc folosind algorimul lui Euclid. Algoritmul lui Euclid: { Input n1, n2 If n1 > n2 Then deimp = n1 imp = n2 Else deimp = n2 imp = n1 EndIf rest=imp While rest != 0 Do rest = deimp modulo imp deimp = imp imp = rest EndWhile Output deimp } 8.Descrieti algoritmii pentru descompunerea unui numar n factori primi, determinarea tuturor numerelor prime pna la un n citit etc.

Algoritm de descompunere a unui numar n in factori primi: { Input n i=2; While i<n do c=0 if n modulo i=0 then While n modulo i=0 do c=c+1 n=n/i EndWhile output i,'^',c,' ' EndIf i=i+1 EndWhile } Algoritm de determinare a tuturor numerelor prime mai mici decat un n citit: { Input n For i=2 to n do prim=1 For j=2 to i/2 do If i modulo j=0 then prim=0 EndIf EndFor If prim=1 then output i,' ' EndIf EndFor Laborator 2 1/*determinarea mediei aritmetice a trei numere neintregi */ #include<iostream> using namespace std; void main(void) { /*declararea celor 3 numere si a variabilei media*/ float a,b,c,med; /*citirea de la tastatura a celor 3 numere*/ cout<<"a="; cin>>a; cout<<"b="; cin>>b; cout<<"c="; cin>>c; /*calcularea mediei*/ med=(a+b+c)/3; /* afisarea medie*/ cout<<"med este"<<"\n"<<med; } 2/*determinarea mediei geometrice a doua numere intregi*/ # include <iostream> #include <math.h> using namespace std;

void main (void) /*declararea celor doua numere si a variabilei media geometrica*/ { float a,b,mg; cout <<"a="; cin >>a; cout <<"b="; cin>>b; /*calcularea mediei geometrice*/ mg= sqrt(a*b); /*afisarea mediei geometrice*/ cout <<"mg este"<<"\n"<<mg; } 3/*definirea unei variabile intregi care va initializa cu valori constante*/ #include<iostream> using namespace std; void main(void) /*declararea variabilei intregi*/ { int x=2; /*afisarea rezultatului cu ajutorul supraincarcarii operatorului << si a lui cout*/ cout<<"\n Numarul citit este:"<<x; } 4/*definirea unui sir de caractere ce va fi afisat cu cout si definirea altor siruri de caractere folosind escape*/ #include<iostream> using namespace std; void main(void) { char a[255],b[255],c[255]; cout<<"\n dati sirul de caractere:"; cin>>a; cout<<a<<endl; cout<<"\n dati sirul de caractere:"; cin>>b; cout<<"Sirul de caractere este afisat pe rand nou: "; cout<<"\n"<<b<<endl; cout<<"\n dati sirul de caractere:"; cin>>c; cout<<"Sirul de caractere este aliniat la dreapta: "; cout<<"\t"<<c<<endl; } Labrator 3 1.Realizati o aplicatie care citeste de la intrarea standard doua valori pentru variabilele R1 si R2, reprezentand valoarea rezistentelor R1 si R2, iar apoi apeleaza functii ce calculeaza rezistenta echivalenta gruparii serie, respectiv gruparii paralel, dupa care afiseaza valorile returnate cu 3 zecimale si aliniate la dreapta. #include <iostream> #include <stdio.h> using namespace std; float serie(float,float); float paralel (float,float); void main(void){ float r1,r2,s,p;

printf("\n rezistenta 1="); scanf("%f",&r1); printf("\ rezistenta 2="); scanf("%f",&r2); s=serie(r1,r2); p=paralel(r1,r2); printf("\n rezistenta serie este:\n%5.3f",s); printf("\n rezistenta paralel este:\n%5.3f",p); } float serie(float a,float b) {return a+b;} float paralel(float a, float b) {return a*b/(a+b); } 2.Scrieti o aplicatie care citeste de la intrarea standard doua valori pentru variabilele C1 si C2, reprezentand valori de capacitati, iar apoi apeleaza functii ce calculeaza capacitatea echivalenta gruparii serie, respectiv gruparii paralel, dupa care afiseaza valorile returnate cu 4 zecimale si aliniere la stanga. #include <stdio.h> #include <iostream> using namespace std; float serie(float,float); float paralel (float,float); void main(void); float c1,c2,s,p; printf("\n capacitate 1="); scanf("%f",&c1); printf("\ capacitate 2="); scanf("%f",&c2); s=serie(c1,c2); p=paralel(c1,c2); printf("\n capacitate serie este:\n%-6.4f",s); printf("\n capacitate paralel este:\n%-6.4f",p); float paralel(float a,float b); return a+b; float serie(float a, float b); {return a*b/(a+b) } 3.Cititi de la tastatura doua valori intregi care reprezinta catetele unui triunghi dreptunghi. Determinati ipotenuza cand se cunosc catetele si perimetrul triunghiului. Afisati rezultatul pe linii diferite #include <stdio.h> #include <iostream> #include <math.h> using namespace std; float perimetru(float, float, float); float ipotenuza(float, float); void main(void) float a,b,i,p; printf("\n cateta 1 este:"); scanf("%f",&a); printf("\n cateta 2 este:"); scanf("%f",&b); i=ipotenuza(a,b); p=perimetru(a,b,i); printf("\nipotenuza este:%f",i);

printf("\nprimetru este:%f",p); float perimetru(float x, float y, float z); return x+y+z; float ipotenuza(float c, float d);{ return sqrt(c*c+d*d);} 4.Cititi de la tastatura Cadoua valori intregi a si b(a!=0), unde a si b sunt coeficientii ecuatiei ax+b=0. Rezolvati ecuatia si afisati rezultatul #include <stdio.h> #include <iostream> #include <math.h> using namespace std; void main(void) int a,b; float s; printf("\na="); scanf("%d",&a); printf("\nb="); scanf("%d",&b); s=-b/a; printf("\n solutia ecuatiei este:%f",s); 5.Considerand ca in problema 1 valorile intregi sunt capacitati, calculati valorile corespunzatoare gruparii serie si paralel. Includeti si situatia cu rezistentele si cea cu capacitatile intr-un acelasi program #include <iostream> #include <stdio.h> using namespace std; float serie(float,float); float paralel (float,float); float serie2(float,float); float paralel2(float,float); void main(void) float r1,r2,s,p, c1, c2, ss, pp; printf("\n rezistenta 1="); scanf("%f",&r1); printf("\ rezistenta 2="); scanf("%f",&r2); printf("\n capacitate 1="); scanf("%f",&c1); printf("\ capacitate 2="); scanf("%f",&c2); s=serie(r1,r2); p=paralel(r1,r2); printf("\n rezistenta serie este:\n%5.3f",s); printf("\n rezistenta paralel este:\n%5.3f",p); ss=serie2(c1,c2); pp=paralel2(c1,c2); printf("\n capacitate serie este:\n%-6.4f",s); printf("\n capacitate paralel este:\n%-6.4f",p); float serie(float a,float b) return a+b; float paralel(float a, float b) return a*b/(a+b); float paralel2(float a,float b) return a+b; float serie2(float a, float b) return a*b/(a+b);

6.

//Se citesc de la tastatura numele a 2 studen?i ?i nota fiecaruia la programare. Sa se afi?eze pe linii separate numele fiecarui student ntr-un cmp de afi?are cu dimensiunea 20, aliniat la dreapta, respectiv la stnga ?i media notelor lor, cu o precizie de 2 zecimale. #include<stdio.h> float medie(float n1,float n2); int main(){ char nume1[255]; char nume2[255]; float n1,n2; float m; printf("Dati prinul nume\n"); scanf("%s", nume1); printf("\nDati al doilea nume\n"); scanf("%s", nume2); printf("\nDati nota primului elev\n"); scanf("%f", &n1); printf("\nDati nota pt al doilea elev\n"); scanf("%f", &n2); printf("\nElevul1:%+20.20s", nume1); printf("\nElevul2:%+20.20s", nume2); //m=(n1+n2)/2; m=medie(n1,n2); printf("\n media:%-.2f", medie(n1,n2)); } float medie(float n1,float n2){ float med; med=(n1+n2)/2; return med; } 7. /*Se cite.te de la tastatura un numar ntreg, ce reprezinta raza unui cerc. Sa se afi.eze lungimea .i aria cercului de raza data, cu o precizie de 3 zecimale, ntr-un cmp de afi.are cu dimensiunea 10. Pentru valoarea lui PI defini.i o constanta simbolica.*/ #include<stdio.h> #define Pi 3.14159 float aria(float R); float lungime(float R); int main(){ float R,A,L; printf("Dati valori razei "); scanf("%f", &R); printf("\nAria cercului:%10.3f", aria(R)); printf("\nLungimea cercului:%10.3f", lungime(R)); } float aria(float R){ float A; A=Pi*R*R; return A; } float lungime(float R){ float L; L=2*Pi*R; return L; } 8. //Durata calatoriei #include<iostream> using namespace std; int main(){ int o1,o2,m1,m2; cout<<"Trenul din Cluj pleaca la ora: "; cin>>o1; cout<<" si la minutul: "; cin>>m1; cout<<endl; cout<<"Trenul ajunge in Brasov la ora: "; cin>>o2; cout<<" si minutul: "; cin>>m2; cout<<"Durata calatoriei a fost:"; if(m1>m2){

o2=o2-1; m2=m2+60; cout<<(o2-o1)<<"ore, "<<(m2-m1)<<"minute";} else cout<<(o2-o1)<<"ore, "<<(m2-m1)<<"minute"; return 0; } 9. /*Dou maini se deplaseaz una spre cealalt cu vitezele v1 i v2, plecnd din dou orae situate la distana d=100km. Vitezele celor dou ma.ini se citesc de la tastatur. Afisa.i timpul dup care se ntlnesc, exprimat n minute.*/ #include<iostream> using namespace std; int main(){ float v1,v2,d; float t; cout<<"Viteza masinii unu(km/h)="; cin>>v1; cout<<"Viteza masinii doi(km/h)="; cin>>v2; cout<<"Distanta dintre cele doua masini(km)="; cin>>d; t=d/(v1+v2); cout<<"Timpul pana cand cele doua masini se intalnesc este="; t=t*60; cout<<t<<" minute"; }

Laborator nr 5 1. /*afisarea valorii polinomului de gradul 3 pentru o anumita valoare a variabilei reale x*/ #include<iostream> using namespace std; void main(void) { /*declararea numerelor si a variabilei x*/ int a,b,c,d,x,val; cout<<"\n Dati coeficientul a:"; cin>>a; cout<<"\n Dati coeficientul b:"; cin>>b; cout<<"\n Dati coeficientul c:"; cin>>c; cout<<"\n Dati coeficientul d:"; cin>>d; cout<<"\n Dati valoarea lui x:"; cin>>x; /*afisarea polinomului de gradul 3 pentru o anumita valoare a lui x*/ cout<<"\n Polinomul este: "<<a<<"*"<<x<<"^3+"<<b<<"*"<<x<<"^2+"<<c<<"*"<<x<<"+"<<d<<endl; val=a*x*x*x+b*x*x+c*x+d; /*afisarea valorii polinomului*/ cout<<"\n Valoarea polinomului este "<<val<<endl; } 2./*citirea lungimilor laturilor unui triunghi folosind variabile intregi si afisarea ariei triunghiului ca valoare reala*/ #include<iostream> using namespace std; #include<math.h> void main(void) { /*declararea variabilelor*/ int a,b,c;

float arie,sp; cout<<"\n Dati latura a:"; cin>>a; cout<<"\n Dati latura b:"; cin>>b; cout<<"\n Dati latura c:"; cin>>c; /*declararea ariei triunghiului ca valoare reala*/ sp=(a+b+c)/2; arie=sqrt((float)(sp*(sp-a)*(sp-b)*(sp-c))); /*afisarea ariei triunghiului ca valoare reala*/ cout<<"\n Aria triunghiului este: "<<arie<<endl; } 3./*afisarea valorii bitilor unei variabile de tip unsigned char aplicand succesiv operatorul de deplasare dreapta si operatorul % */ #include <iostream> using namespace std; void main(void) { /*declararea bitilor si a variabilei de tip unsigned char*/ unsigned char a; int i; cout<<"Introduceti un caracter: "; cin>>a; for(i=1;i<=sizeof(a)*8;i++) { /*afisarea variabilei de tip unsigned char aplicand succesiv operatorul de deplasare dreapta si operatorul % */ cout<<"\n Bitul de pe pozitia "<<i<<" este "<<a%2; a=a>>1; } } 4Sa se scrie un program care monitorizeaza un canal de 16/32/64 biti. Pentru aceasta cititi de la tastatura o valoare ntrega fara semn a care va fi afisata n zecimal, binar, octal si hexazecimal. Folositi o functie pentru conversia numerelor din baza 10 n baza 2. Implementati o alta functie numita getsets() care primeste trei valori ca parametri: - x: valoarea citita de la tastatura - p: pozitia unui bit din cei 16/32 sau 64 de biti (numarnd de la dreapta) - n: numarul de biti care vor fi extrasi din tabel. Functia returneaza, aranjati spre dreapta, acei n biti ai valorii x, pornind de la pozitia p, unde p>8*sizeof(x) si p>n. Afisati rezultatul n binar, octal si hexazecimal. #include <iostream> using namespace std; #include<stdio.h> unsigned short int v[32]; unsigned convert(unsigned int a) { unsigned short int aux[32],poz=-1; while (a>0) { aux[++poz] = a%2; a/=2; } for(int i=0;i<=poz;i++) { v[poz-i]=aux[i]; } return poz; }

void main(void) { unsigned int a,dim; cout<<"Introduceti o voloare intreaga fara semn: "; cin>>a; printf("Numarul introdus este: %d (baza 10), ",a); dim = convert(a); for(int i=0;i<=dim;i++) { cout<<v[i]; } cout<<" (baza 2), "; printf("%o (baza 8), %x (baza 16)",a,a); } 5./*citirea de la intrarea standard a unui numar intreg si afisarea numarului de zerouri din reprezentarea sa binara*/ #include <iostream> using namespace std; #include<stdio.h> void main(void) { /*declararea numarului intreg si zero*/ int a,nr=0; cout<<"Introduceti un numar intreg: "; cin>>a; while (a>0) { if(!(a%2)) nr++; a=a>>1; } /*afisarea numarului de zerouri din reprezentarea binara a numarului introdus*/ printf("Numarul de zerouri din reprezentarea binara a numarului introdus este: %d",nr); } LABORATORUL NR.6 1. Se citesc trei numere de la tastatura (a,b si c). Sa se determine aria dreptunghiului a carui laturi sunt a si b si verificati daca diagonala dreptunghiului este egala cu c. #include <iostream> #include <math.h> using namespace std; void main(void) { float a,b,c,aria,diag; cout<<"Introduceti trei numere reale de la tastatura\n"; cout<<"Primul numar: "; cin>>a; cout<<"Al doilea numar: "; cin>>b; cout<<"Al treilea numar: "; cin>>c; aria = a*b; cout<<"Aria dreptunghiului determinat de laturile de lungime "<<a<<" si "<<b<<" este: "<<aria<<endl<<endl; diag = sqrt(a*a+b*b); if(c==diag) cout<<"Diagonala dreptunghiului discutat este egala cu cel de al treilea numar introdus ("<<c<<")";

else cout<<"Diagonala dreptunghiului discutat nu este egala cu cel de al treilea numar introdus ("<<c<<")"; cout<<endl<<endl; } 2. Sa se scrie un program care verifica daca un numar este patrat perfect #include <iostream> using namespace std; void main(void) { float nr; int i; cout<<"Introduceti un numar: "; cin>>nr; for(i=1;i<nr/2;i++) if(i*i == nr) { cout<<endl<<endl<<"Numarul introdus este patratul perfect al numarului "<<i<<endl; return; } cout<<endl<<endl<<"Numarul introdus nu este patrat perfect"<<endl; } 3. Sa se scrie un program care calculeaza a^n, unde n este citit de la consola. #include <iostream> using namespace std; void main(void) { float a,result=1; unsigned int n; //se considera n numar natural cout<<"Introduceti un numar real: "; cin>>a; cout<<endl<<"Introduceti un numar natural: "; cin>>n; for(int i=0;i<n;i++) result *= a; cout<<a<<" la puterea "<<n<<" este egal cu: "<<result<<endl; } 4. Sa se scrie de la tastatura un program care citeste de la tastatura o valoare intreaga si calculeaza n!. #include <iostream> using namespace std; void main(void) { float a,result=1; unsigned int n; //se considera n numar natural cout<<"Introduceti un numar real: "; cin>>a; cout<<endl<<"Introduceti un numar natural: "; cin>>n; for(int i=0;i<n;i++) result *= a; cout<<a<<" la puterea "<<n<<" este egal cu: "<<result<<endl; } 5. Sa se scrie un program care:

10

- determina cel mai mare numar prim mai mic decat numarul dat - determina toate numerele prime mai mici decat numarul dat #include <iostream> #include <math.h> using namespace std; void main(void) { unsigned int x,last,prim; cout<<"Introduceti un numar natural: "; cin>>x; if(x>2) { cout<<endl<<endl<<"Numere prime mai mici decat "<<x<<":\n\t"; cout<<2; last = 2; } else { cout<<"Nu exista numere prime mai mici decat "<<x<<endl<<endl; return; } for(unsigned int d=3;d<x;d+=2) { prim = 1; for(unsigned int i=3;i<=(unsigned int)sqrt((float)d);i+=2) { if(d%i==0) { prim = 0; break; } } if(prim) { cout<<" "<<d; last = d; } } cout<<endl<<endl<<"Cel mai mare numar prim mai mic decat "<<x<<" este: "<<last<<endl<<endl; } 6. Sa se scrie un program care determina cel mai mare divizor comun a doi intregi. #include <iostream> using namespace std; void main(void) { int a,b; cout<<"Introduceti doua numere intregi: "; cout<<endl<<"\tPrimul numar: "; cin>>a; cout<<endl<<"\tAl doilea numar: "; cin>>b; while(a!=b) if(a>b) a-=b; else b-=a; cout<<endl<<endl<<"Cel mai mare divizor comun a numerelor date este: "<<a<<endl; }

11

7. Sa se scrie un program care determina toti divizorii unui numar. #include <iostream> using namespace std; void main(void) { unsigned int x; cout<<"Introduceti un numar natural: "; cin>>x; cout<<"Divizorii numarului "<<x<<" sunt:\n\t1 "; for(int d=2;d<=x;d++) if(!(x%d)) cout<<" "<<d; cout<<endl; } 8. Calculati produsul a doua numere intregi folosind numarul corespunzator de adunari. #include <iostream> using namespace std; void main(void) { int x,y,produs=0,semn = 1; cout<<"Introduceti doua numere intregi: "; cout<<endl<<"\tPrimul numar: "; cin>>x; cout<<endl<<"\tAl doilea numar: "; cin>>y; if(y<0) { y*=-1; semn = -1; } for(int i=0;i<y;i++) produs += x; produs *= semn; cout<<endl<<"Produsul celor doua numere este: "<<produs<<endl; } 9. Sa se scrie un program care determina catul impartirii a doi intregi folosind scaderi succesive. #include <iostream> using namespace std; void main(void) { int x,y,catul=0,semnX=1,semnY=1; cout<<"Introduceti doua numere intregi: "; cout<<"\n\tDeimparititul: "; cin>>x; cout<<"\n\tImpartitorul: "; cin>>y; if(y==0) { cout<<"\nImpartitorul nu poate fi 0\n"; return; } if(x<0)

12

{ x*=-1; semnX = -1; } if(y<0) { y*=-1; semnY = -1; } while(x>=y) { x-=y; catul++; } catul*=semnX*semnY; cout<<"Catul impartirii celor doua numere este: "<<catul<<endl; } 10. Sa se scrie un program care determina numarul de cifre care compun un numar intreg citit de la tastatura. #include <iostream> using namespace std; void main(void) { int x,cifre=0; cout<<"Introduceti un numar intreg: "; cin>>x; while(x>0) { cifre++; x/=10; } cout<<"\nNumarul dat are "<<cifre<<" cifre."<<endl; } 11. Sa se scrie un program care citeste de la tastatura n numere intregi. Afisati toate numerele impare din sir. #include <iostream> using namespace std; #define MAX 100 void main(void) { int v[MAX]; unsigned n; cout<<"Introduceti dimensiunea sirului: "; cin>>n; if(n>MAX) { cout<<"\nDimensiune invalida\n"; return; } cout<<"\nIntroduceti numerele sirului: "; for(unsigned i=0;i<n;i++) { cout<<"\n\tNumarul "<<i+1<<": "; cin>>v[i]; } cout<<"\nNumerele impare din sirul dat sunt: "; for(unsigned i=0;i<n;i++)

13

if(v[i]%2) cout<<v[i]<<" "; cout<<endl; LABORATOR NR.7 1.//* determinarea valorii medii a elementelor pozitive/negative dintr-un vector #include <iostream> using namespace std; #define MAX 100 unsigned citire(int x[]); float valMedieNegative(int x[],unsigned n); float valMediePozitive(int x[],unsigned n); void main(void) { int x[MAX]; unsigned n; n = citire(x); cout<<"Valorea medie a numerelor negative din sirul dat este: "<<valMedieNegative(x,n)<<endl; cout<<"Valorea medie a numerelor pozitive din sirul dat este: "<<valMediePozitive(x,n)<<endl; } unsigned citire(int x[]) { unsigned n; cout<<"Introduceti dimensiunea vectorului: "; cin>>n; cout<<"Introduceti elementele vectorului"; for(unsigned i=0;i<n;i++) { cout<<"\n\tElementul "<<i+1<<": "; cin>>x[i]; } return n; } float valMedieNegative(int x[],unsigned n) { float sum = 0; unsigned count = 0; for(unsigned i=0;i<n;i++) if(x[i]<0) { sum+=x[i]; count++; } if(!count) return 0; return sum/count; } float valMediePozitive(int x[],unsigned n) { float sum=0; unsigned count = 0; for(unsigned i=0;i<n;i++) if(x[i]>=0) { sum+=x[i];

14

count++; } if(!count) return 0; return sum/count; } 2.//* determinarea celui mai mic element pozitiv dintr-un vector #include <iostream> using namespace std; #define MAX 100 unsigned citire(int x[]); unsigned minElemPozitiv(int x[],unsigned n); void main(void) { int x[MAX]; unsigned n,min; n = citire(x); min = minElemPozitiv(x,n); if(min==-1) cout<<"Nu exista numere pozitive in sirul dat\n"; else cout<<"Cel mai mic element pozitiv din sirul dat este: "<<min<<endl; } unsigned citire(int x[]) { unsigned n; cout<<"\nIntroduceti dimensiunea vectorului: "; cin>>n; cout<<"Introduceti elementele vectorului"; for(unsigned i=0;i<n;i++) { cout<<"\n\tElementul "<<i+1<<": "; cin>>x[i]; } return n; } unsigned minElemPozitiv(int x[],unsigned n) { int min=-1; for(unsigned i=0;i<n;i++) if(x[i]>0 && (min==-1 || x[i]<min)) min = x[i]; return min; } 3.//* citirea de la tastatura a unui sir de 10 valori intregi //* definirea unei functii care primeste sirul ca parametru si apoi il afiseaza ordonat crescator #include <iostream> using namespace std; void ord(int x[]); void main(void) { int x[10]; cout<<"Introduceti zece elemente intregi"; for(int i=0;i<10;i++) {

15

cout<<"\n\tElementul "<<i+1<<": "; cin>>x[i]; } ord(x); } void ord(int x[]) { int aux; for(int i=0;i<10;i++) for(int j=9;j>i;j--) if(x[j]<x[j-1]) { aux = x[j]; x[j] = x[j-1]; x[j-1] = aux; } cout<<"\nSirul dat ordonat crescator este: "; for(int i=0;i<10;i++) cout<<x[i]<<" "; } 4.//* definirea unei parole(in format sir de caractere) //* citirea in mod repetat sirurile de caractere introduse de la tastatura pana cand utilizatorul scrie parola corecta //* afisarea numarului de incarcari pana la introducereaparolei carecte #include <iostream> using namespace std; int compare(char sir[],char parola[]); void main(void) { char sir[255],parola[] = "parola"; int result,count = 0; cout<<"Introduceti parola: "; do { cin>>sir; result = compare(sir,parola); if(result) { cout<<"Parola a fost introdusa corect dupa "<<count<<" incercari esuate."; break; } else { cout<<"Parola incorecta, va rugam reincercati: "; } count++; } while(true); } int compare(char sir[],char parola[]) { int i=0; while(sir[i]!=0 && parola[i]!=0) { if(sir[i]!=parola[i]) return 0; i++; } if(sir[i]!=0 || parola[i]!=0) return 0;

16

return 1; } 5.//* citirea de la tastatura a doua siruri de caractere reprezentand numele si prenumele unei persoane //* afisarea sirurilor cu majuscule separate prin 2 spatii de tabulare #include <iostream> using namespace std; void main(void) { char nume[255],prenume[255]; cout<<"Introduceti numele: "; cin>>nume; cout<<"Introduceti prenumele: "; cin>>prenume; if(nume[0]>=97) nume[0]-=32; if(prenume[0]>=97) prenume[0]-=32; cout<<endl<<nume<<"\t\t"<<prenume<<endl; } 6.//* definirea a doua matrice de valoriintregi unde dimensiunile si elementele matricelor sunt citite de la tastatura //* afisarea pozitiilor elementelor pare din fiecare matrice; //* afisarea sumei elementelor impare din ambele matrice; //* afisarea sumei matricelor; #include <iostream> using namespace std; #define MAX 10 void read(int v[MAX][MAX],int n,int m); void pozPare(int v[MAX][MAX],int n,int m); void sumaImpare(int v1[MAX][MAX],int v2[MAX][MAX],int n,int m); void sumaMatricelor(int v1[MAX][MAX],int v2[MAX][MAX],int n, int m); void main(void) { int v1[MAX][MAX],v2[MAX][MAX],n,m; cout<<"Introduceti dimensiunile matricelor: "; cin>>n>>m; cout<<"\nIntroduceti prima matrice"; read(v1,n,m); cout<<"\nIntroduceti matricea a doua"; read(v2,n,m); cout<<"\nPozitiile elementelor pare din matricea 1: "; pozPare(v1,n,m); cout<<"\nPozitiile elementelore pare din matricea 2: "; pozPare(v2,n,m); sumaImpare(v1,v2,n,m); cout<<"\nSuma matricelor este: \n"; sumaMatricelor(v1,v2,n,m); cout<<endl<<endl; } void read(int v[MAX][MAX],int n,int m) { for(int i=0;i<n;i++) for(int j=0;j<m;j++) { cout<<"\tElementul "<<i+1<<" "<<j+1<<": "; cin>>v[i][j];

17

} } void pozPare(int v[MAX][MAX],int n,int m) { for(int i=0;i<n;i++) for(int j=0;j<m;j++) if(v[i][j]%2==0) cout<<endl<<i+1<<" "<<j+1; } void sumaImpare(int v1[MAX][MAX],int v2[MAX][MAX],int n,int m) { int sum = 0; for(int i=0;i<n;i++) for(int j=0;j<m;j++) { if(v1[i][j]%2) sum+=v1[i][j]; if(v2[i][j]%2) sum+=v2[i][j]; } cout<<"\n\nSuma elemtelor impare din cele doua matrici este: "<<sum; } void sumaMatricelor(int v1[MAX][MAX],int v2[MAX][MAX],int n,int m) { for(int i=0;i<n;i++) { cout<<endl; for(int j=0;j<m;j++) cout<<" "<<v1[i][j]+v2[i][j]; } } 7. //* citirea de la tastatura a elementelor unei matrice de elementele de tip float cu dimensiunea 3x3 //* rearanjarea coloanelor matricei astfel incat suma elementelor de pe o anumita coloana sa fie mai mica decat suma elementelor de pe coloana urmatoare #include <iostream> using namespace std; void swap(float v[3][3],int c1,int c2); void main(void) { float v[3][3],sum,s[3]; cout<<"Introduceti elemtele matricii 3x3\n"; for(int i=0;i<3;i++) for(int j=0;j<3;j++) { cout<<"\tElementul "<<i+1<<" "<<j+1<<": "; cin>>v[i][j]; } for(int j=0;j<3;j++) { sum = 0; for(int i=0;i<3;i++) sum += v[i][j]; s[j] = sum; } cout<<endl; if(s[0]>s[1])

18

{ if(s[0]>s[2]) { swap(v,0,2); if(s[1]<s[2]) swap(v,0,1); } else { swap(v,0,1); } } else { if(s[1]>s[2]) swap(v,1,2); } for(int i=0;i<3;i++) { cout<<endl; for(int j=0;j<3;j++) cout<<v[i][j]<<" "; } } void swap(float v[3][3],int c1,int c2) { float aux; for(int i=0;i<3;i++) { aux = v[i][c1]; v[i][c1]=v[i][c2]; v[i][c2]=aux; } } TEMA LABORATOR NR. 8 1.//*scrierea unui program care citeste de la tastatura un sir de caractere folosind pointeri si sa se afiseze sirul obtinut prin eliminarea caracterelorcare se repeta din sir #include <stdio.h> void main(void) { char sir[225],*c=sir,sirClean[255],*cC=sirClean; int asci[255],i,k=0; printf("Introduceti un sir de caractere: "); scanf("%s",c); for(i=0;i<255;i++) asci[i] = 0; i=0; while(*(c+i)!=0) { if(!asci[*(c+i)]) { asci[*(c+i)] = 1; *(cC+(k++))=*(c+i); } i++; } *(cC+k) = 0; printf("%s",sirClean); }

19

2. //*scrierea unui program care citeste de la tastatura 2 siruri de caractere si sa se afiseze numarul de caractere prin care difera cele doua siruri prin pointeri (numarul de caractere care exista in primul si nu exista in al doilea+numarul de caractere care exista in al doilea si nu exista in primul) #include <stdio.h> void main(void) { char sir1[255],sir2[255],*c1=sir1,*c2=sir2; int asci1[255],asci2[255],i,s=0; printf("Introduceti doua siruri de caractere\n\tPrimul sir: "); scanf("%s",c1); printf("\n\tAl doilea sir: "); scanf("%s",c2); for(i=0;i<255;i++) { asci1[i]=0; asci2[i]=0; } i=0; while(*(c1+i)) { asci1[*(c1+(i++))] = 1; } i=0; while(*(c2+i)) asci2[*(c2+(i++))] = 1; for(i=0;i<255;i++) if(asci1[i] && asci2[i]) { asci1[i] = 0; asci2[i] = 0; } for(i=0;i<255;i++) { if(asci1[i]) s++; if(asci2[i]) s++; } printf("Numarul de caractere care difera in cele doua siruri este: %d\n",s); } 3.//*scrierea unui program C/C++ care citeste elementele a doi vectori intregi si afiseaza produsul scalar al acestora, folosind o functie care citeste de la tastatura si o functie care calculeaza produsul scalar,ambele sa utilizeze pointeri.Citirea numarului de elemente ale tabloului si afisarea rezultatului se va face cu functia main() #include <iostream> using namespace std; #define MAX 100 void citire(int *v,int n); int prodScalar(int *v1,int*v2,int n); void main(void) { int n,v1[MAX],v2[MAX]; cout<<"Introduceti dimensiunea vectorilor: "; cin>>n; if(n>=MAX) {

20

cout<<"Dimensiune invalida\n"; return; } cout<<"Introduceti elementele primului vector\n"; citire(v1,n); cout<<"Introduceti elementele vectorului doi\n"; citire(v2,n); cout<<"\n\nProdusul scalar al celor doi vectori este: "<<prodScalar(v1,v2,n)<<endl; } void citire(int *v,int n) { int i; for(i=0;i<n;i++) { cout<<"\tElementul "<<i+1<<": "; cin>>*(v+i); } } int prodScalar(int *v1,int *v2,int n) { int i,s=0; for(i=0;i<n;i++) s+= *(v1+i) * *(v2+i); return s; } TEMA LABORATOR NR.9 1. Rezolvati problemele din laboratorul de aplicatii cu tablouri (laboratorul 7, problemele 2-8) folosind pointeri. Lab7 prob1 //*scrierea unui program pentru determinarea valorii medii a elementelor pozitive/negative dintr-un vector #include<iostream> using namespace std; #define DIM 255 void main(void) { int n,i,x=0,y=0; float b,c,a[DIM],s1=0,s2=0; cout<<"\n Introduceti dimensiunea vectorului:"; cin>>n; if(n>DIM) { cout<<"\n Dimensiune invalida!"<<endl; return; } else { for(i=0;i<n;i++) { cout<<"\n\t Introduceti elementul a["<<i+1<<"]: "; cin>>*(a+i); } for(i=0;i<n;i++) { if(*(a+i)>0)

21

{ s1+=*(a+i); x++; } else if(*(a+i)<0) { s2+=*(a+i); y++; } } b=s1/x; c=s2/y; if(x==0) cout<<"\n Nu sunt elemente pozitive in sir!"<<endl; else cout<<"\n Media elementelor pozitive din sir este "<<b<<endl; if(y==0) cout<<"\n Nu sunt elemente negative in sir!"<<endl; else cout<<"\n Media elementelor negative din sir este "<<c<<endl; } } Lab7 prob2 //*scrierea unui program pentru determinarea celui mai mic element pozitiv dintr-un vector #include<iostream> using namespace std; #define DIM 255 void main(void) { int a[DIM],n,i,min; cout<<"\n Introduceti lungimea vectorului:"; cin>>n; for(i=0;i<n;i++) { cout<<"\n introduceti elementul "<<i+1<<": "; cin>>*(a+i); } min=*a; if(min<0) { for(i=1;i<n;i++) if(*(a+i)>=0) { min=*(a+i); break; for(i=0;i<n;i++) if(*(a+i)<min) min=*(a+i); } } else { for(i=1;i<n;i++) if(*(a+i)>0) if(*(a+i)<min) min=*(a+i);

22

} cout<<"\n cel mai mic element pozitiv din sir este:"<<min<<endl; } lab7 prob3 //*citirea de la tastatura a unui sir de 10 valori intregi //*definirea unei functii care primeste sirul ca parametru si apoi il afiseaza ordonat crescator #include<iostream> using namespace std; void sortare(int *a); void main(void) { int a[10],i; for(i=0;i<10;i++) { cout<<"\n introduceti elementul a["<<i<<"] = "; cin>>*(a+i); } cout<<"\n Sirul sortat este:"; sortare(a); } void sortare(int *a) { int aux,j,sortat; do { sortat=0; for(j=0;j<9;j++) if(*(a+j)>*(a+j+1)) { aux=*(a+j); *(a+j)=*(a+j+1); *(a+j+1)=aux; sortat=1; } } while(sortat!=0); for(j=0;j<=9;j++) cout<<*(a+j)<<" "; cout<<endl; } lab7 prob4 //*definirea unei parole (in format sir de caractere). //*citirea in mod repetat sirurile de caractere introduse de la tastatura, pana cand utilizatorul scrie parola corecta //*afisarea numarului de incercari pana la introducerea parolei corecte #include<iostream> using namespace std; #include<string.h> void main(void) { char s[255],a[]="parola"; int i,j=0; cout<<"\n Introduceti parola:"; cin>>s;

23

i=strcmp(s,a); if(i!=0) { cout<<"\n Ati introdus o parola gresita! Incercati din nou!"<<endl; j=1; while(i!=0) { cout<<"\n Introduceti din nou parola:"; cin>>s; i=strcmp(s,a); if(i!=0) { cout<<"\n Ati introdus o parola gresita! Incercati din nou!"<<endl; j++; } else cout<<"Parola corecta!"<<endl; } } else cout<<"\n Parola corecta!"<<endl; cout<<"\n Ati introdus de "<<j<<" parola gresit!"; } lab7 prob5 //*citirea de la tastatura a doua siruri de caractere reprezentand numele si prenumele unei persoane //*afisarea sirurilor cu majuscule separate prin 2 spatii de tabulare #include<iostream> using namespace std; #include<string.h> void main(void) { char a[255],b[255]; cout<<"\n Introduceti numele:"; cin>>a; cout<<"\n Introduceti prenumele:"; cin>>b; cout<<"Numele si prenumele:"<<endl; cout<<strupr(a)<<"\t\t"<<strupr(b)<<endl; } lab7 prob6 //* definirea a doua matrice de valoriintregi unde dimensiunile si elementele matricelor sunt citite de la tastatura //* afisarea pozitiilor elementelor pare din fiecare matrice; //* afisarea sumei elementelor impare din ambele matrice; //* afisarea sumei matricelor; #include<iostream> using namespace std; #define DIM 255 void citire(int *s,int n,int m); void pozpare(int *a,int *b,int n,int m); void suma_elem_impare(int *a,int *b,int n,int m); void suma_matrice(int *a,int *b,int *s,int n,int m); void main(void) {

24

int a[DIM][DIM],b[DIM][DIM],s[DIM][DIM],n,m,*pa=&a[0][0],*pb=&a[0][0],*ps=&s[0][0]; cout<<"\n Introduceti dimensiunea matricei:"; cin>>n>>m; if(n>DIM || m>DIM) { cout<<"\n Dimensiunile introduse sunt incorecte!"; return; } else { cout<<"\n Introduceti elementele primei matrici:"; citire(pa,n,m); cout<<"\n Introduceti elementele celei de-a doua matrici:"; citire(pb,n,m); pozpare(pa,pb,n,m); suma_elem_impare(pa,pb,n,m); suma_matrice(pa,pb,ps,n,m); } } void citire(int *s,int n,int m) { for(int i=0;i<n;i++) for(int j=0;j<m;j++) { cout<<"\n\t s["<<i<<"]["<<j<<"]= "; cin>>*(s+i*n+j); } } void pozpare(int *a,int *b,int n,int m) { cout<<"\n Pozitiile pare din prima matrice:"; for(int i=0;i<n;i++) for(int j=0;j<m;j++) { if(*(a+i*n+j)%2==0) cout<<"\n\tElementul par "<<*(a+i*n+j)<<" se afla pe pozitia "<<i<<" "<<j; } cout<<endl; cout<<"\n Pozitiile pare din a doua matrice:"; for(int i=0;i<n;i++) for(int j=0;j<m;j++) { if(*(b+i*n+j)%2==0) cout<<"\n\tElementul par "<<*(b+i*n+j)<<" se afla pe pozitia "<<i<<" "<<j; } cout<<endl; } void suma_elem_impare(int *a,int *b,int n,int m) { int s=0; for(int i=0;i<n;i++) for(int j=0;j<m;j++)nu { if(*(a+i*n+j)%2!=0) s+=*(a+i*n+j); } for(int i=0;i<n;i++) for(int j=0;j<m;j++) {

25

if(*(b+i*n+j)%2!=0) s+=*(b+i*n+j); } cout<<"\n\n\n Suma elementelor impare din cele 2 matrici este "<<s<<endl; cout<<endl; } void suma_matrice(int *a,int *b,int *s,int n,int m) { for(int i=0;i<n;i++) for(int j=0;j<m;j++) *(s+i*n+j)=0; for(int i=0;i<n;i++) for(int j=0;j<m;j++) *(s+i*n+j)=*(a+i*n+j)+*(b+i*n+j); cout<<"\n Suma celor matrici este:"<<endl; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) cout<<*(s+i*n+j)<<" "; cout<<endl; } } lab7 prob7 //* citirea de la tastatura a elementelor unei matrice de elementele de tip float cu dimensiunea 3x3 //* rearanjarea coloanelor matricei astfel incat suma elementelor de pe o anumita coloana sa fie mai mica decat suma elementelor de pe coloana urmatoare #include <iostream> using namespace std; void citire(float *p); float suma(float *p,int k); void swapCol(float *p,int col1,int col2,float *ps); void afis(float *p); void main(void) { float x[3][3],*p=&x[0][0],sum[3],*ps=sum; citire(p); for(int i=0;i<3;i++) *(ps+i) = suma(p,i); if(*(ps)>*(ps+1)) if(*(ps)>*(ps+2)) { swapCol(p,0,2,ps); if(*(ps)>*(ps+1)) swapCol(p,0,1,ps); } else swapCol(p,0,1,ps); else if(*ps>*(ps+2)) swapCol(p,0,2,ps); cout<<"Matricea prelucrata:"; afis(p); } void citire(float *p) { cout<<"Introduceti elementele unei matrici 3x3\n"; for(int i=0;i<3;i++)

26

for(int j=0;j<3;j++) { cout<<"\tElementul "<<i+1<<" "<<j+1<<": "; cin>>*(p+i*3+j); } } float suma(float *p,int k) { float s=0; for(int i=0;i<3;i++) s+= (*(p+i*3+k)); return s; } void swapCol(float *p,int col1,int col2,float *ps) { float aux; for(int i=0;i<3;i++) { aux = *(p+i*3+col1); *(p+i*3+col1) = *(p+i*3+col2); *(p+i*3+col2) = aux; } aux = *(ps); *(ps+col1) = *(ps+col2); *(ps+col2) = aux; } void afis(float *p) { for(int i=0;i<3;i++) { cout<<endl; for(int j=0;j<3;j++) cout<<*(p+i*3+j)<<" "; } } 2. //*generarea unui tablou de pointeri spre siruri de caractere folosind functia de biblioteca strdup() sau o functie proprie //*afisarea intrarilor pare ale acestui tablou. #include<iostream> using namespace std; #include<string.h> void intr_pare(char *); void main(void) { int i; char s[255]; intr_pare(s); } void intr_pare(char *s) { cout<<"\n Introduceti sirul de caractere:"; cin>>s; for(int i=0;i<strlen(s);i+=2) cout<<*(s+i)<<" "; cout<<endl; }

27

3. //*ordonarea unui sir de numere ntregi cu ajutorul functiei qsort() din biblioteca stdlib.h, folosind acelasi algoritm pentru numere float. #include <iostream> using namespace std; #include <stdlib.h> #define DIM 100 int compare(const void *a,const void *b); int compareFloat(const void *a,const void *b); void main(void) { int n,v[DIM],*pv=v; float f[DIM],*pf=f; cout<<"Introduceti dimensiunea vectorului: "; cin>>n; cout<<"\n Introduceti elementele :"; for(int i=0;i<n;i++) { cout<<"\tElementul "<<i+1<<": "; cin>>*(pv+i); } qsort((void*)pv,(size_t)n,sizeof(int),compare); cout<<"\nVectorul ordonat este: \n\t"; for(int i=0;i<n;i++) cout<<*(pv+i)<<" "; cout<<"\n\nIntroduceti dimensiunea vectorului(de numere reale): "; cin>>n; cout<<"\n Introduceti elementele reale: "; for(int i=0;i<n;i++) { cout<<"\tElementul "<<i+1<<": "; cin>>*(pf+i); } qsort((void*)pf,(size_t)n,sizeof(float),compareFloat); cout<<"\nVectorul ordonat este: \n\t"; for(int i=0;i<n;i++) cout<<*(pf+i)<<" "; } int compare(const void *a,const void *b) { return (*(int*)a)-(*(int*)b); } int compareFloat(const void *a,const void *b) { float r=(*(float*)a)-(*(float*)b); if(r<0) return -1; else if(r==0) return 0; else return 1; } 4.//*se considera doi parametri ntregi si alti doi flotanti de la linia de comanda si sa se afiseze suma si produsul lor. #include <iostream> using namespace std;

28

void main(int argc,char *argv[]) { if(argc<5) { cout<<"Introduceti doi parametri intregi si doi parametri floatanti de la linia de comanda\n\n"; return; } cout<<"Suma elementelor intregi este: "<<atoi(argv[1])+atoi(argv[2]) <<"\nProdusul elementelor intregi este: "<<atoi(argv[1])*atoi(argv[2]) <<"\n\nSuma elementelor reale este: "<<atof(argv[3])+atof(argv[4]) <<"\nProdusul elementelor reale este: "<<atof(argv[3])*atof(argv[4])<<endl; } 5. //*citirea de la tastatura a unui sir de caractere cu lungimea mai mare decat 7, folosind un pointer pentru a accesa si afisa caracterele de pe pozitiile 1, 3, 5 si 7. #include<iostream> using namespace std; #include<string.h> void main(void) { int i; char s[255]; cout<<"\n Introduceti sirul de caractere :"; cin>>s; if(strlen(s)<7) { cout<<"\n Dimensiunea sirului de caractere este mai mica decat 7!"; return; } for(i=1;i<strlen(s);i++) while(i<=7) { cout<<*(s+i)<<" "; i=i+2; } cout<<endl; } 6. //*realizarea unui algoritm care sorteaza numere introduse de la tastatura ntr-un vector pe masura ce acestea sunt citite.Sa se foloseasca pointeri pentru accesarea elementelor vectorului.Sa se dezvolte o aplicatie C/C++ n care o functie are ca parametrii formali pointeri la vectorul de elemente float si dimensiunea acestuia (void dir_sort(float *,int n);). #include<iostream> using namespace std; #define DIM 255 void dir_sort(float *,int n); void main(void) { int n; float a[DIM]; cout<<"\n Introduceti dimensiunea sirului:"; cin>>n; if(n>DIM) cout<<"\n Dimensiune invalida!"; else dir_sort(a,n); } void dir_sort(float *a,int n)

29

{ int j,sortat,i,k; float aux; cout<<"\n Introduceti primul element:"; cin>>*a; cout<<"\n Sirul este :"<<*a<<endl; i=1; while(i<n) { cout<<"\n Introduceti un nou element:"; cin>>*(a+i); cout<<endl; for(k=0;k<=i;k++) { do { sortat=0; for(j=0;j<i;j++) if(*(a+j)>*(a+j+1)) { aux=*(a+j); *(a+j)=*(a+j+1); *(a+j+1)=aux; sortat=1; } } while(sortat!=0); cout<<*(a+k)<<" "; } i++; } } 7. //*Dezvoltarea unui algoritm care interclaseaza doi vectori cu elemente valori numerice ntregi,folosind pointeri. #include<iostream> using namespace std; #define DIM 255 void citire(int *,int); void main(void) { int a[DIM],b[DIM],c[DIM],n,i=0,j=0,k=0; cout<<"\n Introduceti dimensiunea vectorilor:"; cin>>n; if(n>DIM) { cout<<"\n Dimensiune nevalabila!"; return; cout<<endl; } cout<<"\n Introduceti elementele primului sir:"; citire(a,n); cout<<endl; cout<<"\n Introduceti elementele celui de-al doilea sir:"; citire(b,n); cout<<endl; while(i<n && j<n && k<n+n) {

30

*(c+k)=*(a+i); i++; k++; *(c+k)=*(b+j); j++; k++; } cout<<"\n Sirul este:"; for(i=0;i<n+n;i++) cout<<*(c+i)<<" "; cout<<endl; } void citire(int *a,int n) { for(int i=0;i<n;i++) { cout<<"\n\t Introduceti elementul "<<i+1<<" : "; cin>>*(a+i); } } 8. //*Citirea de la tastatura a elemetelor a 2 matrici de valori ntregi. Scrierea unei functii care primeste ca parametri pointerii la cele 2 matrici si returneaza un pointer la matricea suma. Rezultatul nsumarii matricelor va fi afisat n functia main. Afisati elementele de pe diagoanala secundara a matricii suma, folosind acelasi pointer. #include <iostream> using namespace std; #define MAX 10 void citeste(int*,int); int* sumaMatrici(int*,int*,int*,int); void main(void) { int m1[MAX][MAX],m2[MAX][MAX],*p1=&m1[0][0],*p2=&m2[0][0],m12[MAX][MAX],*p12=&m12[0][0],n; cout<<"Introduceti dimensiunile matricilor patratice: "; cin>>n; cout<<"Introduceti elementele matricii unu: \n"; citeste(p1,n); cout<<"Introduceti elementele matricii doi: \n"; citeste(p2,n); p12 = sumaMatrici(p1,p2,p12,n); cout<<"Suma matriciilor este: \n"; for(int i=0;i<n;i++) { cout<<endl; for(int j=0;j<n;j++) cout<<*(p12+i*MAX+j)<<" "; } cout<<"\n\nElementele de pe diagonala secundara: \n\t"; for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(i == n-j-1) cout<<*(p12+i*MAX+j)<<" "; } void citeste(int *p,int n) { for(int i=0;i<n;i++) for(int j=0;j<n;j++) { cout<<"\tElementul "<<i+1<<" "<<j+1<<": ";

31

cin>>*(p+i*MAX+j); } } int* sumaMatrici(int *p1,int *p2,int *p12,int n) { for(int i=0;i<n;i++) for(int j=0;j<n;j++) *(p12+i*MAX+j) = *(p1+i*MAX+j) + *(p2+i*MAX+j); return p12; } 9. //* Definiti un sir de pointeri de tip caracter. Fiecare locatie a sirului contine unul din urmatoarele siruri de caractere: - "valoare prea mica" - "valoare prea mare" - "valoare corecta" Aplicatia genereaza un numar aleator ntre 1 si 100 si apoi citeste n mod repetat intrarea de la tastatura pna cnd utilizatorul introduce valoarea corecta. Folositi mesajele definite pentru a informa utilizatorul, la fiecare pas, despre relatia existenta ntre numarul generat si ultima valoare citita. #include <iostream> using namespace std; #include <math.h> #include <string.h> void main(void) { char mic[]="Valoare prea mica"; char mare[]="Valoare prea mare"; char egal[]="Valoare corecta"; char *p[3]; int x,r; p[0] = strdup(mic); p[1] = strdup(mare); p[2] = strdup(egal); r = rand()%100+1; cout<<"Introduceti un numar intre 1 si 100: "; cin>>x; while(x!=r) { if(x<r) cout<<p[0]; else cout<<p[1]; cout<<"\n\t"; cin>>x; } cout<<p[2]; } 10. //*scrierea un program n care sa definiti un tablou de pointeri spre siruri de caractere, pe care sa-l initializati cu diferite mesaje. Afisati mesajele. #include <iostream> using namespace std; void main(void) { char *p[] = {"Acesta este un mesaj","acesta este al doilea mesaj","Vreau acasa","Vine vacanta","Sarbatori fericite"}; cout<<"Mesajele definite sunt:";

32

for(int i=0;i<5;i++) cout<<"\n\t"<<p[i]; cout<<endl; } 11.//*Sa se scrie un program care preia din linia de comanda siruri de caractere si afiseaza sirul rezultat din concatenarea acestora. #include <iostream> using namespace std; #include <string.h> void main(int argc,char **argv) { char sir[255]; sir[0] = '\0'; for(int i=1;i<argc;i++) { strcat(sir,*(argv+i)); } cout<<"Sirurile concantenate: "<<sir<<endl; } 12. //*Sa se scrie un program care inverseaza sirul de caractere citit din linia de comanda. #include <iostream> using namespace std; #include <string.h> void main(int argc,char **argv) { char sir[255]; int len; if(argc!=2) { cout<<"Numar gresit de parametri\n"; return; } len = (int)strlen(*(argv+1)); for(int i=len-1;i>=0;i--) { sir[len-i-1] = *(*(argv+1)+i); } sir[len]='\0'; cout<<sir<<endl; } 13. //*Scrierea unui program care citeste de la tastatura elementele de tip float ale unui vector, elemente ce reprezinta mediile unei grupe de studenti. Sa se scrie o functie care determina numarul studentilor cu media >= 8. Afisati rezultatul n main. (pointeri, fara variabile globale). #include<iostream> using namespace std; #define DIM 255 void citire(float *,int n); void afisare(float *,int n); int nr_stud(float *,int n); void main(void) { int n; float a[DIM];

33

cout<<"\n Introduceti nr de studenti:"; cin>>n; if(n>DIM) cout<<"\n Valoare incorecta!"; else { citire(a,n); cout<<endl; cout<<"\n Mediile studentilor sunt:"; afisare(a,n); cout<<endl; for(int i=0;i<n;i++) if(*(a+i)>10 || *(a+i)<1) { cout<<"\n Ati introdus cel putin o medie peste nota 10 sau mai mica decat 1!"; return; cout<<endl; } cout<<"\n Sunt "<<nr_stud(a,n)<<" studenti cu media peste nota 8"; cout<<endl; } } void citire(float *a,int n) { for(int i=0;i<n;i++) { cout<<"\n\t Introduceti media studentului "<<i+1<<": "; cin>>*(a+i); } } void afisare(float *a,int n) { for(int i=0;i<n;i++) cout<<*(a+i)<<" "; } int nr_stud(float *a,int n) { int s=0; for(int i=0;i<n;i++) if(*(a+i)>=8) s++; return s; } 14. //*Scrierea unui program C/C++ n care se citesc de la tastatura elementele de tip ntreg ale unui vector a, utiliznd o functie. Scrieti o functie care completeaza un alt vector b, fiecare element al acestuia fiind obtinut prin scaderea mediei aritmetice a elementelor din a din elementul corespunzator din a. Scrieti o functie care permite afisarea unui vector si afisati vectorii a si b. (pointeri, fara variabile globale). #include<iostream> using namespace std; #define DIM 255 void citire(float *,int n); void afisare(float *,int n);

34

void completare_b(float *,float *,int n); void main(void) { int n; float b[DIM],a[DIM]; cout<<"\n Introduceti dimensiunea sirului a:"; cin>>n; citire(a,n); cout<<endl; completare_b(a,b,n); cout<<"\n Sirul a este:"; afisare(a,n); cout<<endl; cout<<"\n Sirul b este:"; afisare(b,n); cout<<endl; } void citire(float *a,int n) { for(int i=0;i<n;i++) { cout<<"\n\t Introduceti elementul "<<i+1<<": "; cin>>*(a+i); } } void afisare(float *a,int n) { for(int i=0;i<n;i++) cout<<*(a+i)<<" "; } void completare_b(float *a,float *b,int n) { float s=0; float ma; for(int i=0;i<n;i++) s+=*(a+i); ma=s/n; for(int i=0;i<n;i++) *(b+i)=*(a+i)-ma; } 15. //*Scrierea unui program n care se citesc de la tastatura elementele de tip ntreg ale unei matrici patratice, utiliznd o functie. Scrieti o functie care determina numarul de elemente negative de deasupra diagonalei secundare. Afisati rezultatul n main (fara variabile globale). #include<iostream> using namespace std; #define DIM 255 void citire(int *,int n); int elem_neg(int *,int n); void main(void) { int a[DIM][DIM],n,i,s,*pa=&a[0][0]; cout<<"\n Introduceti dimensiunea matricii:"; cin>>n; citire(pa,n); cout<<"\n Deasupra diagonalei secundare sunt "<<elem_neg(pa,n)<<" elemente negative."; cout<<endl;

35

} void citire(int *a,int n) { for(int i=0;i<n;i++) for(int j=0;j<n;j++) { cout<<"\n Introduceti elementul "<<i+1<<","<<j+1<<": "; cin>>*(a+i*n+j); } } int elem_neg(int *a,int n) { int s=0; for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(i+j<n) if(*(a+i*n+j)<0) s++; return s; } 16. //*Scrierea unui program n care se citesc de la tastatura elementele de tip ntreg ale unei matrici patratice, utiliznd o functie. Scrieti o functie care interschimba doua linii ale matricii. Afisati cu o functie matricea initiala si cea obtinuta. Dimensiunea matricii si numerele ce identifica liniile care vor fi interschimbate se citesc de la tastatura, n functia main. (fara variabile globale). #include <iostream> using namespace std; #define MAX 10 void read(int *p,int n); void interschimba(int *p1,int *p2,int n,int j,int k); void afis(int *p,int n); void main(void) { int v1[MAX][MAX],v2[MAX][MAX],*pv1=&v1[0][0],*pv2=&v2[0][0],n,k,j; cout<<"Introduceti dimensiunea matricei: "; cin>>n; cout<<"Introduceti elementele matricii\n"; read(pv1,n); cout<<"\nIntroduceti liniile pentru interschimbare: "; cin>>j>>k; interschimba(pv1,pv2,n,j,k); cout<<"\nMatricea initiala: "; afis(pv1,n); cout<<"\nMatricea dupa interschimbare: "; afis(pv2,n); } void read(int *p,int n) { for(int i=0;i<n;i++) for(int j=0;j<n;j++) { cout<<"Elementul "<<i+1<<" "<<j+1<<": "; cin>>*(p+i*MAX+j); } } void interschimba(int *p1,int *p2,int n,int j,int k) {

36

int aux; j--; k--; for(int i=0;i<n;i++) for(int j=0;j<n;j++) *(p2+i*MAX+j) = *(p1+i*MAX+j); for(int i=0;i<n;i++) { aux = *(p2+j*MAX+i); *(p2+j*MAX+i) = *(p2+k*MAX+i); *(p2+k*MAX+i) = aux; } } void afis(int *p,int n) { for(int i=0;i<n;i++) { cout<<endl; for(int j=0;j<n;j++) cout<<*(p+i*MAX+j)<<" "; } TEMA LABORATORUL 10 1./*Sa se scrie un program care citeste n numere reale, pe care le stocheaza ntr-un tablou alocat dinamic, afiseaza suma elementelor negative citite, iar la sfrsit elibereaza zona de memorie alocata */ #include <stdio.h> #include <malloc.h> void main() { int i,n,*a,neg; printf(" Dati lungimea vectorului "); scanf("%d",&n); a=(int *)malloc(n*sizeof(int));neg=0; for(i=0;i<n;i++) { printf("a[%d]=",i); scanf("%d",a+i); if((*(a+i))<0) neg=neg+*(a+i); } printf(" %d",neg); } 2. /*Fie o aplicatie de gestiune distribuita care considera ca trateaza activitatea din 5 orase diferite n fiecare oras fiind 3 birouri de vnzare pe teritoriul respectiv. Sa se creeze n cadrul unei functii un tablou de 5 pointeri catre date de tip flotant, fiecare pointer din acest tablou referind o zona n heap alocata dinamic de 3 date flotante ce reprezinta situatia vnzarilor la sfarsitul unei zile. Se cere prelucrarea datelor din fiecare oras, respectiv din fiecare birou de vnzare, prelucrare ce va include: - functie care permite introducerea datelor pentru cele 5 orase si respectiv pentru fiecare oras pentru cele 3 magazine din oras; - functie ce permite determinarea totalului de vnzari pe fiecare oras n parte, valoare pe care o va returna astfel ca n programul principal se va calcula si afisa media vnzarilor din toate cele 5 orase; - functie care va permite eliberarea spatiului de memorie alocat dinamic astfel nct daca aceiasi firma are alte 3 magazine n cele 5 orase de profil diferit sa poata sa realoce un spatiu echivalent pentru noile prelucrari pe care le va efectua. */ #include <stdio.h> #include <malloc.h> void citire(float **a); void calcul(float **a); void eliberare(float **a); void main() { int i,j;

37

float **a; citire(a); calcul(a); eliberare(a); } void citire(float **a){ int i,j; a=(float **)malloc(5*sizeof(float)); for (i=0;i<5;i++){ a[i]=(float*)malloc(3*sizeof(float)); for(j=0;j<3;j++){ printf("orasul %d , chioscul %d:",i,j); scanf("%f",&a[i][j]); } } } void calcul(float **a){ float sum; int i,j; for(i=0;i<5;i++){ sum=0; for(j=0;j<3;j++){ sum+=a[i][j]; } printf("pentru orasul %d media vanzarilor este:%f",i,sum/3.0); } } void eliberare(float **a){ int i; for(i=0;i<5;i++) free(a[i]); free(a); } 3. /*Sa se scrie o aplicatie C/C++, care aloca dinamic memorie pentru stocarea elementelor a doua matrici de "m" linii si "n" coloane. Sa se scrie o functie care calculeaza suma celor doua matrici si o functie pentru afisarea unei matrici. Sa se afiseze matricile initiale si matricea obtinuta*/ #include <stdio.h> #include <conio.h> #include <malloc.h> void afisare(int *a,int m,int n){ for(i=0;i<m;i++){ for(j=0;j<n;j++) printf("%d",*(a+m*i+j); printf("\n"); } } void citire(int *a,int m,int n){ for(i=0;i<m;i++){ for(j=0;j<n;j++){ printf("a[%d][%d]:",i,j); scanf("%d",*(a+m*i+j); } } } void main(){ int *a,*b,*c,i,j,m,n; a=(int*)malloc(m*n*sizeof(int)); b=(int*)malloc(m*n*sizeof(int)); c=(int*)malloc(m*n*sizeof(int));

38

citire(a); citire(b); for(i=0;i<m*n;i++) *(c+i)=*(a+i)+(*(b+i)); afisare(a,m,n); afisare(b,m,n); afisare(c,m,n); } 4. /*Sa se scrie o aplicatie C/C++ care aloca dinamic memorie pentru "n" siruri de caractere, care se vor citi de la tastatura*/ #include<iostream> using namespace std; #include<malloc.h> void main() { int n,m,i,j; char *a; cout<<"\n introduceti numarul de siruri:"; cin>>n; cout<<"\n introduceti dimensiunea sirului de caractere!"; cin>>m; if(n<0) { cout<<"\n reintroduceti numarul de siruri!"; } else { for(i=0;i<n;i++) { a=(char*)malloc(n*sizeof(char)); if(a==NULL) { cout<<"\n eroare de calcul!"; return; } cout<<"\n introduceti cele m caractere!"; for(j=0;j<m;j++) { cout<<"\n a["<<j<<"]= "; cin>>*(a+j); } if(a) free(a); } } } 5. /*Declarati un pointer global de tip float. n functia main cititi o valoare ntreaga N care reprezinta dimensiunea tabloului de numere reale. Alocati memoria necesara pentru stocarea tabloului si cititi elementele de la tastatura. Determinati valoarea medie a celor N elemente si calculati Mn=(sum(pow((xi-xmed),n))/N, unde n=1,2,3. Afisati rezultatele si apoi eliberati memoria. Folositi functiile malloc si free. Generati numerele din tablou folosind functia de biblioteca care genereaza numere aleatoare si determinati pentru acestea media valorilor si Mn. Realizati aceeasi aplicatie folosind operatorii new si delete */ #include<iostream> using namespace std; #include<math.h> float medie(int N1); long int*v;

39

void main() { int N,i,n; long float ma,sumas=0,v1,v2,v3; cout<<"\n introduceti dimensiunea tabloului:"; cin>>N; if(N<=0) { cout<<"\n dimensiune invalida!"; return; } v=(long int*)malloc(N*sizeof(long int)); if(v==NULL) { cout<<"\n alocare esuata!"; return; } else { for(i=0;i<N;i++) { v[i]=rand(); } cout<<"\n vectorul este:"; for(i=0;i<N;i++) { cout<<"\n v["<<i<<"]= "<<*(v+i); } ma=medie(N); for(i=0;i<N;i++) { long int q=*(v+i); v1=pow((q-ma),1); v2=pow((q-ma),2); v3=pow((q-ma),3); sumas+=v1+v2+v3; } long float Mn=(long float)sumas/N; cout<<"\n rezultatul este: "; cout<<"\n "<<Mn<<endl; } if(v) free(v); } float medie(int N1) { int i; long float med; int sum=0; for(i=0;i<N1;i++) { sum+=v[i]; } med=(long float)sum/N1; return(med); }

40

6. /*Folositi alocarea dinamica pentru o matrice n x m cu valori intregi (n,m<7).Initializati elementele matricii. Daca matricea este patratica, folositi metoda lui Sarrus pentru a obtine valoarea determinantului.Afisati rezultatul si eliberati memoria*/ #include <iostream> using namespace std; void main(void) { int m,n,*p,s=0,ps; cout<<"Introduceti dimensiunile matricii: "; cin>>m>>n; if(m==n) { p = new int[m*(2*m-1)]; memset(p,0,sizeof(int)*m*(2*m-1)); } else { p = new int[m*n]; } cout<<"Introduceti elemetele matricii\n"; for(int i=0;i<m;i++) { cout<<"\tLinia "<<i+1<<endl; for(int j=0;j<n;j++) { cout<<"\t\tColoana "<<j+1<<": "; if(m==n) { cin>>*(p+i*(2*m-1)+j); } else cin>>*(p+i*m+j); } } if(m==n) { for(int i=0;i<m;i++) for(int j=0;j<m-1;j++) *(p+i*(2*m-1)+j+m) = *(p+i*(2*m-1)+j); for(int j=0;j<m;j++) { ps=1; for(int i=0;i<m;i++) ps *= *(p+i*(2*m-1)+j+i); s+=ps; } for(int j=2*m-2;j>m-2;j--) { ps = 1; for(int i=0;i<m;i++) ps *= *(p+i*(2*m-1)+j-i); s-=ps; } cout<<"\n\nDeterminantul matricii este "<<s<<endl; } else { cout<<"\nMatricea nu este patratica"; } delete []p; }

41

7. /*Sa se scrie o aplicatie C/C++ care aloca dinamic memorie necesara pentru stocarea a 10.000 de numere ntregi. Programul initializeaza numerele cu valori aleatoare ntre 1 si 100 (folositi functiile randomize si random in BC++ sau rand in VC++ XE). Scrieti o functie care afiseaza cele mai frecvente 10 numere si numarul lor de aparitii n vectorul initial */ #include<iostream> using namespace std; #include<math.h> #include<stdlib.h> #include<malloc.h> #define n 10000 void main() { int i,k,aux,j; int*p; int x[10000],y[10000]; p=new int[n]; if(p!=NULL) { srand(2); int RANGE_MIN = 0; int RANGE_MAX = 100; for(i=0;i<n;i++) { int v = (((double) rand() / (double) RAND_MAX) * RANGE_MAX + RANGE_MIN); *(p+i)=v; } for(i=0;i<101;i++) { x[i]=0; } for(j=0;j<101;j++) { y[j]=j; } for(i=0;i<n;i++) { int v1=*(p+i); for(k=0;k<101;k++) { if(v1==k) x[k]=x[k]+1; } } for(k=0;k<100;k++) { for(i=k+1;i<101;i++) { if(x[k]<x[i]) { aux=y[k]; y[k]=y[i]; y[i]=aux; } } } cout<<"\n numerele care apare cel mai frecvent sunt:"; for(k=0;k<10;k++) {

42

cout<<"\n y["<<k<<"]= "<<y[k]<<endl; } } else { cout<<"\n alocare nereusita!"; delete[]p; } } TEMA LARORATOR 11 1. //*Sa se scrie un program, care folosind o structura de tip student sa determin numarul de studenti straini dintr-o grupa si sa afiseze toate datele acestora (nume, prenume, tara de origine, grupa, anul nasterii). Datele pentru studentii din grupa se citesc de la intrarea standard, pana la intalnirea numelui AAA*// #include <iostream> #include <stdlib.h> #include <string.h> using namespace std; #define end "AAA" struct student { char nume[50]; char prenume[50]; char tara[50]; int grupa; int an; }; struct list { struct student *p; struct list *next; }; list* aloc_list(void); student* aloc_student(void); void dealocare(struct list *p); void main(void) { struct list *start,*p; char nume[50],tara[50]; int grupa; start = aloc_list(); p = start; cout<<"Introduceti datele studentilor:\n"; cout<<"\tNume: "; cin>>nume; while(strcmp(nume,end)!=0) { p->p = aloc_student(); strcpy(p->p->nume,nume); cout<<"\tPrenume: "; cin>>p->p->prenume; cout<<"\tTara: "; cin>>p->p->tara; cout<<"\tGrupa: "; cin>>p->p->grupa; cout<<"\tAnul nasterii: "; cin>>p->p->an; p->next = aloc_list();

43

p = p->next; cout<<"\n\tNume: "; cin>>nume; } cout<<"\nSfarsit lista student\n"; p->next = NULL; cout<<"Introduceti numarul grupei: "; cin>>grupa; cout<<"Introduceti tara de referinta: "; cin>>tara; p = start; cout<<"\n\nStudentii din grupa "<<grupa<<" care nu sunt din tara "<<tara<<": \n"; while(p->next) { if(p->p->grupa == grupa) if(strcmp(p->p->tara,tara)==0) cout<<"\t"<<p->p->nume<<" "<<p->p->prenume<<"\tan:"<<p->p->an<<endl; p = p->next; } dealocare(start); } struct list* aloc_list(void) { struct list *p; if(!(p = new struct list)) { cout<<"\n\nEroare la alocare!\n"; exit(1); } return p; } student* aloc_student(void) { struct student *p; if(!(p = new struct student)) { cout<<"\n\nEroare la alocare!\n"; exit(1); } return p; } void dealocare(struct list *p) { if(p->next) dealocare(p->next); delete p->p; delete p->next; } 2. //*Sa se scrie un program, in care folosind cate o functie se transfera ca parametru o variabila de tip structura de date, ca valoare si, respectiv, prin adresa folosind pointeri. In functia main initializati campurile structurii cu date citit de la tastatura. In ambele functii afisati datele din structura folosind un mesaj adecvat*// #include <iostream> using namespace std; struct student { char nume[50]; char prenume[50];

44

}; void afisNuPointer(struct student p); void afisPointer(struct student *p); void main(void) { struct student p,*pp; pp = &p; cout<<"Introduceti date pentru structura student cu campurile nume si prenume: \n"; cout<<"\tNume: "; cin>>p.nume; cout<<"\tPrenume: "; cin>>p.prenume; cout<<"\nAfisare prin functie cu parametru o variabila de tip structura: "; afisNuPointer(p); cout<<"\nAfisare prin functie cu parametru pointer la o variabila de tip structura: "; afisPointer(pp); } void afisNuPointer(struct student p) { cout<<"\nNume: "<<p.nume<<"\t\tPrenume: "<<p.prenume; } void afisPointer(struct student *p) { cout<<"\nNume: "<<p->nume<<"\t\tPrenume: "<<p->prenume; } 3. //*Sa se scrie un program, in care o functie returneaza o structura de date adecvata. In acest fel vor fi returnate mai multe valori. Afisati rezultatul, valorile initiale transferate functie (puteti realiza orice operatie in cadrul acelei functii), cu mesaje adecvate*// #include <iostream> #include <string.h> using namespace std; struct siruri { char sir1[50]; char sir2[50]; char sir3[100]; int xerox; }; siruri operatie(struct siruri p); void main(void) { struct siruri p; cout<<"Introduceti doua siruri de caractere: "; cin>>p.sir1>>p.sir2; p = operatie(p); if(p.xerox) cout<<"\nSirurile sunt identice"; else cout<<"\nCele doua siruri sunt diferite"; cout<<"\nSirul rezultat prin concantenarea celor doua siruri: "<<p.sir3<<endl; } siruri operatie(struct siruri p) { if(strcmp(p.sir1,p.sir2)==0) p.xerox = 1; else p.xerox = 0;

45

strcpy(p.sir3,p.sir1); strcat(p.sir3,p.sir2); return p; } 4. //*Sa se scrie un program care utilizand o structura de tip angajat sa afiseze toate datele persoanelor cu ocupatia inginer, intr-o intreprindere (nume, prenume, ocupatia, data nasterii, sectia in care lucreaza)*// #include <iostream> #include <stdlib.h> using namespace std; struct data{ int zi; int luna; int an; }; struct angajat { char nume[50]; char prenume[50]; char ocupatie[50]; struct data *d; char sectie[50]; }; data* readDate(struct data *d); void main(void) { int n; struct angajat *p; cout<<"Introduceti numarul de angajati: "; cin>>n; if(!(p = new struct angajat[n])) { cout<<"\nEroare la alocare!\n"; return; } for(int i=0;i<n;i++) { cout<<"\n\n\tNume: "; cin>>(p+i)->nume; cout<<"\tPrenume: "; cin>>(p+i)->prenume; cout<<"\tOcupatie: "; cin>>(p+i)->ocupatie; cout<<"\tData nastere: "; (p+i)->d = readDate((p+i)->d); cout<<"\tSectia: "; cin>>(p+i)->sectie; } cout<<"\nAngajatii care sunt de profesie ingineri: \n"; for(int i=0;i<n;i++) { if(strcmp((p+i)->ocupatie,"inginer")==0) { cout<<"\t"<<(p+i)->nume<<" "<<(p+i)->prenume<<"\t\t"<<(p+i)->d->zi<<"."<<(p+i)->d->luna<<"."<<(p+i)->d->an<<"\t"<<(p+i)>sectie<<endl; } } for(int i=0;i<n;i++)

46

delete (p+i)->d; delete []p; } data* readDate(struct data *d) { if(!(d = new struct data)) { cout<<"\nEroare la alocare!\n"; exit(1); } cout<<"\n\t\tZi: "; cin>>d->zi; cout<<"\t\tLuna: "; cin>>d->luna; cout<<"\t\tAn: "; cin>>d->an; return d; } 5. //*Sa se scrie un program care citeste datele personale pentru n persoane (nume, prenume, data nasterii codul numeric personal, data angajarii) si apoi le afiseaza in ordinea datei angajariii*// #include <iostream> #include <stdlib.h> using namespace std; struct data { int zi; int luna; int an; }; struct persoana{ char nume[50]; char prenume[50]; struct data *dn; char codnumeric[13]; struct data *da; }; void sort(struct persoana *p,int *v,int n); void afis(struct persoana *p,int *v,int n); data* readDate(void); int compareDate(struct data *p1,struct data *p2); void dealocare(struct persoana *p,int *v,int n); void main(void) { int n,*v; struct persoana *p; cout<<"Introduceti numarul de persoane: "; cin>>n; if(!(p = new struct persoana[n])) { cout<<"\n\nEroare la alocare!\n"; exit(1); } if(!(v = new int[n])) { cout<<"\n\nEroare la alocare!\n"; exit(1); }

47

cout<<"Introduceti datele celor "<<n<<" persoane:\n"; for(int i=0;i<n;i++) { cout<<"\n\tNume: "; cin>>(p+i)->nume; cout<<"\tPrenume: "; cin>>(p+i)->prenume; cout<<"\tData nasterii: "; (p+i)->dn = readDate(); cout<<"\tCNP: "; cin>>(p+i)->codnumeric; cout<<"\tData angajarii: "; (p+i)->da = readDate(); } for(int i=0;i<n;i++) *(v+i) = i; sort(p,v,n); afis(p,v,n); dealocare(p,v,n); cout<<endl<<endl; } void sort(struct persoana *p,int *v,int n) { int res,aux; for(int i=0;i<n-1;i++) { for(int j=i+1;j<n;j++) { res = compareDate((p+*(v+i))->da,(p+*(v+j))->da); if(res>0) { aux = *(v+i); *(v+i) = *(v+j); *(v+j) = aux; } } } } void afis(struct persoana *p,int *v,int n) { cout<<"Personalul aranjat dupa data angajarii:"; for(int i=0;i<n;i++) { cout<<"\n\t"<<(p+*(v+i))->nume<<" "<<*(p+*(v+i))->prenume<<"\n\t\tcnp:"<<(p+*(v+i))->codnumeric <<"\n\t\t d.nas: "<<(p+*(v+i))->dn->zi<<"."<<(p+*(v+i))->dn->luna<<"."<<(p+*(v+i))->dn->an <<"\n\t\t d.angj: "<<(p+*(v+i))->da->zi<<"."<<(p+*(v+i))->da->luna<<"."<<(p+*(v+i))->da->an; } } data* readDate(void) { struct data *p; if(!(p = new struct data)) { cout<<"\n\nEroare la alocare!\n"; exit(1); } cout<<"\n\t\tZi: "; cin>>p->zi; cout<<"\t\tLuna: ";

48

cin>>p->luna; cout<<"\t\tAn: "; cin>>p->an; return p; } int compareDate(struct data *p1,struct data *p2) { if(p1->an < p2->an) return -1; if(p1->an == p2->an) { if(p1->luna < p2->luna) return -1; if(p1->luna == p2->luna) { if(p1->zi < p2->zi) return -1; if(p1->zi == p2->zi) return 0; } } return 1; } void dealocare(struct persoana *p,int *v,int n) { for(int i=0;i<n;i++) { delete (p+i)->da; delete (p+i)->dn; } delete []p; delete []v; } 6. //*Sa se scrie un program care afiseaza numele, prenumele si media studentului cu cele mai bune rezultate din grupa in urma sesiunii de iarna. Folositi pentru aceasta o structura student, alocarea dinamica, si o functie de care returneaza inregistrarea student care are media cea mai mare*// #include <iostream> using namespace std; struct student { char nume[50]; char prenume[50]; float medie; }; void afis(struct student *p,int n); void main(void) { int n; struct student *p; cout<<"Introduceti numarul de studenti din grupa: "; cin>>n; if(!(p = new struct student[n])) { cout<<"\n\nEroare la alocare\n"; return; } cout<<"\nIntroduceti datele studentilor:";

49

for(int i=0;i<n;i++) { cout<<"\n\tNume: "; cin>>(p+i)->nume; cout<<"\tPrenume: "; cin>>(p+i)->prenume; cout<<"\tMedia: "; cin>>(p+i)->medie; } cout<<"Studentul cu media cea mai mare este: "; afis(p,n); delete []p; } void afis(struct student *p,int n) { float max = p->medie; int loc = 0; for(int i=1;i<n;i++) { if((p+i)->medie > max) { loc = i; max = (p+i)->medie; } } cout<<"\n\t"<<(p+loc)->nume<<" "<<(p+loc)->prenume<<"\tmedie: "<<(p+loc)->medie<<endl; } 7. //*Sa se scrie o plicatie care aloca dinamic memorie pentru memorarea datelor a nstudenti, si dupa ce citeste datele pentru fiecare din acestia, afiseaza numarul studentelelor. In final se va elibera memoria alocata*// #include <iostream> using namespace std; struct student { char nume[50]; char prenume[50]; char sex; }; void main(void) { int n,cate=0; struct student *p; cout<<"Introduceti numarul de studenti: "; cin>>n; if(!(p = new struct student[n])) { cout<<"\n\nEroare la alocare!\n"; exit(1); } cout<<"Introduceti datele studentilor: "; for(int i=0;i<n;i++) { cout<<"\n\tNume: "; cin>>(p+i)->nume; cout<<"\tPrenume: "; cin>>(p+i)->prenume; cout<<"\tSex(m/f): "; cin>>(p+i)->sex;

50

} for(int i=0;i<n;i++) { if((p+i)->sex == 'f') cate++; } if(cate>0) cout<<"\n"<<cate<<" dintre studenti sunt studente\n"; else cout<<"Nu exista nici o studenta, ce trist :(\n\n"; delete []p; } 8. //*Declarati o structura de date de tip struct, o_struct, care sa contina o variabila de tip intreg, una de tip caracter si un sir de 256 caractere. In programul principal definiti o variabila statica de tip o_struct, careia sa-i initializati variabilele cu date citite de la intrarea standard. Declarati apoi un pointer de tip o_struct, po_struct, pe care sa-l definiti folosind alocarea dinamica cu o zona de memorie care sa contina un articol de tip o_struct. Initializati campurile structurii de date folosind pointer, po_struct. Eliberati in final zona de memorie alocata*// #include <iostream> #include <string.h> using namespace std; struct o_struct { int nr; char caracter; char sir[255]; }; void main(void) { struct o_struct str,*po_struct; cout<<"Introduceti un numar intreg: "; cin>>str.nr; cout<<"Introduceti un caracter: "; cin>>str.caracter; cout<<"Introduceti un sir de caractere: "; cin>>str.sir; if(!(po_struct = new struct o_struct)) { cout<<"\n\nEroare la alocare!\n"; exit(1); } po_struct->nr = str.nr; po_struct->caracter = str.caracter; strcpy(po_struct->sir,str.sir); delete po_struct; } TEMA LABORATOR 12 1. //*Folosind structura de date union denumita grupa compusa din diferite campuri cum ar fi: int, long, double, char etc.,scrieti o aplicatie care va initializa un element de tipul grupa de la tastatura. Este posibil sa afisam in acelasi timp toate campurile folosind pointeri sau nume calificate? Afisati ceea ce este posibil si dimensiunea elementului union. Realizati aceeasi operatie considerand o simpla structura struct*// #include <iostream> using namespace std; void main(void)

51

{ union grup { int nrint; float nrfloat; }g; cout<<"Operatia aplicata unei uniuni\n"; cout<<"Introduceti un numar real: "; cin>>g.nrfloat; cout<<"Introduceti un numar intreg: "; cin>>g.nrint; cout<<"\nValoare numarul real a fost pierduta. Valoarea numarul intreg este: "<<g.nrint <<"\nDimensiunea uniunii este: "<<sizeof(g); struct str{ int nrint; float nrfloat; }s; cout<<"\n\nOperatia aplicata unei structuri\n"; cout<<"Introduceti un numar real: "; cin>>s.nrfloat; cout<<"Introduceti un numar intreg: "; cin>>s.nrint; cout<<"\nValoarea numarului real este: "<<s.nrfloat <<". Valoarea numarul intreg este: "<<s.nrint <<". Dimensiunea structurii este: "<<sizeof(s); } 3. //*Sa se scrie un program care citeste si apoi afiseaza date intregi preluate dintru-un fisier text al carui nume este citit de la consola. Creati in prealabil fisirul prin program*// #include <iostream> #include <stdio.h> using namespace std; void main(void) { int opt,n,aux; char fileName[50]; FILE *f; cout<<"Introduceti 1 pentru a crea un fisier sau 2 pentru a afisa datele dintr-un fisier: "; do { cin>>opt; if(opt>2 || opt<1) cout<<"Optiune invalida, reincercati: "; else break; } while(true); if(opt == 1) { cout<<"\nIntroduceti numele fisierului pe care doriti sa il creati: "; cin>>fileName; f = fopen(fileName,"w"); if(f == NULL) { cout<<"\n\nEroare la crearea fisierului!\n"; return; }

52

cout<<"\nIntroduceti cate numere intregi vreti sa scrieti in fisier: "; cin>>n; cout<<"\nIntroduceti numerele: "; for(int i=0;i<n;i++) { cin>>aux; fprintf(f," %d",aux); } fclose(f); cout<<"\nNumerele au fost scrise cu succes"; } else { cout<<"\nIntroduceti numele fisierului pentru citire: "; cin>>fileName; f=fopen(fileName,"r"); if(f==NULL) { cout<<"\n\nEroare la deschiderea fisierului!\n"; return; } cout<<"\nNumerele din fisier sunt: \n"; while(feof(f)==0) { fscanf(f,"%d",&aux); cout<<" "<<aux; } fclose(f); } } 4. //*Sa se scrie un program care citeste dintr-un fisier text 10 numere intrei (generat in prealabil prin program sau extern). Sa se scrie functiile care: a. aranjeaza crescator/descrescator sirul si afiseaza rezultatul; b. numara cate elemente sunt pare si afiseaza rezultatul. Scrieti in fisier noile rezultate obtinute.*// #include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; void createFile(char fileName[]); void sort(int *p); int catePare(int *p); void main(void) { int *p,op,cate; char fileName[255],s[255],opt; FILE *f; cout<<"Introduceti: \n\t1 pentru prelucrarea informatiilor din fisier\n\t2 pentru crearea unui fisier nou \n\t3 pentru vizualizarea rezultatului dintr-un fisier\n\n\tOptiune:"; do { cin>>op; if(op==1||op==2||op==3) break; else cout<<"Optiune invalida, reincercati: "; } while(true);

53

if(op == 1) { cout<<"Introduceti numele fisierului: "; cin>>fileName; f = fopen(fileName,"r"); if(f==NULL) { cout<<"Fisierul nu exista, doriti sa il creati(y/n)?"; do { cin>>opt; if(opt == 'y' || opt == 'n') break; else cout<<"Optiune invalida, reincercati(y/n): "; } while(true); if(opt == 'y') { createFile(fileName); return; } else { cout<<"\nO zi buna!"; return; } } if(!(p = new int[10])) { cout<<"\nEroare la alocarea dinamica!\n"; return; } for(int i=0;i<10;i++) { if(feof(f)) { cout<<"Fisierul nu contine date valide"; return; } fscanf(f,"%d",p+i); } sort(p); cate = catePare(p); fclose(f); f = fopen(fileName,"w"); if(f==NULL) { cout<<"\nEroare la deschidere!\n"; return; } fprintf(f,"Numerele ordonate crescator:\n\t"); for(int i=0;i<10;i++) { fprintf(f," %d",*(p+i)); } fprintf(f,"\n\nDin care %d sunt pare.\n",cate); fclose(f); } else {

54

if(op == 2) { cout<<"\nIntroduceti numele fisierului: "; cin>>fileName; createFile(fileName); } else { cout<<"\nIntroduceti numele fisierului: "; cin>>fileName; f = fopen(fileName,"r"); if(f==NULL) { cout<<"Eroare la deschidere"; return; } while(feof(f)==0) { cout<<fgets(s,255,f); } } } } void createFile(char fileName[]) { int aux; FILE *f; f = fopen(fileName,"w"); if(f == NULL) { cout<<"\nEroare la crearea fisierului!\n"; exit(1); } cout<<"Introduceti 10 numere intregi: "; for(int i=0;i<10;i++) { cin>>aux; fprintf(f," %d",aux); } fclose(f); cout<<"\nNumerele au fost scrise cu succes\n"; } void sort(int *p) { int aux; for(int i=0;i<9;i++) { for(int j=i+1;j<10;j++) { if(*(p+i)>*(p+j)) { aux = *(p+i); *(p+i) = *(p+j); *(p+j) = aux; } } }

55

cout<<"\nVectorul ordonat: \n\t"; for(int i=0;i<10;i++) { cout<<" "<<*(p+i); } } int catePare(int *p) { int cate = 0; for(int i=0;i<10;i++) { if(*(p+i) % 2 == 0) { cate ++; } } cout<<"\n"<<cate<<" numere sunt pare\n"; return cate; } 5. //*Scrieti un program care citeste de la consola n numere intregi pe care le scrie intr-un fisier text cu numele citit de la tastatura. Cititi apoi numerele din fisier, determinati apoi media lor aritmetica pe care o adaugati la sfarsitul fisierului si o afisati si pe ecran*// #include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; void createFile(char fileName[]); void sort(int *p); int catePare(int *p); void main(void) { int *p,op,cate; char fileName[255],s[255],opt; FILE *f; cout<<"Introduceti: \n\t1 pentru prelucrarea informatiilor din fisier\n\t2 pentru crearea unui fisier nou \n\t3 pentru vizualizarea rezultatului dintr-un fisier\n\n\tOptiune:"; do { cin>>op; if(op==1||op==2||op==3) break; else cout<<"Optiune invalida, reincercati: "; } while(true); if(op == 1) { cout<<"Introduceti numele fisierului: "; cin>>fileName; f = fopen(fileName,"r"); if(f==NULL) { cout<<"Fisierul nu exista, doriti sa il creati(y/n)?";

56

do { cin>>opt; if(opt == 'y' || opt == 'n') break; else cout<<"Optiune invalida, reincercati(y/n): "; } while(true); if(opt == 'y') { createFile(fileName); return; } else { cout<<"\nO zi buna!"; return; } } if(!(p = new int[10])) { cout<<"\nEroare la alocarea dinamica!\n"; return; } for(int i=0;i<10;i++) { if(feof(f)) { cout<<"Fisierul nu contine date valide"; return; } fscanf(f,"%d",p+i); } sort(p); cate = catePare(p); fclose(f); f = fopen(fileName,"w"); if(f==NULL) { cout<<"\nEroare la deschidere!\n"; return; } fprintf(f,"Numerele ordonate crescator:\n\t"); for(int i=0;i<10;i++) { fprintf(f," %d",*(p+i)); } fprintf(f,"\n\nDin care %d sunt pare.\n",cate); fclose(f); } else { if(op == 2) { cout<<"\nIntroduceti numele fisierului: "; cin>>fileName; createFile(fileName); } else { cout<<"\nIntroduceti numele fisierului: "; cin>>fileName; f = fopen(fileName,"r"); if(f==NULL)

57

{ cout<<"Eroare la deschidere"; return; } while(feof(f)==0) { cout<<fgets(s,255,f); } } } } void createFile(char fileName[]) { int aux; FILE *f; f = fopen(fileName,"w"); if(f == NULL) { cout<<"\nEroare la crearea fisierului!\n"; exit(1); } cout<<"Introduceti 10 numere intregi: "; for(int i=0;i<10;i++) { cin>>aux; fprintf(f," %d",aux); } fclose(f); cout<<"\nNumerele au fost scrise cu succes\n"; } void sort(int *p) { int aux; for(int i=0;i<9;i++) { for(int j=i+1;j<10;j++) { if(*(p+i)>*(p+j)) { aux = *(p+i); *(p+i) = *(p+j); *(p+j) = aux; } } } cout<<"\nVectorul ordonat: \n\t"; for(int i=0;i<10;i++) { cout<<" "<<*(p+i); } } int catePare(int *p) { int cate = 0; for(int i=0;i<10;i++) { if(*(p+i) % 2 == 0) { cate ++;

58

} } cout<<"\n"<<cate<<" numere sunt pare\n"; return cate; } 6. //*Scrieti un program care citeste de la tastatura un caracter apoi scrie acest caracter intr-un fisier text pe n linii, cate n caractere pe fiecare linie, n citit de la consola*// #include <iostream> #include <stdlib.h> using namespace std; void main(void) { FILE *f; char c,fileName[255]; int n; cout<<"Introduceti caracterul: "; cin>>c; cout<<"Introduceti numarul de multiplicitate: "; cin>>n; cout<<"Introduceti numele fisierului: "; cin>>fileName; f = fopen(fileName,"w"); if(f == NULL) { cout<<"\nEroare la deschidere!\n"; return; } for(int i=0;i<n;i++) { fprintf(f,"\n"); for(int j=0;j<n;j++) { fprintf(f,"%c",c); } } cout<<"\nFisierul a fost scris cu succes"; fclose(f); } 7. //*Sa se scrie o aplicatie care citeste un fisier text linie cu linie si il afiseaza pe ecran. se va folosi un fisier existent din sistem sau se va genera in prealabil unul prin program*// #include <iostream> using namespace std; void main(void) { int opt; char fileName[255],s[255]; FILE *f; cout<<"Introduceti:\n\t1 pentru a citi un fisier\n\t2 pentru a crea un fisier\n\n\tOptiune:"; do { cin>>opt; if(opt==1 || opt == 2) break; else

59

cout<<"\tOptiune invalida, reincercati: "; } while(true); if(opt ==1 ) { cout<<"\nIntroduceti numele fisierului: "; cin>>fileName; f=fopen(fileName,"r"); if(f==NULL) { cout<<"\nEroare la deschidere!\n"; return; } while(feof(f)==0) { fgets(s,255,f); cout<<s; } fclose(f); return; } cout<<"Introduceti numele fisierului: "; cin>>fileName; f=fopen(fileName,"w"); if(f==NULL) { cout<<"\nEroare la deschidere!\n"; return; } cout<<"\nIntroduceti textul de scris in fisier, pentru a incheia introduceti * pe o linie noua:\n"; fflush(stdin); do { gets(s); if(s[0]=='*' && s[1] == '\0') break; fprintf(f,"%s\n",s); } while(true); fclose(f); cout<<"\n\nFisierul a fost scris cu succes!"; } TEMA LABORATOR NR.13 1. //*Sa se scrie o aplicatie care: - citeste de la consola un numar intreg n; - citeste de la consola, cu o functie, n numere reale, intr-un vector dinamic; - scrie apoi valorile din tablou intr-un fisier binar al carui nume este citit de la consola; - citeste apoi continutul fisierului si afiseaza numerele din 3 in 3 pozitii, folosind accesul aleator la fisiere*// #include #include using namespace std; void read(int *p,int n); void main(void) { int n,*p,a; char fileName[255]; FILE *f;

60

cout<<"Introduceti dimensiunea vectorului: "; cin>>n; if(!(p = new int[n])) { cout<<"Eroare la la alocarea dinamica!"; return; } read(p,n); cout<<"Introduceti numele fisierului: "; cin>>fileName; if((f=fopen(fileName,"wb"))==NULL) { cout<<"Eroare la deschiderea fisierului"; return; } fwrite(p,sizeof(int),n,f); fclose(f); if((f=fopen(fileName,"rb"))==NULL) { cout<<"Eroare la deschiderea fisierului"; return; } while(true) { fread(&a,sizeof(int),1,f); if(feof(f)!=0) break; else { cout<< fseek(f,2*(long)sizeof(int),SEEK_CUR); } } fclose(f); } void read(int *p, int n) { cout<<"Introduceti elementele vectorului\n"; for(int i=0;i { cout<<"\tElementul "<<<": "; cin>>*(p+i); } } 2. //*Sa se scrie o aplicatie care: - defineste o structura Student (nume,prenume,grupa,medie); - citeste de la consola un numar intreg n; - pentru fiecare student, citeste cu o functie datele aferente si le scrie intr-un fisier cu numele preluat de la consola; - citeste continutul fisierului si afiseaza la consola studentii ce au media mai mare decat o medie citita de la consola*// #include using namespace std; #include struct student{ char nume[50]; char prenume[50];

61

int grupa; float medie; }; void read(struct student *p); void main(void) { struct student *p; int n; FILE *f; char fileName[255]; float med; cout<<"Introduceti numarul de studenti: "; cin>>n; if(!(p = new struct student[n])) { cout<<"Eroare la alocarea dinamica!"; return; } cout<<"Introduceti datele studentilor\n"; for(int i=0;i { read(p+i); } cout<<"\nIntroduceti numele fisierului: "; cin>>fileName; if((f = fopen(fileName,"wb"))==NULL) { cout<<"Eroare la deschiderea fisierului"; return; } for(int i=0;i { fwrite((p+i),sizeof(student),1,f); } fclose(f); cout<<"\nIntroduceti media limita: "; cin>>med; if((f=fopen(fileName,"rb"))==NULL) { cout<<"Eroare la deschiderea fisierului"; return; } cout<<"Studentii cu medie mai mare decat "<<<":\n"; for(int i=0;i { fread((p+i),sizeof(student),1,f); if((p+i)->medie>med) { cout<<"\n\t"<<(p+i)->nume<<"\t"<<(p+i)->prenume<<"\n\t\tgr: "<<(p+i)->grupa<<"\tmed: "<<(p+i)->medie; } } fclose(f); } void read(struct student *p) { cout<<"\n\tNume: "; cin>>p->nume; cout<<"\tPrenume: "; cin>>p->prenume;

62

cout<<"\tGrupa: "; cin>>p->grupa; cout<<"\tMedia: "; cin>>p->medie; } 3. //*Sa se scrie o aplicatie care: - citeste de la consola un numar intreg n; - citeste de la consola, cu o functie, n numere intregi, intr-un vector dinamic; - scrie apoi valorile din tablou intr-un fisier binar al carui nume este citit de la consola; - citeste apoi continutul fisierului si afiseaza pozitiile pe care s-au gasit numere pare*// #include using namespace std; #include void read(int *p,int n); void main(void) { int n,*p; char fileName[255]; FILE *f; cout<<"Introduceti dimensiunea vectorului: "; cin>>n; if(!(p= new int[n])) { cout<<"Eroare la alocarea dinamica"; return; } cout<<"Introduceti numerele: \n"; read(p,n); cout<<"Introduceti numele fisierului: "; cin>>fileName; if((f=fopen(fileName,"wb"))==NULL) { cout<<"Eroare la deschiderea fisierului"; return; } fwrite(p,sizeof(int),n,f); fclose(f); if((f=fopen(fileName,"rb"))==NULL) { cout<<"Eroare la deschiderea fisierului"; return; } fread(p,sizeof(int),n,f); fclose(f); cout<<"Elementele pare sunt pe pozitiile: \n\t"; for(int i=0;i { if(*(p+i)%2==0) { cout<<" "< } } delete []p; } void read(int *p,int n) { for(int i=0;i

63

{ cout<<"\tElementul "<<<": "; cin>>*(p+i); } } 4. //*Sa se scrie un program care primeste in linia de comanda doua nume de fisiere. Prin program se citesc 8 numere intregi, care apoi vor fi scrise, in mod binar, in primul fisier. Cititi apoi valorile din acest fisier si efectuati media aritmetica a numerelor mai mari decat 4. Rezultatul va fi scris in al doilea fisier, sub forma: Media aritmetica a numerelor ..., este .... Unde in locul punctelor de suspensie vor fi scrise valorile a caror pedie a fost calculata si respectiv valoarea mediei cu o precizie de 2 digiti*// #include using namespace std; #include void main(void) { char fileNameIn[255],fileNameOut[255]; int *p,cate=0; float med=0; FILE *f; cout<<"Introduceti numele fisierului intrare: "; cin>>fileNameIn; cout<<"Introduceti numele fisierului iesire: "; cin>>fileNameOut; if(!(p=new int[8])) { cout<<"Eroare la alocarea dinamica"; return; } cout<<"Introduceti 8 numere intregi: \n"; for(int i=0;i<8;i++) { cout<<"\tElementul "<<<": "; cin>>*(p+i); } if((f=fopen(fileNameIn,"wb"))==NULL) { cout<<"Eroare la deschiderea fisierului"; return; } fwrite(p,sizeof(int),8,f); fclose(f); if((f=fopen(fileNameIn,"rb"))==NULL) { cout<<"Eroare la deschiderea fisierului"; return; } fread(p,sizeof(int),8,f); fclose(f); if((f=fopen(fileNameOut,"w"))==NULL) { cout<<"Eroare la deschiderea fisierului"; return; } fprintf(f,"Media aritmetica a numerelor "); for(int i=0;i<8;i++) {

64

if(*(p+i)>4) { fprintf(f," %d",*(p+i)); med+=*(p+i); cate++; } } med/=cate; fprintf(f,", este %.2f.",med); fclose(f); cout<<"\nRezultatul a fost scris in fisierul "< }

65