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
Răspunsuri la întrebare
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: , 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] << ' ';
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;
}
{
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