Sunteți pe pagina 1din 40

Atestat 2010.

Subiecte programare

Atestat 2010. Subiecte programare

1. Se citesc de la tastatura n numere naturale, cu cel mult 9 cifre fiecare. Scrieti un program care pentru
o cifră k citită de la tastatura, afișează pe ecran câte numere prime în scrierea cărora apare cifra k, se
găsesc în șirul dat.
Exemplu: pentru n=4 , cifra k=2 si valorile citite 23, 603, 122, 27 se obtine numarul nr = 1, care
corespunde valorii 23 .
#include<fstream.h>
#include<conio.h>
int n,v[20],i,k;
ifstream f("atestat.in");
ofstream g("atestat.out");
void citire()
{f>>n;
for(i=1;i<=n;i++) f>>v[i];
do{cout<<"k="; cin>>k;}while(k<0||k>9);
}
int prim(int a)
{for(int d=2;d<=a/2;d++) if(a%d==0) return 0;
return 1;
}
int cifra(int k,int a)
{while(a!=0){if(a%10==k) return 1;
a=a/10;
}
return 0;
}
void main()
{int nr=0;
citire();
for(i=1;i<=n;i++) if(prim(v[i]))if(cifra(k,v[i])){g<<v[i]<<" ";
nr++;
}
g<<nr;
1
Atestat 2010. Subiecte programare
}

2. Se citește de la tastatură un număr natural n cu cel mult nouă cifre. Scrieți un program care verifică
dacă există un număr natural k cu proprietatea că n=1*2*3*…*k. Daca exista un astfel de numar,
programul va afisa mesajul “Da” și valoarea k , altfel va afisa mesajul “Nu”.(intensiv: valoarea se
determină utilizând o metodă eficientă din punct de vedere al timpului de execuție)
#include<fstream.h>
#include<conio.h>
int n,i,k;
void citire()
{cout<<"n="; cin>>n;
}
int factorial(int n)
{int sw=1,i=1,p=1;
while(sw!=0){p=p*i;
i++;
if(p==n) return i-1;
else if(p>n) return 0;
}
}
void main()
{clrscr();
citire();
if(factorial(n)!=0) cout<<"DA "<<factorial(n);
else cout<<"NU";
getch();
}

3. În fişierul valori.txt se găsesc pe prima linie maximum 1000 de numere întregi despărţite printr-un
spaţiu. Scrieţi un program care să determine valoarea maximă şi valoarea minimă, împreună cu numărul
de apariţii al maximului, respectiv al minimului.(intensiv: folosiţi o metodă eficientă din punct de
vedere al memoriei şi al numărului de operaţii efectuate şi afişaţi pe ecran valorile obţinute).
Exemplu:conţinutul fişierului valori.txt este : 24 3 89 24 1 3 1 1 89, atunci se vor afişa rezultatele:
min = 1 nr_aparitii = 3
max = 89 nr_aparitii = 2
#include<iostream.h>
2
Atestat 2010. Subiecte programare
#include<conio.h>
int n,x[29],i,min,max;
void citire()
{cout<<"n="; cin>>n;
for(i=1;i<=n;i++) cin>>x[i];
}
void minimax(int &min,int &max)
{ min=x[1];
max=x[1];
for(i=2;i<=n;i++)if(x[i]<min)min=x[i];
else if(x[i]>max) max=x[i];
}
void frecventa(int max,int min,int &t,int &k)
{t=0;
k=0;
for(i=1;i<=n;i++) if(x[i]==max)k++;
else if(x[i]==min)t++;
}
void main()
{clrscr();
int min,max,t,k;
citire();
minimax(min,max);
frecventa(max,min,t,k);
cout<<"Maximul din vector este "<<max<<" si apare de "<<k<<" ori";
cout<<"Minimul din vector este "<<min<<" si apare de "<<t<<" ori";
getch();
}

4.Fişierul unu.in conţine pe primul rând valoarea n ( 2≤n≤1.000.000 ), iar pe a doua linie se găsesc n
numere întregi formate din cel mult 9 cifre şi despărţite prin spaţiu. Ştiind că fişierul conţine cel puţin
două numere distincte printre cele n de pe a doua linie, scrieţi un program care să scrie în fişierul
unu.out pe o singură linie şi separate printr-un spaţiu, în ordine descrescătoate, cele mai mari două
valori distincte din fişierul de intrare. (intensiv :alegeţi o metodă eficientă de rezolvare atât ca timp
de executare, cât şi ca gestionare a memoriei)
3
Atestat 2010. Subiecte programare
Exemplu :
unu.in unu.out
10
-8 14 8 14 15 9 -7 1 4 10 15 14
#include<iostream.h>
#include<conio.h>
int n,x[29],i,min,max;
void citire()
{cout<<"n="; cin>>n;
for(i=1;i<=n;i++) cin>>x[i];
}
void minimax(int n,int &max,int &t)
{
max=x[1];
for(i=2;i<=n;i++) if(x[i]>max) {max=x[i];
t=i;
}
}
void main()
{clrscr();
int max,t,m,aux;
citire();
minimax(n,max,t);
for(i=1;i<=n;i++)if(i==t){aux=x[n];
x[n]=x[i];
x[i]=aux;
}
minimax(n-1,m,t);
cout<<max<<" "<<m<<endl;
getch();
}

5. Fişierul text numere.in conţine pe prima linie un număr natural n (0≤n≤5000), iar pe a doua linie n
numere naturale de cel mult 9 cifre fiecare, separate prin câte un spaţiu. Să se scrie un program care
citeşte n, apoi cele n numere naturale din fişierul numere.in şi scrie în fişierul numere.out, pe câte o

4
Atestat 2010. Subiecte programare
linie fiecare, numerele de pe a doua linie a fişierului numere.out care sunt palindroame cu exact patru
cifre (un număr este palindrom dacă este egal cu oglinditul său).
De exemplu dacă fişierul numere.in are următorul conţinut :
5
1441 5 14 2552 78
atunci fişierul numere.out va conţine :
1441
2552
#include<iostream.h>
#include<conio.h>
int n,x[29],i,min,max;
void citire()
{cout<<"n="; cin>>n;
for(i=1;i<=n;i++) cin>>x[i];
}
int palindrom(int a)
{int p=0,b;b=a;
while(a!=0){p=p*10+a%10;
a=a/10;
}
if(p==b) return 1;
return 0;
}
void main()
{int nr=0;
clrscr();
citire();
for(i=1;i<=n;i++) if(palindrom(x[i])){cout<<x[i]<<" ";
nr++;
}
cout<<"Nr de numere palindrom="<<nr;
getch();
}
6.Se citește de la tastaturp n, și apoi n perechi de câte două numere întregi a și b cu ( a < 0 < b)
reprezentând capetele intervalului[a, b]. Afisati pe ecran , dacă există, capetele intervalului de intersecție
al celor n intervale citite. În cazul în care nu există intervalul de intersecție se afișează 0.
5
Atestat 2010. Subiecte programare
De exemplu, pentru n=3 si perechile [-1,20], [-4,9], [-7, 12] , obtinem solutia x= -1 si y= 9.
#include<iostream.h>
#include<conio.h>
struct interval{int x;
int y;
};
interval a[20];
int n,i;
void citire()
{cout<<"n="; cin>>n;
for(i=1;i<=n;i++){cin>>a[i].x;
cin>>a[i].y;
}
}
int maxim(interval a[20],int n)
{int max; max=a[1].x;
for(i=2;i<=n;i++) if(a[i].x>max) max=a[i].x;
return max;
}
int minim(interval a[20],int n)
{int min;
min=a[1].y;
for(i=2;i<=n;i++) if(min>a[i].x) min=a[i].x;
return min;
}
int verificare()
{int max;
max=maxim(a,n);
for(i=1;i<=n;i++) if(a[i].y<max) return 0;
return 1;
}
void main()
{clrscr();
citire();
int m,t;
for(i=1;i<=n;i++) cout<<"["<<a[i].x<<","<<a[i].y<<"]"<<endl;
6
Atestat 2010. Subiecte programare
m=maxim(a,n);
if(verificare()) t=minim(a,n);
else cout<<"intersectia acestor intervale este multimea vida";
if(m==t) cout<<"intersectia intervalelor este elementul "<<m;
else cout<<"intersectia intervalelor este intervalul ["<<m<<","<<t<<"]"<<endl;
getch();
}

7. Se citesc de la tastatură n numere naturale, cu cel mult 9 cifre fiecare. Scrieţi un program care afişează
cifra care apare de cele mai multe ori în numerele citite. Dacă există mai multe astfel de cifre se vor
afişa toate.
#include<iostream.h>
#include<conio.h>
int n,x[40],i,j,v[10];
void citire()
{cout<<"n="; cin>>n;
for(i=1;i<=n;i++) cin>>x[i];
}
void formare(int n,int x[40],int v[10])
{int a;
for(i=1;i<=n;i++){a=x[i];
while(a!=0){v[a%10]=v[a%10]+1;
a=a/10;
}
}
}
int maxim(int v[10])
{int max=0;
for(i=0;i<=9;i++)if(v[i]>max) max=v[i];
return max;
}
void main()
{clrscr();
int max;
citire();
formare(n,x,v);
for(i=0;i<=9;i++) if(v[i]==max) cout<<i<<endl;
getch();
}
Exemplu:Pentru n=4 şi valorile 23, 431, 154, 452 se afişează 3 pentru că cifra 4 apare de 3 ori în
numerele citite.

8. Se citeşte de la tastatură un număr natural n cu maxim cinci cifre. Afişaţi cel mai apropiat număr faţă
de n care are aceeaşi sumă a cifrelor.

#include<iostream.h>

#include<conio.h>

int n;
7
Atestat 2010. Subiecte programare
void citire()

{cout<<"n="; cin>>n;

int suma(int a)

{int s=0;

while(a!=0){s=s+a%10;

a=a/10;

return s;

int maimare()

{int t,sw=1,i;

t=suma(n);

i=n+1;

while(sw!=0)if(suma(i)==t){sw=0;

return i;

else i++;

int maimic()

{int t,i;

t=suma(n);

for(i=n-1;i>=1;i--)if(suma(i)==t)return i;

return 0;

void main()

{int m,p;

clrscr();

citire();
8
Atestat 2010. Subiecte programare
m=maimic();

p=maimare();

if((n-m)>(p-n)) cout<<p;

else if((n-m)<(p-n)) cout<<m;

else cout<<p<<","<<m;

getch();

9.Se citesc n numere naturale. Să se ordoneze numerele crescător după numarul de divizori. (intensiv:
numărul de divizori se va determina utilizând o metodă eficientă din punct de vedere al timpului
de execuție)
Exemplu: n=4, numerele 12,4,6,13 13,4,6,12 .
#include<iostream.h>
#include<conio.h>
int n,i,x[30],d[30];
void citire()
{cout<<"n=";
cin>>n;
for(i=1;i<=n;i++) cin>>x[i];
}
void vector(int n,int x[30],int d[30])
{int p=0;
for(i=1;i<=n;i++)if(x[i]==1) d[i]=1;
else if(x[i]==0) d[i]=0;
else {for(p=2;p<=x[i]/2;p++) if(x[i]%p==0)d[i]++;
d[i]=d[i]+2;
}
}
void sortare(int n,int d[30])
{int sw,aux1,aux2;
do{sw=1;
for(i=1;i<=n-1;i++) if(d[i]>d[i+1]){aux1=x[i];
x[i]=x[i+1];
x[i+1]=aux1;
aux2=d[i];
d[i]=d[i+1];
d[i+1]=aux2;
sw=0;
}
}while(sw==0);
}
void main()
{clrscr();
citire();
vector(n,x,d);
sortare(n,d);
for(i=1;i<=n;i++) cout<<x[i]<<" ";
9
Atestat 2010. Subiecte programare
getch();
}

10. Se citeşte n număr natural (n<32000) şi apoi se introduc pe rând n numere întregi. Să se afișeze
numerele prime şi să se calculeze media lor aritmetică.
#include<iostream.h>
#include<conio.h>
int n,x[50],i;
void citire()
{cout<<"n="; cin>>n;
for(i=1;i<=n;i++) cin>>x[i];
}
int prim(int a)
{for(int d=2;d<=a/2;d++) if(a%d==0) return 0;
return 1;
}
void main()
{clrscr();
int s=0,k=0;
citire();
for(i=1;i<=n;i++)if(prim(x[i])){cout<<x[i]<<" ";
s=s+x[i];
k++;
}
cout<<"Media aritmetica este "<<s/k;
getch();
}

11. Se citește de la tastatură un număr natural n cu cel mult 9 cifre. Sa se afiseze cel mai mare și cel mai
mic numar care se poate forma cu cifrele distincte ale numarului.
#include<iostream.h>
#include<conio.h>
int i,a[10];
long n;
void citire()
{cout<<"n="; cin>>n;
}
void formare(long n,int a[10])
{while(n!=0){a[n%10]=a[n%10]+1;
n=n/10;
}
}
int celmmic(int a[10])
{int p=0;
for(i=1;i<=9;i++)if(a[i]!=0)p=p*10+i;
return p;
}
int cmmare(int a[10])
{int p=0;
for(i=9;i>=0;i--) if(a[i]!=0) p=p*10+i;

10
Atestat 2010. Subiecte programare
return p;
}
void main()
{clrscr();
citire();
formare(n,a);
cout<<"Nr cel mai mic care se poate forma cu cifrele numarului "<<n<<" este "<<celmmic(a)<<endl;
cout<<"Nr cel mai mare care se poate forma cu cifrele numarului "<<n<<" este "<<cmmare(a);
getch();
}

12. Se citește din fișierul numar.txt un număr natural n. Să se verifice dacă este putere a lui 2 și să se
calculeze frecvența de apariție a fiecarei cifre în scrierea în baza 10 a numărului.
#include<iostream.h>
#include<conio.h>
int i,a[10];
long n;
void citire()
{cout<<"n="; cin>>n;
}
void formare(long n,int a[10])
{while(n!=0){a[n%10]=a[n%10]+1;
n=n/10;
}
}
int putere(long n)
{while(n%2==0)n=n/2;
if(n==1) return 1;
return 0;
}
void main()
{clrscr();
citire();
if(putere(n)==1) cout<<"Numarul "<<n<<" este putere a lui 2 "<<endl;
else cout<<"Numarul "<<n<<" nu este putere a lui 2 "<<endl;
formare(n,a);
for(i=1;i<=9;i++) if(a[i]!=0) cout<<"Cifra "<<i<<" apare in numarul "<<n<<" de "<<a[i]<<" ori
"<<endl;
getch();
}

13. Scrieti un program care afișează pe ecran toate numerele naturale cu maxim 9 cifre care sunt
rotunde(numerele care convertite in binar au acelasi numar de 0 respectiv de 1).
Exemplu: 12=>1100 este rotund; 13 =>1101 nu este rotund )
#include<iostream.h>
#include<conio.h>
int n;
void citire()
{cout<<"n=";
cin>>n;
}
int rotund(int n)
{int p=0,t=0;

11
Atestat 2010. Subiecte programare
while(n!=0){if(n%2==0)p++;
else t++;
n=n/2;
}
if(p==t) return 1;
return 0;
}
void main()
{clrscr();
citire();
if(rotund(n)==1) cout<<"Numarul "<<n<<" este round ";
else cout<<"Numarul "<<n<<" nu este round ";
getch();
}

14. Fişierul text numere.in conţine pe prima linie un număr natural n (0<n<1000), iar pe a doua linie n
numere naturale cu cel mult 9 cifre fiecare, despărţite prin câte un spaţiu. Scrieţi un program C/C++ care
citeşte toate numerele din fişier şi afişează pe ecran, separate prin câte un spaţiu, numerele de pe a doua
linie a fişierului, care sunt formate din cifre identice.
Exemplu: dacă fişierul numere.in are conţinutul:
9
55 107 3 101 99 7 208 2222 80
numerele ce se vor afişa sunt:
55 3 99 7 2222
#include<iostream.h>

#include<conio.h>

int n,i,x[100];

void citire()

{cout<<"n="; cin>>n;

for(i=1;i<=n;i++) cin>>x[i];

int identic(int t)

{int p;

p=t%10;

t=t/10;

while(t!=0){if(t%10!=p)return 0;

t=t/10;

return 1;

12
Atestat 2010. Subiecte programare
void main()

{clrscr();

citire();

for(i=1;i<=n;i++) if(identic(x[i])) cout<<x[i]<<" ";

getch();

15.Fişierul atestat.txt conţine pe prima linie un număr natural n (n≤100), iar pe a doua linie, separate
prin câte un spaţiu, n numere naturale nenule, cu cel mult 4 cifre fiecare. Scrieţi programul C/C++ care
afiseaza pe ecran cifra de control a fiecărui număr (c(4568)=c(4+5+6+8)=c(23)=5).
Exemplu: dacă fişierul are conţinutul alăturat,
7
120 346 68 9 32 0 112
atunci se afişează 3 4 5 9 5 0 4
#include<iostream.h>
#include<conio.h>
int n;
void citire()
{cout<<"n="; cin>>n;
}
int suma(int n)
{int s=0;
while(n!=0){s=s+n%10;
n=n/10;
}
return s;
}
void main()
{int p;
clrscr();
citire();
p=suma(n);
while(p>9)p=suma(p);
cout<<"Cifra de control a numarului "<<n<<" este "<<p;
getch();
}

16. Fişierul numere.in conţine pe prima linie mai multe numere naturale în ordine crescătoare dintre
care cel puțin o putere a lui 3. Scrieţi un algoritm eficient care afişează pe ecran numerele din fişier ce
sunt puteri ale lui 3.
#include<iostream.h>
#include<conio.h>
int n,i,x[100];
void citire()
{cout<<"n="; cin>>n;
for(i=1;i<=n;i++) cin>>x[i];
}
int putere(int t)
13
Atestat 2010. Subiecte programare
{while(t%3==0) t=t/3;
if(t==1) return 1;
return 0;
}
void main()
{clrscr();
citire();
for(i=1;i<=n;i++)if(putere(x[i])==1) cout<<x[i]<<" ";
getch();
}

17. Dat n natural, sa se descompuna ca suma de puteri distincte ale lui 2.


Exemplu : 25=24+23+20.
#include<iostream.h>
#include<conio.h>
#include<math.h>
int n;
void citire()
{cout<<"n="; cin>>n;
}
void putere(int m)
{int t,p;
do{t=0;
p=m;
while(p>1){
p=p/2;
t++;
}
cout<<t<<" ";
m=m-pow(2,t);
}while(m>=1);
if(m==1) cout<<0;
}
void main()
{clrscr();
citire();
putere(n);
getch();
}

18. Să se scrie un program care să verifice dacă suma cifrelor de pe poziţiile impare şi suma cifrelor de
pe poziţiile pare ale unui număr natural n citit de la tastatură sunt egale. Poziţiile se numără de la dreapta
la stânga începând cu poziţia 1. Se afişează sumele şi un mesaj corespunzător pe ecran.
Exemplu: se citeşte: n=12345 şi
se afişează: sp=6 şi simp=9 Nu coincid!
#include<iostream.h>
#include<conio.h>
#include<math.h>
int n;
void citire()
{cout<<"n="; cin>>n;
}
int sume(int n)

14
Atestat 2010. Subiecte programare
{int s=0,p=0,nr=0;
while(n!=0){nr++;
if(nr%2==0) s=s+n%10;
else p=p+n%10;
n=n/10;
}
if(p==s) return 1;
return 0;
}
void main()
{clrscr();
citire();
if(sume(n)==1) cout<<"Suma cifrelor de pe pozitiile pare este egala cu suma cifrelor de pe pozitiile
impare ";
else cout<<"Suma cifrelor de pe pozitiile pare nu este egala cu suma cifrelor de pe pozitiile impare";
getch();
}

19. Să se afişeze primele n perechi de numere prime gemene, unde n este un număr natural nenul citit de
la tastatură.
Exemplu: se citeşte: n=4
se afişează: (3 ; 5) ; (5 ; 7) ; (11 ; 13) ; (17 ; 19)
#include<iostream.h>
#include<conio.h>
int n;
void citire()
{cout<<"n=";
cin>>n;
}
int prim(int t)
{for(int d=2;d<=t/2;d++) if(t%d==0) return 0;
return 1;
}
void main()
{int sw=1,i=2;
clrscr();
citire();
while(sw<=n){if(prim(i)==1) if(prim(i+2)==1){cout<<"("<<i<<","<<i+2<<")"<<endl;
sw++;
}
i++;
}
getch();
}

20. Se citesc n numere naturale nenule. Să se precizeze cu câte zerouri se va termina produsul numerelor
fără a calcula efectiv produsul lor.
Exemplu: se citeşte:n=3 și numerele25, 12, 9
se afişează: 2 de zero
#include<iostream.h>
#include<conio.h>
int n,i,x[30];
void citire()

15
Atestat 2010. Subiecte programare
{cout<<"n=";
cin>>n;
for(i=1;i<=n;i++) cin>>x[i];
}
void zerouri(int n,int x[30],int &c,int &d)
{int p;
for(i=1;i<=n;i++){p=x[i];
while(p%5==0){c++;
p=p/5;
}
while(p%2==0){d++;
p=p/2;
}
}
}
void main()
{clrscr();
int c,d;
citire();
zerouri(n,x,c,d);
if(c<=d) cout<<"Produsul numerelor are "<<c<<" zerouri ";
else cout<<"Produsul numerelor are "<<d<<" zerouri ";
getch();
}

21. Se citeşte un număr natural n. Să se afişeze toate numerele prime mai mici decât n astfel încât suma
cifrelor a fiecărui număr să fie mai mică decât un alt număr citit m.
Exemplu: se citeşte: n= 30 şi m=7
se afişează: 2, 3, 5, 11, 13, 23
#include<iostream.h>
#include<conio.h>
int n,i,x[30],m;
void citire()
{cout<<"n=";
cin>>n;
cout<<"m=";
cin>>m;
}
int suma(int t)
{int s=0;
while(t!=0){s=s+t%10;
t=t/10;
}
return s;
}
int prim(int t)
{for(int d=2;d<=t/2;d++) if(t%d==0) return 0;
return 1;
}
void main()
{int i;
clrscr();
citire();

16
Atestat 2010. Subiecte programare
for(i=2;i<=n;i++)if(prim(i)==1) if(suma(i)<=m)cout<<i<<" , ";
getch();
}

22. Fişierul matrice.txt conţine pe primul rând două valori naturale m şi n (1≤n≤100, 1≤m≤100),
reprezentând numărul de linii şi respectiv de coloane ale unei matrice a, iar pe următoarele m linii câte n
valori întregi cu maximum 4 cifre fiecare, separate prin câte un spaţiu, reprezentând elementele matricei
a. Afişaţi pe ecran un şir de 2*(n+m) – 4 numere ordonate crescător, şir format din elementele aflate pe
chenarul exterior al matricei a. Chenarul exterior este format din prima şi ultima linie, respectiv prima şi
ultima coloană din matrice.

Exemplu: dacă matricea dată este :


3 4
1 2 3 4
5 6 7 8
9 1 2 3
se va afişa şirul : 1 1 2 2 3 3 4 5 8 9.
#include<iostream.h>
#include<conio.h>
int n,m,i,j ,a[30][30],t,x[100];
void citire()
{cout<<"n=";
cin>>n;
cout<<"m=";
cin>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++){gotoxy(j*3,i+5);
cin>>a[i][j];
}
}
void formare(int n,int m,int a[30][30],int &t,int x[100])
{for(i=1;i<=n;i++)x[++t]=a[1][i];
for(i=1;i<=n;i++)x[++t]=a[n][i];
for(i=2;i<m;i++) x[++t]=a[i][1];
for(i=2;i<m;i++) x[++t]=a[i][n];
}
void sortare(int t,int x[100])
{ int sw,aux;
do{sw=1;
for(i=1;i<t;i++) if(x[i]>x[i+1]){aux=x[i];
x[i]=x[i+1];
x[i+1]=aux;
sw=0;
}
}while(sw==0);
}
void afis(int k,int v[100])
{for(i=1;i<=k;i++) cout<<v[i]<<" ";
cout<<endl;
}
void main()

17
Atestat 2010. Subiecte programare
{clrscr();
citire();
formare(n,m,a,t,x);
cout<<endl<<"elementele din chenarul exterior nesortate sunt "<<endl;
afis(t,x);
sortare(t,x);
cout<<endl<<"elementele din chenarul exterior sortate sunt "<<endl;
afis(t,x);
getch();
}
23. Se citeşte de la tastatură o valoare naturală m (2≤m≤100). Scrieţi programul C/C++/Pascal care
construieşte în memorie şi apoi afişează pe ecran matricea a cu m linii şi m coloane de numere întregi,
construită după următoarea regulă : elementul de pe linia i şi coloana j a matricii ( 1≤i , j≤m) este :
 1 dacă i*i+j*j este pătrat perfect
 2 dacă i*i+j*j nu este pătrat perfect, dar este număr prim mai mare decât 2
 3 în rest.
Exemplu: pentru m = 2, se va afişa matricea :
3 2
2 3
#include<iostream.h>
#include<conio.h>
int m,i,j ,a[30][30];
void citire()
{cout<<"m=";
cin>>m;
}
int patrat(int t)
{for(int d=1;d<=t/2;d++)if(d*d==t) return 1;
return 0;
}
int prim(int t)
{for(int d=2;d<=t/2;d++) if(t%d==0) return 0;
return 1;
}
void main()
{clrscr();
citire();
for(i=1;i<=m;i++)
for(j=1;j<=m;j++)if(patrat(i*i+j*j)==1)a[i][j]=1;
else if(i*i+j*j>2&&prim(i*i+j*j)==1) a[i][j]=2;
else a[i][j]=3;
for(i=1;i<=m;i++)
for(j=1;j<=m;j++){gotoxy(j*3,i+5);
cout<<a[i][j];
}
getch();
}

24. Se citeşte un vector v cu n componente numere naturale. Să se afişeze cel mai mare număr care se
poate forma cu cifra maximă a fiecărui număr din vector.
Exemplu: se citeşte: n= 5 şi v=(29, 171, 0, 2222, 100)
se afişează: 97210
#include<iostream.h>
18
Atestat 2010. Subiecte programare
#include<conio.h>
int m,x[100],i,j,a[10];
void citire()
{cout<<"m=";
cin>>m;
for(i=1;i<=m;i++) cin>>x[i];
}
int cifmaxima(int t)
{int max;
max=t%10;
t=t/10;
while(t!=0){if(t%10>max)max=t%10;
t=t/10;
}
return max;
}
void formare(int a[10])
{int t;
for(i=1;i<=m;i++){t=cifmaxima(x[i]);
a[t]=a[t]+1;
}
}
long numar(int a[10])
{int p=0;
for(i=9;i>=0;i--)if(a[i]!=0)if(a[i]>1) while(a[i]!=0){p=p*10+i;
a[i]=a[i]-1;
}
else p=p*10+i;
return p;
}
void main()
{
clrscr();
citire();
formare(a);
cout<<"Cel mai mare numar care se poate forma cu cifra maxima a fiecarui element din vector este
"<<numar(a);
getch();
}

25. Se consideră o matrice oarecare de dimensiune mxn cu elemente numere naturale. Să se afişeze
numerele cu număr impar de divizori din matrice şi să se indice numărul lor.
 4 11 8 
A =  
Exemplu: se citeşte: m=2 şi n=3 şi matricea  12 7 25 
se afişează: 4, 25,
2 numere
#include<iostream.h>
#include<conio.h>
int m,n,i,j,a[10][10];
void citire()
{cout<<"m=";
cin>>m;
for(i=1;i<=m;i++)
19
Atestat 2010. Subiecte programare
for(j=1;j<=m;j++){gotoxy(j*3,i+5);
cin>>a[i][j];
}
}
int divizor(int t)
{int s=2;
for(int d=2;d<=t/2;d++) if(t%d==0)s++;
return s;
}
void main()
{clrscr();
int nr;
citire();
for(i=1;i<=m;i++)
for(j=1;j<=m;j++)if(a[i][j]!=1){n=divizor(a[i][j]);
if(n%2==1){cout<<a[i][j]<<" ";
nr++;
}
}
else {cout<<a[i][j]<<" ";
nr++;
}
cout<<"nr de elemente din matrice care au un numar impar de divizori este "<<nr;
getch();
}

26. Fie un vector v cu n elemente numere întregi citite de la tastatură. Fără a folosi alt vector auxiliar, să
se mute la sfărşitul lui v elementele sale nule, păstrând ordinea celorlalte elemente.
Exemplu: se citeşte: n=7 şi vectorul v=(2,3,0,9,0,0,8)
se afişează: v=(2,3,9,8,0,0,0)
#include<iostream.h>
#include<conio.h>
int v[50],n,i,j,sw,aux;
void citire()
{cout<<"n="; cin>>n;
for(i=1;i<=n;i++) {cin>>v[i];
if(v[i]==0)sw++;
}
}
void schimb(int i,int m)
{aux=v[i];
v[i]=v[m];
v[m]=aux;
}
void zero(int n,int v[50])
{for(int t=1;t<=sw;t++)
for(i=1;i<=n;i++) if(v[i]==0)schimb(i,n+1-t);
}
void afis(int n,int v[50])
{for(i=1;i<=n;i++) cout<<v[i]<<" ";
cout<<endl;
}

20
Atestat 2010. Subiecte programare
void main()
{clrscr();
citire();
afis(n,v);
zero(n,v);
afis(n,v);
getch();
}

27. Fie a o matrice pătratică de dimensiune n. Folosind o funcţie de ordonare a unui vector de
dimensiune k, afişaţi matricea modificată prin ordonarea crescătoare a liniilor impare.
#include<iostream.h>
#include<conio.h>
int n,m,a[20][20],i,j;
void citire()
{cout<<"n="; cin>>n;
cout<<"m="; cin>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++){gotoxy(j*3,i+5);
cin>>a[i][j];
}
}
void sortare(int t,int k,int a[20][20])
{int sw,aux;
do{sw=1;
for(i=1;i<k;i++) if(a[t][i]>a[t][i+1]){aux=a[t][i];
a[t][i]=a[t][i+1];
a[t][i+1]=aux;
sw=0;
}
}while(sw==0);
}
void afis()
{for(i=1;i<=n;i++)
{cout<<endl;
for(j=1;j<=m;j++) cout<<a[i][j]<<" ";
}
cout<<endl;
}
void main()
{clrscr();
citire();
for(j=1;j<=n;j++)if(j%2==1) sortare(j,m,a);
afis();
getch();
}
28. Fisierul matrice.in conţine pe prima linie un număr natural n (0≤n≤5000), iar pe următoarele 2n
linii câte n numere naturale de cel mult 5 cifre fiecare, separate prin câte un spaţiu reprezentând
elementele a două matrice a şi b cu câte nXn elemente fiecare. Verificaţi dacă b este obţinută din a prin
rotirea spre stânga cu 270 de grade, afişând un mesaj afirmativ sau „nu”.
Exemplu:
Dacă fişierul matrice.in are următorul conţinut :
3

21
Atestat 2010. Subiecte programare
123
345
567

531
642
753
atunci se va afişa “DA”
#include<iostream.h>
#include<conio.h>
int a[20][20],n,i,j,b[20][20],c[20][20];
void citire()
{cout<<"n="; cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){gotoxy(j*7,i+9);
cin>>a[i][j];
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) {gotoxy(j*10,i+15);
cin>>b[i][j];
}
}
void rotire(int a[20][20],int n,int c[20][20])
{for(i=1;i<=n;i++)
for(j=1;j<=n;j++)c[j][i]=a[i][j];
}
void afis(int d[20][20],int n)
{for(i=1;i<=n;i++)
{for(j=1;j<=n;j++) cout<<d[i][j]<<" ";
cout<<endl;
}
}
void verificare()
{for(i=1;i<=n;i++)
for(j=1;j<=n;j++) if(b[i][j]==c[i][j]) cout<<"DA";
else {cout<<"NU";
j=n+1;
i=n+1;
}
}
void main()
{clrscr();
citire();
rotire(a,n,c);
afis(a,n);
cout<<"Matricea rotita la 270 grade la stanga este: "<<endl;
afis(b,n);
verificare();
getch();
}
29. Dată o matrice cu elemente numere întregi de dimensiune nXm să se determine punctele-șa din
matrice, adică elementele care sunt minime pe linia lor și maxime pe coloana lor. În cazul în care nu
există se va afișa mesajul “NU”.

22
Atestat 2010. Subiecte programare
Exemplu=3;
4 3 6
12 1 4 => numarul 3 este șa.
5 0 7
#include<iostream.h>
#include<conio.h>
int a[20][20],n,i,j;
void citire()
{cout<<"n="; cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){gotoxy(j*3,i+5);
cin>>a[i][j];
}
}
int maxim(int t,int k,int a[20][20])
{int max,p=1;
max=a[1][t];
for(i=2;i<=k;i++)if(a[i][t]>max) {max=a[i][t];
p=i;
}
return p;
}
int minim(int t,int k,int a[20][20])
{int min;
min=a[t][1];
for(i=2;i<=k;i++) if(min>a[t][i]) min=a[t][i];

return min;
}
void main()
{int sw=0,min,m;
clrscr();
citire();
for(j=1;j<=n;j++){m=maxim(j,n,a);
min=minim(m,n,a);
if(a[m][j]==min){cout<<min;
sw=1;
}
}
if(sw==0) cout<<"NU EXISTA!!!!!!!!!!!!!!";
getch();
}
30. Fie n si m doua numere naturale citite de la tastatura. Sa se formeze un tablou bidimensional cu n
linii si m coloane cu primele n×m numere naturale imperfecte. Un numar natural n este perfect daca
suma S a divizorilor sai mai mici decât n este egală de numarul n (exceptand numarul insusi ).
Exemplu:n=2, m=3 atunci matricea este
1 2 3
4 5 7
! 6 este număr perfect – 6=1+2+3
#include<iostream.h>
#include<conio.h>
int n,v[100],i,j;

23
Atestat 2010. Subiecte programare
void citire()
{cout<<"n="; cin>>n;
}
int perfect(int a)
{int s=1,d;
for(d=2;d<=a/2;d++) if(a%d==0) s=s+d;
if(s==a) return 1;
return 0;
}
void vector(int n,int v[100])
{int sw=1,t=1,i=1;
while(sw!=0){if(perfect(i)==0||i==1) {v[t]=i;
if(t==n*n) sw=0;
t++;
}
i++;
}
}
void afis()
{cout<<endl;
for(i=1;i<=n*n;i++)
if(i%n==0) cout<<v[i]<<endl;
else cout<<v[i]<<" ";
}
void main()
{clrscr();
citire();
vector(n,v);
afis();
getch();
}
31. Scrieţi un program C/C++ care citeşte de la tastatură un număr natural n (2<n<20), construieşte în
memorie şi afişează pe ecran o matrice cu n linii şi n coloane, numerotate de la 1 la n. Fiecare element
din matrice aflat pe o linie impară va fi egal cu numărul liniei pe care se află iar elementele de pe linii
pare să fie completate cu valorile de la n la 1. Elementele matricei vor fi afişate pe ecran, câte o linie a
matricei pe câte o linie a ecranului cu câte un spaţiu între elementele fiecărei linii.
Exemplu: pentru n=5 se va afişa matricea de mai jos
11111
54321
33333
54321
55555
#include<iostream.h>
#include<conio.h>
int n,a[20][20],i,j;
void citire()
{cout<<"n="; cin>>n;
}
void formare()
{for(i=1;i<=n;i++)
for(j=1;j<=n;j++) if(i%2==1)a[i][j]=i;
else a[i][j]=n-j+1;
}

24
Atestat 2010. Subiecte programare
void afis()
{for(i=1;i<=n;i++)
for(j=1;j<=n;j++){gotoxy(j*3,i+4);
cout<<a[i][j];
}
}
void main()
{clrscr();
citire();
formare();
afis();
getch();
}

32. Se dau numărul de n linii si m coloane a unei matrici.Să se construiască și să se afișeze matricea în
fisierul matrice.out stiind ca elementul din pozitia i,j este egal cu minimul dintre i si j. Afișarea se
realizează prin intermediul unui vector construit prin parcurgerea matricei sub formă de L.
#include<iostream.h>
#include<conio.h>
int n,a[20][20],i,j,v[100];
void citire()
{cout<<"n="; cin>>n;
}
void formare()
{for(i=1;i<=n;i++)
for(j=1;j<=n;j++) if(i>j)a[i][j]=j;
else a[i][j]=i;
}
void afis()
{for(i=1;i<=n;i++)
for(j=1;j<=n;j++){gotoxy(j*3,i+4);
cout<<a[i][j];
}
cout<<endl;
}
void vector()
{int t,k=0;
for(t=1;t<=n;t++)
{for(j=1;j<=n-t;j++)v[++k]=a[j][t];
for(j=t;j<=n;j++) v[++k]=a[n-t+1][j];
}
}
void main()
{clrscr();
citire();
formare();
afis();
vector();
for(i=1;i<=n*n;i++) cout<<v[i]<<" ";
getch();
}
33. Fişierul text NUMERE.IN conţine pe prima linie un număr natural nenul n (1≤n≤100) şi pe
următoarea linie n numere reale pozitive separate prin câte un spaţiu. Scrieţi un program C/C++ care

25
Atestat 2010. Subiecte programare
citeşte din fişierul NUMERE.IN numărul natural n, şi determină, utilizând un algoritm eficient din
punct de vedere al timpului de executare şi al memoriei utilizate, poziția pe care se află primul şi ultimul
număr din cele n numere reale care sunt egale cu valoarea minimă dintre ele.
Exemplu: Dacă fişierul NUMERE.IN are conţinutul:
6
2.8 2.3 5.7 5.7 2.3 6.3
atunci se afişează 2 si 5 (valoarea minimă este 2.3 și numerele de pe poziţia 2 si 5 sunt egale cu 2.3)
#include<iostream.h>
#include<conio.h>
int n,i;
float v[100];
void citire()
{cout<<"n="; cin>>n;
for(i=1;i<=n;i++) cin>>v[i];
}
float minim()
{float min;
min=v[1];
for(i=2;i<=n;i++) if(min>v[i]) min=v[i];
return min;
}
void main()
{float a; int b;
clrscr();
citire();
a=minim();
for(i=1;i<=n;i++)if(v[i]==a){cout<<i<<" ";
i=n+1;
b=i;
}
for(i=n;i>=1;i--) if(v[i]==a){if(i!=b)cout<<i;
i=0;
}
getch();
}

34. Scrieţi un program C/C++ care citeşte de la tastatură un număr natural n (1<=n<=20), elementele
unei matrice cu n linii şi n coloane, numere întregi din intervalul [-100, 100] şi afişează pe ecran m1 şi
m2, unde m1 este media aritmetică a elementelor strict pozitive ale matricei, situate deasupra diagonalei
principale, iar m2 este media aritmetică a elementelor strict pozitive ale matricei, situate sub diagonala
principală, ca în exemplu. Cele două medii se consideră egale cu 0 dacă nu există valori strict pozitive în
zonele corespunzătoare.
Exemplu: pentru n=4 şi matricea alăturată se afişează
m1=2.75, calculată din elementele aflate deasupra diagonalei
principale, şi m2=2.5, calculată din elementele aflate sub diagonala principală.
-1 2 -4 5
0 6 3 1
2 4 2 0
3 -5 1 -3
#include<iostream.h>
#include<conio.h>

26
Atestat 2010. Subiecte programare
int a[20][20],n,i,j,k,t;
float m1,m2;
void citire()
{cout<<"n="; cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){gotoxy(j*7,i+9);
cin>>a[i][j];
}
}
float sumaunu()
{float s=0;
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++) if(a[i][j]>0){s=s+a[i][j];
k++;
}
m1=s/k;
return m1;
}
float sumadoi()
{float s=0;
for(i=1;i<n;i++)
for(j=1;j<i;j++)if(a[i][j]>0){s=s+a[i][j];
t++;
}
m2=s/t;
return m2;
}
void main()
{clrscr();
citire();
cout<<"Media aritmetica a elementelor strict pozitive de deasupra diagonalei principale este
"<<sumaunu();
cout<<"Media aritmetica a elementelor strict pozitive de dedesubtul diagonalei principale este
"<<sumadoi();
getch();
}

35. Scrieţi un program C/C++ care citeşte de la tastatură numerele întregi m şi n (1<=m<=50,
1<=n<=50) şi elementele unui tablou bidimensional cu m linii şi n coloane, numere întregi distincte de
cel mult 4 cifre fiecare. Programul va afişa pe prima linie a ecranului numărul de elemente prime de pe
fiecare coloana a matricii, separate prin câte un spațiu.Definiți o funcţie care verifică dacă un număr
întreg este prim şi folosii apeluri ale ei pentru rezolvarea cerinţei.

Exemplu: pentru m=3 şi n=4 şi tabloul de mai jos


2714
14 6 12 3
9 22 8 5
Pe ecran se va afişa:
311
#include<iostream.h>
#include<conio.h>

27
Atestat 2010. Subiecte programare
int a[20][20],n,i,j;
void citire()
{cout<<"n="; cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){gotoxy(j*7,i+9);
cin>>a[i][j];
}
}
int prim(int a)
{int d;
for(d=2;d<=a/2;d++) if(a%d==0) return 0;
return 1;
}
void main()
{clrscr();
citire();
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)if(prim(a[j][i])==1) cout<<a[j][i]<<" ";
getch();
}

36. Fie x un vector de numere întregi de lungime n, să se construiască un vector y, astfel încât
y[i]=numărul de apariţii ale lui x[i] în vectorul x.
Exemplu: Pentru x=(1,5,2,1,5,7,2,1,5) se obţine y=(3,3,2,3,3,1,2,3,3).
#include<iostream.h>
#include<conio.h>
int v[50],y[50],n,i,j,k;
void citire()
{cout<<"n="; cin>>n;
for(i=1;i<=n;i++)cin>>v[i];
}
int aparitie(int a)
{int s=0;
for(i=1;i<=n;i++)if(v[i]==a)s++;
return s;
}
void formare(int n,int v[50],int y[50])
{for(j=1;j<=n;j++){k=aparitie(v[j]);
y[j]=k;
}
}
void afis(int n,int x[100])
{for(i=1;i<=n;i++) cout<<x[i]<<" ";
cout<<endl;
}
void main()
{clrscr();
citire();
formare(n,v,y);
afis(n,v);

28
Atestat 2010. Subiecte programare
afis(n,y);
getch();
}

37. Scrieţi un program care citeşte de la tastatură două numere naturale nenule m şi n şi care
construieşte în memorie şi apoi afişează o matrice A cu m linii şi n coloane cu proprietatea că fiecare
element aij memorează cea mai mică dintre valorile indicilor i şi j. Matricea se va afişa în fișierul
matrice.txt, câte o linie a matricei pe câte o linie a ecranului, elementele fiecărei linii fiind separate prin
câte un spaţiu.
Exemplu: Pentru m=4 şi n=5 fișierul va conține matricea alăturată 1 1 1 1 1
12222
12333
12344
#include<iostream.h>
#include<conio.h>
int a[20][20],n,m,i,j;
void citire()
{cout<<"n="; cin>>n;
cout<<"m="; cin>>m;
}
void formare()
{for(i=1;i<=n;i++)
for(j=1;j<=m;j++)if(i<j)a[i][j]=i;
else a[i][j]=j;
}
void afis()
{for(i=1;i<=n;i++)
for(j=1;j<=m;j++){gotoxy(j*3,i+5);
cout<<a[i][j];
}
}
void main()
{clrscr();
citire();
formare();
afis();
getch();
}
38. Se citesc de la tastatură doi vectori cu câte n elemente. Afişaţi ultima cifră a sumei
a1 ⋅ b1 + a 2 ⋅ b2 + ...... + a n ⋅ bn fără a calcula efectiv suma.
#include<iostream.h>
#include<conio.h>
int n,a[100],b[100],i;
void citire()
{cout<<"Dati numarul de elemente:"; cin>>n;
for(i=1;i<=n;i++) {cin>>a[i];
cin>>b[i];
}
}
int ultimacifra(int n,int a[100],int b[100])
{int s=0;
for(i=1;i<=n;i++){s=s+a[i]+b[i];
29
Atestat 2010. Subiecte programare
s=s%10;
}
return s;
}
void main()
{clrscr();
citire();
cout<<"Suma se termina cu cifra:"<<ultimacifra(n,a,b);
getch();
}

39. Scrieți un program care construiește în memorie o matrice pătratică de ordin n cu elemente numere
naturale astfel încât pe diagonala principală să existe numai elemente egale cu 1, elementele de pe cele
două « semidiagonale » paralele cu diagonala principală și alăturate diagonalei principale să fie toate
egale cu 2, elementele de pe urmatoarele două « semidiagonale » să fie egale cu 3,etc.
Valoarea lui n se citeste de la tastatură, iar matricea se va afișa pe ecran.
Pentru n=4 se va afișa tabloul :
1234
2123
3212
4321
#include<iostream.h>
#include<conio.h>
int a[20][20],n,m,i,j;
void citire()
{cout<<"n="; cin>>n;
}
void formare()
{for(i=1;i<=n;i++)
for(j=n;j>=i;j--){a[i][j]=j-i+1;
a[j][i]=a[i][j];
}

}
void afis()
{for(i=1;i<=n;i++)
for(j=1;j<=n;j++){gotoxy(j*3,i+4);
cout<<a[i][j];
}
}
void main()
{clrscr();
citire();
formare();
afis();
getch();
}
39. Fie a un vector cu n componente reale (n>=30). Să se obtină din a vectorul b care să indeplinească
condițiile :
- b[i]>=b[i+1] pentru i=1,2,…,k-1
- b[i]<=b[i+1] pentru i=k,k+1, , n-1
- b[k-i]>=b[k+i] pentru i=1,2, …, k-1, unde k=n/2 cand n este par si k=(n+1)/2 cand n este impar.
#include<iostream.h>

30
Atestat 2010. Subiecte programare
#include<conio.h>
int v[50],n,b[50],i,j;
void citire()
{cout<<"n="; cin>>n;
for(i=1;i<=n;i++) cin>>v[i];
}
void sortare()
{int sw,aux;
do{sw=1;
for(i=1;i<n;i++) if(v[i]<v[i+1]){aux=v[i];
v[i]=v[i+1];
v[i+1]=aux;
sw=0;
}
}while(sw==0);
}
void formare(int &t,int b[50])
{t=0;
for(i=1;i<=n/2;i++)b[++t]=v[i];
for(i=n;i>=n/2;i--)b[++t]=v[i];

}
void afis(int m,int x[100])
{for(i=1;i<=m;i++) cout<<x[i]<<" ";
cout<<endl;
}
void main()
{int t;
clrscr();
citire();
afis(n,v);
sortare();
formare(t,b);
afis(n,b);
getch();
}

40. Se citește de la tastatură o matrice a cu m linii și n coloane, ale cărei elemente sunt cifre de la 0 la 9
(0<=m,n<=5). Să se afișeze suma numerelor care se pot forma cu cifrele fiecărei linii (numărul aferent
fiecărei linii se va obține prin citirea cifrelor de pe linia respectivă de la stânga la dreapta, ignorându-se
zerourile de la inceputul liniei).
Exemplu : Pentru matricea :
03825
00514
0 7 7 9 3 se va afișa valoarea 12132 reprezentând suma 3825+514+7793.
#include<iostream.h>
#include<conio.h>
int a[20][20],n,m,i,j;
void citire()
{cout<<"n="; cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){gotoxy(j*3,i+4);

31
Atestat 2010. Subiecte programare
cin>>a[i][j];
}
}
int numar(int t)
{int p=0;
for(i=1;i<=n;i++)if(a[t][i]!=0) p=p*10+a[t][i];
else if(p!=0) p=p*10+a[t][i];
return p;
}
int suma()
{int s=0,b;
for(j=1;j<=n;j++){b=numar(j);
cout<<b<<" ";
s=s+b;
}
return s;
}
void main()
{clrscr();
citire();
cout<<"Suma obtinuta este "<<suma();
getch();
}

41. Scrieți un program care construiește în memorie o matrice t pătratică de ordin n cu elemente numere
naturale astfel încât pe ultima coloană și pe ultima linie să se afle numai elemente egale cu 1, iar oricare
alt element al matricei să fie egal cu suma dintre elementul aflat imediat sub el și elementul aflat imediat
în dreapta lui.
Exemplu : Pentru n =4 se va afisa tabloul urmator :
20 10 4 1
10 6 3 1
4 3 2 1
1 1 1 1
#include<iostream.h>
#include<conio.h>
int a[20][20],n,m,i,j;
void citire()
{cout<<"n="; cin>>n;
for(i=1;i<=n;i++){a[n][i]=1;
a[i][n]=1;
}
}
void formare()
{for(i=n-1;i>=1;i--)
for(j=n-1;j>=1;j--)a[i][j]=a[i+1][j]+a[i][j+1];
}
void afis()
{for(i=1;i<=n;i++)
for(j=1;j<=n;j++){gotoxy(j*3,i+5);
cout<<a[i][j];
}
}

32
Atestat 2010. Subiecte programare
void main()
{clrscr();
citire();
formare();
afis();
getch();
}

42. Scrieţi programul C, C++ sau Pascal, care citeşte de la tastatură un şir s de cel mult 30 de caractere şi
un caracter c. Programul determină triplarea fiecărei apariţii a caracterului c în s şi scrie noul şir obţinut
în fişierul text final.out. (neintensiv: șirul poate fi scris în fișier fără a fi construit efectiv în
memorie)
De exemplu, dacă se citeşte şirul : ciocarlie şi caracterul c atunci fişierul va conţine şirul : ccciocccarlie.
#include<iostream.h>
#include<string.h>
#include<conio.h>
void main()
{char cuv[100],ch;
int i,n,j;
clrscr();
cout<<"Dati cuvantul:"<<endl;
cin.get(cuv,30); cin.get();
cout<<"Dati caracterul ch:"; cin>>ch;
n=strlen(cuv);
for(i=0;i<n;i++)if(cuv[i]==ch)
{for(j=n;j>i+1;j--)cuv[j]=cuv[j-1];
cuv[i+1]=ch;
n++;
i++;
for(j=n;j>i+1;j--)cuv[j]=cuv[j-1];
n++;
cuv[i+1]=ch;
i=i+2;
}
cuv[n]=NULL;
cout<<cuv;
getch();

33
Atestat 2010. Subiecte programare
}

43. Fişierul cuv_a.txt conţine mai multe cuvinte ordonate alfabetic. Pentru un cuvânt c dat de la
tastatură generaţi fişierul cuv_b.txt conţine cuvintele din primul fişier şi cuvântul c, toate în ordine
alfabetică.

#include<iostream.h>

#include<string.h>

#include<conio.h>

void main()

{char cuv[100][100],ch[100];

int i,n,sw=1,j;

clrscr();

cout<<"Dati nr de cuvinte:"; cin>>n;

cin.get();

for(i=1;i<=n;i++){cin.get(cuv[i],20);

cin.get();

cin.get(ch,20);

if(strcmp(cuv[1],ch)>=0){for(j=n+1;j>=1;j--) strcpy(cuv[j],cuv[j-1]);

strcpy(cuv[1],ch);

n=n+1;

sw=0;

else for(i=2;i<=n;i++)if(strcmp(cuv[i],ch)>=0)

{for(j=n+1;j>=i;j--)strcpy(cuv[j],cuv[j-1]);

strcpy(cuv[i],ch);

n++;

sw=0;

i=n+3;

34
Atestat 2010. Subiecte programare
if(sw==1){strcpy(cuv[n+1],ch);

n++;

for(i=1;i<=n;i++) cout<<cuv[i]<<endl;

getch();

44. Definiți structura fracție care memorează în câmpul a al structurii numărătorul, iar în câmpul b
numitorul fracției. Citiți numitorul și numărătorul a n fracții. Pentru fiecare fracție să se verifice dacă
este ireductibila, în caz afirmativ să se afișeze, iar în caz contrar să se afișeze numitorul și numărătorul
după simplificare.
#include<iostream.h>
#include<conio.h>
struct fractie{int a;
int b;
};
fractie f;
void citire()
{cout<<"Dati numaratorul fractiei:"; cin>>f.a;
cout<<"Dati numitorul fractiei:"; cin>>f.b;
}
int divizor(int p,int t)
{int i;
if(p>t)for(i=t;i>1;i--) if(p%i==0&&t%i==0) return i;
for(i=p;i>1;i--)if(p%i==0&&t%i==0) return i;
return 0;
}
void main()
{clrscr();
citire(); int k;
k=divizor(f.a,f.b);
if(k!=0) cout<<"Fractia simplificata este "<<f.a/k<<"/"<<f.b/k;
else cout<<"Fractia este ireductibila";
getch();
}

45. Se consideră un text cu maximum 255 de caractere în care cuvintele sunt separate prin unul sau mai
multe spaţii. Primul caracter din textul citit este o literă, iar cuvintele sunt formate numai din litere mici
ale alfabetului englez. Scrieţi un program C/C++ care citeşte de la tastatură textul şi îl transformă
înlocuind prima literă a fiecărui cuvânt cu litera mare corespunzătoare, restul caracterelor rămânând
nemodificate. Textul astfel transformat va fi afişat pe ecran.
#include<iostream.h>
#include<string.h>
#include<conio.h>
#include<ctype.h>
void main()
{char cuv[100];
int i,n;
35
Atestat 2010. Subiecte programare
clrscr();
cin.get(cuv,30);
n=strlen(cuv);
cuv[0]=toupper(cuv[0]);
for(i=1;i<n;i++) if(cuv[i]==' '&&cuv[i+1]!=' ')cuv[i+1]=toupper(cuv[i+1]);
cout<<cuv;
}
Exemplu: dacă de la tastatură se introduce textul: clasă elev şcoală se va afişa pe ecran: Clasă Elev
Şcoală

46. Se dă o înregistrare cu numele cerc,în care sunt stocate abscisa și ordonata centrului cercului și raza
acestuia. Pentru un n număr natural <100, citiți datele caracteristice a n cercuri, sortați structurile
descrescător în funcție de diametru și afișați coordonatele centrelor cercurilor în ordinea obținută după
ordonare.
#include<iostream.h>
#include<conio.h>
struct cerc
{int x;
int y;
float r;
};
cerc c[100];
int n,i;
void citire()
{cout<<"Dati numarul de cercuri:"; cin>>n;
for(i=1;i<=n;i++){cout<<"Dati abscisa centrului cercului:";
cin>>c[i].x;
cout<<"Dati ordonata centrului cercului:";
cin>>c[i].y;
cout<<"Dati raza cercului:";
cin>>c[i].r;
}
}
void ordonare()
{int sw,aux1,aux2;
float aux3;
do{sw=1;
for(i=1;i<n;i++) if(2*c[i].r>=2*c[i+1].r){sw=0;
aux1=c[i].x;
c[i].x=c[i+1].x;
c[i+1].x=aux1;
aux2=c[i].y;
c[i].y=c[i+1].y;
c[i+1].y=aux2;
aux3=c[i].r;
c[i].r=c[i+1].r;
c[i+1].r=aux3;
}
}while(sw==0);
}
void main()
{clrscr();
citire();

36
Atestat 2010. Subiecte programare
ordonare();
for(i=1;i<=n;i++)
cout<<"Cercul de centrul("<<c[i].x<<","<<c[i].y<<") si de raza "<<c[i].r<<endl;
getch();
}
47. Scrieţi programul C/C++ care citeşte de la tastatură un număr de n şiruri de cel mult 40 de caractere,
formate doar din litere mici ale alfabetului englez. Sa se verifice daca sirul de pe pozitia i se termina cu
acelasi caracter cu care incepe sirul de pe pozitia i+1, pentru i de la 1 la n-1.
Se va afişa pe ecran mesajul Sirurile citite verifica proprietatea sau Sirurile citite nu verifica
proprietatea
Exemplu: dacă se citeşte şirul n=4 si sirurile
Proba a acoperit tot!
atunci pe ecran se va afişa: Sirurile citite verifica proprietatea
#include<iostream.h>
#include<string.h>
#include<conio.h>
#include<ctype.h>
void main()
{char cuv[100][100];
int i,n,j,sw=1;
clrscr();
cout<<"Dati nr de cuvinte:"; cin>>n;
for(i=1;i<=n;i++){cin.get();
cin.get(cuv[i],30);
}
cin.get();
for(i=1;i<n;i++){j=strlen(cuv[i]);
if(cuv[i][j-1]!=cuv[i+1][0])sw=0;
}
if(sw==0) cout<<"nu";
else cout<<"da";
getch();
}

48. Fişierul text linii.txt este alcătuit din mai multe linii de lungime variabilă, pe fiecare linie găsindu-se
câte un cuvânt. Scrieţi un program care afişează linia (liniile) de lungime maximă.
Exemplu: Pentru fişierul „linii.txt”: Se va afişa:
informatica informatica
isoscel programator
triunghi
trapez
programator
caiet
#include<iostream.h>
#include<string.h>
#include<conio.h>
#include<ctype.h>
37
Atestat 2010. Subiecte programare
void main()
{char cuv[100][100];
int i,n,j,t,max;
clrscr();
cout<<"Dati nr de cuvinte:"; cin>>n;
for(i=1;i<=n;i++){cin.get();
cin.get(cuv[i],30);
}
t=strlen(cuv[1]); max=t;
for(i=2;i<=n;i++){j=strlen(cuv[i]);
if(t<j)max=j;
}
for(i=1;i<=n;i++) if(strlen(cuv[i])==max) cout<<cuv[i]<<endl;
getch();
}
49. Fie s1 şi s2 două şiruri de caractere. Verificaţi dacă s2 este o codificare „shift” a lui s1(o codificare
„shift” se obţine din s1 prin adăgarea la codul ASCII al fiecărui caracter din s1 a unei constante k)
afişând în caz afirmativ valoarea lui k sau mesajul „NU” în caz contar.
Ex: Pentru şirurile s1=”acdrtu” şi s2=”ceftvx” se afişează k=2.
#include<string.h>
#include<stdlib.h>
#include<iostream.h>
#include<conio.h>
int n,i;
char s[100],c[100],cuv[100];
void citire()
{cin.getline(s,30);
cin.get(c,30);
}
void main()
{int t,k=0;
clrscr();
citire();
t=c[0]-s[0];
for(i=0;i<strlen(s)-1;i++)cuv[i]=s[i]+t;
cout<<cuv;
if(strcmp(cuv,c)==0) cout<<"Da"<<t;
else cout<<"Nu";
getch();
}

38
Atestat 2010. Subiecte programare
50. Scrieţi un program care citeşte de la tastatură un şir de caractere ce conţine litere mici şi spaţii.
Afişaţi cuvântul cu cele mai multe vocale (dacă există mai multe se va afişa unul singur). Există cel
puțin un cuvânt ce conține vocale.

#include<iostream.h>

#include<string.h>

#include<conio.h>

#include<ctype.h>

void main()

{char cuv[100][100],voc[]="a,e,i,o,u";

int i,n,j,t,max,nr=0;

clrscr();

cout<<"Dati nr de cuvinte:"; cin>>n;

for(i=1;i<=n;i++){cin.get();

cin.get(cuv[i],30);

for(j=0;j<strlen(cuv[0]);j++)if(strchr(voc,cuv[0][j]))nr++;

max=nr;

for(i=2;i<=n;i++){nr=0;

for(j=0;j<strlen(cuv[i]);j++)if(strchr(voc,cuv[i][j]))nr++;

if(max<nr) max=nr;

for(i=1;i<=n;i++){nr=0;

for(j=0;j<strlen(cuv[i]); j++)if(strchr(voc,cuv[i][j]))nr++;

if(max==nr) {cout<<cuv[i];i=n+1;}

getch();

51. Scrieţi programul C/C++ care citeşte de la tastatură un cuvânt de cel mult 15 litere mici ale
alfabetului englez şi care afişează pe ecran, pe linii distincte, cuvintele obţ�inute prin ştergerea
succesivă a vocalelor din cuvântul citit, de la stânga la dreapta, ca în exemplu de mai jos:
Exemplu: Dacă se citeşte cuvântul examen se afişează:

39
Atestat 2010. Subiecte programare
xamen
xmen
xmn
#include<iostream.h>
#include<conio.h>
#include<string.h>
void main()
{clrscr();
char cuv[100],voc[]="a,e,i,o,u";
int i,n,j;
cout<<"Dati cuvantul"<<endl;
cin.get(cuv,30);
n=strlen(cuv);
for(i=0;i<n;i++)if(strchr(voc,cuv[i])){for(j=i;j<n;j++)cuv[j]=cuv[j+1];
cuv[n-1]=NULL;
cout<<cuv<<endl;
n--;
i--;
}
getch();
}

40

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