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

Arreglos en C; Moda de un conjunto de números.

Estas en el tema de Arreglos en C; Moda de un conjunto de números. en el foro de C/C++ en Foros del Web. Hola, quisiera que me ayudaran un programa que tiene que determinar cual es la moda o la bimoda de un grupo de números, hasta ese ...
  #1 (permalink)  
Antiguo 23/10/2015, 01:05
 
Fecha de Ingreso: septiembre-2015
Mensajes: 3
Antigüedad: 9 años, 1 mes
Puntos: 0
Exclamación Arreglos en C; Moda de un conjunto de números.

Hola, quisiera que me ayudaran un programa que tiene que determinar cual es la moda o la bimoda de un grupo de números, hasta ese momento el programa va bien, mi problema es cuando el programa no tiene moda, o sea que todos sus números son diferentes y por lo tanto su frecuencia es 1, cuando sea este caso el programa debe decir "No hay moda", pero no es así, quisiera que me ayudaran haciéndome saber mi error en el programa, les dejo mi código para que lo vean.
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <windows.h>
  3. int main()
  4. {
  5.  int tamano;
  6.  R:
  7.  printf("Introduzca la cantidad de numeros a ingresar: ");
  8.  scanf("%i",&tamano);
  9.  
  10. int A[tamano],B[tamano],MODA[tamano];
  11. int j, i, temp=0;
  12. system("cls");
  13. printf ("Introduce %i numeros a ordenar:\n",tamano);
  14. for (i = 0; i < tamano; i++)
  15. {
  16. printf ("%i: ", i + 1);
  17. scanf ("%i", &A[i]);
  18. printf ("\n");
  19. }
  20. for (i = 0; i < (tamano - 1); i++)
  21. {
  22. for(j = i + 1; j < tamano; j++)
  23. {
  24. if(A[j] < A[i])
  25. {
  26. temp = A[j];
  27. A[j] = A[i];
  28. A[i] = temp;
  29. }
  30. }
  31. }
  32. /* Mostramos los números ordenados */
  33. printf ("Los numeros ordenados son:\n");
  34. for (i = 0; i < tamano; i++)
  35. {
  36. printf("%i, ", A[i]);
  37. }
  38. /* INICIAR ARREGLO MODA*/
  39. for (i = 0; i < tamano; i++)
  40. {
  41. MODA[i]=1;
  42. }
  43. /* COMPARACION */
  44. for (i = 0; i < (tamano - 1); i++)
  45. {
  46. for(j = i + 1; j < tamano; j++)
  47. {
  48. if(A[i] == A[j])
  49. {
  50. MODA[i] = MODA[i]+1;
  51. }
  52. }
  53. }
  54. for (i = 0; i < tamano; i++)
  55. {
  56. B[i] = MODA[i];
  57. }
  58. for (i = 0; i < (tamano - 1); i++)
  59. {
  60. for(j = i + 1; j < tamano; j++)
  61. {
  62. if(MODA[j] < MODA[i])
  63. {
  64. temp = MODA[j];
  65. MODA[j] = MODA[i];
  66. MODA[i] = temp;
  67. }
  68. }
  69. }
  70. {
  71. for (i = 0; i < tamano; i++)
  72. {
  73. if(B[i] == 1)
  74. {
  75. temp++;
  76. }
  77. }
  78. if(MODA[tamano-1]==MODA[tamano-2])
  79. {
  80. printf(".\n");
  81. printf("\n\n\nLas modas y sus frecuencias:\n");
  82. for(i=0;i<tamano;i++)
  83. {
  84. if(MODA[tamano-1]==B[i])
  85. {
  86. printf("%i - %i\n",A[i],B[i]);
  87. }
  88. }
  89. }
  90. else
  91. if(MODA[tamano-1]!=MODA[tamano-2])
  92. {
  93. printf(".\n");
  94. printf("\n\n\nLas moda y su frecuencia:\n");
  95. for(i=0;i<tamano;i++)
  96. {
  97. if(MODA[tamano-i]==B[i])
  98. {
  99. printf("%i - %i\n",A[i],B[i]);
  100. }
  101. }
  102. }
  103. else
  104. if (temp==tamano)
  105. {
  106. printf("\n\nNO HAY MODA...\n\n"); goto R;
  107. }
  108. }
  109. printf("\n\n\n");
  110. system("PAUSE");
  111. }
Agradecería sus comentarios y gracias por su atención.

Última edición por uriel_bla; 23/10/2015 a las 02:29
  #2 (permalink)  
Antiguo 23/10/2015, 14:40
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 8 meses
Puntos: 3
Respuesta: Arreglos en C; Moda de un conjunto de números.

eso no deberia ni compilar. No puedes reservar memoria dinamica de esa manera.
Código C++:
Ver original
  1. printf("Introduzca la cantidad de numeros a ingresar: ");
  2.  scanf("%i",&tamano);
  3.  
  4. int A[tamano],B[tamano],MODA[tamano];
tienes que usar malloc o calloc.
Ademas en C no puedes declarar las variables donde te de la gana.

Última edición por aguml; 23/10/2015 a las 14:52
  #3 (permalink)  
Antiguo 23/10/2015, 15:52
Avatar de xKuZz  
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 9 meses
Puntos: 27
Respuesta: Arreglos en C; Moda de un conjunto de números.

Cita:
eso no deberia ni compilar. No puedes reservar memoria dinamica de esa manera.
tienes que usar malloc o calloc.
Ademas en C no puedes declarar las variables donde te de la gana.
Ha usado un array en memoria estática eso compila perfectamente y es correcto y puede declarar las variables en cualquier lugar mientras esten declaradas antes de su uso.

En cuanto al código hasta que utilizas el algoritmo de ordenación de burbuja todo bien, pero a pesar de mirarlo varias veces no soy capaz de comprender lo que estás intentado hacer a la hora de calcular la frecuencia de cada valor. Si pudieses poner lo que intentas hacer nos facilitaría bastante ayudar a localizar el error en la implementación del código o del algoritmo que tu has ideado para resolver tu problema.
  #4 (permalink)  
Antiguo 23/10/2015, 16:36
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 14 años, 1 mes
Puntos: 10
Respuesta: Arreglos en C; Moda de un conjunto de números.

Cita:
Iniciado por xKuZz Ver Mensaje
Ha usado un array en memoria estática eso compila perfectamente y es correcto y puede declarar las variables en cualquier lugar mientras esten declaradas antes de su uso.

En cuanto al código hasta que utilizas el algoritmo de ordenación de burbuja todo bien, pero a pesar de mirarlo varias veces no soy capaz de comprender lo que estás intentado hacer a la hora de calcular la frecuencia de cada valor. Si pudieses poner lo que intentas hacer nos facilitaría bastante ayudar a localizar el error en la implementación del código o del algoritmo que tu has ideado para resolver tu problema.
Realmente no es correcto definir el tamaño del array a partir de unos valores en tiempo de ejecución.

Hay algún hilo aquí en el que se habló de ello. No obstante dependiendo del compilador se lo puede "tragar", pero no es lo correcto ni nada te asegura que ese código funcione bien en todas las plataformas y con otros compiladores.

Mira aquí (la nota resaltada):

http://c.conclase.net/curso/?cap=010
__________________
Mi calculadora en Qt
  #5 (permalink)  
Antiguo 23/10/2015, 16:48
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 8 meses
Puntos: 3
Respuesta: Arreglos en C; Moda de un conjunto de números.

El estándar dice que para reservar memoria estática necesitas un valor constante y en este caso usa un valor variable por lo que eso no es estándar y en mi c++Builder ni compila.
Con respecto a poder declarar donde quiera, en C el estándar dice que tiene que ser al inicio de la función y no en cualquier parte. En c++ si que se puede en cualquier parte.

Última edición por aguml; 23/10/2015 a las 17:01
  #6 (permalink)  
Antiguo 23/10/2015, 17:38
Avatar de xKuZz  
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 9 meses
Puntos: 27
Respuesta: Arreglos en C; Moda de un conjunto de números.

Cita:
El estándar dice que para reservar memoria estática necesitas un valor constante y en este caso usa un valor variable por lo que eso no es estándar y en mi c++Builder ni compila.
Con respecto a poder declarar donde quiera, en C el estándar dice que tiene que ser al inicio de la función y no en cualquier parte. En c++ si que se puede en cualquier parte.
A partir del estándar c99 ambas cosas se pueden hacer, en anteriores no, si tienes compiladores más antiguos no podrás hacerlo pero si utilizas compiladores más nuevos podrás hacerlo sin problema.
  #7 (permalink)  
Antiguo 23/10/2015, 22:37
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 14 años, 1 mes
Puntos: 10
Respuesta: Arreglos en C; Moda de un conjunto de números.

Cita:
Iniciado por xKuZz Ver Mensaje
A partir del estándar c99 ambas cosas se pueden hacer, en anteriores no, si tienes compiladores más antiguos no podrás hacerlo pero si utilizas compiladores más nuevos podrás hacerlo sin problema.
Definitivamente no. Me da rabia no saber usar bien el buscador, porque seguro que ya se habló de esto. Efectivamente el estandar c99 lo permitió, pero las siguientes revisiones lo volvieron a sacar.

Si compilas esto con el modo -pedantic:
Código C++:
Ver original
  1. int a=5;
  2.     int arr[a];

Te dará este aviso:
warning: ISO C++ forbids variable length array ‘arr’ [-Wvla]|

Vale que sea un aviso, (estoy en gcc) pero el hecho de que no sea parte del estandar hace que un compilador no esté obligado a admitirlo, como de hecho le pasa a aguml, lo que resta portabilidad a tu código.

Incluso puede que gcc en futuras revisiones no admita esa forma y ese código haya que actualizarlo
__________________
Mi calculadora en Qt
  #8 (permalink)  
Antiguo 24/10/2015, 04:48
Avatar de xKuZz  
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 9 meses
Puntos: 27
Respuesta: Arreglos en C; Moda de un conjunto de números.

Dime cuándo lo han quitado del estándar de C, por que al menos ni mi gcc se ha enterado y siempre lo tengo bien actualizado. Es más si compilas con cualquier revisión del estándar superior o igual a c99 siempre te va a tirar incluso aunque lo pongas con -pedantic. Por lo cual en C si está permitido.

Ahora bien, en c++ como veo que estás compilando te doy la razón en que nunca se ha permitido y no se debe hacer, el mero hecho de que funcionase en c++ es por que los de g++ añadieron una extensión para que esto se pudiera hacer.
  #9 (permalink)  
Antiguo 24/10/2015, 05:59
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 14 años, 1 mes
Puntos: 10
Respuesta: Arreglos en C; Moda de un conjunto de números.

Vaya, la verdad es que tenía en mente C++ y no sabía lo de C.

Entonces disculpas y gracias por la aclaración
__________________
Mi calculadora en Qt
  #10 (permalink)  
Antiguo 26/10/2015, 02:55
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Arreglos en C; Moda de un conjunto de números.

En C lo que sucede es que el array se crea en la pila, lo cual puede no ser recomendable por varias razones:

  • Al salir de la función se perderá el array... cuidado con los punteros que referencien el array
  • Si no se controla el tamaño del array puedes acabar teniendo buffer overflow con suma facilidad.


Al final casi lo más cómodo es quitarse de problemas y reservar la memoria de forma dinámica.

Etiquetas: arreglos, burbuja, moda, ordenamiento
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 12:13.