PDA

Visualizza la versione completa : [C] Confronto vettori per individuare ripetizioni


BlackThunder
08-05-2012, 20:42
Salve a tutti,
sto avendo non pochi problemi nel scrivere un programma che stabilisce se due vettori contengono gli stessi elementi(anche in ordine differente), se si devo considerare la possibilità che ci siano valori ripetuti tra quelli memorizzati nei vettori.
Ad esempio
v1  1 3 2 4 3
v2  3 1 4 3 2
contengono gli stessi valori ed il 3 compare 2 volte per vettore.

Io ho risolto così:

#define N 5

int main()
{
int s,cont1,cont2,flag,i,j,v1[N],v2[N];
for(i=0;i<N;i++){
printf("Inserisci un elemento-->");
scanf("%d",&v1[i]);
}
for(i=0;i<N;i++){
printf("Inserisci un elemento-->");
scanf("%d",&v2[i]);
}

i=j=cont1=cont2=0;
flag=0;

for( i=0 ; i<N ; i++ ){
while((j<N) && (flag==0)){
for(s=0;s<N;s++){
if(s!=i){
if(v1[i]==v1[s]){
cont1++;
}
if(v1[i]==v2[s]){
cont2++;
}
}

}
if(cont1==cont2){
printf("L'elemento %d occorre %d volte per vettore",v1[i],cont1);
}
if( v1[i] == v2[j] ){
flag = 1 ;}
j++;
}
if(flag==0){
printf("Vettori non contenenti stessi elementi");
break;
}else{
flag=0;
j=0;
}
}
if(i==N){
printf("Vettori contenenti stessi elementi");
}
return 0;
}

Qualcuno ha qualche suggerimento su come posso migliorarla?

escocat
08-05-2012, 21:08
Io per prima cosa ordinerei i due vettori così da rendere immediata la scoperta di eventuali ripetizioni e facilitare il confronto di elementi.

BlackThunder
10-05-2012, 14:27
Ho rifatto il codice con l'ordinamento:


#define N 5
int main()
{
int pos,tmp,s,cont1,cont2,flag,i,j,v1[N],v2[N];
//Acquisizione dei due vettori
for(i=0;i<N;i++){
printf("Inserisci un elemento-->");
scanf("%d",&v1[i]);
}
for(i=0;i<N;i++){
printf("Inserisci un elemento-->");
scanf("%d",&v2[i]);
}

i=j=cont1=cont2=0;
flag=0;
//Ordinamento v1
for(i=0;i<N-1;i++){
tmp=v1[i];
pos=i;
for(j=i+1;j<N;j++){
if(v1[j]<tmp){
tmp=v1[j];
pos=j;
}
}
v1[pos]=v1[i];
v1[i]=tmp;
}
tmp=pos=0;
//Ordinamento v2
for(i=0;i<N-1;i++){
tmp=v2[i];
pos=i;
for(j=i+1;j<N;j++){
if(v2[j]<tmp){
tmp=v2[j];
pos=j;
}
}
v2[pos]=v2[i];
v2[i]=tmp;
}
//Confronto Vettori
for(i=0;i<N;i++){
if(v1[i]!=v2[i]){
flag=1;
}
}
//Stampa del risultato
if(flag==0){
printf("Vettori contenenti stessi elementi");
}else{
printf("Vettori non contenenti stessi elementi");
}
return 0;
}



Ora dovrei stampare gli elementi che compaiono più di una volta, come dovrei fare?
Esempio:
V[4,5,6,6,8,9,9,9]
Dovrebbe stampare :
"Il 6 è ripetuto 2 volte"
"Il 9 è ripetuto 3 volte".

Scara95
10-05-2012, 15:12
con un ciclo sul vettore ad ogni numero controlli se il sucessivo è uguale, se è uguale agisci a dovere...

BlackThunder
10-05-2012, 18:29
Ho risolto così:


#define N 5

int main()
{
int pos,tmp,s,cont1,flag1,flag,i,j,v1[N],v2[N];
//Acquisizione dei due vettori
for(i=0;i<N;i++){
printf("Inserisci un elemento-->");
scanf("%d",&v1[i]);
}
for(i=0;i<N;i++){
printf("Inserisci un elemento-->");
scanf("%d",&v2[i]);
}

i=j=flag=flag1=s=0;
cont1=1;
//Ordinamento v1
for(i=0;i<N-1;i++){
tmp=v1[i];
pos=i;
for(j=i+1;j<N;j++){
if(v1[j]<tmp){
tmp=v1[j];
pos=j;
}
}
v1[pos]=v1[i];
v1[i]=tmp;
}
tmp=pos=0;
//Ordinamento v2
for(i=0;i<N-1;i++){
tmp=v2[i];
pos=i;
for(j=i+1;j<N;j++){
if(v2[j]<tmp){
tmp=v2[j];
pos=j;
}
}
v2[pos]=v2[i];
v2[i]=tmp;
}
//Confronto Vettori
for(i=0;i<N;i++){
if(v1[i]!=v2[i]){
flag=1;
}
}
//Stampa del risultato
if(flag==0){
printf("Vettori contenenti stessi elementi\n");
i=0;
while((i<N+1)){
if(v1[i]==v1[i+1]){
s=v1[i];
cont1++;
flag1=1;
}else{
if(flag1==1){
printf("Il numero %d occorre %d volte in entrambe i vettori\n", s, cont1);
flag1=0;
cont1=1;
}
}
i++;
}
}else{
printf("Vettori non contenenti stessi elementi");
}
return 0;
}


L'unico problema è che ad esempio:
v1=[2,2,3,3,3]
mi stampa solo che il 2 occorre 2 volte e dovrebbe stamparmi anche che il 3occorre 3 volte.
Invece se assegno:
v1=[3,3,4,4,4]
mi stampa correttamente sia il 3 sia il 4, dov'è l'errore?

Loading