Informatică, întrebare adresată de broby24072002, 8 ani în urmă

void Diferenta(int A[200],int B[200],int C[200],int k)

{

int v1[201]= {0},v2[201]= {0};

k=1;

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

v1[A[i]]++;

for (j=1; j<10; j++)

v2[B[j]]++;

j=0;

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

for (j=1;j<10;j++)

if((i==j)&&(v1[i]!=0&&v2[++j]==0))

C[k++]=i;

}


asa il apelez :


cout<<"Introduceti Dimensiunea Primei Multimi\n";

cin>>n;

cout<<"Introduceti Prima Multimie\n";

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

cin>>A[i];

cout<<"Introduceti Dimensiunea Celei De A Doua Multimi\n";

cin>>m;

cout<<"Introduceti Cea De A Doua Multime\n";

for (j=1; j<=m; j++)

cin>>B[j];

Diferenta(A,B,C,k);

for (i=1; i<=k; i++)
cout


CinevaFaraNume: Ce reprezinta k?
broby24072002: contor pt cate numere va avea vectorul c care reprezina rezulatul a-b

Răspunsuri la întrebare

Răspuns de CinevaFaraNume
2

In functia:

void Diferenta(int A[200],int B[200],int C[200],int k)

{

int v1[201]= {0},v2[201]= {0};

k=1;

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

v1[A[i]]++;

for (j=1; j<10; j++)

v2[B[j]]++;

j=0;

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

for (j=1;j<10;j++)

if((i==j)&&(v1[i]!=0&&v2[++j]==0))

C[k++]=i;

}

1. Nu se stiu marimile multimilor, astfel,

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

for (j=1; j<10; j++)

au sens doar daca multimile au exact 9 elemente.

2. Din cate vad, partea asta:

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

v1[A[i]]++;

for (j=1; j<10; j++)

v2[B[j]]++;

creaza cate un vector de frecventa pentru multimile A si B, si partea asta:

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

for (j=1;j<10;j++)

if((i==j)&&(v1[i]!=0&&v2[++j]==0))

C[k++]=i;

Pune in C toate elementele x daca acesta apare cel putin o data in A si x+1 nu apare in B.

Din partea cu apelarea:

Diferenta(A,B,C,k);

// k aici are valoarea initiala.

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

Daca vrei ca k sa aiba marimea multimii C, trebuie declarata ca referinta aici:

void Diferenta(int A[200],int B[200],int C[200],int k)

care devine acum

void Diferenta(int A[200],int B[200],int C[200],int& k)

Daca e declarat ca referinta, atunci k are valoarea (indicele ultimului element)+1, deci o iterare pe vectorul C trebuie sa arate cam asa:

for (i=1; i<k; i++), fara "=" din conditie.

Referitor la problema cu marimile vectorilor, sugerez sa le transmiti ca parametri functiei Diferenta:

void Diferenta(int A[200],int B[200],int C[200],int&k, const int n, const int m){

int v1[201]= {0},v2[201]= {0};

k=1;

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

v1[A[i]]++;

for (j=1; j<=m; j++)

v2[B[j]]++;

j=0;

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

for (j=1;j<=199;j++)

if((i==j)&&(v1[i]!=0&&v2[++j]==0))

C[k++]=i;

}

si sa fie apelata astfel:

Diferenta(A,B,C,k,n,m);

Acum daca scopul functiei nu este sa puna in C elementele x daca acesta apare cel putin o data in A si x+1 nu apare in B, si defapt sa calculeze diferenta dintre ele, matematic: C = \{x\in A | x \notin B\}, atunci functia trebuie sa arate asa:

void Diferenta(int A[200],int B[200],int C[200],int&k, const int n, const int m){

int v1[201]= {0},v2[201]= {0};

k=1;

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

v1[A[i]]++;

for (j=1; j<=m; j++)

v2[B[j]]++;

j=0;

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

for (j=1;j<=199;j++)

if((i==j)&&(v1[i]!=0&&v2[j]==0))// inlocuieste ++j cu j simplu

C[k++]=i;

}

Acum pentru optimizarea a acestei functii:

Deoarece avem nevoie doar de cazul in care i == j nu mai avem nevoie de 2 for-uri. Inlocuim asta:

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

for (j=1;j<=199;j++)

if((i==j)&&(v1[i]!=0&&v2[j]==0))

C[k++]=i;

cu asta:

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

if(v1[i]!=0&&v2[i]==0)

C[k++]=i;

Si o alta optimizare(nu imbunatateste foarte mult viteza de executie dar e bine de stiut) este sa construim doar un vector de frecventa pentru B si sa parcurgem vectorul A, care ar arata asa:

void Diferenta(int A[200],int B[200],int C[200],int&k, const int n, const int m){

int v[201]= {0};

k=1;

for (j=1; j<=m; j++)

v[B[j]]++;

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

if(v[A[i]]==0)

C[k++]=A[i];

}

Sau in varianta fara a 2-a optimizare:

void Diferenta(int A[200],int B[200],int C[200],int&k, const int n, const int m){

int v1[201]= {0},v2[201]= {0};

k=1;

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

v1[A[i]]++;

for (j=1; j<=m; j++)

v2[B[j]]++;

j=0;

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

if(v1[i]!=0&&v2[i]==0)

C[k++]=i;

}

Si partea cu apelul la functie asa:

cout<<"Introduceti Dimensiunea Primei Multimi\n";

cin>>n;

cout<<"Introduceti Prima Multimie\n";

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

cin>>A[i];

cout<<"Introduceti Dimensiunea Celei De A Doua Multimi\n";

cin>>m;

cout<<"Introduceti Cea De A Doua Multime\n";

for (j=1; j<=m; j++)

cin>>B[j];

Diferenta(A,B,C,k, n, m);

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

cout

Daca la ultimul cout vroiai sa spui C[i], atunci:

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

cout << C[i];// optional - spatii intre ele: cout << C[i] << ' ';


CinevaFaraNume: void reuniune(int A[200], int B[200], int C[400], int n, int m, int& k){
k = 1;
int v[201] = {0};
for(int i = 1; i <= n; i++)
v[A[i]]++;
for(int i = 1; i <= m; i++)
v[B[i]]++;
for(int i = 0; i <= 200; i++)
if(v[i])
C[k++] = i;
}
broby24072002: asta e pt diferenta simetrica?
CinevaFaraNume: E prentru reuniune
CinevaFaraNume: Dar cred ca merge si a ta cu interclasare
CinevaFaraNume: Nu calculezi ce trebuie
CinevaFaraNume: Ba da
broby24072002: deci de ce imi da return 0 ?
broby24072002: ti am dat un link pt tot programul
CinevaFaraNume: Liniile 190 si 206 arata putin ciudat
CinevaFaraNume: void Intersectie (int A[200],int B[200],int C[200], int &k)
{
int v[201]= {0};
k=0;
for (i=1; i<=n; i++)
if (v[A[i]]==0)
v[A[i]]++;
for (j=1; j<=m; j++)
if (v[B[j]]<=1)
v[B[j]]++;
for (i=1; i<=10; i++)
if(v[i]==2)
C[++k]=i;
}
Incearca codul asta pentru intersectie
Alte întrebări interesante