Sunteți pe pagina 1din 25

Atestat 2010.

Subiecte programare

1. Se citesc de la tastatura n numere naturale, cu cel mult 9 cifre fiecare. Scr


ieti 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 nu
marul 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;
}
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 va
loarea 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 întreg
i despărţite printr-un spaţiu. Scrieţi un program care să determine valoarea max
imă ş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 memor
iei ş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>
#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 me
todă eficientă de rezolvare atât ca timp de executare, cât şi ca gestionare a m
emoriei)
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 pri
n câte un spaţiu. Să se scrie un program care citeşte n, apoi cele n numere natu
rale din fişierul numere.in şi scrie în fişierul numere.out, pe câte o linie fie
care, 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 citit
e. În cazul în care nu există intervalul de intersec ie se afișează 0.
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;
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. Scr
ieţ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 c
el mai apropiat număr faţă de n care are aceeaşi sumă a cifrelor.
#include<iostream.h>
#include<conio.h>
int n;
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();
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ă efi
cientă 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]<<" ";
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();
}

12. Se citește din fișierul numar.txt un număr natural n. Să se verifice dacă es


te putere a lui 2 și să se calculeze frecven a de apari ie a fiecarei cifre în s
crierea î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;
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 l
inie 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;
}
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 p
e a doua linie, separate prin câte un spaţiu, n numere naturale nenule, cu cel m
ult 4 cifre fiecare. Scrieţi programul C/C++ care afiseaza pe ecran cifra de con
trol 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 ordin
e crescătoare dintre care cel pu in o putere a lui 3. Scrieţi un algoritm eficie
nt 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)
{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();
}

18. Să se scrie un program care să verifice dacă suma cifrelor de pe poziţiile i


mpare ş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 p
oziţ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)
{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 cifr
elor de pe pozitiile impare ";
else cout<<"Suma cifrelor de pe pozitiile pare nu este egala cu suma cifrelo
r de pe pozitiile impare";
getch();
}

20. Se citesc n numere naturale nenule. Să se precizeze cu câte zerouri se va te


rmina 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()
{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 d
ecâ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();
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 elem
entele 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()
{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 ma
i 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>
#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 natural
e. Să se afişeze numerele cu număr impar de divizori din matrice şi să se indic
e numărul lor.
Exemplu: se citeşte: m=2 şi n=3 şi matricea
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++)
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;
}
void main()
{clrscr();
citire();
afis(n,v);
zero(n,v);
afis(n,v);
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 co
loane, numerotate de la 1 la n. Fiecare element din matrice aflat pe o linie imp
ară 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
1 1 1 1 1
5 4 3 2 1
3 3 3 3 3
5 4 3 2 1
5 5 5 5 5
#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;
}
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();
}
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ţi
u. Scrieţi un program C/C++ care 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 int
ervalul [-100, 100] şi afişează pe ecran m1 şi m2, unde m1 este media aritmetic
ă a elementelor strict pozitive ale matricei, situate deasupra diagonalei princi
pale, iar m2 este media aritmetică a elementelor strict pozitive ale matricei, s
ituate sub diagonala principală, ca în exemplu. Cele două medii se consideră ega
le 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>
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 pri
ncipale este "<<sumaunu();
cout<<"Media aritmetica a elementelor strict pozitive de dedesubtul diagonalei p
rincipale 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 c
oloane, 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 ma
tricii, separate prin câte un spa iu.Defini i o funcţie care verifică dacă un nu
mă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
2 7 1 4
14 6 12 3
9 22 8 5
Pe ecran se va afişa:
3 1 1
#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*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);
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 s
eparate prin câte un spaţiu.
Exemplu: Pentru m=4 şi n=5 fișierul va con ine matricea alăturată

#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 cif
ră a sumei 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];
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 nu
mai elemente egale cu 1, elementele de pe cele două « semidiagonale » paralele c
u 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 :
1 2 3 4
2 1 2 3
3 2 1 2
4 3 2 1
#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 c
and n este impar.
#include<iostream.h>
#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 el


emente 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 in
e prin citirea cifrelor de pe linia respectivă de la stânga la dreapta, ignorând
u-se zerourile de la inceputul liniei).
Exemplu : Pentru matricea :
0 3 8 2 5
0 0 5 1 4
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);
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 ord


in n cu elemente numere naturale astfel încât pe ultima coloană și pe ultima lin
ie 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 imedia
t î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];
}
}
void main()
{clrscr();
citire();
formare();
afis();
getch();
}

42. Scrieţi programul C, C++ sau Pascal, care citeşte de la tastatură un şir s d
e 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 fi
nal.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();
}
44. Defini i structura frac ie care memorează în câmpul a al structurii numărăto
rul, iar în câmpul b numitorul frac iei. Citi i numitorul și numărătorul a n fra
c ii. Pentru fiecare frac ie să se verifice dacă este ireductibila, în caz afirm
ativ să se afișeze, iar în caz contrar să se afișeze numitorul și numărătorul du
pă 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 sepa
rate prin unul sau mai multe spaţii. Primul caracter din textul citit este o lit
eră, iar cuvintele sunt formate numai din litere mici ale alfabetului englez. Sc
rieţi un program C/C++ care citeşte de la tastatură textul şi îl transformă înlo
cuind prima literă a fiecărui cuvânt cu litera mare corespunzătoare, restul cara
cterelor 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;
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 ordonat
a centrului cercului și raza acestuia. Pentru un n număr natural <100, citi i da
tele 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ă o
rdonare.
#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();
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();
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 AS
CII al fiecărui caracter din s1 a unei constante k) afişând în caz afirmativ val
oarea 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();
}
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 distin
cte, 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ă:
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();
}

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