[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