Stampa valori ripetuti in un vettore [C]

di il
6 risposte

Stampa valori ripetuti in un vettore [C]

Ho fatto questo programma per stampare i valori che sono ripetuti in un vettore ma vorrei che quando eseguo il programma mi stampasse solo una volta il valore ripetuto, invece ora come ora se 3 è ripetuto tipo 2 volte lui mi scrive 2 volte che 3 è ripetuto 2 volte.
#include <stdio.h>
#include <stdlib.h>
#define N 8

int main()
{
    int v[N],i,j,a=1;
    for(i=0;i<N;i++)
    {
        printf("Inserisci un valore ");
        scanf("%d",&v[i]);
    }

    for(i=0;i<N;i++)
    {        
        a=1;
        for(j=0;j<N;j++)
        {

               if(v[i]==v[j] && i!=j)
                    {
                     a=a+1;
                    }

        }

      if(a>1)
         {
           printf("Il valore %d e' ripetuto %d volte\n",v[i],a);
         }
     }


    return 0;
}

6 Risposte

  • Re: Stampa valori ripetuti in un vettore [C]

    Ti serve un vettore di supporto che memorizza le lettere già uscite e controllarle di volta in volta!

    Es. la prima lettera è A conti quante volte è presente e la metti in questo vettore. La seconda lettera è di nuovo A, scorri il vettore di supporto, controlli che A è già stata contata quindi eviti e passi al ciclo successivo.

    Spero di essere stato chiaro.
  • Re: Stampa valori ripetuti in un vettore [C]

    Con un vettore

    t[N]

    di appoggio ...
    
        for(i=0;i<N;i++)
    		if(t[i]==0)
    		{
    			t[i]=1;
    
    			a=1;
    			
    			for(j=i+1; j<N-1; j++)
    				if(v[i]==v[j])
    				{
    					a++;
    					t[j]=1;
    				}
    
    			if(a>1)
    				printf("Il valore %d e' ripetuto %d volte\n",v[i],a);
    		}
    
  • Re: Stampa valori ripetuti in un vettore [C]

    Con un minimo di ingegno è possibile scrivere un bel codice elegante e veloce senza if nel ciclo che conta le ripetizioni. Usando un array o un bitarray(qui si fa più complicato) inizializzato a 0,con dimensioni pari a UCHAR_MAX + 1,è possibile contare le ripetizioni in modo veloce senza branching.Basta fare array[char_letto] +++; tenendo presente che ogni indice dell'array coincide con il corrispondente carattere ASCII 8.Ad esempio se leggo il carattere '0'(non '\0') farò array[(int)'0']++; Una volta inizializzata questa tabella, stampi i caratteri della tabella creata che sono apparsi due o più volte.
  • Re: Stampa valori ripetuti in un vettore [C]

    loopunrolling ha scritto:


    Con un minimo di ingegno
    E' una delle soluzioni che si impara alle elementari.

    Il fatto è che è più "educativo" scervellarsi sulla soluzione senza array.

    E se vuoi ingegnarti di più, prova a non usare un array di 256 elementi dato che non dovrai trattare un bel po' di questi caratteri.
  • Re: Stampa valori ripetuti in un vettore [C]

    Tranquillo Oregon, ho parlato appunto di minimo ingegno non di nuovo algoritmo.Quello proposto è comunque migliore del classico algoritmo scolastico(che tu ci creda o no,a scuola non fanno niente di algoritmica, solo implementazioni idiote).Avrei anche la versione con bitarray(da aggiustare)ma non posso mettere il codice dato che l'avevo postato un altro forum.
  • Re: Stampa valori ripetuti in un vettore [C]

    loopunrolling ha scritto:


    Tranquillo Oregon
    Grazie per la raccomandazione ma sono tranquillo ...
    tu ci creda o no
    Non ho detto che non ci credo ...
Devi accedere o registrarti per scrivere nel forum
6 risposte