Problema Trovare il valore più frequente e meno frequente in un vettore

di il
8 risposte

Problema Trovare il valore più frequente e meno frequente in un vettore

Salve a tutti, sono un principiante che cerca di imparare qualcosa in più di questo linguaggio, e ho un grosso bisogno del vostro aiuto.
Come da titolo mi è stato dato un esercizio in cui dovevo trovare l'elemento più frequente e meno frequente di un vettore di interi.
Consultando un paio di siti (ahimé non molto chiari) e aggiungendo quel poco di conoscenza che ho del C, sono riuscito a creare un algoritmo che mi conta le frequenze di tutti i valori e mi stampa il valore più frequente, PROBLEMA: quando cerco di stampare anche il meno frequente mi stampa SEMPRE lo stesso valore più frequente di prima.
Ho provato a cambiare diversi parametri ma il risultato è sempre lo stesso, quindi essendo davvero disperato mi rivolgo a voi sperando che riusciate a chiarirmi le idee. Vi ringrazio in anticipo e spero di cuore di ricevere una soluzione al più presto.
Vi posto lo screen dell'eseguibile, e il mio algoritmo:



#include <stdlib.h>
#include <stdio.h>


int main() {
int vet[100], vetfreq[100];
int valore, i, j, conteggio,max,min;

printf("Inserisci il numero degli elementi del vettore\n");
scanf("%d", &valore);
printf("Inserisci i %d numeri seguiti da uno spazio\n", valore);

/* Legge elementi vettore */
for(i = 0; i < valore; i++){
scanf("%d", &vet);
vetfreq = -1;
}

/* Calcola la frequenza di ciasciun numero.
* per ogni elemento di vet, SE vetfreq = -1,
* significa che la frequenza non è ancora contata per quel numero
* mentre vetfreq = 0 significa che la frequenza è già contata per quel numero.
*/
for(i = 0; i < valore; i++){
conteggio = 1;
for(j = i+1; j < valore; j++){
if(vet==vet[j]) {
vetfreq[j] = 0;
conteggio++;
}
}


if(vetfreq!=0) { //Se iesimo valore del vettore conteggio è *diverso* da 0, allora assegnare conteggio a iesimo val di vettore conteggio//
vetfreq = conteggio; //cioè vuol dire che se non ha ancora contato quel valore, darà a quel valore un conteggio//
printf("valore %d: conteggio %d\n",vet, vetfreq); //mostra il conteggio delle frequenze di tutti i valori//
}
}


max = vetfreq[0];
for (i = 0; i < 100; i++){
if (vetfreq[i] > max) {
max = vet[i];

}
}

printf("\nIl valore con la frequenza massima e': %d\n", vetfreq[i]);



min = vetfreq[0];
for (i = 0; i < 100; i++){
if (vetfreq[i] < min) {
min = vet[i];

}
}

printf("\nIl valore con la frequenza minima e': %d\n", vetfreq[i]);


system("pause");
return 0;
}

8 Risposte

  • Re: Problema Trovare il valore più frequente e meno frequente in un vettore

    maxilrosso ha scritto:


    In entrambi i casi stampi

    vetfreq


    E cosa dovrei stampare nel minimo?
  • Re: Problema Trovare il valore più frequente e meno frequente in un vettore

    UP, Altre risposte please?
  • Re: Problema Trovare il valore più frequente e meno frequente in un vettore

    Scusa ma max e min a cosa servono?

    E come mai controlli sempre 100 elementi anche se ne hai inseriti meno?
  • Re: Problema Trovare il valore più frequente e meno frequente in un vettore

    Max e Min sono la frequenza massima e minima del ciclo di elementi inseriti da tastiera in una Dimensione MASSIMA costante di 100.
    Io voglio stampare l'i-esimo elemento del vettore frequenza per conoscere l'elemento che abbia un valore frequenza max e min.
    Dov'è che sbaglio? Perchè la funzione mi stampa un elemento max al posto del min? Perchè non posso mettere una cardinalità massima di 100?

    Spero finalmente di aver chiarito tutto, e attendo risposte serie.
  • Re: Problema Trovare il valore più frequente e meno frequente in un vettore

    Non puoi esaminare 100 elementi se non hai inserito 100 valori. Se hai inserito 3 valori, perché controlli gli altri 97?
  • Re: Problema Trovare il valore più frequente e meno frequente in un vettore

    oregon ha scritto:


    Non puoi esaminare 100 elementi se non hai inserito 100 valori. Se hai inserito 3 valori, perché controlli gli altri 97?
    Volevo fare in modo che l'utente scegliesse da tastiera il numero massimo di numeri da controllare, e ho messo 100 come cardinalità massima, ma il problema non è quello. Ho provato anche a mettere 6 come card max, ma il problema è lo stesso, anzi, mi sono accorto che il problema alla radice è molto più grande di quanto pensassi. La funzione mi stampa solo i numeri in POSIZIONE ZERO, quindi anche se avessi messo:
    2 5 5 3 3 3
    max è 2 anziché 3
    min è 2 (caso fortuito ma non verificato)

    Ho provato a stampare l'indirizzo di MIN al posto di vetfreq e mi cambiava valore, ma quel valore era l'ultimo se non sbaglio.
  • Re: Problema Trovare il valore più frequente e meno frequente in un vettore

    Prendi spunto da queste modifiche della parte finale
    
    int imax=0;
    int imin=0;
    max = vetfreq[0];
    min = vetfreq[0];
    for (i = 0; i < valore; i++){
    	if (vetfreq[i] > max && vetfreq[i] > 0) 
    	{
    		max = vetfreq[i];
    		imax=i;
    	}
    
    	if (vetfreq[i] < min && vetfreq[i] > 0) 
    	{
    		min = vetfreq[i];
    		imin=i;
    	}
    }
    
    printf("\nIl valore con la frequenza massima e': %d\n", vet[imax]);
    printf("\nIl valore con la frequenza minima e': %d\n", vet[imin]);
    
  • Re: Problema Trovare il valore più frequente e meno frequente in un vettore

    oregon ha scritto:


    Prendi spunto da queste modifiche della parte finale
    
    int imax=0;
    int imin=0;
    max = vetfreq[0];
    min = vetfreq[0];
    for (i = 0; i < valore; i++){
    	if (vetfreq[i] > max && vetfreq[i] > 0) 
    	{
    		max = vetfreq[i];
    		imax=i;
    	}
    
    	if (vetfreq[i] < min && vetfreq[i] > 0) 
    	{
    		min = vetfreq[i];
    		imin=i;
    	}
    }
    
    printf("\nIl valore con la frequenza massima e': %d\n", vet[imax]);
    printf("\nIl valore con la frequenza minima e': %d\n", vet[imin]);
    
    Che bello ti ringrazio tanto per la pazienza. E' da più di una settimana che cercavo di trovare una soluzione, stavo quasi impazzendo, se non mi avessi aiutato ci avrei rinunciato definitivamente.
    Purtroppo non ho avuto il tempo di controllare bene il passaggio, ma l'ho aggiunto al mio codice e finalmente funziona.
    Se avrò dei dubbi, non esiterò a chiedere.
Devi accedere o registrarti per scrivere nel forum
8 risposte