PDA

Visualizza la versione completa : [C++] Calcolo della moda restituosce sempre 0


Fagnese67
04-07-2013, 20:21
Scusate, devo fare un programma che calcoli media mediana e moda, ho un problema con quest'ultima, ho fatto la funzione ma mi da sempre 0 come risposta, forse ho fatto qualche cazzata...



int modaf (float *x, int elemN)
{
int a=0, b=0, max=0, ris= 0, c=0;
for (int i = 0; i<elemN; i++)
{
a = x[i];
for( i = 1; i <elemN; i++)
{
if ( x[i] == a)
{
b+=1;
c=a;
}
}

if (b > max)
{
max = b;
ris = c;
}
}

return ris;

}

LeleFT
05-07-2013, 10:08
Ciao e benvenuto nel forum.
Ti invito a prendere visione del Regolamento interno (http://forum.html.it/forum/showthread.php?s=&threadid=973887), dove puoi trovare tutte le indicazioni sulle regole da rispettare all'apertura di una discussione.

In particolare:

1) Il titolo č importante e deve dare un'idea del contenuto della discussione. "Aiuto C++" non dice assolutamente nulla del problema trattato.

2) Il codice va postato indentato e all'interno degli appositi tag CODE, previsti dal forum, in modo da mantenere indentazione e formattazione. Un esempio d'uso:



codice indentato


Correggo io questa discussione.


Ciao. :ciauz:

bomberdini
05-07-2013, 13:38
Originariamente inviato da Fagnese67


int modaf (float *x, int elemN)
{
int a=0, b=0, max=0, ris= 0, c=0;
for (int i = 0; i<elemN; i++)
{
a = x[i];
for( i = 1; i <elemN; i++)
{
if ( x[i] == a)
{
b+=1;
c=a;
}
}

if (b > max)
{
max = b;
ris = c;
}
}

return ris;

}


assegni ad a il primo elemento (0) dell'array.
poi nel secondo for dici se l'elemento in posizione 1 e' uguale ad a che contiene l'elemento in posizione 0 fai qualcosa.

Nessuno dice che l'if si verifichi.

quindi se l'if non si verifica non si verifica nemmeno il secondo if.
Quindi ris non cambia e resta zero :ciauz:

bomberdini
05-07-2013, 13:39
.

Fagnese67
05-07-2013, 17:08
Quindi non mi continua il ciclo for? continuando a verificare tutti i vari valori dell'array?

c'č un modo di far funzionare questa soluzione per la moda o devo cambiare totalmente approccio?

quello che io mi aspettavo :

-lui prende il primo valore dell'array con il primo ciclo for, se lo scrive nella costante a
-con il secondo ciclo for va a vedere tutti gli elementi che seguono x[i] , se sono uguali ad a incrementa il valore di b ogni volta che compare.
-se il valore di b č maggiore di quello registrato il ciclo prima lo sovrascrive, poi continua il primo ciclo for verificando il secondo numero dell'array e cosė via...

Fagnese67
05-07-2013, 19:48
int modaf (float *x , int elemN)
{
int freq [100], ris = 0, max=0;

for (int i=0; i <100 ; i++)
{
freq [i] = 0;

for ( int j = 1; j < elemN; j++)
{
++freq [(int)x[j]];
}
}

for (int i = 0; i< 100; i++)
{
if (freq[i]>max)
{
max = i;
}
}
return max;
}


Ho abbandonato la precedente impostazione modificandola un po', solo che non riesco a trovare il motivo per cui su max non mi scrive il valore con freq pių alta ma semplicemente l'ultimo valore assegnato...

EDIT

Scusate, ho trovato da solo lo stupido errore !

bomberdini
08-07-2013, 10:43
Originariamente inviato da Fagnese67

int modaf (float *x , int elemN)
{
int freq [100], ris = 0, max=0;

for (int i=0; i <100 ; i++)
{
freq [i] = 0;

for ( int j = 1; j < elemN; j++)
{
++freq [(int)x[j]];
}
}

for (int i = 0; i< 100; i++)
{
if (freq[i]>max)
{
max = i;
}
}
return max;
}


Ho abbandonato la precedente impostazione modificandola un po', solo che non riesco a trovare il motivo per cui su max non mi scrive il valore con freq pių alta ma semplicemente l'ultimo valore assegnato...

EDIT

Scusate, ho trovato da solo lo stupido errore !

:fighet:

Loading