Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Confronto Vettori in C

    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?

  2. #2
    Utente di HTML.it L'avatar di escocat
    Registrato dal
    Feb 2012
    Messaggi
    308
    Io per prima cosa ordinerei i due vettori così da rendere immediata la scoperta di eventuali ripetizioni e facilitare il confronto di elementi.

  3. #3
    Ho rifatto il codice con l'ordinamento:
    codice:
    #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".

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    con un ciclo sul vettore ad ogni numero controlli se il sucessivo è uguale, se è uguale agisci a dovere...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    Ho risolto così:
    codice:
    #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?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.