[C con Clase] Errores de aprendiz
Ariel Tarifeño
ariel.tarifeno en gmail.com
Lun Mayo 12 20:11:42 CEST 2008
Gracias Steven. Me ayudo mucho. Sii, del N° 13 en adelante daba siempre
error. Lo cambie y funciona aunque sigue siendo de principiante.
#include <stdio.h>
int EsPrimo(int N)
{
int Divisor;
int Contador;
Divisor = 1;
Contador = 0;
if (N > 0)
{
do
{
if (N % Divisor == 0)
Contador = Contador + 1;
Divisor = Divisor + 1;
}
while (Divisor <= N);
if (Contador <= 2)
return 1;
}
return 0;
}
void main ()
{
int i;
printf("Ingrese numero: ");
scanf("%d", &i);
if(EsPrimo(i))
printf("El numero es primo");
else
printf("El numero no es primo");
getch();
}
Saludos
2008/5/11 Steven Davidson <srd4121 en njit.edu>:
> 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
>
>
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20080512/66422894/attachment.html>
Más información sobre la lista de distribución Cconclase