Foros del Web » Programación para mayores de 30 ;) » C/C++ »

¿Cómo puedo contar cuantos números se repiten en un Array?

Estas en el tema de ¿Cómo puedo contar cuantos números se repiten en un Array? en el foro de C/C++ en Foros del Web. Buenas tardes, Tengo la siguiente duda, y creo que es bastante fácil de resolver, pero no consigo encontrar la manera.... ¿Cómo puedo hacer para contar ...
  #1 (permalink)  
Antiguo 23/01/2016, 11:37
 
Fecha de Ingreso: junio-2014
Mensajes: 3
Antigüedad: 10 años, 6 meses
Puntos: 0
¿Cómo puedo contar cuantos números se repiten en un Array?

Buenas tardes,

Tengo la siguiente duda, y creo que es bastante fácil de resolver, pero no consigo encontrar la manera....

¿Cómo puedo hacer para contar los números que se repiten mas veces y menos veces en un Array?

Gracias,

Marcos Cabrera.
  #2 (permalink)  
Antiguo 23/01/2016, 16:38
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 2 meses
Puntos: 204
Respuesta: ¿Cómo puedo contar cuantos números se repiten en un Array?

¿C o C++?

En cualquier caso, si el rango de números es acotado (de 0 a 10 o de 0 a 100 por ejemplo), puedes crearte un array con el mismo número de elementos que el rango posible de números... la idea es utilizar cada una de esas posiciones para almacenar el número de repeticiones de cada número.

El siguiente paso es inicializar todas las posiciones del array a 0 para evitar resultados raros. Tras esto recorremos nuestro array (el original) y para cada número que nos encontramos incrementamos en uno la posición correspondiente de nuestro array de repeticiones, es decir:

Código C:
Ver original
  1. repeticiones[array_original[i]]++;

Donde repeticiones es el array donde vamos almacenando las repeticiones y array_original es el array donde tienes tus números.

Finalmente recorres el array de las repeticiones y te quedas con el valor más alto y el más bajo.

Para conocer cada uno de estos datos necesitas dos variables (una para almacenar el número de repeticiones y otra para conocer el número asociado a las repeticiones dadas), aunque también puedes hacerlo con únicamente una variable (almacena el número de repeticiones y después buscas en el array de repeticiones a ver qué número tiene las repeticiones dadas).

Para calcular el valor más alto lo ideal es inicializar la variable a 0, para el valor más alto tienes dos opciones (o pones un número muy alto procurando no pasarte del rango de la variable o bien usas los límites dados en limits.h. Después iteras sobre todo el array de repeticiones y compruebas si las repeticiones dadas son mayores que el máximo que has encontrado hasta entonces o menores que el mínimo... si es así actualizas la variable y listo:

Código C:
Ver original
  1. // INT_MAX se encuentra en limits.h
  2. int min_rep = INT_MAX;
  3. int max_rep = 0;
  4. int min_num = -1;
  5. int max_num = -1;
  6.  
  7. for( int i=0; i<tam_array; i++)
  8. {
  9.   if( repeticiones[i]<min_rep )
  10.   {
  11.     min_rep = repeticiones[i];
  12.     min_num = i;
  13.   }  
  14.  
  15.   if( repeticiones[i]>max_rep )
  16.   {
  17.     max_rep = repeticiones[i];
  18.     max_num = i;
  19. }

Y ya está, ya conoces el número máximo y el mínimo de repeticiones así como los números asociados.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #3 (permalink)  
Antiguo 24/01/2016, 11:37
 
Fecha de Ingreso: diciembre-2015
Mensajes: 67
Antigüedad: 9 años
Puntos: 2
Respuesta: ¿Cómo puedo contar cuantos números se repiten en un Array?

Que tal si usas un siclo dentro de otra:
Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.     int a[7] = {3, 2, 0, 2, 0, 1, 0};
  6.     int m=6;
  7.     int i, ii, y;
  8.     for(i=0;i<m;i++)
  9.     {
  10.         y=0;
  11.         for(ii=0;ii<m;ii++)
  12.             if((a[i]==a[ii]) && (i!=ii))
  13.                 y=1;
  14.         if(y)
  15.             printf("El número %i se repite\n", a[i]);
  16.         else
  17.             printf("El número %i no se repite\n", a[i]);
  18.     }
  19.     return 0;
  20. }
  #4 (permalink)  
Antiguo 24/01/2016, 16:17
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 2 meses
Puntos: 204
Respuesta: ¿Cómo puedo contar cuantos números se repiten en un Array?

Cita:
Iniciado por sanandresm Ver Mensaje
Que tal si usas un siclo dentro de otra:
Solo una duda... ¿cómo resuelve esto el problema que plantea de conocer el número que más se repite y el número que menos?
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #5 (permalink)  
Antiguo 25/01/2016, 15:09
 
Fecha de Ingreso: diciembre-2015
Mensajes: 67
Antigüedad: 9 años
Puntos: 2
Respuesta: ¿Cómo puedo contar cuantos números se repiten en un Array?

No hare todo el trabajo te di la base con eso puedes contar cual se repite mas y cual menos
  #6 (permalink)  
Antiguo 26/01/2016, 02:00
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 2 meses
Puntos: 204
Respuesta: ¿Cómo puedo contar cuantos números se repiten en un Array?

Cita:
Iniciado por sanandresm Ver Mensaje
No hare todo el trabajo te di la base con eso puedes contar cual se repite mas y cual menos
Lo siento si suena mal pero... no has ayudado en nada. Has puesto el código que te ha dado la gana que no solo no resuelve la duda del usuario sino que ni tan siquiera se le aproxima.

Por otro lado piensa que te contesto yo, @eferion, y no @themarcoscabrera97, que es quien hizo inicialmente la pregunta.

@themarcoscabrera97 pregunta cómo conocer el número con más repeticiones y el número con menos repeticiones de un array... y tu código únicamente es capaz de decir si un número se repite o no... además que, para el ejemplo que has puesto, te dice 2 veces que se repite el número 2 y 3 veces que se repite el número 0... habría estado bien que, al menos, te sacase un resultado por número.

A modo de bonus piensa que últimamente has realizado bastantes preguntas en este foro... si respondes lo que te da la gana y te quedas tan tranquila luego no te quejes si no te respondemos lo que tu esperas...

Estoy de acuerdo en que no se trata de hacerle la tarea a nadie. Pero si se trata de orientar y dar consejos útiles. Si pones un código que no hace absolutamente nada de lo que te han pedido al menos indícalo en el mensaje e indica igualmente los motivos. Hay que intentar que un novato no se vuelva loco tratando de entender un código que no conoce solo para descubrir que además no hace lo que él espera.

Bonus 2: Por qué seguimos declarando todas las variables al inicio de la función? Los nuevos estándares de C (C99 y C11) ya permiten declarar variables dentro de los bucles... lo que permite tener código más legible. También estaría bien que usases el tipo bool, definido en stdbool.h para almacenar datos booleanos, la legibilidad de un código fuente es algo importantísimo.

Una versión que hace exactamente lo mismo que la tuya pero con ligeros cambios:
  • Uso de bool para booleanos.
  • Cada variable declarada en su ámbito correcto.
  • Uso de punteros en vez de índices.
  • Solo hay un printf.

Código C:
Ver original
  1. #include <stdbool.h>
  2. #include <stdio.h>
  3.  
  4. int main()
  5. {
  6.     int a[7] = {3, 2, 0, 2, 0, 1, 0};
  7.     const int* end = a + sizeof(a)/sizeof(int);
  8.     const char* no = " no";
  9.     const char* si = "";
  10.    
  11.     for(int* ptr=a; ptr<end; ++ptr)
  12.     {
  13.         bool repeated = false;
  14.         for( int* ptr2=a; ptr2<end && !repeated; ++ptr2)
  15.           repeated = (*ptr==*ptr2 && ptr!=ptr2);
  16.  
  17.         char* option = (repeated)? si : no;
  18.  
  19.         printf("El numero %i%s se repite\n", *ptr, option );
  20.     }
  21.     return 0;
  22. }

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #7 (permalink)  
Antiguo 26/01/2016, 15:28
 
Fecha de Ingreso: diciembre-2015
Mensajes: 67
Antigüedad: 9 años
Puntos: 2
Respuesta: ¿Cómo puedo contar cuantos números se repiten en un Array?

Lo se pero no habia leido bien la pregunta y respondi lo que entendi a pasos largos. Yo crei que estaban preguntando lo que respondi pero luego pense que mi codigo era casi lo que nesecitaba, pero si fue mi error y para enmendarlo te dare al codigo(a partir de la modificacion de eferion) de lo que buscas:

Código C:
Ver original
  1. #include <stdbool.h>
  2. #include <stdio.h>
  3.  
  4. int main()
  5. {
  6.     int a[7] = {3, 2, 0, 2, 0, 1, 0};
  7.     int r[7], p[7], mar=0, map=-1, mir=1000, mip=-1;
  8.     int i, t;
  9.     const int* end = a + sizeof(a)/sizeof(int);
  10.  
  11.     for(int* ptr=a; ptr<end; ++ptr)
  12.     {
  13.         int nrepeated = 0;
  14.         for( int* ptr2=a; ptr2<end; ++ptr2)
  15.             if((*ptr==*ptr2) && (ptr!=ptr2))
  16.                 nrepeated++;
  17.         t=true;
  18.         for(i=0;i<ptr-a;i++)
  19.             if(p[i]==*ptr)
  20.                 t=false;
  21.         if(t)
  22.         {
  23.             r[ptr-a] = nrepeated;
  24.             p[ptr-a] = *ptr;
  25.         }
  26.     }
  27.     for(i=0;i<end-a-1;i++)
  28.     {
  29.         if(mar<r[i])
  30.         {
  31.             map=p[i];
  32.             mar=r[i];
  33.         }
  34.         if(mir>r[i])
  35.         {
  36.             mip=p[i];
  37.             mir=r[i];
  38.         }
  39.     }
  40.     printf("El numero %i se repite %i veces, se repite mas que los otros\n", map, mar);
  41.     printf("El numero %i se repite %i veces, se repite menos que los otros\n", mip, mir);
  42.     return 0;
  43. }

Disculpenme por mi error.
  #8 (permalink)  
Antiguo 27/01/2016, 03:21
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 2 meses
Puntos: 204
Respuesta: ¿Cómo puedo contar cuantos números se repiten en un Array?

Cita:
Iniciado por sanandresm Ver Mensaje
Disculpenme por mi error.
Creo que aquí todos somos humanos y nos confundimos... no será la primera vez que respondo algo que no se parece en nada a lo que han preguntado y doy fe de que no es intencionado.

Como digo siempre, los foros son espacios frios porque es muy complicado saber las intenciones reales de quien escribe... en este caso daba la impresión de que te estabas enrocando y por eso el motivo de mi respuesta anterior.

Con respecto a tu código un par de cosillas, si me permites la crítica constructiva:

Código C:
Ver original
  1. int main()
  2. {
  3.     int i, t;
  4.     // ...
  5.     t=true;
  6.     // ...
  7. }

Si pones t=true lo lógico es que t sea de tipo bool. Que luego bool no sea más que un typedef de int es algo que te debería dar igual. Por un lado poner bool t indica que esa variable la vas a usar para almacenar booleanos. Otro beneficio adicional de bool es que es su rango puede adaptarse a entornos concretos, por lo que si en un sistema X resulta más óptimo utilizar unsigned short para gestionar los bool basta con modificar el alias y el código se aprovechará de la mejora mientras que si usas int...

Además, sigo insistiendo en que t no significa absolutamente nada luego no deberías usar ese nombre para nada.

Código C:
Ver original
  1. int mir=1000

¿Estás seguro de que si le dejas al usuario introducir valores no va a menter valores superiores a 1000? Estas tonterías suelen ser una fuente de problemas. Tienes a tu disposición una serie de constantes que te proporcionan los números límite dentro de un rango, es decir tanto el mayor como el menor... lo bueno de usar esas constantes es que se adaptarán automáticamente al sistema en el que trabajes:

Código C:
Ver original
  1. #include <limits.h>
  2.  
  3. int mir= INT_MAX;

Otro tema a mejorar es el ámbito de las variables. En serio, ve acostumbrándote a declarar las variables cuando las necesitas y no al inicio de la función. Esa es una herencia de versiones antiguas de C. Hacer que una variable tenga un ámbito mínimo evita errores tontos... veamos:

Código C:
Ver original
  1. int main()
  2. {
  3.   int i,j;
  4.  
  5.   for( i=0; i<10; i++ )
  6.     printf("%d ",i);
  7.  
  8.   for( j=0; j<10; i++ )
  9.     printf("%d ",j);
  10. }

El ejemplo es muy tonto pero sirve para el caso. La idea es imprimir 2 veces una secuencia de 0 a 9... pero el programa se queda atascado en el segundo bucle.

Aquí es fácil encontrar el error... ¿pero qué sucedería si añadimos 20 variables más al inicio del main y un par de decenas de líneas de código entre ambos for? lo mismo ya no resulta tan obvio el problema, verdad? Sin embargo:

Código C:
Ver original
  1. int main()
  2. {
  3.   for( int i=0; i<10; i++ )
  4.     printf("%d ",i);
  5.  
  6.   for( int j=0; j<10; i++ )
  7.     printf("%d ",j);
  8. }

Ahora el compilador nos indica que hay un error... i no está declarada en el segundo for. Partiendo de la base de que C es un lenguaje con unas reglas bastante laxas, cualquier medida que podamos implementar para que el compilador nos ayude a detectar problemas debería ser siempre bien recibida. Y en este caso reducir el ámbito de las variables al mínimo es una buena práctica.

Además, esto te permite repetir el nombre de las variables siempre y cuando su ámbito no sea exactamente el mismo:

Código C:
Ver original
  1. int main()
  2. {
  3.   int i = 5;
  4.  
  5.   for( int i=0; i<10; i++ )
  6.     printf("%d ",i);
  7.  
  8.   printf("\n%d ",i);
  9. }

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:32.