Compattare vettore

di il
2 risposte

Compattare vettore

Ciao a tutti,
ho scritto un programmino che inserito un vettore di interi positivi incluso lo zero, crea un vettore compattato dal primo, semplicemente eliminando gli 0 e non ripetendo piu' volte gli stessi valori nel vettore.
Il programmino sembra andare, sotto allego il codice, ma ricontrollandolo mi e' saltato all'occhio che sembra confrontare nel test per il flag, un elemento dell'array vett gia' inserito con uno dell'array comp[j] ancora non inserito e che quindi potrebbe contenere di tutto, e casualmente potrebbe pure falsificare il test!
confermate questo errore?
Non riesco a trovare un modo per evitarlo e fare funzionare tutto!

	
    /*programma che inserito un vettore di interi, lo compatta in un vettore nuovo, eliminando gli 0 e gli interi ripetuti piu' volte*/
     
    #include <stdio.h>
     
    int main()
    {
        int vett[20],comp[20];/*nel caso vett fosse un vettore non comprimibile*/
        int n,ncomp;
        int i,j;
        int trovato;/*flag*/
        do
        {
            printf("\nindicare un numero di cifre da inserire minore di 20: ");
            scanf("%d",&n);
            if(n>20||n<=0)
                printf("errore!!!");
        }while(n>20||n<=0);
        for(i=0;i<n;i++)/*acquisizione vettore iniziale*/
        {
            printf("\ninserisci il valore numero %d: ",i+1);
            scanf("%d",&vett[i]);
        }
        for(ncomp=0/*indice vettore compattato*/,i=0;i<n;i++)/*scandisce vett[i]*/
        {
            trovato=0;/*flag che verifica se l'intero vett[i] e' un valore gia' inserito o uno zero*/
            for(j=0;j<=ncomp;j++)
    /*test per valori ripetuti e 0 DUBBIO!! comp[j] potrebbe contenere qualsiasi cosa e quindi non mi pare corretto cosi'*/
                if((!vett[i])||(comp[j]==vett[i]))
                    trovato=1;
            if(!trovato)/*se il flag e' negativo assegna vett[i] a al vettore compattato comp[ncomp]*/
            {
                comp[ncomp]=vett[i];
                ncomp++;/*incrementa l'indice del vettore compattato*/
            }
        }
        for(j=0;j<ncomp;j++)
            printf("%d",comp[j]);
        printf("\n");
     
        return 0;
    }
ciao Igor

2 Risposte

  • Re: Compattare vettore

    Io farei una cosa più sensata. Creerei una funzione che controlla se il valore esiste nel vettore compattato in primis.
    Ritorna 0 se non trovato e 1 se trovato
    
    int ControllaVettore(int v[], int dimensione, int valore)
    {
       int i = 0;
       for(i  = 0; i < dimensione; i++)
       {
          if(v[i] == valore)
             return 1;
       }
       return 0;
    }
    
    Così puoi confrontare quando vuoi se il valore esiste.
    Poi nel punto del tuo dubbio metterei
    
            for(ncomp=0/*indice vettore compattato*/,i=0;i<n;i++)/*scandisce vett[i]*/
            {
                 if((!vett[i])||(ControllaVettore(vett,ncomp,vett[i])))
                        trovato=1;
                if(!trovato)/*se il flag e' negativo assegna vett[i] a al vettore compattato comp[ncomp]*/
                {
                    comp[ncomp]=vett[i];
                    ncomp++;/*incrementa l'indice del vettore compattato*/
                }
            }
    
    oppure più semplicemente
    
    for(ncomp=0/*indice vettore compattato*/,i=0;i<n;i++)/*scandisce vett[i]*/
            {
                 if(!((!vett[i])||(ControllaVettore(vett,ncomp,vett[i]))))
                {
                    comp[ncomp]=vett[i];
                    ncomp++;/*incrementa l'indice del vettore compattato*/
                }
            }
    
  • Re: Compattare vettore

    Grazie mille!
    Ho seguito il tuo consigli e ovviamente ha funzionato perfettamente!
    Grazie davvero, noto che ancora mi complico la vita quando invece potrei semplificarmela con considerazioni come quelle che hai fatto tu!

    ciao Igor
Devi accedere o registrarti per scrivere nel forum
2 risposte