Probleme Rezolvate
Probleme Rezolvate
Probleme Rezolvate
#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;
void main(void)
{
int a,b;
float s;
printf("\ Coeficientul a= ");
scanf("%d",&a);
printf("\ Coeficientul b= ");
scanf("%d",&b);
s=-b/a;
printf("\n Solutia ecuatiei este:%f",s);}
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 serie1(float,float);
float paralel1(float,float);
float serie2(float,float);
float paralel2(float,float);
void main(void) {
float r1,r2,serie_r,paralel_r, c1, c2, serie_c, paralel_c;
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);
serie_r=serie1(r1,r2);
paralel_r=paralel1(r1,r2);
printf("\n Rezistenta serie este:\n%5.3f \n",serie_r);
printf("\n Rezistenta paralel este:\n%5.3f \n",paralel_r);
serie_c=serie2(c1,c2);
paralel_c=paralel2(c1,c2);
printf("\n Capacitate serie este:\n%-8.4f \n",serie_c);
printf("\n Capacitate paralel este:\n%-8.4f \n",paralel_c);
}
float serie1(float a,float b)
{return a+b;}
float paralel1(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); }
/*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;
4
- p: pozitia unui bit din cei 16/32 sau 64 de biti (numarând 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);}
/*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);}
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>
6
cin>>n;
for(int i=1;i<=n;i++)
p=p*i;
cout<<"Valoarea lui "<<n<<"! este: "<<p<<endl;}
Sa se scrie un program care :
- 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;
}
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 al numerelor date este: "<<a<<endl;}
Sa se scrie un program care determina toti divizorii unui numar.
8
#include <iostream>
using namespace std;
void main(void)
{
unsigned int x;
cout<<"Introduceti un numar natural: ";
cin>>x;
cout<<"Divizorii numarului "<<x<<" sunt:\n\t 1";
for(int d=2;d<=x;d++)
if(x%d==0)
cout<<" "<<d;
cout<<endl;}
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;}
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,semn_X=1,semn_Y=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)
{
x*=-1;
semn_X = -1;
}
if(y<0)
{
y*=-1;
semn_Y = -1;
9
}
while(x>=y)
{
x-=y;
catul++;
}
catul*=semn_X*semn_Y;
cout<<"Catul impartirii celor doua numere este: "<<catul<<endl;}
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;}
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++)
if(v[i]%2)
cout<<v[i]<<" ";
cout<<endl;}
Scrieti un program pentru 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)
{
10
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: "; //se introduc elementele sirului respectand dimensiunea data anterior.
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]; //se calculeaza suma numerelor negative din vector.
count++;
}
if(!count) //daca numarul cifrelor negative (count) este diferit de 0,se efectueaza impartirea sum/count.
return 0;
return sum/count; //se calculeaza valoarea medie a nr negative din vector.
}
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]; //se calculeaza suma numerelor pozitive din vector.
count++;
}
if(!count) //daca numarul cifrelor pozitive (count) este diferit de 0,se efectueaza impartirea sum/count.
return 0;
return sum/count; //se calculeaza valoarea medie a nr pozitive din vector.}
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);
11
min = minElemPozitiv(x,n);
if(min==-1)
cout<<"Nu exista numere pozitive in sirul dat\n"; //daca in sir nu sunt elemente pozitive se va afisa acest mesaj.
else
cout<<"Cel mai mic element pozitiv din sirul dat este: "<<min<<endl; //altfel,minimul din sir va fi reprezentat de variabila min.
}
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)) //conditiile de afisare a celui mai mic element pozitiv din sir.
min = x[i];
return min;
}
Scrieti o aplicatie C/C++ care citeste de la tastatura un sir de 10 valori intregi. Definiti o functie 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++)
{
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--) //parcurgem valorile de la ultimul element catre primul element.
if(x[j]<x[j-1])
{
aux = x[j];
x[j] = x[j-1];
x[j-1] = aux;
} //cu ajutorul variabile aux,interschimbam x[j] cu x[j-1] in caz ca se indeplineste conditia x[j]<x[j-1]
cout<<"\nSirul dat ordonat crescator este: "<<endl;
for(int i=0;i<10;i++)
cout<<x[i]<<" ";}
12
Scrieti o aplicatie C/C++ care defineste o parola (in format sir de caractere). Programul citeste in mod repetat sirurile de caractere
introduse de la tastatura, pana cand utilizatorul scrie parola corecta.
Sa se afiseze numarul de incercari pana la introducerea parolei corecte.
#include <stdio.h>
char parola[]= "petronela"; //parola propriu-zisa.
int parola_gresita();
void main()
{int count=parola_gresita(); //variabila count retine numarul de incercari cand parola a fost introdusa gresit.
printf("Numarul de incercari: %d\n",count);
}
int parola_gresita()
{int c=0,p=0,bun=1;
do{
c++;
printf("Introduceti parola: ");
char s[100];
scanf("%s",s);
p=0;
bun=1;
while(s[p]!='\0' && parola[p]!='\0')
{
if(s[p]!=parola[p]) {bun=0; break;}
p++;
}
if((s[p]=='\0'&&parola[p]!='\0')||(s[p]!='\0'&&parola[p]=='\0')) bun=0;
}while(!bun);
return c;
}
Scrieti o aplicatie C/C++ care citeste de la tastatura 2 siruri de caractere reprezentand numele si prenumele unei persoane. Afisati-le
cu majuscula, separate prin 2 spatii de tabulare.
//Program care citeste de la tastatura 2 siruri de caractere reprezentand numele si prenumele unei persoane. Afisati-le cu majuscula,
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;
}
Scrieti o aplicatie C/C++ care defineste 2 matrice de valori intregi. Dimensiunea si elementele matricilor sunt citite de la tastatura.
Scrieti functiile care:
a) afiseaza pozitiile elementelor pare din fiecare matrice;
b) afiseaza suma elementelor impare din ambele matrice;
c) afiseaza suma matricelor;
#include <iostream>
using namespace std;
#define MAX 10
void read(int v[MAX][MAX],int n,int m); //functia pt citirea matricelor.
13
void pozitiile_Pare(int v[MAX][MAX],int n,int m); //functia pt determinarea pozitiilor elementelor pare din fiecare matrice;
void suma_Impare(int v1[MAX][MAX],int v2[MAX][MAX],int n,int m); //functia pt determinarea sumei elementelor impare din ambele
matrice;
void suma_Matricelor(int v1[MAX][MAX],int v2[MAX][MAX],int n, int m); //functia pt determinarea sumei matricelor.
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: ";
pozitiile_Pare(v1,n,m);
cout<<"\nPozitiile elementelore pare din matricea 2: ";
pozitiile_Pare(v2,n,m);
suma_Impare(v1,v2,n,m);
cout<<"\nSuma matricelor este: \n";
suma_Matricelor(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];
}
}
cout<<endl;
for(int j=0;j<m;j++)
cout<<" "<<v1[i][j]+v2[i][j];
} //se afiseaza suma elementelor matricelor v1 si v2.
}
Cititi de la tastatura elementele unei matrice de elemente de tip float, cu dimensiunea 3x3. Rearanjati coloanele matricei astfel incat
suma elementelor de pe o anumita coloana sa fie mai mica decat suma elementelor de pe coloana urmatoare.
#include <stdio.h>
int m[3][3];
void matrice(int a[3][3]);
void sortare_matrice(int a[3][3]); //functia ce sorteaza coloanele.
int suma(int a[3][3],int); //functia ce realizeaza suma elementelor de pe coloane.
void rearanjare_matrice(int a[3][3],int); //funtia ce reaaranjeaza matricea.
void main()
{
printf("\nDati elementele matricei:\n");
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
scanf("%d",&m[i][j]);
matrice(m);
printf("\n");
sortare_matrice(m);
matrice(m);
}
a[j][i]=a[j][i]-a[j][i+1];
} //interschimbarea coloanelor,astfel incat suma elementelor de pe o anumita coloana sa fie mai mica decat suma elementelor de
pe coloana urmatoare.
}
Sa se scrie un program care citeste de la tastatura un sir de caractere folosind pointeri si sa se afiseze sirul obtinut prin eliminarea
caracterelor care se repeta in sir.
#include<stdio.h>
#include<string.h>
void main(void)
{
char v[30],*p,i,j,k; //variabile sir de caractere
p=&v[0];
printf("Introduceti sirul de caractere: "); //introducem sirul de caractere fara spatii intre caractere
scanf("%s",p);
printf("%s\n",p);
for( i=0;i<strlen(p);i++) //parcurgem sirul folosind doua variabile i de la 0 si j de la i+1 cu functia for()
for( j=i+1;j<=strlen(p);j++)
while (*(p+i)==*(p+j)) //cat timp doua caractere sunt identice se executa functia for()
{
for( k=j;k<strlen(p);k++) //sirul parcurs cu variabila k imi returneaza noul sir cu *(p+i)!=*(p+j)
*(p+k)=*(p+k+1); //caracterul identic este ignorat si se trece la urmatoarea valoare.
}
for(i=0;i<strlen(p);i++)
printf("%c \n",*(p+i)); //se afiseaza caracterele ce apar o singura data in sir.
}
Sa se scrie un program care citeste de la tastatura 2 siruri de caractere si sa se afiseze numarul de
caractere prin care difera cele doua siruri (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). Folositi pointeri pentru accesul la elementele
tablourilor.
#include <stdio.h>
#include <string.h>
void main()
{
char a[30], b[30];
char *p, *q;
p = &a[0];
q = &b[0];
printf("primul cuvant:");
scanf("%s",p);
printf("al 2-lea cuvant:");
scanf("%s",q);
int i, j, c, x = 0; //c = marcaj(marcam daca exista elementul cautat din primul sir in al doilea sir)
for (i = 0; i < strlen(p); i++)
{
c = 0; //marcaj=0(nu exista caracterul curent din a in sirul b)
for (j = 0; j < strlen(q); j++)
if (*(p+i) == *(q+j))
{
c = 1; //marcaj=1(exista caracterul curent din a in sirul b)
break; //intreruperea celui de-al doilea for()
}
if (!c) x++; //daca marcaj=0(nu exista caracterul curent din sirul a in b, incrementam x (numarul elementelor cu
care difera)
}
for (i = 0; i < strlen(q); i++)
{ //acelasi algoritm, dar cautand din sirul b in sirul a, cu incrementarea aceluiasi x.
c = 0;
16
#include<stdio.h>
void cit(int *a,int n);
int scalar(int *a,int *b,int n);
void main()
{
int a[100],b[100];
int n,ok;
printf("Dimensiunea vectorilor a si b=");
scanf("%i",&n);
if(n<100)
{
ok=1; //confirma ca dimensiunea data de la tastatura este corespunzatoare,in secventa de instrunctiuni se introduc elementele
vectorilor a si b;
printf("Primul vector:\n");
cit(a,n);
printf("Al 2-lea vector:\n");
cit(b,n);
int p=scalar(a,b,n); //valoarea produsului este atribuita prin functia scalar variabilei p;
printf("Produsul scalar este: %i \n",p); //afisarea produsului scalar
}
else printf("Dimensiunea este prea mare! n trebuie sa fie mai mic de 100"); //altfel afiseaza mesajul corespunzator.
}
#include <stdio.h>
int v[100],*p=v,n,sum_neg,sum_poz,nr_poz,nr_neg; //declararea variabilelor.
17
void main()
{
printf("Dati numarul de elemente: ");
scanf("%d",&n);
printf("Dati %d elementele separate prin spatii: ",n);
for(int i=0;i<n;i++) //intr-un ciclu for() calculam suma elementelor pozitive/negative si numaram cate elemente negative/pozitive
avem in vector.
{
scanf("%d",p+i);
if(v[i]<0) //daca in vector avem elemente negative efectuam suma elementelor respective.
{
sum_neg+=*(p+i);
nr_neg++; //numara cate numere negative sunt in vector.
}
else //altfel daca in vector avem elemente pozitive efectuam suma elementelor respective.
{
sum_poz+=*(p+i);
nr_poz++; //numara cate numere pozitive sunt in vector.
}
}
if(nr_neg)
printf("Valoarea medie a elementelor negative din vector este %f\n",(float)sum_neg/nr_neg); //calculam valoarea medie a elentelor
negative.
else
printf("Nu exista numere negative in vector\n");
if(nr_poz)
printf("Valoarea medie a elementelor pozitive din vector este %f\n",(float)sum_poz/nr_poz); //calculam valoarea medie a elentelor
pozitive.
else
printf("Nu exista numere pozitive in vector!\n");
}
//Program pentru determinarea celui mai mic element pozitiv dintr-un vector,folosind pointeri.
#include <stdio.h>
void main()
{
int v[100],*p=v,n,min=-1; //declararea variabilelor;min se initializeaza cu -1 deoarece trecuie sa porneasa de la cea mai mica
valoare,diferita de 0.
printf("Dati numarul de elemente ale vectorului: ");
scanf("%d",&n);
printf("Dati %d elementele separate prin spatii: ",n);
for(int i=0;i<n;i++) //parcurgem vectorul intr-un ciclu for().
scanf("%d",p+i);
for(int i=0;i<n;i++)
if(*(p+i)>=0 && (*(p+i)<min||min<0)) //impunem conditiile necesare gasirii minimului; elementele vectorului sa fie pozitive si se
compara fiecare element *(p+i) cu min sau min cu 0,pentru a fi diferit de valoari negative,cea initializata la inceput (min=-1).
min=*(p+i); //daca conditiile sunt indeplinite si *(p+i) este mai mic decat min,lui min i se atribuie valoarea respectiva.
if(min>=0) //verifica daca ultima valoare minima gasita in vector este pozitiva si daca se respecta conditia atunci se va afisa acel
numar.
printf("Cel mai mic numar pozitiv din vector este %d\n",min);
else
printf("Nu exista numere pozitive in vector!"); //altfel va afisa un mesaj corespunzator.
}
//Program care citeste de la tastatura un sir de 10 valori intregi. Definiti o functie care
primeste sirul ca parametru si apoi il afiseaza ordonat crescator,folosind pointeri.
#include <stdio.h>
18
ok=1;
}
} while(ok==1);
}
//Program care defineste parola,in format sir de caractere,citeste in mod repetat sirurile de caractere introduse de la tastatura, pana
cand utilizatorul scrie parola corecta.Se afiseaza si numarul de incercari pana la introducerea parolei corecte,folosind pointeri
#include <stdio.h>
int acces_parola(char*);
void main()
{
char parola[]= "ana"; //parola propriu-zisa.
int count=acces_parola(parola); //i se atribuie numarul de incercari, atunci cand s-a introdus parola gresita.
printf("Numarul de incercari: %d\n",count);
}
int acces_parola(char *parola)
{int c=0,i=0,bun=1;
char s[100],*p=s; //declararea unui sir de caractere si pointerul aferent lui.
do //intr-un ciclu do-while() se realizeaza introducerea parolei de la tastatura pana la introducerea parolei propriu-zise
declarata la inceputul programului.
{
c++;
printf("Introduceti parola: ");
scanf("%s",p);
i=0;
bun=1;
while(*(p+i)!='\0' && *(parola+i)!='\0')
{
if(*(p+i)!=*(parola+i))
{
bun=0;
break;
}
19
i++;
}
if((*(p+i)=='\0'&&*(parola+i)!='\0')||(*(p+i)!='\0'&&*(parola+i)=='\0')) //verifica caracter cu caracter daca sirul de caractere
introdus se potriveste cu parola propriu-zisa declarata initial.
bun=0;
}while(!bun);
return c;
}
//Program care citeste de la tastatura 2 siruri de caractere reprezentand numele si prenumele unei persoane. Afisati-le cu majuscula,
separate prin 2 spatii de tabulare,folosind pointeri.
#include <stdio.h>
#include <stdlib.h>
void upper(char *s);
void main()
{
char nume[30],*n=nume,prenume[30],*p=prenume;
printf("Introduceti numele si prenumele: ");
scanf("%s",n);
scanf("%s",p);
upper(n);
upper(p);
printf("%s\t%s\n",n,p);
}
void upper(char *s)
{ int i=0;
while(*(s+i))
{if(*(s+i)>=97)
*(s+i)-=32;
i++;
}
}
//Program care defineste doua matrice de valori intregi,dimensiunea si elementele fiind date de la tastatura.Determina functiile
pentru:
a) afisarea pozitiile elementelor pare din fiecare matrice;
b) afisarea suma elementelor impare din ambele matrice;
c) afisarea suma matricelor;
Folositi pointeri.
#include <stdio.h>
void suma_impara(int *mt,int dim); //functia pt determinarea sumei elementelor impare din ambele matrice;
void pozitie_para(int *mt,int dim); //functia pt determinarea pozitiilor elementelor pare din fiecare matrice;
void suma(int *mt,int dim); //functia pt determinarea sumei matricelor.
void main()
{int matrice[2][100][100],*m=&matrice[0][0][0];
int n,sum_i=0;
printf("Dati dimensiunea matricii: "); //Dam dimensiunea matricelor de la tastatura;
scanf("%d",&n);
for(int k=0;k<2;k++)
{printf("Dati elemenentele matricii %d:\n",k+1); //Elementele celor doua matrici;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",(m+k*n*n+i*n+j));
}
pozitie_para(m,n); //apelul functiilor;
suma_impara(m,n);
suma(m,n);
}
void suma(int *m,int dim) //realizeaza suma matricelor;
20
{
printf("Suma matricelor este: \n");
for(int i=0;i<dim;i++)
{for(int j=0;j<dim;j++)
printf("%d ",*(m+dim*i+j)+*(m+dim*dim+dim*i+j));
printf("\n");
}
}
void pozitie_para(int *m,int dim) //afiseaza pozitia elementelor pare din cele doua matrici;
{
for(int k=0;k<2;k++)
{
printf("Pozitia elementelor pare din vector %d sunt: \n",k+1);
for(int i=0;i<dim;i++)
for(int j=0;j<dim;j++)
if(*(m+k*dim*dim+dim*i+j)%2==0)
printf("(%d,%d) ",i,j);
printf("\n\n");
}
}
void suma_impara(int *m,int dim) //realizeaza suma elementelor impare din ambele matrici;
{
int sum_i=0;
for(int k=0;k<2;k++)
{
for(int i=0;i<dim;i++)
for(int j=0;j<dim;j++)
if(!(*(m+k*dim*dim+dim*i+j)%2))
sum_i+=*(m+k*dim*dim+dim*i+j);
}
printf("Suma elementelor impare este %d",sum_i);
printf("\n\n");
}
//Program care citeste de la tastatura o matrice cu trei linii si trei coloane.Programul rearanjeaza coloanele matricei astfel incat suma
elementelor de pe o anumita coloana sa fie mai mica decat suma elementelor de pe coloana urmatoare.
#include <stdio.h>
void matrice(int *);
void sortare_matrice(int *); //functia ce sorteaza coloanele.
int suma(int *,int); // //functia ce realizeaza suma elementelor de pe coloane.
void rearanjare_matrice(int *,int); //funtia ce reaaranjeaza matricea.
void main()
{int m[3][3],*p=&m[0][0];
printf("Dati elementele matricei: \n");
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
scanf("%d",(p+i*3+j));
printf("Matricea sortata este:\n");
sortare_matrice(p);
matrice(p);
}
void matrice(int *a)
{
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
printf("%d ",*(a+i*3+j));
21
printf("\n");
}
}
void sortare_matrice(int *a)
{
int s;
do{ s=0;
for(int i=0; i<2;i++)
if(suma(a,i)>suma(a,i+1)) //sortarea coloanelor dupa suma elementelor.
{
rearanjare_matrice(a,i);
s=1;
}
}while(s==1);
}
printf("Introduceti sirul:");
scanf("%s",p);
printf("%s\n",p);
for (i=0;i<=7;i+=2)
printf("%c ",*(p+i));
}
Cititi de la tastatura elemetele a 2 matrici de valori intregi. Scrieti o functie care
primeste ca parametri pointerii la cele 2 matrici si returneaza un pointer la matricea suma. Rezultatul insumãrii matricelor va fi afisat
in 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* suma_matrici(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; //declararea
matricelor patratice,matricea suma (m12) si pointerii aferenti matricelor m1 si m2;
cout<<"Introduceti dimensiunile matricilor patratice: "; //Dimensiunea matricelor patratice;
cin>>n;
cout<<"Introduceti elementele matricii unu: \n"; //Introducem de la tastatura element cu element componentele matricei m1;
citeste(p1,n);
cout<<"Introduceti elementele matricii doi: \n"; //Introducem de la tastatura element cu element componentele matricei m2;
citeste(p2,n);
p12 = suma_matrici(p1,p2,p12,n); //apelul functiei ce realizeaza suma matricelor;
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)<<" "; //se identifica elementele de pe diagonala secundara;
}
cout<<"\n\n Elementele de pe diagonala secundara: \n\t"<<endl;
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<<"\t Elementul "<<i+1<<" "<<j+1<<": ";
cin>>*(p+i*MAX+j);
}
}
int* suma_matrici(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;
}
Definiti un sir de pointeri de tip caracter. Fiecare locatie a sirului contine unul din
urmatoarele siruri de caractere:
- "valoare prea mica"
23
#include <iostream>
using namespace std;
#include <math.h>
#include <string.h>
void main(void)
{
char mic[]="Valoarea este prea mica!";
char mare[]="Valoarea este prea mare!";
char egal[]="Valoarea este 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];
}
Scrieti un program in 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[] = {"Buna ziua!","Acesta este un mesaj!","Ne apropiem de Sfintele Sarbatori!","Vine vacanta!!","Sarbatori fericite si
odihna placuta!"};
cout<<"Mesajele definite sunt urmatoarele: "<<endl;
for(int i=0;i<5;i++)
cout<<"\n\t"<<p[i];
cout<<endl;
}
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';
24
for(int i=1;i<argc;i++)
{
strcat(sir,*(argv+i));
}
cout<<"Sirurile concantenate sunt: "<<sir<<endl;
}
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;
}
Scrieti un 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 in 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];
cout<<"\n Introduceti numarul de studenti: ";
cin>>n;
if(n>DIM)
cout<<"\n Valoare incorecta!";
else
{
citire(a,n);
cout<<endl;
cout<<endl;
}
#include<iostream>
using namespace std;
#define DIM 255
void citire(float *,int n);
void afisare(float *,int n);
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;
}
26
#include <stdio.h>
void citeste(int *,int);
int negativ(int *,int);
void main()
{
int n,a[100][100],*p=&a[0][0];
printf("Dati dimensiunea matricei: ");
scanf("%d",&n);
printf("Dati elementele matricei: ");
read(p,n);
printf("Numarul de elemente negative de deasupra diagonalei secundare este %d\n",negativ(p,n));
}
Scrieti un program in care se citesc de la tastatura elementele de tip intreg ale unei
matrici patratice, utilizand o functie. Scrieti o functie care interschimba doua linii ale
matricii. Afisati cu o functie matricea initialt si cea obtinuta. Dimensiunea matricii si
numerele ce identifica liniile care vor fi interschimbate se citesc de la tastatura, in
functia main. (fara variabile globale).
#include <stdio.h>
void main()
{
int n,a[100][100],*p=&a[0][0],x,y;
printf("Dati dimensiunea matricei: ");
scanf("%d",&n);
printf("Dati numarul de linii ce trebuie interschimbate: ");
scanf("%d%d",&x,&y);
if(x>n||y>n||x<1||y<1)
printf("Verifica valorile introduse!");
else
{
printf("Dati elementele: ");
citeste(p,n);
printf("Matricea initiala este: \n");
matrice(p,n);
printf("Matricea finala este: \n");
interschimb(p,x,y,n);
matrice(p,n);
}
}
*(a+j*d+k)=*(a+i*d+k)-*(a+j*d+k);
*(a+i*d+k)=*(a+i*d+k)-*(a+j*d+k);
}
}
Sa se scrie un program C/C++, care folosind o structura de tip student sa determine
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.
//Aplicatie care determina 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" //definim valoarea ce termina ciclul din structura;
struct student {
char nume[100];
char prenume[100];
char tara[100];
int grupa;
int an;
}; //declaratia campurilor;
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[100],tara[100];
int grupa;
start = aloc_list();
p = start;
cout<<"Introduceti datele studentilor:\n";
cout<<"\t Numele: ";
cin>>nume;
while(strcmp(nume,end)!=0) //compara varibila nume cu 0, intr-un ciclu repetitiv while(); cat timp nume este diferit de 0 se executa
urmatoarele instructiuni;
{
p->p = aloc_student();
strcpy(p->p->nume,nume); //copiaza elememtele;
cout<<"\t Prenumele: ";
cin>>p->p->prenume;
cout<<"\t Tara de provenienta: ";
cin>>p->p->tara;
cout<<"\t Grupa: ";
cin>>p->p->grupa;
cout<<"\t Anul nasterii: ";
cin>>p->p->an;
p->next = aloc_list();
29
p = p->next;
cout<<"\n\t Numele: ";
cin>>nume;
}
cout<<"\n Sfarsit lista studenti!\n"; //s-a introdus "AAA";
p->next = NULL;
cout<<"Introduceti numarul grupei: "; //imi selecteaza studentii staini in functie de datele de mai jos;
cin>>grupa;
cout<<"Introduceti tara de referinta: ";
cin>>tara;
p = start;
cout<<"\n\n Studentii 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\n Eroare la alocare!\n";
exit(1);
}
return p;
}
student* aloc_student(void)
{
struct student *p;
if(!(p = new struct student))
{
cout<<"\n\n Eroare la alocare!\n";
exit(1);
}
return p;
}
void dealocare(struct list *p) //eliberam memoria alocata;
{
if(p->next)
dealocare(p->next);
delete p->p;
delete p->next;
}
Sa se scrie un program C/C++, 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 citite de la
tastatura. In ambele functii afisati datele din structura folosind un mesaj adecvat.
#include <iostream>
using namespace std;
struct student {
char nume[100];
char prenume[100];
30
};
void afisFaraPointer(struct student p); //functia ce afiseaza cu parametru o variabila de tip structura;
void afisPointer(struct student *p); //functie ce afiseaza cu pointer o variabila de tip structura;
void main(void)
{
struct student p,*pp;
pp = &p;
cout<<"Introduceti date pentru structura student completand campurile nume si prenume: \n";
cout<<"\t Nume: ";
cin>>p.nume;
cout<<"\t Prenume: ";
cin>>p.prenume;
cout<<"\n Afisare prin functie cu parametru o variabila de tip structura: ";
afisFaraPointer(p);
cout<<"\n Afisare prin functie cu parametru pointer la o variabila de tip structura: ";
afisPointer(pp);
}
void afisFaraPointer(struct student p)
{
cout<<"\n Nume: "<<p.nume<<"\t\tPrenume: "<<p.prenume; //afisare cu parametru;
}
void afisPointer(struct student *p)
{
cout<<"\n Nume: "<<p->nume<<"\t\tPrenume: "<<p->prenume; //afisare cu pointer;
}
Sa se scrie un program C/C++, in care o functie returneaza o structura de date
adecvata. In acest fel vor fi returnate mai multe valori. Afisati rezultatul, valorile
initiale transferate functiei (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 separate prin spatii: ";
cin>>p.sir1>>p.sir2;
p = operatie(p);
if(p.xerox)
cout<<"\n Sirurile sunt identice!";
else
cout<<"\n Cele doua siruri sunt diferite!";
cout<<"\n Sirul rezultat prin concantenarea celor doua siruri este: "<<p.sir3<<endl;
}
siruri operatie(struct siruri p)
{
if(strcmp(p.sir1,p.sir2)==0) //compararea celor doua siruri;
p.xerox = 1;
else
p.xerox = 0;
31
#include <iostream>
#include <stdlib.h>
using namespace std;
struct data{
int zi;
int luna;
int an;
}; //declaratia campurilor;
struct angajat {
char nume[100];
char prenume[100];
char ocupatie[100];
struct data *d;
char sectie[100];
};
data* citesteDate(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<<"\n Eroare la alocare!\n";
return;
}
for(int i=0;i<n;i++)
{
cout<<"\n\n\t Nume: ";
cin>>(p+i)->nume;
cout<<"\t Prenume: ";
cin>>(p+i)->prenume;
cout<<"\t Ocupatie: ";
cin>>(p+i)->ocupatie;
cout<<"\t Data nastere: ";
(p+i)->d = citesteDate((p+i)->d);
cout<<"\t Sectia: ";
cin>>(p+i)->sectie;
}
cout<<"\n Urmatorii angajati sunt de proferie ingineri: \n";
for(int i=0;i<n;i++)
{
if(strcmp((p+i)->ocupatie,"inginer")==0) //compara datele introduse si ii selecteaza pe aceia ce au la campul "ocupatie" cuvantul
"inginer";
{
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; //afiseaza din nou datele complete, pentru cei cu ocupatia de inginer;
}
32
}
for(int i=0;i<n;i++)
delete (p+i)->d;
delete []p;
}
data* citesteDate(struct data *d)
{
if(!(d = new struct data))
{
cout<<"\n Eroare la alocare!\n";
exit(1);
}
cout<<"\n\t\t Zi: ";
cin>>d->zi;
cout<<"\t\t Luna: ";
cin>>d->luna;
cout<<"\t\t An: ";
cin>>d->an;
return d;
}
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 angajarii.
#include <iostream>
#include <stdlib.h>
using namespace std;
struct data {
int zi;
int luna;
int an;
};
struct persoana{
char nume[100];
char prenume[100];
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* citesteDate(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])) //alocarea tablourilor de pointeri;
{
cout<<"\n\n Eroare la alocare!\n";
exit(1);
}
if(!(v = new int[n])) //alocarea tablourilor de pointeri;
{
cout<<"\n\n Eroare la alocare!\n";
33
exit(1);
}
cout<<"Introduceti datele celor "<<n<<" persoane: \n";
for(int i=0;i<n;i++)
{
cout<<"\n\t Nume: ";
cin>>(p+i)->nume;
cout<<"\t Prenume: ";
cin>>(p+i)->prenume;
cout<<"\t Data nasterii: ";
(p+i)->dn = citesteDate();
cout<<"\t Codul Numeric Personal: ";
cin>>(p+i)->codnumeric;
cout<<"\t Data angajarii: ";
(p+i)->da = citesteDate();
}
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); //determina sortarea angajatilor dupa data angajarii;
if(res>0)
{
aux = *(v+i);
*(v+i) = *(v+j);
*(v+j) = aux;
}
}
}
}
void afis(struct persoana *p,int *v,int n) //afisarea angajatilor in urma sortarii;
{
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\t CNP: "<<(p+*(v+i))->codnumeric
<<"\n\t\t Data nasterii: "<<(p+*(v+i))->dn->zi<<"."<<(p+*(v+i))->dn->luna<<"."<<(p+*(v+i))->dn->an
<<"\n\t\t Data angajarii : "<<(p+*(v+i))->da->zi<<"."<<(p+*(v+i))->da->luna<<"."<<(p+*(v+i))->da->an;
}
}
data* citesteDate(void)
{
struct data *p;
if(!(p = new struct data))
{
cout<<"\n\n Eroare la alocare!\n";
exit(1);
34
}
cout<<"\n\t\t Zi: ";
cin>>p->zi;
cout<<"\t\t Luna: ";
cin>>p->luna;
cout<<"\t\t An: ";
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; //se elibereaza memoria intregului tablou p;
delete []v; //se elibereaza memoria intregului tablou v;
}
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 inregistrareastudent care are media cea mai mare.
//Aplicatie care afiseaza numele, prenumele si media studentului cu cele mai bune rezultate din grupa in urma sesiunii de iarna.
#include <iostream>
using namespace std;
struct student { //declararea campurilor;
char nume[100];
char prenume[100];
float medie;
};
void afis(struct student *p,int n); //functia pentru afisare;
void main(void)
{
int n;
struct student *p;
cout<<"Introduceti numarul de studenti din grupa: ";
cin>>n;
35
//Aplicatie care aloca dinamic memorie pentru memorarea datelor a n studenti, si dupa ce citeste datele pentru fiecare din acestia,
afiseazã numarul studentelor. In final se elibereaza memoria alocata.
#include <iostream>
using namespace std;
struct student { //declararea campurilor;
char nume[100];
char prenume[100];
char sex;
};
void main(void)
{
int n,nr_fete=0;
struct student *p;
cout<<"Introduceti numarul de studenti din grupa 9: ";
cin>>n;
if(!(p = new struct student[n])) //alocarea tablourilor de pointeri;
{
cout<<"\n\n Eroare la alocare!\n";
exit(1);
36
}
cout<<"Introduceti datele studentilor: ";
for(int i=0;i<n;i++)
{
cout<<"\n\t Nume: ";
cin>>(p+i)->nume;
cout<<"\t Prenume: ";
cin>>(p+i)->prenume;
cout<<"\t Sex(m/f): ";
cin>>(p+i)->sex;
}
for(int i=0;i<n;i++)
{
if((p+i)->sex == 'f') //daca este indeplinita conditia variabila nr_fete retine cate fete sunt in grupa;
nr_fete++;
}
if(nr_fete>0)
cout<<"\n In grupa 9 exista "<<nr_fete<<" studenta(e)!\n"; //daca si a doua conditie este verificata rezulta ca exista nr_fete in grupa;
else //altfel se afiseaza urmatorul mesaj;
cout<<"Nu exista nicio studenta in grupa 9!\n\n";
delete []p; //se elibereaza memoria intregului tablou p;
}
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 de
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 pointerul, 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)) //alocarea tablourilor de pointeri;
{
cout<<"\n\n Eroare la alocare!\n";
exit(1);
}
po_struct->nr = str.nr;
po_struct->caracter = str.caracter;
strcpy(po_struct->sir,str.sir);
delete po_struct; //eliberarea memoriei alocate;
}
/* 1. Sa se scrie un program care citeste n numere reale, pe care le stocheaza intr-un tablou alocat dinamic, afiseaza suma elementelor
negative citite, iar la sfarsit elibereaza zona de memorie alocata.*/
37
#include <malloc.h>
#include <stdio.h>
#include <iostream>
using namespace std;
void main()
{
int n,suma=0;
float *p;
printf("\nNumarul n este: ");
scanf("%d",&n);
p=(float*)malloc(n*sizeof(float));
if (p==NULL)
{
printf("\n error!");
return;
}
printf("\n Dati Elementele: ");
for(int i=0;i<n;i++)
scanf("%f",p+i);
for (int i=0;i<n;i++)
if (p[i]<0)
suma=suma+p[i];
printf("\n Suma este %f",suma);
if (p!=NULL)
free (p);
}
/* 2. Program de gestiune chiosc */
#include <stdio.h>
#include <malloc.h>
float **citire();
void calcul(float **a);
void eliberare(float **a);
void main() {
int i,j;
float **a;
a=citire();
calcul(a);
eliberare(a);
}
float** citire()
{
int i,j;
float **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]);
}
}
return a;
}
38
#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));
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*/
39
#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;
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;
40
}
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);
}
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;
41
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;
}
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
42
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++)
{
cout<<"\n y["<<k<<"]= "<<y[k]<<endl;
}
}
else
{
cout<<"\n alocare nereusita!";
delete[]p;
}
43
}
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();
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: ";
44
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;
}
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];
};
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";
45
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;
}
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;
strcpy(p.sir3,p.sir1);
strcat(p.sir3,p.sir2);
return p;
}
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)*/
46
#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++)
delete (p+i)->d;
delete []p;
}
data* readDate(struct data *d)
{
if(!(d = new struct data))
47
{
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;
}
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);
}
cout<<"Introduceti datele celor "<<n<<" persoane:\n";
for(int i=0;i<n;i++)
{
cout<<"\n\tNume: ";
cin>>(p+i)->nume;
48
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: ";
cin>>p->luna;
cout<<"\t\tAn: ";
cin>>p->an;
49
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;
}
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:";
for(int i=0;i<n;i++)
{
50
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;
}
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;
}
51
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;
}
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;
}
Folosind structura de date union denumita grup compusa din diferite campuri cum ar fi: int, long, double, char etc., scrieti o aplicatie
C/C++ care va initializa un element de tipul grup 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)
{
union grup { //declaram campurile structurii de date union;
int nr_int;
52
float nr_float;
}g;
cout<<"Operatia aplicata unei uniuni este urmatoarea: \n";
cout<<"Introduceti un numar real: ";
cin>>g.nr_float;
cout<<"Introduceti un numar intreg: ";
cin>>g.nr_int;
cout<<"\n Valoare numarul real a fost pierduta. Se va afisa valoarea numarul intreg este: "<<g.nr_int<<"\n Dimensiunea uniunii
este: "<<sizeof(g);
#include <stdio.h>
enum Lumina_Alba{Rosu=1,Portocaliu=2,Galben=3,Verde=4,Albastru=5,Indigo=6,Violet=7};
char *tradu (Lumina_Alba culori) //functia ce imi traduce numele culorilor in engleza;
{
switch (culori)
{
case Rosu:
return "Red";
break;
case Portocaliu:
return "Orange";
break;
case Galben:
return "Yellow";
break;
case Verde:
return "Green";
break;
case Albastru:
return "Blue";
break;
case Indigo:
return "Indigo";
break;
case Violet:
return "Violet";
break;
}
}
Sa se scrie un program care citeste si apoi afiseaza date intregi preluate dintr-un fisier text al carui nume este citit de la consola. Creati
in prealabil fisierul prin program.
#include <iostream>
#include <stdio.h>
using namespace std;
void main(void)
{
int optiuni,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>>optiuni;
if(optiuni>2 || optiuni<1)
cout<<"Optiune invalida, reincercati: ";
else break;
} while(true);
54
if(optiuni == 1)
{
cout<<"\nIntroduceti numele fisierului pe care doriti sa il creati: ";
cin>>fileName;
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
void bubble(int *); //functie ce aranjeaza crescator/descrescator sirul;
int count(int *); //functie ce numara cate elemente sunt pare;
void main()
{char *fn;
55
int *ar;
if(!(fn=(char *)calloc(25, sizeof(char)))) //calloc() returneaza un pointer gereric in caz de succes sau mesajul urmator in caz de esec;
{printf("Eroare in alocarea memoriei!\n"); exit(0);}
FILE *f;
printf("Introduceti numele fisierului:");
scanf("%s",fn);
if(!(f=fopen(fn,"r"))) //daca nu se poate deschide fisierul pentru citire se va afisa mesajul:
{printf("Eroare in deschiderea fisierului,pentru citire!\n"); exit(0);}
if(!(ar=(int *)calloc(10,sizeof(int)))) //returneaza un pointer gereric in caz de succes sau mesajul urmator in caz de esec;
{printf("Eroare in alocarea memoriei!\n"); exit(0);}
for(int i=0;i<10;i++)
fscanf(f,"%d",(ar+i)); //functia pentru citirea din fisier;
int even=count(ar);
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
void main()
{char *fn;
int *ar,n,aux;
float ma=0;
if(!(ar=(int *)calloc(n,sizeof(int)))) //calloc() returneaza un pointer gereric in caz de succes sau mesajul urmator in caz de esec;
{printf("Eroare in alocarea memoriei!\n"); exit(0);}
FILE *f;
printf("Introduceti numele fisirului: ");
scanf("%s",fn);
for(int i=0;i<n;i++)
{
fprintf(f,"%d",*(ar+i));
if(i<n-1)
fprintf(f," ");
}
fclose(f);
int count=1;
while(!feof(f)) //cat timp functia feof(f) nu a gasit sfarsitul fisierului se executa urmatoarele operatii:
{
fscanf(f,"%d",&aux);
ma+=aux; //se realizeaza suma elementelor din fisier;
count++; //incrementeaza,tine evidenta cate numere se aduna;
}
fclose(f); //inchiderea fisierului;
if(!(f=fopen(fn,"a")))
{printf("Eroare in deschiderea fisierului!\n"); exit(0);}
ma=ma/count; //se realizeaza media aritmetica a numerelor adunate anterior;
printf("Media aritmetica este %f.\n",ma);
fprintf(f,"\n%f",ma);
57
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
void main()
{
char *fn,c;
int n;
if(!(fn=(char *)calloc(25, sizeof(char)))) //calloc() returneaza un pointer gereric in caz de succes sau mesajul urmator in caz de esec;
{printf("Eroare in alocarea memoriei!\n"); exit(0);}
FILE *f;
printf("Introduceti numele fiserului: ");
scanf("%s",fn);
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
void main()
{char *fn;
if(!(fn=(char *)calloc(25, sizeof(char)))) //calloc() returneaza un pointer gereric in caz de succes sau mesajul urmator in caz de esec;
{printf("Eroare in alocarea memoriei!\n"); exit(0);}
58
FILE *f;
printf("Introduceti numele fisierului:");
scanf("%s",fn);
while(!feof(f)) //cat timp functia feof(f) nu a gasit sfarsitul fisierului se executa urmatoarele operatii:
{
char c;
fscanf(f,"%c",&c); //citeste sirul de caractere;
printf("%c",c); //afiseaza sirul de caractere citit;
}
fclose(f); //inchiderea fiserului;
#include <stdio.h>
#include <malloc.h> //fisier antet din biblioteca standard,pentru alocari dinamice;
if(!(v= (int *) malloc(n*sizeof(int)))) //alocarea dinamica, verificam daca alocarea a fost realizata,in caz afirmativ functia
returneaza un pointer generic,altfel afiseaza mesajul urmator:
{
printf("Alocare nereusita!");
return;
}
if((f=fopen(t, "wb"))==NULL) //fisierul returneaza un pointer la structura FILE daca deschidera fisierului pt scriere este
posibila,altfel returneaza mesajul urmator:
{ //"wb" deschiderea fisierului binar pentru scriere;
printf("Deschiderea fisierul nereusita!");
59
return;
}
void elemente (int *p, int n) //definirea functiei pentru a introduce elementele;
{
int i;
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
void date (struct student *p); //functia ce-mi permite introducerea datelor studentilor;
void afisare (struct student *p); //functia ce afiseaza studentii cu media mai mare decat un numar introdus de la tastatura;
void main(void)
60
{
int n, i;
struct student *ps, *np; //declararea pointerilor ps si np catre stuctura student;
FILE *f; //declararea pointerului fisierului;
char t[27];
float nr;
if (!(ps = (struct student*) malloc(n* sizeof(struct student)))) //alocarea dinamica,verificam daca alocarea a fost realizata,in caz
afirmativ functia returneaza un pointer generic,altfel afiseaza mesajul urmator:
{
printf("Alocare nereusita!");
return;
}
if((f=fopen(t, "wb"))==NULL) //fisierul returneaza un pointer la structura FILE daca deschidera fisierului pt scriere este
posibila,altfel returneaza mesajul urmator:
{ //"wb" deschiderea fisierului binar pentru scriere;
printf("Fisierul nu poate fi deschis pt scriere!");
exit(1);
}
if((f=fopen(t, "rb"))==NULL) //fisierul returneaza un pointer la structura FILE daca deschidera fisierului pt citire este
posibila,altfel returneaza mesajul urmator:
{ //"rb" deschiderea fisierului binar pentru citire;
printf("Fisierul nu poate fi deschis pt citire!");
exit(1);
}
//vom citi din fisier cate o structura si o vom salva in pointerul np;
if (!(np = (struct student*) malloc(n* sizeof(struct student)))) //alocarea dinamica,verificam daca alocarea a fost realizata,in caz
afirmativ functia returneaza un pointer generic,altfel afiseaza mesajul urmator:
{
printf("Alocare nereusita!");
return;
}
61
void date (struct student *p) //definirea functiei date(),ce ne permite introducerea datelor studentilor;
{
printf("Nume: ");
scanf("%s", p->nume);
printf("Prenume: ");
scanf("%s", p->prenume);
printf("Grupa: ");
scanf("%d", &p->grupa);
printf("Media: ");
scanf("%f", &p->media);
}
void afisare (struct student *p) //definirea functiei afisare(),ce ne permite afisarea studentilor cu media mai mare decat nr,numarul
introdus de la tastatura;
{
printf("Nume si Prenume: %s %s\n", p->nume, p->prenume);
printf("Grupa: %d\n", p->grupa);
printf("Media: %.2f\n", p->media);
}
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 <stdio.h>
#include <malloc.h>
if(!(v= (int *) malloc(n*sizeof(int)))) //alocarea dinamica, verificam daca alocarea a fost realizata,in caz afirmativ functia
returneaza un pointer generic,altfel afiseaza mesajul urmator:
{
printf("Alocare nereusita!");
return;
}
if ((f=fopen(t, "wb"))==NULL) //fisierul returneaza un pointer la structura FILE daca deschidera fisierului pt scriere este
posibila,altfel returneaza mesajul urmator:
{
printf("Deschiderea fisierului pt scriere nereusita!");
return;
}
void vector (int *p, int n) //definirea functiei vector(),unde sunt introduse elementele vectorului;
{
int i;
for (i=0; i<n; i++)
{
printf("Numarul %d: ", i+1);
scanf("%d", (p+i));
}
}
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 medie a fost calculata si respectiv valoarea mediei cu o precizie de 2 digiti.
#include <stdio.h>
#include <malloc.h>
void main (int argc, char *argv[]) //argc=numarul de argumente; argv=tablou de pointeri catre siruri de caractere;
{
int *p, i, *af, k=0;
63
float S=0;
FILE *f1, *f2; //declararea pointerilor f1 si f2 fisierelor;
if (argc!=3)
{
printf("Introduceti de la linia de comanda doua nume de fisiere!\n");
return;
}
if(!(p=(int*) malloc(8*sizeof(int)))) //alocarea dinamica, verificam daca alocarea a fost realizata,in caz afirmativ functia
returneaza un pointer generic,altfel afiseaza mesajul urmator:
{
printf("Alocare nereusita!");
return;
}
if( (f1=fopen(*(argv+1), "wb"))==NULL) //fisierul returneaza un pointer la structura FILE daca scrierea in fisier este posibila,altfel
returneaza mesajul urmator:
{
printf("Fisierul %s nu poate fi deschis pt scrire!", *(argv+1));
return;
}
if( (f1=fopen(*(argv+1), "rb"))==NULL) //fisierul returneaza un pointer la structura FILE daca deschidera fisierului este
posibila,altfel returneaza mesajul urmator:
{
printf("Fisierul %s nu poate fi citit!", *(argv+1));
return;
}
//in af o sa fie cele 8 numere citite din f1;
if(!(af=(int*) malloc(8*sizeof(int))))
{
printf("Alocare nereusita!");
return;
}
for (i=0; i<8; i++)
{
fread((af+i), sizeof(int), 1, f1); //returneaza numarul de articole citite,adica 1;
if (*(af+i)>4) //se verifica cate numere din vector sunt mai mari decat 4;
{
S+=(float)*(af+i); //se face media aritmetica a acestor numere;
k++;
}
}
fclose(f1); //inchiderea primului fisier;
if( (f2=fopen(*(argv+2), "w"))==NULL) //fisierul returneaza un pointer la structura FILE deschide fisierul pt scriere,altfel
64