Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Roga en 28 Mayo 2017, 02:13 am



Título: Ayuda errores en codigo en lenguaje c.
Publicado por: Roga en 28 Mayo 2017, 02:13 am
Buenas tengo un error en mi codigo si coloco que n(valores) es igual 1 el promediob = a basura. ademas que los promedios no me dan.
al depurar me da que la suma incrementa el numero en 2 cuando no es asi. aqui el codigo
Código
  1. /*Cargar un vector de “n” posiciones con numero enteros, a partir de este crear 2 vectores; uno con los números pares y el otro con los numero impares,
  2. además decir cuál de los vectores es más grande y el promedio de los elementos en cada vector.*/
  3. #include <stdio.h>
  4. void crear(int numerosa[],int n);
  5. int main(){
  6. int vector,n;
  7. printf("Cargue 1 lista para crear 2 nuevas con los numeros pares e impares y decir cual vector es mas grande y el promedio de ambos.");
  8. printf("\nIngrese el numero de valores que desee cargar:");
  9. scanf("%d",&n);
  10. int numerosa[n];
  11. while(n<=0){
  12. printf("\nValor invalido. Ingrese de nuevo.\nIngrese el numero de valores que desee cargar:");
  13. scanf("%d",&n);
  14. int numerosa[n];
  15. }
  16. printf("\nLista 1.\n\n");
  17. for(vector=1;vector<=n;vector++){
  18. printf("Ingrese el valor %d:",vector);
  19. scanf("%d",&numerosa[vector]);
  20. }
  21. crear(numerosa,n);
  22. printf("\n\n");
  23. system("pause");
  24. return 0;
  25. }
  26. void crear(int numerosa[],int n){
  27. int vector,numerosb[n],numerosc[n],pares,impares,aux,y;
  28. float promedioa,promediob,promedioc,suma;
  29. char *mayor;
  30. promedioa=0;
  31. promediob=0;
  32. promedioc=0;
  33. aux=0;
  34. pares=0;
  35. impares=0;
  36. //crear 2 y 3
  37. for(vector=1;vector<=n;vector++){
  38. y=numerosa[vector]%2;
  39. if(y==0){
  40. pares++;
  41. numerosb[pares]=numerosa[vector];
  42. }
  43. else{
  44. impares++;
  45. numerosc[impares]=numerosa[vector];
  46. }
  47. }
  48. // mayor
  49. if(pares>impares){
  50. char p[]={'p','a','r'};
  51. mayor=p;
  52. }
  53. if(pares<impares){
  54. char i[]={'i','m','p','a','r'};
  55. mayor=i;
  56. }
  57. if(pares==impares){
  58. char ni[]={'n','i','n','g','u','n','a'};
  59. mayor=ni;
  60. }
  61. //el promedio vector a
  62. aux=0;
  63. for(vector=1;vector<=n;vector++){
  64. suma=numerosa[vector]+aux;
  65. aux=numerosa[vector];
  66. }
  67. promedioa=suma/n;
  68. //el promedio vector b
  69. if(pares>0){
  70. aux=0;
  71. for(vector=1;vector<=pares;vector++){
  72. suma=numerosb[vector]+aux;
  73. aux=numerosb[vector];
  74. }
  75. promediob=suma/pares;
  76. }
  77. //el promedio vector c
  78.  
  79. if(impares>0){
  80. aux=0;
  81. for(vector=1;vector<=impares;vector++){
  82. suma=numerosc[vector]+aux;
  83. aux=numerosc[vector];
  84. }
  85. promedioc=suma/impares;
  86. }
  87. //imprimir
  88. if(n>0){
  89. printf("\n\nLista 1\t\tLista 2\t\tLista 3");
  90. for(vector=1;vector<=n;vector++){
  91. if(vector<=pares&&vector<=impares){
  92. printf("\n%d\t\t%d\t\t%d",numerosa[vector],numerosb[vector],numerosc[vector]);
  93. }
  94. if(vector>pares&&vector<=impares){
  95. printf("\n%d\t\t\t\t%d",numerosa[vector],numerosc[vector]);
  96. }
  97. if(vector<=pares&&vector>impares){
  98. printf("\n%d\t\t%d\t\t\t",numerosa[vector],numerosb[vector]);
  99. }
  100. if(vector>pares&&vector>impares){
  101. printf("\n%d\t\t\t\t\t\t",numerosa[vector]);
  102. }
  103. }
  104. printf("\nPromedio.\n%.1f\t\t%.1f\t\t%.1f",promedioa,promediob,promedioc);
  105. if(*mayor=='p'||*mayor=='i'){
  106. printf("\n\nLa lista mas larga creada es la %s.",mayor);
  107. }
  108. else{
  109. printf("\n\nLa lista mas larga creada es %s.",mayor);
  110. }
  111. }
  112. }

De antemano muchas Gracias!. :D


Título: Re: Ayuda errores en codigo en lenguaje c.
Publicado por: MAFUS en 28 Mayo 2017, 18:13 pm
Antes de empezar a resolver tu duda hay que resolver un problema muy grave:
Creas un array a partir de una variable. Esto es un error pues depende del compilador que funcione o no. Debes usar la familia malloc para crear un array así. Pero más grave aún es que el primer array generado puede tener una dimensión negativa y eso sí es un error muy grave; haces la comprobación  de generarlo después


Título: Re: Ayuda errores en codigo en lenguaje c.
Publicado por: Roga en 28 Mayo 2017, 19:24 pm
ty. Ya investigo sobre el tema y contesto si me resulto. Y sobre el error de los promedios?.


Título: Re: Ayuda errores en codigo en lenguaje c.
Publicado por: Roga en 29 Mayo 2017, 20:02 pm
despues de tanto averiguar sigo sin entender :(. alguna guia que me recomiendes? o el codigo de forma correcta a ver si lo agarro de ejemplo.


Título: Re: Ayuda errores en codigo en lenguaje c.
Publicado por: MAFUS en 29 Mayo 2017, 21:43 pm
Sí, claro. En vez de
Código:
int numerosa[n];
debes poner
Código:
int *numerosa = malloc(sizeof(int) * n);

A partir de aquí puedes continuar.

Por cierto los arrays empiezan por el indice 0 y llegan hasta su tamaño-1, por tanto que empieces por el 1 y llegues hasta su tamaño máximo es erróneo.


Título: Re: Ayuda errores en codigo en lenguaje c.
Publicado por: Roga en 29 Mayo 2017, 23:40 pm
eso lo hize porque si coloco que pares e impares me inicialize en -1 para que cuando entre en el if empieze en 0, me da error.


Título: Re: Ayuda errores en codigo en lenguaje c.
Publicado por: MAFUS en 30 Mayo 2017, 00:04 am
Suma después, no antes. Además las líneas 17, 63, 71, 81, etc. lo haces con un for.


Título: Re: Ayuda errores en codigo en lenguaje c.
Publicado por: Roga en 30 Mayo 2017, 00:50 am
Gracias. por lo que lei se puede programar basicamente sin malloc pero seria aconstumbrarse a programar mal XD. gracias por el tip tambien lei que por cada malloc hay que usar un free como seria eso?. Sigo teniendo el error de los promedios.


Título: Re: Ayuda errores en codigo en lenguaje c.
Publicado por: Serapis en 30 Mayo 2017, 06:32 am
El problema (de los errores del promedio) está en el bucle...
Debes usar cada valor del vector: Todos y solo una única vez cada uno.
En vez de hacer esto:
Código:
	//el promedio vector a
aux=0;
for(vector=1;vector<=n;vector++){
suma=numerosa[vector]+aux;
aux=numerosa[vector];
}

Te basta hacer simplemente:

Código
  1. suma = 0
  2. for(vector=0;vector<=impares;vector++){
  3. suma +=numerosc[vector];
  4. }
Simplifica el código y no tienes que hacer cosas raras antes del bucle, solo poner a cero la variable suma, por si fue usada con anterioridad.
Como ves en el código, el bucle se recorre entero de principio a fin, luego en cada iteración suma el valor del índice apuntado en el array...
Finalmente el promedio será correcto, si lo divides entre el número exacto de componentes que se suman, esto es el tamaño de elementos del array. Al comenzar en 0, quiere decir que el bucle entra por última vez cuando 'vector' es el índice final... luego todavía intentará otra vez entrar en el bucle, con previo incremento de vector, pero ya no podrá entrar, porque finalizó... esto es, la variable de control del bucle, al final contiene la cantidad total de veces que se entró.
Luego el promedio puede hacerse como:
Código
  1. Promedio = (Suma / Vector)
Aunque si n ya tiene igualmente la cantidad de sumandos, vale igualmente...


Por último, señalarte que para detectar si un número es impar, en vez de usar el operador módulo, usa el operador AND... (que siempre es más rápido y al caso más claro)

En vez de esto:
   
Código
  1. y=numerosa[vector]%2;
  2. if(y==0){
  3.                     ...

Mejor así:
Código
  1. if((numerosa[vector] & 1)==0){
  2.                   ...


Título: Re: Ayuda errores en codigo en lenguaje c.
Publicado por: Roga en 2 Junio 2017, 01:59 am
No entendi esta parte.
Citar
Mejor así:
Código
      if((numerosa[vector] & 1)==0){
                   ...

pero si acomode el error en el promedio. tambien libere la memoria de numeroa , numerob y numeroc, con
Código
  1. free(numerosa);
  2. free(numerosb);
  3. free(numerosc);


Título: Re: Ayuda errores en codigo en lenguaje c.
Publicado por: Roga en 2 Junio 2017, 02:19 am
Gracias! Asi quedo el codigo final.
Código
  1. /*Cargar un vector de “n” posiciones con numero enteros, a partir de este crear 2 vectores; uno con los números pares y el otro con los numero impares,
  2. además decir cuál de los vectores es más grande y el promedio de los elementos en cada vector.*/
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. void crear(int numerosa[],int n);
  6. int main(){
  7. int vector,n;
  8. printf("Cargue 1 lista para crear 2 nuevas con los numeros pares e impares y decir cual vector es mas grande y el promedio de ambos.");
  9. printf("\nIngrese el numero de valores que desee cargar:");
  10. scanf("%d",&n);
  11. int *numerosa=malloc(sizeof(int)*n);
  12. while(n<=0){
  13. printf("\nValor invalido. Ingrese de nuevo.\nIngrese el numero de valores que desee cargar:");
  14. scanf("%d",&n);
  15. int *numerosa=malloc(sizeof(int)*n);
  16. }
  17. printf("\nLista 1.\n\n");
  18. for(vector=0;vector<n;vector++){
  19. printf("Ingrese el valor %d:",vector+1);
  20. scanf("%d",&numerosa[vector]);
  21. }
  22. crear(numerosa,n);
  23. printf("\n\n");
  24. system("pause");
  25. return 0;
  26. }
  27. void crear(int numerosa[],int n){
  28. int vector,pares,impares,aux,y;
  29. float promedioa,promediob,promedioc,suma;
  30. char *mayor;
  31. promedioa=0;
  32. promediob=0;
  33. promedioc=0;
  34. aux=0;
  35. pares=0;
  36. impares=0;
  37. //contabilizar pares e impares
  38. for(vector=0;vector<n;vector++){
  39. y=numerosa[vector]%2;
  40. if(y==0){
  41. pares++;
  42. }
  43. else{
  44. impares++;
  45. }
  46. }
  47. int *numerosb=malloc(sizeof(int)*pares);
  48. int *numerosc=malloc(sizeof(int)*impares);
  49. //crear 2 y 3
  50. pares=0;
  51. impares=0;
  52. for(vector=0;vector<n;vector++){
  53. y=numerosa[vector]%2;
  54. if(y==0){
  55. numerosb[pares]=*(numerosa+vector);
  56. pares++;
  57. }
  58. else{
  59. numerosc[impares]=*(numerosa+vector);
  60. impares++;
  61. }
  62. }
  63. // mayor
  64. if(pares>impares){
  65. char p[]={'p','a','r'};
  66. mayor=p;
  67. }
  68. if(pares<impares){
  69. char i[]={'i','m','p','a','r'};
  70. mayor=i;
  71. }
  72. if(pares==impares){
  73. char ni[]={'n','i','n','g','u','n','a'};
  74. mayor=ni;
  75. }
  76. //el promedio vector a
  77. suma=0;
  78. for(vector=0;vector<n;vector++){
  79. suma+=numerosa[vector];
  80. }
  81. promedioa=(suma/n);
  82. //el promedio vector b
  83. if(pares>0){
  84. suma=0;
  85. for(vector=0;vector<pares;vector++){
  86. suma+=numerosb[vector];
  87. }
  88. promediob=(suma/pares);
  89. }
  90. //el promedio vector c
  91. if(impares>0){
  92. suma=0;
  93. for(vector=0;vector<impares;vector++){
  94. suma+=numerosc[vector];
  95. }
  96. promedioc=(suma/impares);
  97. }
  98. //imprimir
  99. if(n>0){
  100. printf("\n\nLista 1\t\tLista 2\t\tLista 3");
  101. for(vector=1;vector<=n;vector++){
  102. if(vector<=pares&&vector<=impares){
  103. printf("\n%d\t\t%d\t\t%d",numerosa[vector-1],numerosb[vector-1],numerosc[vector-1]);
  104. }
  105. if(vector>pares&&vector<=impares){
  106. printf("\n%d\t\t\t\t%d",numerosa[vector-1],numerosc[vector-1]);
  107. }
  108. if(vector<=pares&&vector>impares){
  109. printf("\n%d\t\t%d\t\t\t",numerosa[vector-1],numerosb[vector-1
  110. ]);
  111. }
  112. if(vector>pares&&vector>impares){
  113. printf("\n%d\t\t\t\t\t\t",numerosa[vector-1]);
  114. }
  115. }
  116. printf("\nPromedio.\n%.1f\t\t%.1f\t\t%.1f",promedioa,promediob,promedioc);
  117. if(*mayor=='p'||*mayor=='i'){
  118. printf("\n\nLa lista mas larga creada es la %s.",mayor);
  119. }
  120. else{
  121. printf("\n\nLa lista mas larga creada es %s.",mayor);
  122. }
  123. }
  124. free(numerosa);
  125. free(numerosb);
  126. free(numerosc);
  127. }

aprendi con este ejercicio malloc y free. Y calcular promedio de ese modo. muchas gracias a todos.