C/Visual C - Evaluacion de un codigo

 
Vista:

Evaluacion de un codigo

Publicado por Serguei (15 intervenciones) el 03/10/2005 02:46:14
Saludos a todos, aqui está un estracto de las funciones, no da ningún problema lo malo es que no me devuelve lo que yo espero, yo quiero un Mod pero devuelve un numero cualquiera...
para que vean de qué les hablo aquí está el código:

/* Se trata de cumplir la formula r=(n-Rb);
donde r= respuesta, n=numero, R=resultado de la division
b= base num‚rica*/

int binar(int n){
#define b 2
int i,res[12]={0},resi[13]={0};
res[0]=n;
i=0;
do{
res[i++]=res[i]/b;
resi[13-i]=res[i]%b;
i++;
}while( res[i] > b);
binprint(resi);
return 0;
}
int binprint(int resi[]){
int i;
for (i=0;i<=13;i++)
printf("%d",resi[i]);
return 0;
}

Gracias de Antemeno..
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Evaluacion de un codigo

Publicado por fernando.gomez (1603 intervenciones) el 03/10/2005 19:40:40
Hola, me llama la atención el siguiente fragmento:

int binar(int n){
#define b 2
int i,res[12]={0},resi[13]={0};
res[0]=n;
i=0;
do{
res[i++]=res[i]/b;
resi[13-i]=res[i]%b;
i++;
}while( res[i] > b);

sobre todo el bucle do. Por cierto, creo que deberías cambiar #define b 2 por const int b = 2.

Haciendo un análisis. En la primera iteración, i vale 0, y haces referencia al 0-avo (perdón por el abuso en la notación) elemento en el arreglo. Aumentas i en uno, por lo que le estás asignando al 0-avo elemento, la división del 1-avo elemento entre 2. Pero todo tu arreglo está iniciado a 0, por lo que el resultado será cero. Al hacer la asignación al último elemento de resi, obtienes el residuo entre el 1-avo elemento y 2. Pero el 1-avo elemento es cero, así que el último elemento de resi es cero también. Así, vale gorro que inicies res a n, porque siempre le asignas 0 eventualmente. Luego aumentas i en uno. Pero para la siguiente iteración, haces lo mismo, y le asignas a res el SIGUIENTE elemento en tu arreglo. Pero todo res está inicializado a cero menos el primer elemento, el cuál nunca usas, por lo que yo te podría concluir que todo tu arreglo, tanto res como resi, contendrá elementos con valor cero. Quizás no entiendo bien qué quieres hacer, pero me parece que tu función está mal. ¿Así es como se debería comportar?

Pero dices que te sale un número cualquiera, y yo creo que el problema es la inicialización del arreglo. Según yo,
res[12]={0} es incorrecto, y en el mejor de los casos, inicializarás SOLO EL PRIMER ELEMENTO DEL ARREGLO a cero, por lo que en toda tu operación empleas para hacer tus cálculos basura de memoria.

Creo yo que habrías de hacer dos cosas. Primero, inicializar bien res:
res[12] = {0,0,0,0,0,0,0,0,0,0,0,0};
o si te da flojera --como a mí me daría escribir todo eso--, prueba:
memset(res, 0, sizeof(int)*12);

Segundo, creo yo que en la primera sentencia del bucle,
res[i++] = res[i]/b;
es incorrecta. Creo yo que no deberías aumentar i en uno. Revisa esto. Según yo, esto debería quedar como:
res[i] = res[i] / b;
lo que puedes escribir como:
res[i] /= b;

Revisa y me avisas. Salutes.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar