Calcular mas de una moda

Iniciado por acega, 19 Marzo 2013, 01:38 AM

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

acega

Como todos sabemos la moda es un termino que se utiliza en Estadística para saber cual es el numero que mas se repite.
Mi programa ordena números aleatorios y arroja la media la mediana y la moda y al estarlo corriendo me di cuenta que si hay mas de un número que se repite mas, entonces imprime el ultimo que se repitió en vez de los 2 o 3 que se repitieron aquí esta el código:
Código (cpp) [Seleccionar]
#include <stdio.h>
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
void main (void)
{
clrscr();
int arreglo[10],x,cont,mod;
float Prom;
randomize();
cout<<"***Metodo Burbuja, Media,mediana,moda***\a"<<endl;
for (int i=0;i<10;i++)
{
 arreglo[i]=random(10)+1;
 cout<<arreglo[i]<<" ";
}
getch();
for(int j=0;j<10;j++)
 {
  for(int k=0;k<10;k++)
  {
   if(arreglo[j]>arreglo[k])
   {
    x=arreglo[k];
    arreglo[k]=arreglo[j];
    arreglo[j]=x;
   }
  }
 }
cout<<"\n";
for(int l=9;l>=0;l--)
{
 cont=0;

 cout<<arreglo[l]<<" ";
 for(int a=9;a>=0;a--)
 {
  if(arreglo[l]==arreglo[a])
  {
   cont++;
  }
  if(cont>=2)
  {
   mod=arreglo[l];
  }
 }
}
for(int b=9;b>=0;b--)
{
Prom=Prom+arreglo[b];
}
Prom=Prom/10;
cout<<"\n\20 Media: "<<Prom;
cout<<"\n\20 Mediana: "<<arreglo[5]<<" "<<arreglo[4];
cout<<"\n\20 Moda: "<<mod;

getch();
}

rir3760

Lo primero que debes hacer es cambiar los nombres de los encabezados, evitar el uso de la biblioteca conio de Borland y cambiar la definición de la función main. El porque se explica en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

En este momento tu programa no calcula correctamente la moda ya esta se toma como la ultima repetición de dos o mas números. Para explicarlo mejor esta es una salida de tu programa con ese problema:
***Metodo Burbuja, Media,mediana,moda***
10 7 1 1 1 5 5 9 8 7
1 1 1 5 5 7 7 8 9 10
? Media: 5.4
? Mediana: 5 7
? Moda: 7

Como puedes ver toma la moda como 7 cuando debería ser 1.

Para calcularla correctamente debes utilizar dos bucles: el primero para conocer el numero que se repite mas veces y el segundo para imprimir todos los números que cumplan con ese requisito (así imprimes la moda cuando esta son dos o mas números).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

acega

ok gracias ya lo corregi pero no se como hacer esto:
Cita de: rir3760 en 19 Marzo 2013, 05:07 AM
el segundo para imprimir todos los números que cumplan con ese requisito (así imprimes la moda cuando esta son dos o mas números).


rir3760

Lo mas sencillo es manejar la moda igual a uno como un caso especial (ya que se deben imprimir todos los números).

En los demás casos utilizas un bucle que itere por todos los elementos menos el primero. Comparas el elemento actual con el anterior, si es igual incrementas el numero de repeticiones y si este es igual a la moda imprimes el numero.

Un programa de ejemplo en C que ejemplifica los dos bucles:
#include <stdio.h>
#include <stdlib.h>

int main (void)
{
   int num[] = {1, 1, 2, 2, 3, 3};
   int num_elem = (int) (sizeof num / sizeof num[0]);
   int moda;
   int reps;
   int i;
   
   /* Calculo de la moda */
   moda = reps = 1;
   for (i = 1; i < num_elem; i++)
      if (num[i] != num[i - 1])
         reps = 1;
      else if (++reps > moda)
         moda = reps;
   printf("moda == %d\n", moda);
   
   /* Impresion de la moda */
   if (moda == 1)
      for (i = 0; i < num_elem; i++)
         printf(" %d", num[i]);
   else {
      reps = 1;
      for (i = 1; i < num_elem; i++)
         if (num[i] != num[i - 1])
            reps = 1;
         else if (++reps == moda)
            printf(" %d", num[i]);
   }
   putchar('\n');
   
   return EXIT_SUCCESS;
}

Debes implementar bucles similares en tu programa en C++ después de las partes donde pides los números y los ordenas.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language