[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