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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


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

Desconectado Desconectado

Mensajes: 23


Ver Perfil
Ayuda errores en codigo en lenguaje c.
« 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


« Última modificación: 28 Mayo 2017, 17:04 pm por Roga » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Ayuda errores en codigo en lenguaje c.
« Respuesta #1 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


« Última modificación: 28 Mayo 2017, 19:34 pm por MAFUS » En línea

Roga

Desconectado Desconectado

Mensajes: 23


Ver Perfil
Re: Ayuda errores en codigo en lenguaje c.
« Respuesta #2 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?.
En línea

Roga

Desconectado Desconectado

Mensajes: 23


Ver Perfil
Re: Ayuda errores en codigo en lenguaje c.
« Respuesta #3 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.
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Ayuda errores en codigo en lenguaje c.
« Respuesta #4 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.
« Última modificación: 29 Mayo 2017, 21:54 pm por MAFUS » En línea

Roga

Desconectado Desconectado

Mensajes: 23


Ver Perfil
Re: Ayuda errores en codigo en lenguaje c.
« Respuesta #5 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.
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Ayuda errores en codigo en lenguaje c.
« Respuesta #6 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.
En línea

Roga

Desconectado Desconectado

Mensajes: 23


Ver Perfil
Re: Ayuda errores en codigo en lenguaje c.
« Respuesta #7 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.
« Última modificación: 30 Mayo 2017, 01:03 am por Roga » En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.355


Ver Perfil
Re: Ayuda errores en codigo en lenguaje c.
« Respuesta #8 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.                   ...
« Última modificación: 30 Mayo 2017, 06:36 am por NEBIRE » En línea

Roga

Desconectado Desconectado

Mensajes: 23


Ver Perfil
Re: Ayuda errores en codigo en lenguaje c.
« Respuesta #9 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);
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Errores con el código de una calculadora simple
Programación C/C++
petrusqui 7 4,223 Último mensaje 6 Marzo 2012, 02:46 am
por rir3760
Código de errores SMTP
Dudas Generales
4ndr3s19 1 2,110 Último mensaje 14 Mayo 2016, 02:29 am
por engel lex
Necesito ayuda con mi código marca errores que no comprendo
Programación C/C++
Yaredsf 4 1,980 Último mensaje 26 Noviembre 2018, 07:20 am
por AlbertoBSD
El lenguaje de programación no influye en los errores del código
Noticias
wolfbcn 1 1,056 Último mensaje 1 Febrero 2019, 22:04 pm
por Serapis
Ayuda con un codigo (cualquier lenguaje)
Programación C/C++
Pech 0 3,612 Último mensaje 1 Noviembre 2022, 23:09 pm
por Pech
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines