Sunteți pe pagina 1din 11

PROBLEME REZOLVATE

Subprograme - Functii
1. Din fisierul matrice.in se citesc dou numere naturale n si m (n,m<=100) si apoi citeste o matrice cu n linii si m coloane, cu
elemente numere naturale din intervalul [0,10000].
Afisati ordine strict cresctoare elementele din matrice care au proprietatea c se afl pe linii care au elementele n ordine strict
cresctoare sau strict descresctoare. (Se va folosi algoritmul de interclasare).
Afisarea se va face in fisierul matrice.out.
86
123456
4 5 6 7 9 10
323232
954321
453444
987652
354333
456789
se va afisa:
1 2 3 4 5 6 7 8 9 10

#include <fstream>
using namespace std;
ifstream fin("interlin.in");
ofstream fout("interlin.out");
void citire(int A[], int n)
{ for(int i=1;i<=n;i++) fin>>A[i]; }
void afisare(int A[], int n)
{ for(int i=1;i<=n;i++) fout<<A[i]<<" "; }
int verifscresc(int A[], int n)
{ for(int i=2;i<=n;i++)
if(A[i]<=A[i-1]) return 0;
return 1;
}
int verifsdesc(int A[], int n)
{ for(int i=2;i<=n;i++)
if(A[i]>=A[i-1]) return 0;
return 1;
}
void reuniune(int A[], int n, int B[], int m, int C[], int &k)
{ k=0; int i=1,j=1;
while(i<=n && j<=m)
if(A[i]<B[j]) C[++k]=A[i++];
else if(B[j]<A[i]) C[++k]=B[j++];
else { C[++k]=A[i++]; j++; }
while(i<=n) C[++k]=A[i++];
while(j<=m) C[++k]=B[j++];
}
void copiaza(int A[], int n, int B[], int &m)
{ m=n;
for(int i=1;i<=n;i++) B[i]=A[i];
}
void copiazainvers(int A[], int n, int B[], int &m)
{ m=n;
for(int i=1;i<=n;i++)
B[i]=A[n+1-i];
}

int main()
{
int n,m,X[10001],B[10001],k=0;
int Y[10001],p,Z[10001],r;
fin>>n>>m;
for(int i=1;i<=n;i++)
{
citire(B,m);
if(verifscresc(B,m) || verifsdesc(B,m))
{
if(verifscresc(B,m)) copiaza(B,m,Y,p);
else copiazainvers(B,m,Y,p);
reuniune(X,k,Y,p,Z,r);
copiaza(Z,r,X,k);
}
}
afisare(X,k);
return 0;
}
2. Din fisierul matrice.in se citesc dou numere naturale n si m (n,m<=100) si apoi citeste o matrice cu n linii si m
coloane, cu elemente numere naturale din intervalul [0,10000].
a) Afisati elementul minim din matrice.
b) Afisati cte dintre coloanele matricei au elementele n ordine strict cresctoare.
c) Afisati cte dintre coloanele matricei au elementele n ordine strict descresctoare.
d) Afisati ordine cresctoare elementele din matrice care au proprietatea c se afl pe coloane care au elementele
n ordine strict cresctoare sau strict descresctoare. (Se va folosi algoritmul de interclasare)
Afisrile se vor face in fisierul matrice.out.
Se vor scrie si apela functii cel putin pentru: citirea matricei, determinarea elementului minim din matrice,
verificarea dac o coloan are elementele n ordine strict cresctoare, verificarea dac o coloan are elementele n
ordine strict descresctoare, numrarea coloanelor cu elementele n ordine strict cresctoare, numrarea
coloanelor cu elementele n ordine strict descresctoare, interclasarea a doi vectori, interclasarea coloanelor din
matrice ntr-un vector, afisarea unui vector.
Exemplu: Pentru datele de mai jos,
68
15397633
25476544
35555555
43634674
52723683
62812692
se va afisa:
1
3
2
112223333344445555566677778899
Explicatie:
Elementul minim este 1.
Exist 3 coloane cu elementele n ordine strict cresctoare.
Exist 2 coloane cu elementele n ordine strict descresctoare.
#include <fstream>
using namespace std;
ifstream fin("matrice.in");
ofstream fout("matrice.out");
void citire(int A[][101], int &n, int &m)
{//citeste dimensiunile si matricea
fin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
fin>>A[i][j];
}
void afisare(int A[], int n)
{//afiseaza vectorul
for(int i=1;i<=n;i++)

fout<<A[i]<<" ";
}
int minim(int A[][101], int n, int m)
{//calculeaza si returneaza minimul
int min=A[1][1];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(A[i][j]<min)
min=A[i][j];
return min;
}
int verifscresc(int A[][101], int n, int j)
{//verifica daca coloana are elem. strict crescatoare
for(int i=2;i<=n;i++)
if(A[i-1][j]>=A[i][j]) return 0;
return 1;
}
int catecresc(int A[][101], int n, int m)
{//numara coloanele strict crescatoare
int c=0;
for(int j=1;j<=m;j++)
if(verifscresc(A,n,j))
c++;
return c;
}
int verifsdesc(int A[][101], int n, int j)
{//verifica daca coloana are elem. strict descrescatoare
for(int i=2;i<=n;i++)
if(A[i-1][j]<=A[i][j]) return 0;
return 1;
}
int catedesc(int A[][101], int n, int m)
{//numara coloanele strict descrescatoare
int c=0;
for(int j=1;j<=m;j++)
if(verifsdesc(A,n,j))
c++;
return c;
}
void interclasare(int A[], int n, int B[], int m, int C[], int &k)
{//interclaseaza A si B in C
k=0;
int i=1,j=1;
while(i<=n && j<=m)
if(A[i]<B[j]) C[++k]=A[i++];
else C[++k]=B[j++];
while(i<=n) C[++k]=A[i++];
while(j<=m) C[++k]=B[j++];
}
void copiazavector(int A[], int n, int B[], int &m)
{// B=A
m=n;
for(int i=1;i<=n;i++)
B[i]=A[i];
}
void copiazacoloana(int A[][101], int n, int j, int B[], int &m)
{//copiez coloana j in vectorul B
m=n;
for(int i=1;i<=n;i++)
B[i]=A[i][j];
}

void copiazacoloanainvers(int A[][101], int n, int j, int B[], int &m)


{//copiez invers coloana j in vectorul B
m=n;
for(int i=1;i<=n;i++)
B[i]=A[n+1-i][j];
}
void interclasarecoloane(int A[][101], int n, int m, int X[], int &k)
{ int Y[10001],p,Z[10001],r; k=0;
for(int j=1;j<=m;j++)
if(verifscresc(A,n,j) || verifsdesc(A,n,j))
//coloana e ordonata
{
if(verifscresc(A,n,j)) //ordonata crescator
copiazacoloana(A,n,j,Y,p);
else //ordonata descrescator
copiazacoloanainvers(A,n,j,Y,p);
interclasare(X,k,Y,p,Z,r);//interclasez pe X cu Y in Z
copiazavector(Z,r,X,k);//copiez pe Z in X
}
}
int main()
{
int A[101][101],n,m,X[10001],k;
citire(A,n,m);
fout<<minim(A,n,m)<<endl;
fout<<catecresc(A,n,m)<<endl;
fout<<catedesc(A,n,m)<<endl;
interclasarecoloane(A,n,m,X,k);
afisare(X,k);
return 0;
}

3. Un numr natural nenul se numete sPar dac att el, ct i suma divizorilor si proprii (divizori diferii
de 1 i de el nsui), sunt numere pare. Subprogramul sPar are un singur parametru, n, prin care
primete un numr natural (n[1,109]). Subprogramul returneazcel mai mic numr sPar, strict mai mare
dect n. Scriei definiia complet a subprogramului.
Exemplu:dac n=95, atunci subprogramul returneaz 98 (att 98, ct i
72=2+7+14+49, sunt numere pare).
int sdiv(int n)
{ int s=0;
for(int i=2;i<=n/2;i++)
if(n%i==0) s=s+i;
return s;
}
int sPar1(int n)
{ n++;
while(n%2==1 || sdiv(n)%2==1) n++;
return n;
}
//alta varianta
int sPar(int n)
{ int s;
do
{ n++; s=0;
for(int i=2;i<=n/2;i++)
if(n%i==0) s=s+i;
}
while(n%2==1 || s%2==1);
return n;
}

4. Din fisierul matrice.in se citesc dou numere naturale n si m (n,m<=100) si apoi citeste o matrice cu n linii si m
coloane, cu elemente numere naturale din intervalul [0,10000].
a) Afisati elementul maxim din matrice.
b) Afisati cte dintre liniile matricei au elementele n ordine strict cresctoare.
c) Afisati cte dintre liniile matricei au elementele n ordine strict descresctoare.
d) Afisati ordine cresctoare elementele din matrice care au proprietatea c se afl pe linii care au elementele n
ordine strict cresctoare sau strict descresctoare. Se va folosi algoritmul de interclasare
Afisrile se vor face in fisierul matrice.out.
Se vor scrie si apela functii pentru: citirea matricei, determinarea elementului maxim din matrice, verificarea dac o
linie are elementele n ordine strict cresctoare, verificarea dac o linie are elementele n ordine strict cresctoare,
numrarea liniilor cu elementele n ordine strict cresctoare, numrarea liniilor cu elementele n ordine strict
descresctoare, interclasarea a doi vectori, interclasarea liniilor din matrice ntr-un vector, afisarea unui vector.
Exemplu: Pentru datele de mai jos,
86
123456
4 5 6 7 9 10
323232
954321
453444
987652
354333
456789
se va afisa:
10
3
2
1 1 2 2 2 3 3 4 4 4 4 5 5 5 5 5 6 6 6 6 7 7 7 8 8 9 9 9 9 10
Explicatie:
Elementul maxim este 10.
Exist 3 linii cu elementele n ordine strict cresctoare.
Exist 2 linii cu elementele n ordine strict descresctoare.
#include <fstream>
using namespace std;
ifstream fin("matrice.in");
ofstream fout("matrice.out");
void citire(int A[][101], int &n, int &m)
{
fin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
fin>>A[i][j];
}
void afisare(int A[], int n)
{
for(int i=1;i<=n;i++)
fout<<A[i]<<" ";
}
int maxim(int A[][101], int n, int m)
{
int max=A[1][1];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(A[i][j]>max)
max=A[i][j];
return max;
}
int verifscresc(int A[][101], int m, int i)
{
for(int j=2;j<=m;j++)
if(A[i][j-1]>=A[i][j]) return 0;
return 1;
}
int catecresc(int A[][101], int n, int m)
{
int c=0;
for(int i=1;i<=n;i++)
if(verifscresc(A,m,i))
c++;
return c;
}

int verifsdesc(int A[][101], int m, int i)


{
for(int j=2;j<=m;j++)
if(A[i][j-1]<=A[i][j]) return 0;
return 1;
}
int catedesc(int A[][101], int n, int m)
{
int c=0;
for(int i=1;i<=n;i++)
if(verifsdesc(A,m,i))
c++;
return c;
}
void interclasare(int A[], int n, int B[], int m, int C[], int &k)
{
k=0;
int i=1,j=1;
while(i<=n && j<=m)
if(A[i]<B[j]) C[++k]=A[i++];
else C[++k]=B[j++];
while(i<=n) C[++k]=A[i++];
while(j<=m) C[++k]=B[j++];
}
void copiaza(int A[], int n, int B[], int &m)
{
m=n;
for(int i=1;i<=n;i++)
B[i]=A[i];
}
void copiazainvers(int A[], int n, int B[], int &m)
{
m=n;
for(int i=1;i<=n;i++)
B[i]=A[n+1-i];
}
void interclasarelinii(int A[][101], int n, int m, int X[], int &k)
{
int Y[10001],p,Z[10001],r;
k=0;
for(int i=1;i<=n;i++)
if(verifscresc(A,m,i) || verifsdesc(A,m,i))
{
if(verifscresc(A,m,i)) copiaza(A[i],m,Y,p);
else copiazainvers(A[i],m,Y,p);
interclasare(X,k,Y,p,Z,r);
copiaza(Z,r,X,k);
}
}
int main()
{
int A[101][101],n,m,X[10001],k;
citire(A,n,m);
fout<<maxim(A,n,m)<<endl;
fout<<catecresc(A,n,m)<<endl;
fout<<catedesc(A,n,m)<<endl;
interclasarelinii(A,n,m,X,k);
afisare(X,k);
return 0;
}

5. Se citeste din fisierul matrice.in o matrice patratica cu n linii si n coloane (n<=100), cu elemente numere naturale
din intervalul [0,1000].
Stergeti liniile si coloanele pe care se afla cele mai mici doua elemente de pe diagonala principala si afisati
matricea rezultata in fisierul matrice.out.
Se vor scrie si folosi functii pentru:
- citirea matricii
- afisarea matricii
- determinarea pozitiei elementului minim de pe diagonala principala
- stergerea liniei si a coloanei cu indice dat.
Exemplu:
matrice.in
5
32432
21546
32435
43221
43567
matrice.out
342
345
457
(s-au sters liniile si coloanele 2 si 4)
#include <fstream>
using namespace std;
ifstream fin("matrice.in");
ofstream fout("matrice.out");
void citire(int A[][101], int &n)
{
fin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
fin>>A[i][j];
}
void afisare(int A[][101], int n)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
fout<<A[i][j]<<" ";
fout<<endl;
}
}
int imindp(int A[][101], int n)
{
int min=A[1][1],x=1;
for(int i=2;i<=n;i++)
if(A[i][i]<min) {min=A[i][i];x=i;}
return x;
}
void sterglc(int A[][101], int &n, int x)
{
for(int i=x;i<n;i++)
for(int j=1;j<=n;j++)
A[i][j]=A[i+1][j];
for(int j=x;j<=n;j++)
for(int i=1;i<=n;i++)
A[i][j]=A[i][j+1];
n--;
}
int main()
{
int A[101][101],n,x;
citire(A,n);
x=imindp(A,n);
sterglc(A,n,x);
x=imindp(A,n);
sterglc(A,n,x);
afisare(A,n);
return 0;
}

ALGORITMUL LEE
Se citeste o matrice nXm care contine litere mici si apoi un cuvant s. Gasiti cel mai lung prefix al cuvantului s care
se poate construi cu literele din matrice prin deplasare paralela cu liniile si coloanele matricii fara a trece de doua
ori prin aceeasi litera.
Exemplu:
56
axsads
aanama
nnaair
asdydi
sedrft
anamariana
prefixul este anamaria
#include<fstream>
using namespace std;
const int dx[4]={-1,1,0,0};
const int dy[4]={0,0,-1,1};
char a[100][100],s[50];
int n,m,i,j,maxx;
ifstream f("r.in");
ofstream fout("r.out");
int inside(int i,int j)
{
return i>=1 && i<=n && j>=1 && j<=m;}
void lee(int i,int j)
{ int k,inou,jnou,pas=1,gasit;
int b[100][100]={0};
b[i][j]=1;
do
{ gasit=0;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(a[i][j]==s[pas-1] && b[i][j]==pas)
for(k=0;k<4;k++)
{ inou=i+dx[k];
jnou=j+dy[k];
if(inside(inou,jnou) && a[inou][jnou]==s[pas] && b[inou]
[jnou]==0)
{
gasit=1;
b[inou][jnou]=pas+1;
}
}
pas++;
}
while(gasit);
if(pas-1>maxx) maxx=pas-1;
}
int main()
{ f>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
f>>s;

f>>a[i][j];

for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(a[i][j]==s[0])
{

}
for(i=0;i<maxx;i++) fout<<s[i];
return 0;

lee(i,j);

//sau cu coada
#include<fstream>
using namespace std;
const int dx[4]={-1,1,0,0};
const int dy[4]={0,0,-1,1};
struct poz { int i,j;};
char a[100][100],s[1000];
int n,m,i,j,maxx;
ifstream f("r.in");
ofstream fout("r.out");
int inside(int i,int j)
{
return i>=1 && i<=n && j>=1 && j<=m;
}
void lee(int i, int j)
{ int k,inou,jnou,pas=1,st,dr,gasit;
poz x[10000];
int pus[100][100]={0};
x[1].i=i;
x[1].j=j;
st=dr=1;
do
{
gasit=0;
i=x[st].i;
j=x[st].j;
for(k=0;k<4;k++)

pus[inou][jnou])

{ inou=i+dx[k];
jnou=j+dy[k];
if(inside(inou,jnou) && a[inou][jnou]==s[pas] && !
{

}
if(gasit) pas++;
st++;

}
while(gasit || st<=dr);
if(pas>maxx) maxx=pas;

int main()
{ f>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)

f>>a[i][j];

f>>s;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(a[i][j]==s[0])
for(i=0;i<maxx;i++) fout<<s[i];
return 0;
}

lee(i,j);

dr++;
pus[inou][jnou]=1;
x[dr].i=inou;
x[dr].j=jnou;
gasit=1;

LISTE INLANTUITE
Din fisierul date.in se citeste un numar natural k si apoi de pe a doua linie numere intregi.
Contruiti o lista liniara simplu inlantuita care sa contina numerele intregi citite in ordinea din
fisier.
Permutati lista cu k pozitii spre stanga si afisati valorile din lista.
Indicatie: se vor scrie si folosi functii pentru adaugarea unei valori la sfarsitul listei si pentru
stergerea primului nod al listei si vor fi folosite pentru permuarea ceruta.
Exemplu:
date.in
3
1234
date.out
4123
#include <fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
struct nod
{
int info;
nod* next;
};
void addsf(nod* &prim, nod* &ultim, int v)
{//adauga la finalul listei
if(prim==0)
{
prim=ultim=new nod;
prim->info=v;
prim->next=0;
}
else
{
nod *nou=new nod;
nou->info=v;
nou->next=0;
ultim->next=nou;
ultim=nou;
}
}
void afis(nod *prim)
{//afiseaza lista
for(nod* p=prim; p; p=p->next)
fout<<p->info<<" ";
fout<<endl;
}
void stergprim(nod* &prim, nod* &ultim)
{//sterge primul nod al listei
nod* p=prim;
prim=prim->next;
if(prim==0) ultim=0;
delete p;
}
void permutstanga(nod* &prim, nod* &ultim)
{//permuta lista cu o pozitie spre stanga
if(prim)
{
addsf(prim, ultim, prim->info);//adauga la sfarsit un nod cu informatia din
primul nod
stergprim(prim, ultim);//sterge primul nod
}

}
int main()
{
int k,v;
nod* prim, *ultim;
prim=ultim=0;
fin>>k;
while(fin>>v) addsf(prim, ultim, v);
for(int i=1;i<=k;i++) permutstanga(prim, ultim);//permut de k ori
afis(prim);
fin.close();
fout.close();
return 0;
}