Ayuda errores en codigo en lenguaje c.

Iniciado por Roga, 28 Mayo 2017, 02:13 AM

0 Miembros y 1 Visitante están viendo este tema.

Roga

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:");
scanf("%d",&n);
int numerosa[n];
while(n<=0){
printf("\nValor invalido. Ingrese de nuevo.\nIngrese el numero de valores que desee cargar:");
scanf("%d",&n);
int numerosa[n];
}
printf("\nLista 1.\n\n");
for(vector=1;vector<=n;vector++){
printf("Ingrese el valor %d:",vector);
scanf("%d",&numerosa[vector]);
}
crear(numerosa,n);
printf("\n\n");
system("pause");
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!. :D

MAFUS

#1
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

Roga

ty. Ya investigo sobre el tema y contesto si me resulto. Y sobre el error de los promedios?.

Roga

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.

MAFUS

#4
Sí, claro. En vez de
int numerosa[n];
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.

Roga

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.

MAFUS

Suma después, no antes. Además las líneas 17, 63, 71, 81, etc. lo haces con un for.

Roga

#7
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.

Serapis

#8
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){
                  ...

Roga

No entendi esta parte.
CitarMejor 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

free(numerosa);
free(numerosb);
free(numerosc);