[C con Clase] Errores de aprendiz

Steven Davidson srd4121 en njit.edu
Dom Mayo 11 20:58:24 CEST 2008


Hola Ariel,

Ariel Tarifeño wrote:
> Estoy tratando de traducir un seudocodigo de la U pero me da muchos 
> errores al compilar y no entiendo aun que esta mal.
>  

Si tienes errores de compilación, deberías darnos los mensajes que el 
compilador te muestra, al igual que el nombre y versión del compilador 
que estás usando.

Veamos el código fuente.

> #include <stdio.h>
> #include <conio.h>
> 

Ten en cuenta que <conio.h> no es un fichero de cabecera estándar y por 
tanto no todos los compiladores deben conocerlo ni la biblioteca 
asociada de "conio".

> int Factorial(int N)
> {
>     int Fact;
>     While (N > 0)

El vocablo correcto es 'while' (en minúsculas). Desconozco si realmente 
lo escribiste así en el código fuente, o es una "conversión" 
automáticamente de tu correo-e.

>         {
>         Fact = Fact * N;
>         N = N - 1;
>         }
>     return Fact;
> }

El error está en 'Fact'. Cuando declaras una variable local, ésta no 
contiene un valor conocido. De hecho, contiene cualquier valor que 
estaba ahí en memoria. Por eso, decimos que contiene "basura". La regla 
de oro en la programación es: "Si metes basura, te saldrá basura".

La solución es inicializar la variable 'Fact' para que contenga un valor 
válido y esperado. En este caso, sugiero el valor de 1, porque así 
coincide con el caso de 0! = 1 y además es el elemento neutro de la 
multiplicación; o sea,

Fact = 1 * N  =>  Fact = N

Dicho esto, podrías usar un bucle 'for', en lugar de 'while'. Así puedes 
escribir las operaciones iniciales del algoritmo y el control de 'N', en 
la cabecera de 'for'. Esto sería,

for( Fact=1; N>0; N-- )  Fact *= N;

Como puedes ver, también aconsejo usar los operadores que combinan 
operaciones aritméticas y asignaciones.

> 
> int EsPrimo(int N)
> {
>     If ((Factorial(N-1)+1) % N == 0)
>         Return 1;

Nuevamente, los vocablos de C están en minúsculas, específicamente, 'if' 
y 'return'.

>     else
>         return 0;
> }

Aunque este código sea lógico, no es necesario. Si podemos enviar 
cualquier número entero distinto de cero, y no tiene por qué ser un 1, 
entonces podemos reescribir el código como,

return (Factorial(N-1)+1) % N == 0;

> 
> void main ()
> {
>     int i;
>     clrscr();
>     printf("Ingrese numero: ");
>     scanf("%d", &i);
>     if(EsPrimo(i))
>         printf("El numero es primo");
>     else
>         printf("El numero no es primo");
> 
>     getch();
> }
> 

Este método es bastante interesante; lo desconocía por completo. De 
todos modos, debes tener en cuenta que 'int' tiene sus limitaciones. 
Esto conlleva a un cálculo erróneo de 'Factorial()', en cuanto su 
parámetro se eleve a partir de 12 (int=32 bits) y 21 (int=64 bits).


Espero que esto te ayude.

Steven






Más información sobre la lista de distribución Cconclase