Autor
|
Tema: Ayuda errores en codigo en lenguaje c. (Leído 6,719 veces)
|
Roga
Desconectado
Mensajes: 23
|
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 /*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, además decir cuál de los vectores es más grande y el promedio de los elementos en cada vector.*/ #include <stdio.h> void crear(int numerosa[],int n); int main(){ int vector,n; 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."); printf("\nIngrese el numero de valores que desee cargar:"); int numerosa[n]; while(n<=0){ printf("\nValor invalido. Ingrese de nuevo.\nIngrese el numero de valores que desee cargar:"); int numerosa[n]; } for(vector=1;vector<=n;vector++){ printf("Ingrese el valor %d:",vector ); scanf("%d",&numerosa [vector ]); } crear(numerosa,n); return 0; } void crear(int numerosa[],int n){ int vector,numerosb[n],numerosc[n],pares,impares,aux,y; float promedioa,promediob,promedioc,suma; char *mayor; promedioa=0; promediob=0; promedioc=0; aux=0; pares=0; impares=0; //crear 2 y 3 for(vector=1;vector<=n;vector++){ y=numerosa[vector]%2; if(y==0){ pares++; numerosb[pares]=numerosa[vector]; } else{ impares++; numerosc[impares]=numerosa[vector]; } } // mayor if(pares>impares){ char p[]={'p','a','r'}; mayor=p; } if(pares<impares){ char i[]={'i','m','p','a','r'}; mayor=i; } if(pares==impares){ char ni[]={'n','i','n','g','u','n','a'}; mayor=ni; } //el promedio vector a aux=0; for(vector=1;vector<=n;vector++){ suma=numerosa[vector]+aux; aux=numerosa[vector]; } promedioa=suma/n; //el promedio vector b if(pares>0){ aux=0; for(vector=1;vector<=pares;vector++){ suma=numerosb[vector]+aux; aux=numerosb[vector]; } promediob=suma/pares; } //el promedio vector c if(impares>0){ aux=0; for(vector=1;vector<=impares;vector++){ suma=numerosc[vector]+aux; aux=numerosc[vector]; } promedioc=suma/impares; } //imprimir if(n>0){ printf("\n\nLista 1\t\tLista 2\t\tLista 3"); for(vector=1;vector<=n;vector++){ if(vector<=pares&&vector<=impares){ printf("\n%d\t\t%d\t\t%d",numerosa [vector ],numerosb [vector ],numerosc [vector ]); } if(vector>pares&&vector<=impares){ printf("\n%d\t\t\t\t%d",numerosa [vector ],numerosc [vector ]); } if(vector<=pares&&vector>impares){ printf("\n%d\t\t%d\t\t\t",numerosa [vector ],numerosb [vector ]); } if(vector>pares&&vector>impares){ printf("\n%d\t\t\t\t\t\t",numerosa [vector ]); } } printf("\nPromedio.\n%.1f\t\t%.1f\t\t%.1f",promedioa ,promediob ,promedioc ); if(*mayor=='p'||*mayor=='i'){ printf("\n\nLa lista mas larga creada es la %s.",mayor ); } else{ printf("\n\nLa lista mas larga creada es %s.",mayor ); } } }
De antemano muchas Gracias!.
|
|
« Última modificación: 28 Mayo 2017, 17:04 pm por Roga »
|
En línea
|
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
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
Mensajes: 23
|
ty. Ya investigo sobre el tema y contesto si me resulto. Y sobre el error de los promedios?.
|
|
|
En línea
|
|
|
|
Roga
Desconectado
Mensajes: 23
|
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
Mensajes: 1.603
|
Sí, claro. En vez de debes poner 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
Mensajes: 23
|
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
Mensajes: 1.603
|
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
Mensajes: 23
|
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
|
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: //el promedio vector a aux=0; for(vector=1;vector<=n;vector++){ suma=numerosa[vector]+aux; aux=numerosa[vector]; } Te basta hacer simplemente: suma = 0 for(vector=0;vector<=impares;vector++){ suma +=numerosc[vector]; }
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: 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: y=numerosa[vector]%2; if(y==0){ ...
Mejor así: if((numerosa[vector] & 1)==0){ ...
|
|
« Última modificación: 30 Mayo 2017, 06:36 am por NEBIRE »
|
En línea
|
|
|
|
Roga
Desconectado
Mensajes: 23
|
No entendi esta parte. 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
|
|
|
En línea
|
|
|
|
|
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,721
|
6 Marzo 2012, 02:46 am
por rir3760
|
|
|
Código de errores SMTP
Dudas Generales
|
4ndr3s19
|
1
|
2,402
|
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
|
2,361
|
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,345
|
1 Febrero 2019, 22:04 pm
por Serapis
|
|
|
Ayuda con un codigo (cualquier lenguaje)
Programación C/C++
|
Pech
|
0
|
4,090
|
1 Noviembre 2022, 23:09 pm
por Pech
|
|