Sunteți pe pagina 1din 29

ianuarie 31

Probleme Atestat
Informatic 20132014
Subiecte i soluii
PROGRAMARE

2014

Cuprins

Subiectul 1 .............................................................................................. 3
Subiectul 2 .............................................................................................. 3
Subiectul 3 .............................................................................................. 4
Subiectul 4 .............................................................................................. 4
Subiectul 5 .............................................................................................. 5
Subiectul 6 .............................................................................................. 6
Subiectul 7 .............................................................................................. 6
Subiectul 8 .............................................................................................. 7
Subiectul 9 .............................................................................................. 8
Subiectul 10............................................................................................. 8
Subiectul 11............................................................................................. 9
Subiectul 12........................................................................................... 10
Subiectul 13........................................................................................... 10
Subiectul 14........................................................................................... 11
Subiectul 15........................................................................................... 12
Subiectul 16........................................................................................... 12
Subiectul 17........................................................................................... 13
Subiectul 18........................................................................................... 13
Subiectul 19........................................................................................... 14
Subiectul 20........................................................................................... 14

Subiectul 21........................................................................................... 15
Subiectul 22........................................................................................... 16
Subiectul 23........................................................................................... 16
Subiectul 24........................................................................................... 17
Subiectul 25........................................................................................... 17
Subiectul 26........................................................................................... 18
Subiectul 27........................................................................................... 19
Subiectul 28........................................................................................... 19
Subiectul 29........................................................................................... 20
Subiectul 30........................................................................................... 21
Subiectul 31........................................................................................... 22
Subiectul 32........................................................................................... 22
Subiectul 33........................................................................................... 23
Subiectul 34........................................................................................... 24
Subiectul 35........................................................................................... 25
Subiectul 36........................................................................................... 25
Subiectul 37........................................................................................... 26
Subiectul 38........................................................................................... 27
Subiectul 39........................................................................................... 27
Subiectul 40........................................................................................... 28

Subiectul 1
Scriei un program care citete de la tastatura un numr natural n (n<100) i un ir cu n numere ntregi din
intervalul [100, 999]. Programul construiete un ir de numere rezultat prin nlocuirea fiecrui numr din irul
citit cu numrul obinut prin interschimbarea cifrei unitilor cu cifra sutelor. Numerele din noul ir se vor afia
pe ecran separate printr-un singur spaiu.
Exemplu : pentru n=3 si irul 123 , 904 , 500
se afieaz 321 , 409 , 5.
#include <iostream>
using namespace std;
int main()
{
int n,v[100],i,x,j=0;
cout<<"n=";cin>>n;
for(i=1;i<=n;i++)
{
cout<<"x=";cin>>x;
j++;
v[j]=x%10*100+x/10%10*10+x/100;
}
n=j;
for(i=1;i<=n;i++)
cout<<v[i]<<" ";
}

Cuprins

Subiectul 2
Scriei un program care afieaz toate numerele naturale, mai mari dect 10 i mai mici dect o valoare data n,
n<=2.000.000 , formate doar din cifre identice.
Exemplu: pentru n=195 se afieaz : 11 , 22 , 33 , 44 , 55 , 66 , 77 , 88 , 99 , 111.
#include <iostream>
using namespace std;
int main()
{
int n,uc,i,ok,x;
cout<<"n=";cin>>n;
for(i=10;i<=n;i++)
{
x=i;ok=1;
uc=x%10;
while(x && ok)
{
if(uc!=x%10)
ok=0;
x/=10;
}
if(ok)
cout<<i<<" ";
}
}

Subiectul 3
n fiierul Numere.txt pe prima linie este memorat un numr natural n (n<10000), iar pe linia urmtoare un ir
de n numere naturale distincte cu maximum 4 cifre fiecare, separate prin cte un spaiu. Afiai pe prima linie a
fiierului de ieire Rezultat.out poziia pe care s-ar gsi primul element din irul aflat pe linia a doua a fiierului,
daca irul ar fi ordonat cresctor. Numerotarea poziiilor elementelor n cadrul irului este de la 1 la n.
Exemplu: Dac fiierul Numere.txt are urmtorul coninut:
6
267 13 45 628 7 79
Fiierul Rezultat.out va avea urmtorul coninut:5
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
int n,i,x,y,j=0;
ifstream f("Numere.txt");
ofstream g("Rezultat.out");
f>>n;f>>x;
for(i=2;i<=n;i++)
{
f>>y;
if(y<x)
j++;
}
g<<j+1;
f.close();
g.close();
}

Cuprins

Subiectul 4
Se citete p un numr natural. Construii n memorie o matrice ptratica cu n linii i n coloane,unde n este
numrul de cifre al numrului citit. Matricea va fi construit astfel: pe diagonal principal va conine 0, deasupra
diagonalei principale cea mai mare cifr a numrului p, iar sub diagonala principal cea mai mic cifr a
numrului p. Matricea va fi afiata pe urmtoarele n linii elementele fiecrei linii fiind separate de cte un
singur spaiu. Vei utiliza un subprogram care primete ca parametru un numr natural p de cel mult 9 cifre i
returneaz prin intermediul parametrilor n, max, min numrul de cifre, cifra maxim, respectiv cifra minim a
numrului p.
Exemplu: p=824
Se va afia:
088
208
220
#include <iostream>
using namespace std;
void s(int p,int &n,int &max,int &min)
{
n=0;max=0;min=9;
while(p)
{
n++;
if(p%10>max)
max=p%10;
if(p%10<min)
min=p%10;
p/=10;
}
}

int main()
{
int a[10][10],n,i,j,max,min,p;
cout<<"p=";cin>>p;
s(p,n,max,min);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i==j)
a[i][j]=0;
else
if(i<j)
a[i][j]=max;
else
a[i][j]=min;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
}

Cuprins

Subiectul 5
Se citete un cuvnt format doar din litere mici, separate prin unul sau mai multe spaii. Definim randamentul
unui cuvnt ca fiind numrul de caractere distincte din cuvnt / lungimea cuvntului. De exemplu irul
caractere are randamentul 1/9=0.11. Afiai n fiierul Rezultate.out, randamentul cuvntului citit cu dou
zecimale.
Exemplu: dac se citete cuvntul:
probleme
Fiierul Rezultate.out va avea urmtorul coninut:
0.75

#include <iostream>
#include <cstring>
#include <iomanip>
#include <fstream>
using namespace std;
int main()
{
char s[100];
int k=0,n,i,fr[32]={0};
ofstream g("Rezultate.out");
cout<<"Introduceti cuvantul:";
cin.get(s,100);
n=strlen(s);
for(i=0;s[i];i++)
fr[s[i]-'a']++;
for(i=0;i<=32;i++)
if(fr[i]==1)
{
cout<<(char)(i+'a')<<" ";
k++;
}
cout<<"Numarul de caractere distincte este "<<k<<"."<<endl;
cout<<"Lungimea sirului de caractere este "<<n<<"."<<endl;
cout<<"Randamentul cu doua zecimale ";
cout<<" este "<<fixed<<setprecision(2)<<(float)k/n<<".";
g<<fixed<<setprecision(2)<<(float)k/n;
g.close();
}

Subiectul 6
O matrice ptratic A de dimensiune n cu p elemente nenule este memorat economic n fiierul de intrare
Matrice.txt sub urmtoarea form.: pe prima linie a fiierului se gsesc dou numere n i p, dimensiunea
matricei respectiv numrul de elemente nenule iar pe urmtoarele p linii triplete de numere naturale (v, l, c)
care reprezint valoarea, linia respectiv coloana pe care se gsesc elementele nenule. Scriei un program care
citete informaiile din fiierul de intrare, reface i scrie n fiierul de ieire Matrice.out matricea A.
Exemplu: dac fiierul Matrice.txt are urmtorul coninut:
58
111
512
123
225
332
441
243
854
Fiierul Matrice.out va avea urmtorul coninut:

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
int a[100][100]={0},n,p,v,l,c,i,j,k;
ifstream f("Matrice.txt");
ofstream g("Matrice.out");
f>>n>>p;
for(k=1;k<=p;k++)
{
f>>v>>l>>c;
i=l;j=c;
a[i][j]=v;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
g<<a[i][j]<<" ";
g<<endl;
}
f.close();
g.close();
}

Cuprins

Subiectul 7
Pentru un ir de caractere s, citit de la tastatur s se construiasc i s se afieze un ablonacesta fiind un alt
ir de caractere de aceiai lungime cu s, ce conine doar caractere din mulimea {*, ?, #}, astfel nct fiecare
poziie din s n care se gsete o vocal s fie codificat cu caracterul *, pe fiecare poziie din s n care apare o
consoan s fie codificat cu # i pe fiecare poziie din s n care apare orice alt caracter s fie codificat cu ?. Se
consider vocal orice liter din mulimea {a,e,i,o,u}.
Exemplu: pentru irul: informatica_
Pe ecran se va afia
*##*##*#*#*?

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[100];
int i;
cout<<"Introduceti sirul:";
cin.get(s,100);
for(i=0;s[i];i++)
{
if(isalnum(s[i])==0)
cout<<"?";
else
if(strchr("aeiou",s[i])==0)
cout<<"#";
else
cout<<"*";
}
}

Cuprins

Subiectul 8
Fiierul atestat.in conine dou linii. Pe prima linie este scris un numr natural nenul n, (5<n<30).Pe cea de-a
doua linie a fiierului sunt scrise n numere naturale separate prin cte un spaiu, formate fiecare din cel mult 4
cifre, reprezentnd un ir de n numere naturale. irul conine cel puin dou numere impare.
S se scrie un program care:
a) s afieze pe ecran, n linie, n ordinea invers citirii, toate numerele din ir,separate prin cte un spaiu;
b) s afieze pe ecran, n linie, numrul de cifre din care este format fiecare numrdin irul iniial, separndu-le
prin cte un spaiu;
Exemplu:
Dac fiierul atestat.in conine:
6
13 555 71 2 242 1001
Se va afia:
1001 242 2 71 555 13
232134
#include <iostream>
#include <fstream>
using namespace std;
int contor(int x)
{
if(x==0)
return 0;
else
return contor(x/10)+1;
}
int main()
{
int n,v[30],i;
ifstream f("atestat.in");
f>>n;
for(i=1;i<=n;i++)
f>>v[i];
//a
for(i=n;i>=1;i--)
cout<<v[i]<<" ";
cout<<endl;
//b
for(i=1;i<=n;i++)
cout<<contor(v[i])<<" "; f.close();
}

Subiectul 9
Fiierul atestat.in conine o singur linie pe care se afl scris un text format din cel mult 200 de caractere,
primul caracter fiind liter, iar cuvintele din text sunt separate prin cte un spaiu. Fiecare cuvnt este format
doar din litere mari sau mici ale alfabetului limbii engleze.
S se scrie un program care:
c) s afieze textul pe o singur linie a ecranului, scris cu majuscule;
d) s afieze n fiierul atestat.out numrul consoanelor din text;
Exemplu:
atestat.in
Imi place Informatica
Se va afia:
IMI PLACE INFORMATICA
10
#include <iostream>
#include <cstring>
#include <fstream>
using namespace std;
int main()
{
char s[200];
int i,nr=0;
ifstream f("atestat.in");
ofstream g("atestat.out");
f.get(s,200);
cout<<strupr(s)<<endl;
for(i=0;s[i];i++)
if(strchr("AEIOU",s[i])==0 and s[i]!=' ')
nr++;
g<<nr;
//sau
i=0;
while(s[i])
{
if(s[i]>='A' && s[i]<='Z' || s[i]==' ')
i++;
else
s[i]=toupper(s[i]);//s[i]=s[i]-32;
}
for(i=0;s[i];i++)
if(strchr("AEIOU",s[i])==0 and s[i]!=' ')
nr++;
cout<<s<<endl;
g<<nr;
f.close();
g.close();
}

Cuprins

Subiectul 10
10. Se citete de la tastatur un ir de n numere naturale de maxim 9 cifre (n<=100). S se afieze pe ecran cifra
de control a numerelor din ir. Se va utiliza un subprogram care determin suma cifrelor unui numr natural.
Cifra de control a unui numr se obine calculnd suma cifrelor numrului, apoi se realizeaz suma cifrelor
sumei numrului, .a.m.d. pn cnd se obine ca sum un numr de o cifr.
Exemplu: n=6
13, 452, 1198, 986, 24, 881
Se va afia:
4, 2, 1, 5, 6, 8

#include <iostream>
using namespace std;
int suma(int x)
{
int s=0;
while(x)
{
s=s+x%10;
x/=10;
}
return s;
}
int main()
{
int n,i,v[100];
cout<<"n=";cin>>n;
for(i=1;i<=n;i++)
{
cout<<"v["<<i<<"]=";
cin>>v[i];
}
for(i=1;i<=n;i++)
{
while(v[i]>9)
{
v[i]=suma(v[i]);
}
cout<<v[i]<<" ";
}
}

Cuprins

Subiectul 11
Scriei programul care citete de la tastatur un numr natural n (1 <n<10), apoi n*n numere ntregi, mai mici
dect 32000, reprezentnd elementele unui tablou bidimensional cu n linii i n coloane, i care determin i
afieaz pe ecran ultima cifr a produsului numerelor prime de pe diagonala principal a tabloului sau mesajul
imposibil dac nu exist numere prime.
Exemplu: n=4
15 10 9 2
40 12 13 2
20 14 7 7
31 15 14 2
Se va afia 4(deoarece produsul este 14)
#include <iostream>
using namespace std;
int prim(int x)
{
int d;
for(d=2;d<=x/2;d++)
if(x%d==0)
return 0;
return 1;
}

int main()
{
int a[10][10],n,i,j,p=1;
cout<<"n=";cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
cout<<"a["<<i<<"]["<<j<<"]=";
cin>>a[i][j];
}
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
if(i==j && prim(a[i][j]))
p=p*a[i][j];
cout<<p%10;
}

Subiectul 12
Scriei un program C/C++ care citete de la tastur un numr natural n cu cel mult 8 cifre (n10) i care creeaz
fiierul text NR.TXT ce conine numrul n i toate prefixele nenule ale acestuia, pe o singur linie, separate prin
cte un spaiu, n ordine descresctoare a valorii lor.
Exemplu: pentru n=10305 fiierul NR.TXT va conine numerele:
10305 1030 103 10 1

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
int n;
ofstream f("NR.TXT");
cout<<"n=";cin>>n;
while(n)
{
f<<n<<" ";
n/=10;
}
f.close();
}

Cuprins

Subiectul 13
Se consider un text alctuit din cel mult 250 de caractere, n care cuvintele sunt formate doar din litere mici ale
alfabetului englez i sunt separate prin unul sau mai multe caractere *. Scriei un program C/C++ care citete
de la tastatur textul i afieaz pe ecran, pe cte o linie, toate secvenele formate din cte dou litere identice,
ca n exemplu.
Exemplu: dac textul citit este:
cand*lucreaza**pe*grupe***copiii*trebuie*sa*coopereze
se afieaz perechile de mai jos
ii
ii
oo

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[250],*p,cuv[25];
int i;
cout<<"Introduceti textul: ";
cin.get(s,250);
p=strtok(s,"*");
while(p)
{
strcpy(cuv,p);
for(i=0;cuv[i];i++)
if(cuv[i]==cuv[i+1])
cout<<cuv[i]<<cuv[i+1]<<endl;
p=strtok(NULL,"*");
}
}

Subiectul 14
Se citesc de la tastatur dou numere naturale: n i m de maxim 9 cifre fiecare. S se afieze cte cifre comune
au cele dou numere citite i care sunt aceste cifre.
Exemplu : Numerele 21348 i 14513 au 3 cifre comune : 1, 3, 4.

#include <iostream>
using namespace std;
int main()
{
int n,m,nr=0,frn[10]={0},frm[10]={0},i;
cout<<"n=";cin>>n;
cout<<"m=";cin>>m;
while(n)
{
frn[n%10]++;
n/=10;
}
while(m)
{
frm[m%10]++;
m/=10;
}
for(i=0;i<10;i++)
if(frn[i]!=0 and frm[i]!=0)
{cout<<i<<" ";nr++;}
cout<<endl<<nr;
}

Cuprins

Subiectul 15
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 tastatur, afieaz pe ecran cte numere n scrierea crora apare cifra k, se gsesc n irul dat.
Exemplu: pentru n=4 , cifra k=2 si valorile citite 23, 603, 122, 27 se obtine numarul nr = 3.

#include <iostream>
using namespace std;
int main()
{
int n,i,k,nr=0,ok,x;
cout<<"n=";cin>>n;
cout<<"k=";cin>>k;
for(i=1;i<=n;i++)
{
cout<<"x=";cin>>x;
ok=0;
while(x && !ok)
{
if(x%10==k)
ok=1;
x/=10;
}
if(ok==1)
nr++;
}
cout<<nr;
}

Cuprins

Subiectul 16
Se citesc de la tastatur n numere naturale, cu cel mult 9 cifre fiecare. Scriei un program care afieaz cifra care
apare de cele mai multe ori n numerele citite. Dac exist mai multe astfel de cifre se vor afia toate.
Exemplu: Pentru n=4 i valorile 23, 431, 154, 452 se afieaz 4 pentru c cifra 4 apare de 3 ori n numerele
citite.

#include <iostream>
using namespace std;
int main()
{
int n,fr[10]={0},i,x,max=0;
cout<<"n=";cin>>n;
for(i=1;i<=n;i++)
{
cout<<"x=";cin>>x;
while(x)
{
fr[x%10]++;
if(fr[x%10]>max)
max=fr[x%10];
x/=10;
}
}
for(i=0;i<10;i++)
if(fr[i]==max)
cout<<i<<" ";
}

Subiectul 17
Fiierul numere.in conine pe prima linie mai multe numere naturale n ordine cresctoare dintre care cel puin
o putere a lui 3. Scriei un program care afieaz pe ecran numerele din fiier ce sunt puteri ale lui 3.
Exemplu: 27, 43, 54, 81, 452, 729 se afieaz 27, 81,729.

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
int x,c;
ifstream f("numere.in");
while(f>>x)
{
c=x;
while(x%3==0)
x=x/3;
if(x==1)
cout<<c<<" ";
}
f.close();
}

Cuprins

Subiectul 18
S se scrie un program care s verifice dac suma cifrelor de pe poziiile impare i suma cifrelor de pe poziiile
pare ale unui numr natural n citit de la tastatur sunt egale. Poziiile se numr de la dreapta la stnga
ncepnd cu poziia 1. Se afieaz sumele i un mesaj corespunztor pe ecran.
Exemplu: se citete: n=12345 i se afieaz: sp=6 i simp=9 Nu coincid!.

#include <iostream>
using namespace std;
int main()
{
int n,sp=0,simp=0,i=0;
cout<<"n=";cin>>n;
while(n)
{
i++;
if(i%2!=0)
simp=simp+n%10;
else
sp=sp+n%10;
n/=10;
}
cout<<"sp="<<sp<<" si simp="<<simp<<" ";
if(sp!=simp)
cout<<"Nu coincid!";
else
cout<<"Coincid!";
}

Subiectul 19
Se consider o matrice oarecare de dimensiune mxn cu elemente numere naturale. S se afieze numerele cu
numr impar de divizori din matrice i s se indice numrul lor. Exemplu: se citete: m=2 i n=3 i matricea
12 7 25
4 11 8
se afieaz: 4, 25, 2 numere.

#include <iostream>
using namespace std;
int main()
{
int a[10][10],n,m,i,j,d,k,nr=0;
cout<<"m=";cin>>m;
cout<<"n=";cin>>n;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{
cout<<"a["<<i<<"]["<<j<<"]=";
cin>>a[i][j];
}
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{k=2;
for(d=2;d<=a[i][j]/2;d++)
if(a[i][j]%d==0)
k++;
if(k%2!=0)
{cout<<a[i][j]<<", ";nr++;}
}
cout<<nr<<" numere";
}

Cuprins

Subiectul 20
Scriei un program C/C++ care citete 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 afia pe prima linie a ecranului numrul de elemente prime de pe fiecare coloana a matricii,
separate prin cte un spaiu. Definii o funcie care verific dac un numr ntreg este prim i folosii apeluri ale
ei pentru rezolvarea cerinei.Exemplu: pentru m=3 i n=4 i tabloul de mai jos
17 1 4
4 6 12 3
9 22 8 5
Pe ecran se va afia:
1112

#include <iostream>
using namespace std;
int prim(int x)
{
int d;
for(d=2;d<=x/2;d++)
if(x%d==0)
return 0;
return 1;
}

int main()
{
int a[50][50],m,n,i,j,nr;
cout<<"m=";cin>>m;
cout<<"n=";cin>>n;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{
cout<<"a["<<i<<"]["<<j<<"]=";
cin>>a[i][j];
}
for(j=1;j<=n;j++)
{ nr=0;
for(i=1;i<=m;i++)
if(prim(a[i][j]))
nr++;
cout<<nr<<" ";
}
}

Subiectul 21
Se d o nregistrare cu numele cerc, n care sunt stocate abscisa i ordonata centrului cercului i raza acestuia.
Pentru un n numr natural <100, citii datele pentru n cercuri i sortai structurile descresctor n funcie de
diametru. Exemplu: pentru n=4 i perechile de forma (x,y,r): (2,3,4) (1,2,7) (3,2,6) (7,8,5)
Se afieaz:
(1,2) d=14
(3,2) d=12
(7,8) d=10
(2,3) d=8

#include <iostream>
using namespace std;
int main()
Cuprins
{
struct cerc
{
int abscisa,ordonata,r,d;
} x[100],aux;
int n,i,j;
cout<<"n=";cin>>n;
for(i=1;i<=n;i++)
{
cout<<"Cercul nr. "<<i<<":";
cout<<"Abscisa cercului nr. "<<i<<":";cin>>x[i].abscisa;
cout<<"Ordonata cercului nr. "<<i<<":";cin>>x[i].ordonata;
cout<<"Raza cercului nr. "<<i<<":";cin>>x[i].r;
x[i].d=2*x[i].r;
}
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
if(x[i].d<x[j].d)
{
aux=x[i];x[i]=x[j];x[j]=aux;
}
for(i=1;i<=n;i++)
cout<<"("<<x[i].abscisa<<","<<x[i].ordonata<<")d="<<x[i].d<<endl;
}

Subiectul 22
Se citesc de la tastatur elementele unui vector cu n numere naturale sortat cresctor i un numr natural k. S
se insereze numrul k n irul dat astfel nct irul s rmn sortat cresctor. Exemplu: n=4 i k=100 i
numere: 90 95 110 120
Se va afia : 90 95 100 110 120.

#include<iostream>
using namespace std;
int main()
{
int v[100],n,i,s,d,m,k;
cout<<"n=";cin>>n;
cout<<"k=";cin>>k;
for(i=1;i<=n;i++)
{
cout<<"v["<<i<<"]=";
cin>>v[i];
}
s=1;d=n;
while(s<=d)
{
m=(s+d)/2;
if(k<v[m])
d=m-1;
else
s=m+1;
}
for(i=n+1;i>s;i--)
v[i]=v[i-1];
v[s]=k;
for(i=1;i<=n+1;i++)
cout<<v[i]<<" ";
}

Cuprins

Subiectul 23
Fiierul note.in conine pe prima linie un numr natural n (2 < n < 100), iar pe a doua linie sunt n numere
naturale cuprinse ntre 1 i 10, reprezentnd notele a n elevi dintr-o clas, cel puin 3 note fiind distincte. S se
scrie un program care determin i afieaz pe ecran media aritmetic a celor n note, tiind c notele cele mai
mici (<5) i notele cele mai mari(>=9) nu se iau n considerare la calculul mediei.
Exemplu: note.in
5
28497
Se va afia: 7.5 (deoarece notele 2, 4 i nota 9 se elimin).

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
int x,n,k=0,i,s=0;
ifstream f("note.in");
f>>n;
for(i=1;i<=n;i++)
{
f>>x;
if(x>=5 && x<9)
{s=s+x;k++;}
}
cout<<(float)s/k; f.close();
}

Subiectul 24
Se citesc din fiierul numere.in mai multe numere naturale nenule de cel mult 6 cifre pn la ntlnirea
numrului 0. S se afieze n fiierul numere.out numerele prime.
Exemplu:
numere.in
25 31 100 123456 23 0
numere.out
31 23

#include <iostream>
#include <fstream>
using namespace std;
int prim(int x)
{
int d;
for(d=2;d<=x/2;d++)
if(x%d==0)
return 0;
return 1;
}
int main()
{
int x;
ifstream f("numere.in");
ofstream g("numere.out");
f>>x;
while(x)
{
if(prim(x))
g<<x<<" ";
f>>x;
}
f.close();
g.close();
}

Cuprins

Subiectul 25
Fiierul numere.in conine pe prima linie numrul natural n (2 < = n < = 25000), pe a doua linie un ir de n
numere naturale cuprinse ntre 1 i 1000, iar pe a treia linie un numr natural x cuprins ntre 1 i 1000. S se
memoreze irul ntr-un vector i s se nlocuiasc toate elementele egale cu x cu produsul dintre x i numrul
divizorilor lui x. Vectorul rezultat va fi afiat n fiierul numere.out.
Exemplu:
numere.in

7
3 3 3 999 3 67 24
3
numere.out
6 6 6 999 6 67 24
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
int n,v[100],i,x,d,nr;
ifstream f("numere.in");
ofstream g("numere.out");
f>>n;
for(i=1;i<=n;i++)
{
f>>v[i];
}
f>>x;
for(i=1;i<=n;i++)
{
if(v[i]==x)
{
nr=2;
for(d=2;d<=v[i]/2;d++)
if(v[i]%d==0)
nr++;
v[i]=nr*x;
}
g<<v[i]<<" ";
}
f.close();
g.close();
}

Cuprins

Subiectul 26
Se tie c orice numr par n>=4 se poate scrie ca sum a doua numere prime. S se afieze n fiierul sume.txt
toate sumele posibile de numere prime ce dau ca rezultat n.Exemplu:pentru n=20 se vor afia sumele 1+19,
3+17, 7+13, 13+7, 17+3,19+1.
#include <iostream>
#include <fstream>
using namespace std;
int prim(int x)
{
int d;
for(d=2;d<=x/2;d++)
if(x%d==0)
return 0;
return 1;
}
int main()
{
ofstream f("sume.txt");
int n,a,b;cout<<"n=";cin>>n;
if(n%2!=0)
cout<<"Numarul trebuie sa fie par!";
else
if(n==4)
cout<<2<<" + "<<2;
else
{
for(a=1;a<=n;a++,a++)
if(prim(a))
{
b=n-a;if(prim(b))
f<<a<<" + "<<b<<endl;
}
} f.close();
}

Subiectul 27
Din fiierul propozitie.in se citete un ir de caractere, reprezentnd mai multe cuvinte separate ntre ele prin
urmtorii separatori: ,, ;, ,!,?. S se verifice dac dup eliminarea acestora irul este palindromic ( se va afia DA
n caz afirmativ i NU n caz contrar).Exemplu: pentru propozitia
Ele fac cafele ? se afieaz DA.

#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
int main()
{
ifstream f("propozitie.in");
char s[200],inv[200];
int i;
f.get(s,200);
i=0;
while(s[i])
if(strchr(",:;.!? ",s[i]))
strcpy(s+i,s+i+1);
else
i++;
strupr(s);strcpy(inv,s);
if(strcmp(s,strrev(inv))==0)
cout<<"DA";
else
cout<<"NU";
f.close();
}

Cuprins

Subiectul 28
Definim operaia de compactare a unui tablou ca fiind eliminarea zerourilor din tablou. Dac ntlnim un
element nul toate elementele situate la dreapta sa vor deplasa cu o poziie la stnga, n locul su. Se citesc
elementele unui tablou cu n numere intregi, se cere s-l compactai. Exemplu: pentru n=4 i numerele: 9 0 0 5
Se va afia 9 5.

Metoda nr.1 - cu ajutorul unui vector auxiliar n care se rein valorile diferite de 0. Metoda este simpl, dar nu
respect n totalitate cerinele problemei.

#include <iostream>
using namespace std;
int main()
{
int n,v[100],a[100],j=0,i;
cout<<"n=";cin>>n;
for(i=1;i<=n;i++)
{
cout<<"v["<<i<<"]=";
cin>>v[i];
}
for(i=1;i<=n;i++)
if(v[i]!=0)
{
j++;a[j]=v[i];
}
n=j;
for(i=1;i<=n;i++)
cout<<a[i]<<" ";
}

Metoda nr.2, mai complex, dar respect n totalitate cerinele problemei.

#include <iostream>
using namespace std;
int v[100],n,poz1,poz2,i;
int pozitie(int poz)
{
while(poz<n && v[poz]==0)
poz++;
if(poz<=n && v[poz]!=0)
return poz;
else
return 0;
}
int main()
{
cout<<"n=";cin>>n;
for(i=1;i<=n;i++)
{
cout<<"v["<<i<<"]=";
cin>>v[i];
}
/*
cautam pozitia primului element 0 in vector
si memoram pozitia acestuia in poz1
*/
for(poz1=1;poz1<n && v[poz1]!=0;poz1++);
if(v[poz1]==0)
{
/*
cautam pozitia primului element diferit de 0
si memoram pozitia in poz2
*/
poz2=pozitie(poz1+1);
/*
cat timp poz2 exista
atribuim elementului de la poz1
valoarea elementului de la poz2
*/
while(poz2!=0)
{
v[poz1]=v[poz2];
poz1++;
poz2=pozitie(poz2+1);
}
n=poz1-1;//pozitia ultimului element din vectorul compactat
}
for(i=1;i<=n;i++)
cout<<v[i]<<" ";
}

Cuprins

Subiectul 29
Se citesc mai multe cuvinte din fiierul iruri.txt. Afisati pe ecran, cuvintele ordonate lexicografic.Exemplu:
Siruri.txt conine maine am examen, pe ecran se afieaz am examen maine.

#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
int main()
{
ifstream f("siruri.txt");
char s[200],*p,cuv[20][20],aux[20];
int i=0,n,j;
f.get(s,200);
p=strtok(s," ");
while(p)
{
i++;
strcpy(cuv[i],p);
p=strtok(NULL," ");
}
n=i;
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
if(strcmp(cuv[i],cuv[j])>0)
{
strcpy(aux,cuv[i]);
strcpy(cuv[i],cuv[j]);
strcpy(cuv[j],aux);
}
for(i=1;i<=n;i++)
cout<<cuv[i]<<" ";
f.close();
}

Cuprins

Subiectul 30
Folosind vectori de structur, s se calculeze pentru n numere complexe modulul lor. Vectorii se vor citi dintrun fiier complexe.in care va conine pe fiecare rnd partea real i coeficientul prii imaginare a fiecrui
numr complex.
Exemplu: complexe.in 3 i apoi pe cte o linie 3 4, 6 3, 2 7, se va afia, pe cte o linie 5, 6.7, 7.3.
#include <iostream>
#include <fstream>
#include <cmath>
#include <iomanip>
using namespace std;
int main()
{
struct complex
{
float real,imaginar, modulul;
}c[20];
int n,i=0;
ifstream f("complexe.in");
f>>n;
for(i=1;i<=n;i++)
{
f>>c[i].real>>c[i].imaginar;
c[i].modulul=sqrt(pow(c[i].real,2)+pow(c[i].imaginar,2));
}
for(i=1;i<=n;i++)
cout<<fixed<<setprecision(1)<<c[i].modulul<<endl;
f.close();
}

Subiectul 31
tiind c orice numr natural se poate scrie ca sum de puteri distincte ale lui 2, s se determine o modalitate de
scriere a numrului n, citit de la tostatura, ca sum de puteri ale lui 2 n fiierul suma.txt.
Exemplu: n=5
suma.txt 22+20
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
int main()
{
int n,x,nr,i;
ofstream f("suma.txt");
cout<<"n="; cin>>n;
/*determinam cea mai mare putere a lui 2
in scrierea lui n si o salvam in variabila x*/
for(i=0; i<=n/2; i++)
if(pow(2,i)<=n)
x = i;
//afisam cea mai mare putere a lui 2
f<<2<<" ^ "<<x<<" ";
nr = pow(2,x);
/*determinam exponentii care sunt mai mici
decat exponentul maxim si ii afisam*/
for(i=x-1; i>=0; i--)
if(nr + pow(2,i) <= n)
{
f<<2<<" ^ "<<i<<" ";
nr=nr+pow(2,i);
}
f.close();
}

Cuprins

Subiectul 32
Fiind dat o matrice patratic de dimensiune n, s se afieze n fiierul matrice.txt aceast matrice, fr a afia
cele 2 diagonale i s se calculeze media artimetic a elementelor pozitive i media geometric a elementelor
negative din matrice.
Exemplu:n=3
123
-4 5 -6
7 -8 9
matrice.txt
2
-4 -6
-8

4.5 media arithmetic a elementelor pozitive

5.769 media geometric a elementelor negative

#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
int main()
{
int a[10][10],n,i,j,p=1,sp=0,k=0,w=0;
ofstream f("matrice.txt");
cout<<"n=";cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>a[i][j];
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
if(i!=j && i+j!=n+1)
f<<a[i][j]<<" ";
f<<endl;
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(a[i][j]>=0)
{sp=sp+a[i][j];k++;}
else
{p=p*a[i][j];w++;}
f<<endl<<(float)sp/k<<endl;
if(p<0)
p=-p;
f<<endl<<pow(p,1.0/w);
f.close();
}

Cuprins

Subiectul 33
Pe fiecare linie a fiierului numere.txt este scris cte un numr natural n. S se gseasc pentru fiecare numr
citit cel mai mare numr prim strict mai mic decat n i cel mai mic numr prim mai mare strict decat n i s se
afieze aceste dou numere n fiierul rezultate.txt.
Exemplu:
numere.txt
7
36
10
18
rezultate.txt
5 11
31 37
7 11
17 19
#include <iostream>
#include <fstream>
#include <limits.h>
using namespace std;
int prim(int x)
{
int d;
for(d=2;d<=x/2;d++)
if(x%d==0)
return 0;
return 1;
}

int main()
{
ifstream f("numere.txt");
ofstream g("rezultate.txt");
int n,a,b,i;
while(f>>n)
{
for(i=n-1;i>=0;i--)
if(prim(i))
{a=i;break;}
for(i=n+1;i<INT_MAX;i++)
if(prim(i))
{b=i;break;}
g<<a<<" "<<b<<endl;
}
f.close();
g.close();
}

Subiectul 34
Se citesc din fiierul fractii.txt cte dou numere, reprezentnd numratorul i numitorul fiecrei fracii. S se
afieze n fiierul rezultate.txt aceste fracii simplificate.
Exemplu:
fractii.txt
64
10 5
150 20
rezultate.txt
32
21
15 2
#include <iostream>
#include <fstream>
using namespace std;
int cmmdc(int a,int b)
{
int r;
while(b)
{
r=a%b;
a=b;
b=r;
}
return a;
}
int main()
{
int x,y,z;
ifstream f("fractii.txt");
ofstream g("rezultate.txt");
while(f>>x>>y)
{
z=cmmdc(x,y);
g<<x/z<<" "<<y/z<<endl;
}
f.close();
g.close();
}

Cuprins

Subiectul 35
Se citesc din fisierul text numere.txt, numere ntregi. S se calculeze cel mai mare divizor comun dintre
numerele de pe poziii impare(primul numr, al treilea, etc,) i cel mai mic multiplu comun dintre numerele de
pe poziii pare (al doilea numar, al patrulea, etc) i s se afieze.
Exemplu:
numere.txt: 2 3 18 5 27
cmmdc(2,18,27)=1
cmmmc(3,5)=15
#include <iostream>
#include <fstream>
using namespace std;
int cmmdc(int a,int b)
{
int r;
while(b)
{
r=a%b;
a=b;
b=r;
}
return a;
}
int cmmmc(int a,int b)
{
return (a*b)/cmmdc(a,b);
}
int main()
{
ifstream f("numere.txt");
int i,a,b,x,y,z,w,t;
i=5;
f>>x>>y>>z>>t;
a=cmmdc(x,z);
b=cmmmc(y,t);
while(f>>w)
{
if(i%2)
a=cmmdc(a,w);
else
b=cmmmc(b,w);
i++;
}
cout<<a<<" "<<b;
f.close();
}

Cuprins

Subiectul 36
Un numr a este imperfect dac suma divizorilor si, exceptnd numrul nsui este mai mic dect a. Fiind dat
un numr n de la tastatur s se construiasc vectorul cu primele n numere imperfecte.
Exemplu:n=5 se afieaz 2 3 4 5 7

#include <iostream>
using namespace std;
int imperfect(int x)
{
int s=1,d;
for(d=2;d<=x/2;d++)
if(x%d==0)
s+=d;
return (s<x);
}
int main()
{
int n,i,k,j=0,v[100];
cout<<"n=";cin>>n;
for(i=1,k=1;k<=n;i++)
if(imperfect(i))
{j++;v[j]=i;k++;}
for(i=1;i<=n;i++)
cout<<v[i]<<" ";
}

Subiectul 37
Se citesc mai multe cuvinte din fiierul de intrare fraze.txt. S se afieze, pe cte un rnd, cuvintele din fiier,
lungimile lor i s se afieze n final lungimea maxim i minim a cuvintelor citite din fiier.
Exemplu:
eu sunt printre cei cuminti din scoala
Eu 2
Sunt 4
Printre 7
Cei 3
Cuminti 7
Din 3
Scoala 6
Lungimea minima a cuvintelor este 2
Lungimea maxima a cuvintelor este 7

Cuprins

#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
int main()
{
ifstream f("fraze.txt");
char s[255],*p;
int min,max;
f.get(s,255);
f.close();
p=strtok(s," ");
min=255;max=0;
while(p)
{
*p=toupper(*p);
cout<<p<<" "<<strlen(p)<<endl;
if(strlen(p)>max)
max=strlen(p);
if(strlen(p)<min)
min=strlen(p);
p=strtok(NULL," ");
}
cout<<"Lungimea minima a cuvintelor este "<<min<<endl;
cout<<"Lungimea maxima a cuvintelor este "<<max;
}

Subiectul 38
Se citete un ir de numere naturale pn la citirea lui 0 (care nu face parte din ir). S se calculeze media
aritmetic a numerelor de 3 cifre din ir care au cel puin o cifr egal cu k, citit de la tastatur.
Exemplu:k=5
Pentru irul 2, 751, 215, 210, 2157, 85, 550, 620, 0 media aritmetic este 505.3

#include <iostream>
#include <iomanip>
using namespace std;
int contor(int x,int k)
{
int i=0,ok=0;
while(x)
{
i++;
if(k==x%10)
ok=1;
x/=10;
}
return (i==3 and ok==1);
}
int main()
{
int n,s=0,k,i=0;
cout<<"k=";cin>>k;
cout<<"n=";cin>>n;
while(n)
{
if(contor(n,k))
{
s+=n;i++;
}
cout<<"n=";cin>>n;
}
cout<<fixed<<setprecision(1)<<(float)s/i;
}

Cuprins

Subiectul 39
S se realizeze un program care s afieze numerele din fiierul atestat.in care au numrul cifrelor pare egal cu
numrul cifrelor impare. Afiai i numrul acestor numere. Exemplu: atestat.in : 12 1524 99 6543
Se va afisa : 12 1524 6543

#include <iostream>
#include <fstream>
using namespace std;
int egale(int x)
{
int cp=0,ci=0;
while(x)
{
if(x%2==0)
cp++;
else
ci++;
x/=10;
}
return (cp==ci);
}

int main()
{
ifstream f("atestat.in");
int x,k=0;
while(f>>x)
{
if(egale(x))
{cout<<x<<" ";k++;}
}
f.close();
cout<<endl<<"S-au gasit "<<k<<" numere.";
}

Subiectul 40
Realizai un program care s foloseasc un subprogram recursiv pentru afiarea numerelor ce conin numrul
maxim de cifre distincte, citirea celor n valori intregi se face de la tastatur. Exemplu: n=5 , 121 38 7 1188 22 se
va afia: 1188 38 121.

#include <iostream>
using namespace std;
int v[100],n;
int contor_distincte(int x)
{
int fr[10]={0},i,c=0;
while(x)
{
fr[x%10]=1;
x/=10;
}
for(i=0;i<10;i++)
if(fr[i]==1)
c++;
return c;
}
void afisare(int i,int max)
{
if(i!=n)
{
afisare(i+1,max);
if(contor_distincte(v[i])==max)
cout<<v[i]<<" ";
}
}
int main()
{
int x,j=0,k,max=0;
cout<<"n=";cin>>n;
for(k=1;k<=n;k++)
{
cout<<"x=";cin>>x;
v[j]=x;j++;
if(contor_distincte(x)>max)
max=contor_distincte(x);
}
afisare(0,max);
}

Cuprins