informatica cls xii

21
1 /* * Subi3Var1.cpp * * Created on: Mar 27, 2013 * Author: Vasile Cioban */ // ====================================================================================== ========== //Se citeste un sir de numere naturale nenule. Sa se scrie un program care elimina din X secventele //X[i],...X[i+l] formate din numere asemenea si formeaza un sir R cu numerele "distincte" eliminate. //Spunem ca doua numere naturale sunt asemenea daca scrierile celor doua numere //(in baza 10) au aceleasi cifre (Ex.: 13133, 31 si 3311 SUNT asemenea, //iar 123 si 6132 NU sunt asemenea). La sfarsit se cere tiparirea sirurilor X si R. // //Exemple //Pentru sirul X = (15, 1316, 613, 1316, 4, 58, 85, 885) se va tipari //X = (15, 4) si R = (1316, 613, 58, 85, 885) //Pentru sirul X = (45, 4, 58, 853, 39) se va tipari //X = (45, 4, 58, 853, 39) si 'R este sirul vid' // ====================================================================================== ===== /* daca A asemenea cu B si B asemenea cu C atunci si A asemenea cu C (tranzitivitate) * e suficient sa vedem daca doua elemente alaturate x[i] si X[i+1] sunt asemenea, * si se poate parcurge secventa X o sigura data * algoritmul general in Pseudocod (prima versiune) este: * algoritmul general in Pseudocod (prima versiune) este: i <-1 start <-1 // indicele de start al unei secvente de numere asemenea CatTimp i<= n-1 executa Daca Asemenea(x[i],X[i+1]) atunci // suntem intr-o secventa de numere asemenea Daca i=n-1 // la sfarsitul verificarii lui X // daca X se termina cu o secventa de numere // asemenea atunci @ muta X[start]...X[n] in R (duplicatele nu se muta) @ se sterge X[start]...X[n] din X

Upload: raluca-ralux-manea

Post on 22-Dec-2015

22 views

Category:

Documents


1 download

DESCRIPTION

UBB Cluj

TRANSCRIPT

Page 1: Informatica Cls XII

1

/*

* Subi3Var1.cpp

*

* Created on: Mar 27, 2013

* Author: Vasile Cioban

*/

//

============================================================================================

====

//Se citeste un sir de numere naturale nenule. Sa se scrie un program care elimina din X secventele

//X[i],...X[i+l] formate din numere asemenea si formeaza un sir R cu numerele "distincte" eliminate.

//Spunem ca doua numere naturale sunt asemenea daca scrierile celor doua numere

//(in baza 10) au aceleasi cifre (Ex.: 13133, 31 si 3311 SUNT asemenea,

//iar 123 si 6132 NU sunt asemenea). La sfarsit se cere tiparirea sirurilor X si R.

//

//Exemple

//Pentru sirul X = (15, 1316, 613, 1316, 4, 58, 85, 885) se va tipari

//X = (15, 4) si R = (1316, 613, 58, 85, 885)

//Pentru sirul X = (45, 4, 58, 853, 39) se va tipari

//X = (45, 4, 58, 853, 39) si 'R este sirul vid'

//===========================================================================================

/* daca A asemenea cu B si B asemenea cu C atunci si A asemenea cu C (tranzitivitate)

* e suficient sa vedem daca doua elemente alaturate x[i] si X[i+1] sunt asemenea,

* si se poate parcurge secventa X o sigura data

* algoritmul general in Pseudocod (prima versiune) este:

*

algoritmul general in Pseudocod (prima versiune) este:

i <-1

start <-1 // indicele de start al unei secvente de numere asemenea

CatTimp i<= n-1 executa

Daca Asemenea(x[i],X[i+1])

atunci // suntem intr-o secventa de numere asemenea

Daca i=n-1 // la sfarsitul verificarii lui X

// daca X se termina cu o secventa de numere

// asemenea

atunci

@ muta X[start]...X[n] in R (duplicatele nu se muta)

@ se sterge X[start]...X[n] din X

SfDaca

i <- i+1

altfel // X[i] si X[i+1] nu sunt asemenea

Daca (i>1 si Asemenea(X[i-1],X[i])

Page 2: Informatica Cls XII

2

atunci // secventa X[start]...X[i] contine nr asemenea

@ muta X[start]...X[i] in R (duplicatele nu se muta)

@ se sterge X[start]...X[i] din X

i<-start // trebuie pornit cu i-ul de la start

altfel // X[i] si X[i+1] nu sunt asemenea si X[i] nu

// face parte dintr-o secventa anterioara de

// numere asemenea

start <- start +1 // o eventuala secventa are

// inceputul pe urmatoare pozitie

i <- i+1 // trecem la pozitia urmatoare de verificat

SfDaca

SfDaca

SfCatTimp

*/

#include<iostream>

using namespace std;

int AinB (long a, long b)//returneaza 1 daca cifrele lui a sunt incluse in cifrele lui b

{

//returneaza 0 in caz contrar

long bBak=b; //bBak retine valoarea initiala a lui b

unsigned UCifa; //UCifa retine ultima cifra din a

while (a>0)

{

b =bBak; //refacem valoarea lui b

UCifa=a % 10;

while (b>0 && (UCifa !=(b % 10))) //comparam UCa cu fiecare cifra din b

b=b/10;

if(b==0) return 0; //daca b e 0 atunci o cifra a lui a nu e printre cifrele lui b

a=a/10; //se elimina ultima cifra a lui a

}

return 1; //iesirea din ciclu inseamna ca a < b

}

int Asemenea(long a, long b)

{

if(AinB(a,b) && AinB(b,a)) return 1;

return 0;

}

Page 3: Informatica Cls XII

3

void CitSecv(int &n, long X[])

{

cout<<"da lungime secventa:";

cin >>n;

for(int i=1; i<=n; i++)

{

cout<<"da un element:";

cin >>X[i];

}

}

void AfisSecv(int n, long X[])

{

if (n>0)

for(int i=1; i<=n; i++)

cout<<X[i]<<" ";

else cout<<"secventa este vida";

}

int ExistaInR(long a, int m, long R[])

{

for(int i=1; i<=m; i++)

if (a==R[i]) return 1; //mai exista in R

return 0;

}

void MutaInR (int start,int i, int n, long X[], int& m, long R[])

{

int k=start;

while (k<=i)

{

if (!ExistaInR(X[k],m,R))

{

m++;

R[m]=X[k];

}

k++;

}

}

void StergeDinX(int start,int i,int &n,long X[])

{

int dif=i-start+1;

int k=start;

while (k+dif<=n)

{

X[k]=X[k+dif];

Page 4: Informatica Cls XII

4

k++;

}

n=n-dif;

}

void StergeAsemenea (int &n, long X[], int& m, long R[])

{

// m indice pentru tabloul R

int i,start; // n dimensiunea lui X

m =0;

i =1;

start=1; // indicele de start al unei secvente de numere asemenea

while (i<=(n-1))

{

if(Asemenea(X[i],X[i+1]))

{

// suntem intr-o secventa de numere asemenea

if(i==(n-1)) // la sfarsitul verificarii lui X (daca X se termina cu

{

// o secventa de numere asemenea)

MutaInR (start,n,n,X,m,R);// muta X[start]...X[n] in R (duplicatele nu se muta)

StergeDinX (start,n,n,X); // se sterge X [start]...X[n] din X

}

i++;

}

else // X[i] si X[i+1] nu sunt asemenea

if(i>1 && Asemenea(X[i-1],X[i]))

{

// secventa X[start]...X[i] contine nr asemenea

MutaInR (start,i,n,X,m,R);// muta X[start]...X[i] in R (duplicatele nu se muta)

StergeDinX(start,i,n,X); // se sterge X[start]...X[i] din X

i=start;

}

else // X[i] si X[i+1] nu sunt asemenea si X[i] nu face

// parte dintr-o secventa anterioara de numere asemenea

{

start++; // o eventuala secventa are inceputul pe urmatoare pozitie

i++; // trecem la pozitia urmatoare de verificat

}

}

}

Page 5: Informatica Cls XII

5

int main(void)

{

long X[50],R[50]; //X tabloul initial, n lungimea lui

int n,m; //R tabloul cu numere asemenea, m Lungimea lui

CitSecv (n,X);

cout <<"secventa initiala:";

AfisSecv (n,X);

StergeAsemenea(n,X,m,R);

cout <<endl<<"X:";

AfisSecv (n,X);

cout <<endl<<"R:";

AfisSecv (m,R);

cout <<endl<<"program terminat"<<endl;

return 0;

}

//

============================================================================================

====

//Se citeĹte un Ĺir de numere naturale nenule. SÄ se scrie un program care eliminÄ din X secvenĹŁele� � � �//formate din numere asemenea Ĺi formeazÄ un Ĺir R cu numerele distincte eliminate.� � �//Spunem ca douÄ numere naturale sunt asemenea daca scrierile celor douÄ numere� �//(ĂŽn baza 10) au aceleaĹi cifre (Ex.: 13133, 31 Ĺi 3311 SUNT asemenea,� �//iar 123 Ĺi 6132 NU sunt asemenea). La sfârĹit se cere tipÄrirea sirurilor X Ĺi R.� � � �//

//Exemple

//Pentru Ĺirul X = (15, 1316, 613, 1316, 4, 58, 85, 885) se va tipÄri� �//X = (15, 4) Ĺi R = (1316, 613, 58, 85, 885)�//Pentru Ĺirul X = (45, 4, 58, 853, 39) se va tipÄri� �//X = (45, 4, 58, 853, 39) Ĺi âR este Ĺirul vidâ� � � � ��//===========================================================================================

/*

* Subi3.cpp

*

* Created on: Mar 22, 2013

* Author: Vasile Cioban

*/

#include<iostream>

using namespace std;

Page 6: Informatica Cls XII

6

/* Descriere: Verifica daca cifrele lui a sunt incluse in cifrele lui b

* Date&Prec: a,b doua numere naturale

* Rezultate&PostC: returneaza 1 daca da si 0 in caz contrar

*/

int AinB (long a, long b) //returneaza 1 daca cifrele lui a sunt incluse in cifrele lui b

{ //returneaza 0 in caz contrar

long bBak=b; //bBak retine valoarea initiala a lui b

unsigned UCa; //UCa retine ultima cifra din a

while (a>0)

{ b =bBak; //refacem valoarea lui b

UCa=a % 10;

while (b>0 && (UCa !=(b % 10))) //comparam UCa cu fiecare cifra din b

b=b/10;

if(b==0) return 0; //daca b e 0 atunci o cifra a lui a nu e printre cifrele lui b

a=a/10; //se elimina ultima cifra a lui a

}

return 1; //iesirea din ciclu inseamna ca a < b

}

/* Descriere: Verifica a si b au aceleasi cifre

* Date&Prec: a,b doua numere naturale

* Rezultate&PostC: returneaza 1 daca da si 0 in caz contrar

*/

int Asemenea(long a, long b)

{ if(AinB(a,b) && AinB(b,a)) return 1; // se verifica daca cifrele lui a sunt printe cifrele lui b si

return 0; // daca cifrele lui b sunt printre cifrele lui a

}

/* Descriere: citire secventa numere

* Date&Prec: -

* Rezultate&PostC: n natural, X[1],..X[n] numere naturale

*/

void CitSecv(int &n, long X[])

{ cout<<"da lungime secventa:";

cin >>n;

for(int i=1; i<=n;i++)

{ cout<<"da un element:";

cin >>X[i];

}

}

/* Descriere: afiseaza o secventa de numere naturale

Page 7: Informatica Cls XII

7

* Date&Prec: n natural, X[1],..X[n] numere naturale

* Rezultate&PostC: -

*/

void AfisSecv(int n, long X[])

{ if (n>0)

for(int i=1;i<=n;i++)

cout<<X[i]<<" ";

else cout<<"secventa este vida";

}

/* Descriere: verifica daca un numar este intr-o secventa

* Date&Prec: a natural, n natural, X[1],..X[n] numere naturale

* Rezultate&PostC: -returneaza 1 daca a este in X si 0 altfel

*/

int ExistaInR(long a, int m, long R[])

{ for(int i=1;i<=m;i++)

if (a==R[i]) return 1; //mai exista in R

return 0;

}

/* Descriere: elimina elemente dintr-o secventa

* Date&Prec: i,l naturale (indicele de inceput si numarul de elemente eliminate)

* n natural, X[1],..X[n] numere naturale

* Rezultate&PostC: X, cu l elemente inlaturate de pe pozitia i, n micsorat cu l elemente

*/

void EliminaElem(int i,int l,int &n,long X[])

{ for(int k=i;k<=n-l;k++)

X[k]=X[k+l];

n-=l;

}

/* Descriere: rezolvarea cerintei problemei

* Date&Prec: n natural, X[1],...,X[n] numere naturale

* Rezultate&PostC: n natural, X[1],...,X[n] contine numere care nu sunt asemenea

* m natural, R[1],...,X[m] contine secevnte de numere asemenea fara duplicate.

*/

void EliminaAsemenea (int &n, long X[], int& m, long R[])

{ // m indice pentru tabloul R

int i; // i indicele lui X

m =0;

i =1;

while (i<n)

{ if(Asemenea(X[i],X[i+1])) // daca X[i] si X[i+1] sunt asemenea

{if (!ExistaInR (X[i],m,R)) R[++m]=X[i]; // adaug in R pe X[i]

Page 8: Informatica Cls XII

8

if (!ExistaInR (X[i+1],m,R)) R[++m]=X[i+1];// adaug in R pe X[i+1]

EliminaElem(i,2,n,X); // elimina subsirul X[i],X[i+1] din X

}

else // X[i] si X[i+1] nu sunt asemenea

{if(Asemenea(X[i],R[m])) // daca X[i] e asemenea cu ultimul din R (deci cu R[m])

{if(!ExistaInR(X[i],m,R)) R[++m]=X[i]; // adaug in R pe X[i]

EliminaElem(i,1,n,X); // elimina pe X[i] din X

}

else i++; // daca X[i] nu este asemenea cu R[m] atunci trec la urmatorul

}

}

if(Asemenea(X[n],R[m])) // verificare pentru ultimul element

{if(!ExistaInR (X[n],m,R))

R[++m]=X[n];

EliminaElem(i,1,n,X);

}

}

int main(void)

{ long X[100],R[100]; //X tabloul initial, n lungimea lui

int n,m; //R tabloul cu asemenea, m Lungimea lui

CitSecv (n,X);

cout <<"secventa initiala:";

AfisSecv ( n,X);

EliminaAsemenea(n,X,m,R);

cout <<endl<<"X:";

AfisSecv (n,X);

cout <<endl<<"R:";

AfisSecv (m,R);

cout <<endl<<"program terminat"<<endl;

return 0;

}

Page 9: Informatica Cls XII

9

//

============================================================================================

====

//Se citeĹte un Ĺir X de numere naturale nenule. SÄ se scrie un program care eliminÄ din X secvenĹŁele� � � �//formate din numere asemenea Ĺi formeazÄ un Ĺir R cu numerele distincte eliminate.� � �//Spunem ca douÄ numere naturale sunt asemenea daca scrierile celor douÄ numere� �//(ĂŽn baza 10) au aceleaĹi cifre (Ex.: 13133, 31 Ĺi 3311 SUNT asemenea,� �//iar 123 Ĺi 6132 NU sunt asemenea). La sfârĹit se cere tipÄrirea sirurilor X Ĺi R.� � � �//

//Exemple

//Pentru Ĺirul X = (15, 1316, 613, 1316, 4, 58, 85, 885, 1316, 613, 1316) se va tipÄri� �//X = (15, 4) Ĺi R = (1316, 613, 58, 85, 885)�//Pentru Ĺirul X = (45, 4, 58, 853, 39) se va tipÄri� �//X = (45, 4, 58, 853, 39) Ĺi âR este Ĺirul vidâ� � � � ��//===========================================================================================

/*

* Subi3.cpp

*

* Created on: Mar 22, 2013

* Author: Vasile Cioban

*/

#include<iostream>

using namespace std;

/* Descriere: Verifica daca cifrele lui a sunt incluse in cifrele lui b

* Date&Prec: a,b doua numere naturale

* Rezultate&PostC: returneaza 1 daca da si 0 in caz contrar

*/

int AinB (long a, long b)//returneaza 1 daca cifrele lui a sunt incluse in cifrele lui b

{ //returneaza 0 in caz contrar

long bBak=b; //bBak retine valoarea initiala a lui b

unsigned UCa; //UCa retine ultima cifra din a

while (a>0)

{ b =bBak; //refacem valoarea lui b

UCa=a % 10;

while (b>0 && (UCa !=(b % 10))) //comparam UCa cu fiecare cifra din b

b=b/10;

Page 10: Informatica Cls XII

10

if(b==0) return 0; //daca b e 0 atunci o cifra a lui a nu e printre cifrele lui b

a=a/10; //se elimina ultima cifra a lui a

}

return 1; //iesirea din ciclu inseamna ca a < b

}

/* Descriere: Verifica a si b au aceleasi cifre

* Date&Prec: a,b doua numere naturale

* Rezultate&PostC: returneaza 1 daca da si 0 in caz contrar

*/

int Asemenea(long a, long b)

{ if(AinB(a,b) && AinB(b,a)) return 1; // se verifica daca cifrele lui a sunt printe cifrele lui b si

return 0; // daca cifrele lui b sunt printre cifrele lui a

}

/* Descriere: citire secventa numere

* Date&Prec: -

* Rezultate&PostC: n natural, X[1],..X[n] numere naturale

*/

void CitSecv(int &n, long X[])

{ cout<<"da lungime secventa:";

cin >>n;

for(int i=1; i<=n;i++)

{ cout<<"da un element:";

cin >>X[i];

}

}

/* Descriere: afiseaza o secventa de numere naturale

* Date&Prec: n natural, X[1],..X[n] numere naturale

* Rezultate&PostC: -

*/

void AfisSecv(int n, long X[])

{ if (n>0)

for(int i=1;i<=n;i++)

cout<<X[i]<<" ";

else cout<<"secventa este vida";

}

/* Descriere: verifica daca un numar este intr-o secevnta

* Date&Prec: a natural, n natural, X[1],..X[n] numere naturale

* Rezultate&PostC: -returneaza 1 daca a este in X si 0 altfel

*/

int ExistaInR(long a, int m, long R[])

Page 11: Informatica Cls XII

11

{ for(int i=1;i<=m;i++)

if (a==R[i]) return 1; //mai exista in R

return 0;

}

/* Descriere: elimina elemente dintr-o secventa

* Date&Prec: i,l naturale (indicele de inceput si numarul de elemente eliminate)

* n natural, X[1],..X[n] numere naturale

* Rezultate&PostC: X, cu l elemente inlaturate de pe pozitia i, n micsorat cu l elemente

*/

void EliminaElem(int i,int l,int &n,long X[])

{ for(int k=i;k<=n-l;k++)

X[k]=X[k+l];

n-=l;

}

/* Descriere: rezolvarea cerintei problemei

* Date&Prec: n natural, X[1],...,X[n] numere naturale

* Rezultate&PostC: n natural, X[1],...,X[n] contine numere care nu sunt asemenea

* m natural, R[1],...,X[m] contine secevnte de numere asemenea fara duplicate.

*/

void EliminaAsemenea (int &n, long X[], int& m, long R[])

{ // m indice pentru tabloul R

int i; // i indicele lui X

m =0;

i =1;

while (i<n)

{ if(Asemenea(X[i],X[i+1])) // daca X[i] si X[i+1] sunt asemenea

{if (!ExistaInR (X[i],m,R)) R[++m]=X[i]; // adaug in R pe X[i]

if (!ExistaInR (X[i+1],m,R)) R[++m]=X[i+1];// adaug in R pe X[i+1]

EliminaElem(i,2,n,X); // elimina subsirul X[i],X[i+1] din X

}

else // X[i] si X[i+1] nu sunt asemenea

{if(Asemenea(X[i],R[m])) // daca X[i] e asemenea cu ultimul din R (deci cu R[m])

{if(!ExistaInR(X[i],m,R)) R[++m]=X[i]; // adaug in R pe X[i]

EliminaElem(i,1,n,X); // elimina pe X[i] din X

}

else i++; // daca X[i] nu este asemenea cu R[m] atunci trec la urmatorul

}

}

if(Asemenea(X[n],R[m])) // verificare pentru ultimul element

{if(!ExistaInR (X[n],m,R))

R[++m]=X[n];

Page 12: Informatica Cls XII

12

EliminaElem(i,1,n,X);

}

}

int main(void)

{ long X[100],R[100]; //X tabloul initial, n lungimea lui

int n,m; //R tabloul cu asemenea, m Lungimea lui

CitSecv (n,X);

cout <<"secventa initiala:";

AfisSecv (n,X);

EliminaAsemenea(n,X,m,R);

cout <<endl<<"X:";

AfisSecv (n,X);

cout <<endl<<"R:";

AfisSecv (m,R);

cout <<endl<<"program terminat"<<endl;

return 0;

}

#include <iostream>

using namespace std;

typedef struct{

int val[100];

int fr [100];

int dim;

} Perechi;

typedef struct{

int val[100];

int dim;

} SecVenta;

int Prim(int n){ //returneza 1 daca n e prim si 0 daca n nu e prim

int d=2;

if(n<2) return 0;

while (d*d<=n && n%d!=0)

if(d==2) d=3;

else d=d+2;

Page 13: Informatica Cls XII

13

if(d*d>n) return 1; //numarul e prim

else return 0;

}

int SumaCif(int n){

int S=0;

while(n>0){

S=S+n%10;

n/=10;

}

return S;

}

void Citire(SecVenta& X){

int temp;

X.dim=0;

do{

cout<<"da un numar:";

cin >>temp;

if(temp!=0){

X.dim++;

X.val[X.dim]=temp;

}

} while (temp>0);

}

void AfisareX(SecVenta X){

int DimX;

DimX=X.dim;

for(int i=1; i<=DimX; i++){

cout<<X.val[i]<<" ";

if(i%10==0) cout<<endl;

}

}

void AfisareY(Perechi Y){

int DimY;

DimY=Y.dim;

cout<<endl;

if(DimY)

for(int i=1; i<=DimY; i++){

cout<<"("<<Y.val[i]<<","<<Y.fr[i]<<"),";

if(i%10==0) cout<<endl;

}

else cout<<"nu exista niciiun numar cerut";

}

Page 14: Informatica Cls XII

14

int Exista(Perechi Y, int v){

int i,DimY;

DimY=Y.dim;

i=1;

while(i<=DimY && Y.val[i]!=v) i++;

if(i>DimY) return 0; // daca nu exista v in Y retur 0

return i; // daca exista v in Y retur pozitia

}

void Insert(Perechi& Y, int val){

int DimY=Y.dim;

int i=DimY;

while(i>0 && val<Y.val[i]){

Y.val[i+1]=Y.val[i];

Y.fr[i+1] =Y.fr [i];

i--;

}

Y.val[i+1]=val;

Y.fr [i+1]=1;

Y.dim++;

}

void CreYY(SecVenta X, Perechi& Y){

int DimX=X.dim;

Y.dim=0;

for(int i=1;i<=DimX;i++)

if(Prim(SumaCif(X.val[i])))

{ int poz=Exista(Y,X.val[i]);

if(poz==0) Insert(Y,X.val[i]);

else Y.fr [poz]++;

}

}

int main(){

Perechi Y;

SecVenta X;

Citire (X);

AfisareX (X);

CreYY (X,Y);

AfisareY (Y);

cout <<"\nprogram terminat";

return 0;

}

Page 15: Informatica Cls XII

15

#include <iostream>

#include <fstream>

using namespace std;

int PrimaCif(int n){

while (n>10) n=n/10;

return n;

}

int UltimaCif(int n){

return n%10;

}

int MaxCif(int n){

int Max=-1;

int cif;

while(n>0){

cif=n%10;

if(cif>Max) Max=cif;

n=n/10;

}

return Max;

}

void CreMat(int n, int x[],int a[20][20])

{ for (int i=1;i<=n;i++)

for (int j=1;j<=n;j++)

{ if(i+j<n+1) a[i][j]=UltimaCif(x[n*n+i+j]);

if(i+j>n+1) a[i][j]=PrimaCif (x[n*n+i+j]);

if(i+j==n+1)a[i][j]=MaxCif (x[n*n+i*i]);

}

}

void CreSir(int n, int x[])

{ int N,i,d; // N pentru numarul natural curent

// i indice pentru tabloul x;

// d pentru divizorii lui j

N=i=1;

while (i<=2*n*n){

x[i]=N;

Page 16: Informatica Cls XII

16

d=2;

while(i<=2*n*n && d<=N/2){

if(N%d==0) x[++i]=d;

d++;

}

N++;

i++;

}

return;

}

void Afisare(int n, int x[]){

ofstream g("Sir.out");

for(int i=1; i<=2*n*n;i++ )

{g<<x[i]<<" ";

if(i%20==0) g<<endl;

}

g.close();

}

void AfisareMat(int n, int A[20][20]){

ofstream g("Sir.out2");

for(int i=1; i<=n;i++ )

{for(int j=1;j<=n;j++)

g<<A[i][j]<<" ";

g<<endl;

}

g.close();

}

void AfisareZec(int n, int A[20][20]){

int Max,cif;

for(int j=1; j<=n;j++ )

{ Max=0;

for(cif=9;cif>=0;cif--)

{ for(int i=1;i<=n;i++)

if(cif==A[i][j])Max=Max*10+A[i][j];

}

cout<<Max<<",";

}

}

Page 17: Informatica Cls XII

17

int main()

{ int n=4;

int x[100],A[20][20];

CreSir(n,x);

Afisare(n,x);

CreMat(n,x,A);

AfisareMat(n,A);

AfisareZec(n,A);

return 0;

}

//Doua numere naturale a si b se numesc asemanatoare daca în

//scrierea lor în baza 10 au cel putin o cifra comuna.

//Se citesc mai multe siruri de numere naturale (un sir

//se termina la citirea unui numar negativ),

//iar sirurile se termina cu sirul vid.

//Pentru fiecare sir citit sa se tipareasca cea mai lunga

//secventa de elemente consecutive formata numai din numere asemanatoare

#include<iostream>

using namespace std;

/*

Descriere: citeste de la tastatura un sir de numere naturale

Rezultate: numarul de elemente a sirului(fara numarul negativ), elemtele sirului(fara cel negativ)

*/

void citesteSir(int a[], int &n)

{

n=0; //n va fi folosit pt pozitioonarea in sir si pentru numararea numarului de elemente

while(a[n]>=0) // se citeste pana la intalnirea unui elem negativ

{ n++; //n se incrementeaza pt a se trece la pozitia urm si pt a sti numarul exact de elemente

cin>>a[n];

}

n--; // n scade cu 1, deoarece pe ultima pozitie se afla elementul negativ

}

/*

Descriere:verifica daca 2 numere au vreo cifra asemenea

Date de intrare:Numerele a si b

Rezultate: 1 la intalnirea primei cifre asemenea; 0 la eliminarea tuturor cifrelor din ambele numere

*/

int Asemenea(int a, int b) //variabilele a si b sunt cele ale caror cifre sunt verificate

{ int c; // variabila c va fi folosita in verificare, pt ca sa nu se piarda numarul b

Page 18: Informatica Cls XII

18

while(a!=0) // se verifica atat timp cat exista cifre in a

{ c=b;

while(c!=0) //c(copia numarului b) este cautata de cifre asemenea

if(a%10==c%10) // se compara ultima cifra din a cu ultima cifra din c

return 1; // se returneaza 1 daca s-au gasit cifre asemenea si se iese din functie

else

c/=10; // altfel, ultima cifra din c este eliminata

a/=10;

}

return 0; // se returneaza 0 daca nu exista cifre asemenea

}

/*

Descriere: Functia cauta cea mai lunga secventa de numere asemenea; secventa este pusa in sirul b

Date de intrare: Sirul a( care este cautat de elem asemenea), numarul sau de elemente,

sirul b in care se va pune secventa si numarul sau de elemente

Rezultate:Sirul b ce cea mai lunga secventa si numarul sau de elemente

*/

void CautSecventa(int a[], int n, int b[], int &m)

{ int i,c,maxst,maxdr;

//variabilele maxst, maxdr vor fi folosite pt a memora

//unde incepe si unde se termina fiecare secventa,

// iar contorul c, pt a numara elementele asemenea din fiecare secventa

int ms,md,mc=0;

//variabilele ms si md vor fi folosite pe a unde incepe si

//unde se termina cea mai lunga secventa

// iar contorul mc pt a memora numarul de elemente din cea mai lunga secventa

for(i=1;i<n;i++)

if(Asemenea(a[i],a[i+1])) //se verifica daca elementul de pe pozitia i este asemenea cu cel de pe

//pozitia urmatoare

{ maxst=i;c=1; //daca elem sunt asemena, atunci maxst memoreaza pozitia primului element asemenea

//iar c va fi folosit pt numararea acestora

while(Asemenea(a[i],a[i+1])) //se parcurge sirul in continuare atat timp cat exista numere asemena alaturate

{i++; c++;}

maxdr=i; // maxdr retine pozitia ultimului element asemenea

if(c>mc) // este comparat numarul de elemente asemenea maxim cu cel din ultima parcurgere facuta

{ //daca este mai mare, atunci mc primeste valoarea lui c, iar ms si md cea a lui maxst si maxdr

mc=c; ms=maxst; md=maxdr;

}

}

m=0; // m primeste valoarea 0 pt a se numara nr de elemete din cea mai lunga secventa

for(i=ms;i<=md;i++) // se pune in sirul b cea mai lunga secventa de elemente asemenea

{

m++; b[m]=a[i];

Page 19: Informatica Cls XII

19

}

}

/*

Descriere: Functia afiseaza un sir cu n elemente, punand spatii intre fiecare elemet

Date de intrare: siru si numarul sau de elemete

Rezultate:Afisarea sirului

*/

void AfisSecventa(int b[], int n)

{

for(int i=1;i<=n;i++) //variabila i va fi folosita pt parcurgerea in ordine a sirului, crescand cu 1 dupa fiecare afisare

cout<<b[i]<<" ";

}

int main()

{

int n,a[100],b[100],m;//n va fi numarul de elemente a sirului a, iar m va fi numarul de elemente a sirului b

//sirul a va contine numere naturale ce urmeaza sa fie verificate

//com folosi sirul b pt a aafisa secventa de elem asemenea

citesteSir(a,n); // se apeleaza functia pt citirea sirului a

CautSecventa(a,n,b,m);// se apeleaza functia pt aflarea celei mai lungi secvente de elemente asemenea

AfisSecventa(b,m); // se afiseaza sirul b ce contine cea mai lunga secventa de elemnte asemenea

return 0;

}