Necesito ayuda con mi código help

Iniciado por gabrielgjha1, 15 Julio 2017, 19:01 PM

0 Miembros y 1 Visitante están viendo este tema.

gabrielgjha1

Muy buenas tardes, espero que estén teniendo un buen día era para saber si me podrían ayudar con mi código que tenga mas de 1 moda, osea que si tengo 1 2 2 3 3 4 4 en un vector que me diga que la moda fueron 2,3 y 4 llevo un buen rato tratando y no lo consigo implementar solo me dice 1 moda y cuando no existe, aqui les dejo el codigo


#include <stdio.h>
#include <conio.h>
int main(){
int n,opc,i,j,e;
int vec[100],moda=0,cmoda=0;
int vec2 [n][n];
printf ("ingrese con cuantos datos va a trabajar");
scanf ("%i",&n);
for (i=0;i<n;i++){
printf ("\ningrese numero %i:",i+1);
scanf ("%i",&vec[i]);
}
for (i=0;i<n;i++){
e=0;
for (j=0;j<n;j++)
if (i!=j&&vec[i]==vec[j])
e++;
if (e>cmoda){
moda=vec[i];
cmoda=e;
}
}
if (moda>=1){
printf ("%i",moda);
}
else {
printf ("no hay moda");
}
}

Serapis

#1
array Modas() =  Funcion ContarPresencias(array Numeros() )
   array x(0 a numeros.MaxValue)  // esto es, exige previamente o bien conocer a priori el valor mayor del array o recorrerlo en un bucle para localizarlo.

   // Contar la presencia de cada valor en el array.
   Bucle para k desde 0 a Numeros.Length-1
        x(numeros(k)) += 1
   Fin Bucle

   // Buscar la moda o modas que pudiera haber...
   Bucle para k desde 0 a x.Length -1
       Si x(k) > n luego
           n = x(k)
           Modas=1
       O si x(k) = n luego
           Modas +=1
       Fin Si
   Fin bucle

   Redimensionar Array m(0 a Modas -1)
   k=0
   Hacer Mientras (modas > 0)
       Si n= x(k) luego
           Modas -=1   //hacemos una cuenta regresiva, para ser más óptimos, nos da igual en que orden aparezcan las modas, ¿no?
           m(Modas) = k            
       Fin si
       k +=1
   Repetir

   Devolver m //el array....
Fin Funcion

La llamada a esta función con el array de valores: 1, 2, 2, 3, 3, 4, 4 devolvería un array con 3 elementos y estos serían sus valores: m(0) = 4 , m(1) = 3 , m(2) = 2

Nota sin embargo que esta solución al usar parcialmente el algoritmo counting, tiene algunas serias limitaciones:
--- solo vale para números, no para cadenas.
--- solo vale para enteros, no para decimales (no es dle todo cierto, pero sería costoso multiplicar todos los números para convertirlos en enteros)
--- si el valor mayor del array es gigante, será costoso en memoria, ya se necesita memoria auxilair del array de contar presencia de cada valor desde 0 hasta el mayor valor hallado en el array. por ejemplo si tienes un array de 5 elementos y sus valores son estos: 5,6,76543210,16,84, exige crear un array de 76543211 elementos...
--- si hay valores negativos, es costoso, exige buscar el valor menor, sumar ese valor a todos, para hacer el menor igual a 0, y al final restar ese valor al consignar los valores en el array 'm'...


Ahora bien, si es algo simple como el ejemplo que has puesto cumple perfectamente tus necesidades...

-----------------------------------------
p.d.: modificado, para indicar la salida que daría la función con tus datos de ejemplo como entrada. OJO: Solo indica los valores de moda, no la frecunecia alcanzada en la moda. Si fuere preciso esto, podría devolverse dicho valor en un índice más (el último en el array)... y los cambios al código serían estos:
Citar Redimensionar Array m(0 a Modas -1)
Redimensionar Array m(0 a Modas)

y...
 
Citar k = 0
  Hacer Mientras (modas > 0)

  k = 0
  m(Modas) =n
  Hacer Mientras (modas > 0)
y finalmente la salida sería entonces:
  array con 4 elementos y estos serían sus valores: m(0) = 4 , m(1) = 3 , m(2) = 2 y la cuenta de moda: m(3) = 3