elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema en C [Ayuda]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema en C [Ayuda]  (Leído 3,094 veces)
cacacolass

Desconectado Desconectado

Mensajes: 19


Ver Perfil
Problema en C [Ayuda]
« en: 28 Abril 2014, 15:33 pm »

/*
 * Dado vector de números enteros, obtener el promedio del mismo.
 * Luego partir el vector en 2 vectores,
 * donde los menores al promedio estén en un vector y los mayores en otro vector.
 */


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. void menmay (int vector[10], int i, double promedio);
  6. void free (void* ptr);
  7.  
  8. int main(int argc, char **argv)
  9. {
  10. int vector[10];
  11. int i;
  12. double suma, promedio=0;
  13.  
  14. srand(time(NULL));
  15. for (i=0; i<10; i++)
  16. {
  17. vector[i] = rand() % 100;
  18. printf("%3d", vector[i]);
  19. suma += vector[i];
  20. }
  21.  
  22. promedio = suma/10;
  23. printf("\n Suma de los valores del vector: %.0lf", suma);
  24. printf("\n Promedio de los valores del vector: %.0lf", promedio);
  25. printf("\n");
  26. menmay(vector,i,promedio);
  27. return 0;
  28. }
  29.  
  30. void menmay (int vector[10], int i, double promedio)
  31. {
  32. int* menores;
  33. int* mayores;
  34. int j=0,k=0;
  35.  
  36. menores = (int*)malloc (10*sizeof(int));
  37. mayores = (int*)malloc (10*sizeof(int));
  38.  
  39.  
  40. for (i=0; i<10; i++)
  41. {
  42. if (vector[i] < promedio)
  43. {
  44. menores[j] = vector[i];
  45. j++;
  46. }
  47.  
  48. else
  49. {
  50. mayores[k] = vector[i];
  51.    k++;
  52. }
  53.  
  54. }
  55. printf("Valores menores al promedio \n");
  56. for (j=0;j<10;j++)
  57. if (menores[j] != 0)
  58. printf("%3d",menores[j]);
  59.  
  60. free(menores);
  61.  
  62. printf("\nValores mayores al promedio \n");
  63. for (k=0;k<10;k++);
  64. printf("%3d",mayores[k]);
  65.  
  66. free(mayores);
  67. }
  68.  
  69. void free (void* ptr);
  70.  

Los números menores funcionan correctamente, pero los números mayores al promedio siempre quedan en 0, por qué?

Muchas gracias. Saludos


« Última modificación: 30 Abril 2014, 05:49 am por simorg » En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Problema en C [Ayuda]
« Respuesta #1 en: 28 Abril 2014, 15:59 pm »

"suma" no está inicializado,

Código
  1. double suma, promedio=0;

luego el resultado al final del bucle es aleatorio:

Código
  1.  for (i=0; i<10; i++)
  2.  {
  3.    vector[i] = rand() % 100;
  4.    printf("%3d", vector[i]);
  5.    suma += vector[i];
  6.  }

en consecuencia, la operación que usas para calcular el promedio te arroja un resultado incorrecto:

Código
  1.  promedio = suma/10;

solucionando esto el promedio te sale bien... pero aún verás valores extraños en la lista de resultados.

Esto es porque SIEMPRE imprimes los 10 valores de cada vector "menores y mayores"... y eso no es así. Si hay 3 números por debajo del promedio se deberían imprimir únicamente esos 3 valores.

Otra cosa... ¿por qué pasas 'i' como argumento de 'menmay'? No tiene ningún sentido y la función no necesita ese argumento para nada.

Y si te fijas en esta línea, verás algo raro:

Código
  1.   printf("\nValores mayores al promedio \n");
  2.  for (k=0;k<10;k++); // <<<< EN ESTA
  3.  printf("%3d",mayores[k]);
  4.  

Si el bucle lo terminas con punto y coma... no hace nada.

Con los cambios propuestos al menos obtienes la lista de elementos... ahora tienes que evitar mostrar siempre 10 resultados para la lista de 'menores' y 'mayores':

Código:
 60 68 25 17 96 99 67 26 48  5
 Suma de los valores del vector: 511
 Promedio de los valores del vector: 51
Valores menores al promedio
 25  17  26  48   5 1027951689 1348221507 1919381362 1631874401 1090543988
Valores mayores al promedio
 60  68  96  99  67 1867668577 1852403041 1329791079 1313819981 1196380752

nuevo: En la salida que te he puesto he separado los números por un espacio... te lo digo por si ves que tu salida no coincide con la mía (los números aleatorios no cuentan).


« Última modificación: 28 Abril 2014, 16:04 pm por eferion » En línea

Blaster

Desconectado Desconectado

Mensajes: 190


Ver Perfil
Re: Problema en C [Ayuda]
« Respuesta #2 en: 28 Abril 2014, 17:06 pm »

Para evitar el problema de siempre imprimir los diez valores de cada vector podrias usar una bandera en cada situación, que te indique cuantos son menores o mayores al promedio, tal que quede asi

Código
  1. for (i = 0; i < 10; i++){
  2.   if (vector[i] < promedio){
  3.     menores[j] = vector[i];
  4.     cant1++, j++;
  5.    }
  6.    else{
  7.      mayores[k] = vector[i];
  8.      cant2++, k++;
  9.    }
  10. }
  11.    printf("Valores menores al promedio \n");
  12.    for (j = 0; j < cant1; j++)
  13. if (menores[j] != 0)
  14. printf("%d ", menores[j]);
  15.  
  16.    free(menores);
  17.  
  18.    printf("\nValores mayores al promedio \n");
  19.    for (k = 0; k < cant2; k++)
  20. printf("%d ", mayores[k]);
  21.  
  22.    free(mayores);

No olvides inicializar las banderas a cero

Saludos..
« Última modificación: 28 Abril 2014, 17:10 pm por Blaster » En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Problema en C [Ayuda]
« Respuesta #3 en: 28 Abril 2014, 17:11 pm »

Para evitar el problema de siempre imprimir los diez valores de cada vector podrias usar una bandera en cada situación, que te indique cuantos son menores o mayores al promedio, tal que quede asi

Código
  1. for (i = 0; i < 10; i++){
  2.       if (vector[i] < promedio){
  3.          menores[j] = vector[i];
  4.          cant1++, j++;
  5.        }
  6.       else{
  7.          mayores[k] = vector[i];
  8.          cant2++, k++;
  9. }
  10. }
  11. printf("Valores menores al promedio \n");
  12. for (j = 0; j < cant1; j++)
  13.   if (menores[j] != 0)
  14.      printf("%d ", menores[j]);
  15.  
  16. free(menores);
  17.  
  18. printf("\nValores mayores al promedio \n");
  19. for (k = 0; k < cant2; k++)
  20.   printf("%d ", mayores[k]);
  21.  
  22. free(mayores);

Saludos..

Después del primer for, cant1==j y cant2==k... para qué repetir valores?

Código
  1. for (i = 0; i < 10; i++){
  2.  if (vector[i] < promedio){
  3.    menores[j] = vector[i];
  4.    j++;
  5.  }
  6.  else{
  7.    mayores[k] = vector[i];
  8.    k++;
  9.  }
  10. }
  11.  
  12. printf("Valores menores al promedio \n");
  13. for (i = 0; i < j; i++)
  14.  if (menores[i] != 0)
  15.    printf("%d ", menores[i]);
  16.  
  17. free(menores);
  18.  
  19. printf("\nValores mayores al promedio \n");
  20. for (i = 0; i < k; i++)
  21.  printf("%d ", mayores[i]);
  22.  
  23. free(mayores);

Aunque también te digo que hay que dejar pensar un poco al que tiene los errores... si se lo das todo mascado a la primera no le vas a dar alicientes para que aprenda.
En línea

Blaster

Desconectado Desconectado

Mensajes: 190


Ver Perfil
Re: Problema en C [Ayuda]
« Respuesta #4 en: 28 Abril 2014, 17:16 pm »

Después del primer for, cant1==j y cant2==k... para qué repetir valores?

Muy cierto no me habia fijado :rolleyes:

Saludos..
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Problema en C [Ayuda]
« Respuesta #5 en: 28 Abril 2014, 18:49 pm »


Lo que no tiene ningún sentido es pasarle a la función "i" ya que no aporta ninguna información a la misma. Bastaría declarar int i en la función menmay y dejarla así:

Código
  1. void menmay (int vector[10], double promedio);

Código
  1. ..............
  2. menmay(vector,promedio);
  3. ..................
  4.  

Código
  1. void menmay (int vector[10], double promedio)
  2. {
  3. .............
  4. int i,j=0,k=0;
  5. .................
  6.  

¡¡¡¡ Saluditos! ..... !!!!


En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Problema en C [Ayuda]
« Respuesta #6 en: 28 Abril 2014, 22:51 pm »

Lo que no tiene ningún sentido es pasarle a la función "i" ya que no aporta ninguna información a la misma. Bastaría declarar int i en la función menmay y dejarla así:

Eso también lo comenté en el primer mensaje :)
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Problema en C [Ayuda]
« Respuesta #7 en: 28 Abril 2014, 23:10 pm »

Eso también lo comenté en el primer mensaje :)

Sorry, se me paso por alto.

¡¡¡¡ Saluditos! ..... !!!!


En línea

cacacolass

Desconectado Desconectado

Mensajes: 19


Ver Perfil
Re: Problema en C [Ayuda]
« Respuesta #8 en: 30 Abril 2014, 05:12 am »

Muchas gracias, me olvidé de ese ";" del último for y lo inicializar suma, ya lo había corregido, lo inicialicé a 0 porque sino puede tomar basura de la memoria.
Así quedó el código (apliqué todo lo sugerido):

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. void menmay (int vector[10], double promedio);
  6. void free (void* ptr);
  7.  
  8. int main(int argc, char **argv)
  9. {
  10. int vector[10];
  11. int i;
  12. double suma=0.0, promedio=0.0;
  13.  
  14. srand(time(NULL));
  15. for (i=0; i<10; i++)
  16. {
  17. vector[i] = rand() % 100;
  18. printf("%3d", vector[i]);
  19. suma += vector[i];
  20. }
  21.  
  22. promedio = suma/10;
  23. printf("\n Suma de los valores del vector: %.0lf", suma);
  24. printf("\n Promedio de los valores del vector: %.0lf", promedio);
  25. printf("\n");
  26. menmay(vector,promedio);
  27. return 0;
  28. }
  29.  
  30. void menmay (int vector[10], double promedio)
  31. {
  32. int* menores;
  33. int* mayores;
  34. int i,j=0,k=0, cant=0, cant2=0;
  35.  
  36. menores = (int*)malloc (10*sizeof(int));
  37. mayores = (int*)malloc (10*sizeof(int));
  38.  
  39.  
  40. for (i=0; i<10; i++)
  41. {
  42. if (vector[i] < promedio)
  43. {
  44. menores[j] = vector[i];
  45. cant++; j++;
  46. }
  47.  
  48. else
  49. {
  50. mayores[k] = vector[i];
  51.    cant2++; k++;
  52. }
  53.  
  54. }
  55. printf("Valores menores al promedio \n");
  56. for (j=0;j<cant;j++)
  57. printf("%3d",menores[j]);
  58.  
  59. free(menores);
  60.  
  61. printf("\nValores mayores al promedio \n");
  62. for (k=0;k<cant2;k++)
  63. printf("%3d",mayores[k]);
  64.  
  65. free(mayores);
  66. }
  67.  
  68. void free (void* ptr);
  69.  

P.D: Había pasado 'i' como parámetro para no volverlo a declarar de nuevo en la función. Pensé que no tenía nada de malo.

Muchas gracias por la ayuda, saludos !
« Última modificación: 30 Abril 2014, 05:48 am por simorg » En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Problema en C [Ayuda]
« Respuesta #9 en: 30 Abril 2014, 08:09 am »

P.D: Había pasado 'i' como parámetro para no volverlo a declarar de nuevo en la función. Pensé que no tenía nada de malo.

Cuando tu pasas una variable como argumento de una función se realizan las siguientes acciones (por dar una idea):

* Se hace una copia de la variable.
* Se llama a la función.
* Se recupera la copia de la variable.

Cuando tu la declaras directamente como variable local:

* Se crea la variable ( bien en el stack, bien en los registros del procesador, depende de las optimizaciones del programa )

Pasar una variable como argumento es, como norma general, más costoso y confuso que declarar la variable como local.

Lo de confuso lo entenderás cuando te encuentres con una función ( yo lo he vivido ) con 78 argumentos.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda con un problema...
Java
Zero_1 5 4,424 Último mensaje 30 Noviembre 2007, 13:39 pm
por Zero_1
[Ayuda] Problema con un bat. « 1 2 »
Scripting
washanwer 11 6,514 Último mensaje 9 Julio 2008, 06:45 am
por washanwer
Ayuda con problema en C
Programación C/C++
Pantuflo 5 3,190 Último mensaje 11 Mayo 2010, 16:41 pm
por Ari Slash
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines