Răspuns :
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: [tex]C = \{x\in A | x \notin B\}[/tex], 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] << ' ';
Vă mulțumim pentru vizita pe site-ul nostru dedicat Informatică. Sperăm că informațiile prezentate v-au fost utile. Dacă aveți întrebări suplimentare sau nevoie de ajutor, vă rugăm să ne contactați cu încredere. Așteptăm cu drag să reveniți și nu uitați să ne salvați în lista dumneavoastră de favorite!