Discussion:
Comprobación de argumentos junto strtod
(demasiado antiguo para responder)
Asile
2004-08-21 19:06:20 UTC
Permalink
  Hola, dos cuestiones sobre este programita:

1. Me gustaría combinar estos dos if en uno sólo con un ||
para no tener que repetir la función error(). No veo la manera
puesto no puedo comprobar n si arg!=2, y si argc==1 strtod da
segmentation fault logicamente.

Vamos, es como el perro que se come su rabo...

  if (argc!=2) error(program_name);
        n=strtod(argv[1],ptr); 

           
        /* Chequeo de error de la línea de comandos */
        if (n=='\0')  error(program_name);

2. ¿Qué tal veis el programa, está correcto? ¿estilo, mejoras, etc?
   ¿Hago bien con usar strtod?



/*
 * Hacer un programa que calcule y muestre por pantalla los N números
 * primos introducidos en la línea de comandos.
 * El parámetro N será obligatorio, y en caso de no introducirlo
 * se mostrará un error con la ayuda pertinente.
 * 
 * primos.c 
 * 21 de Agosto de 2004.
 * 
 */ 

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define TRUE 1
#define FALSE 0

int error(char *program_name);

int main (int argc, char **argv){
        
char *program_name;
char *ptr[256];
   
double n; /* veces */
int i;

int resto=0;
int cociente;
int es_primo=FALSE;

program_name=argv[0];

        /* Chequeo de error de la línea de comandos */
        if (argc!=2) error(program_name);
        n=strtod(argv[1],ptr); 

        /* Si n no es un número */
        if (n=='\0')  error(program_name);
         
       for (i=n;i>=1;i--){
          
        es_primo=TRUE;
          
        /* si solo es divisible por si mismo y la unidad es primo */
        for (cociente=n;cociente>=1;cociente--)
            {
            if (i!=cociente && cociente!=1)
                 {
                    resto=i%cociente;
                    /* Si el resto es cero ya no es primo */
                    if (resto==0) es_primo=FALSE;
                 }
            }
          if (es_primo==TRUE) printf ("%.0f Es primo\n",n);
          n--;
       }
   
return (0);
}
/* Mensaje de error */       
int error(char *program_name){
    fprintf (stderr,"Error:\nUso: %s <veces>\n",program_name);
    fprintf (stderr,"Donde <veces> ha de ser un número distinto de cero\n");
    exit (1);
}
barro
2004-10-02 15:08:16 UTC
Permalink
Hola Asile

No tengo mucho tiempo pero sí una sugerencia: la determinación de que un
número es primo se puede hacer por algoritmos más eficientes (rápidos) que
la búsqueda lineal que has hecho. Aplica la criba de Eratóstenes (un
múltiplo de primo es no primo) empezando por abajo, por ejemplo. Hay
infinidad de algoritmos, en Google busca "Sieve algorithms" por ejemplo ...
Post by Asile
1. Me gustaría combinar estos dos if en uno sólo con un ||
para no tener que repetir la función error(). No veo la manera
puesto no puedo comprobar n si arg!=2, y si argc==1 strtod da
segmentation fault logicamente.
Vamos, es como el perro que se come su rabo...
if (argc!=2) error(program_name);
n=strtod(argv[1],ptr);
/* Chequeo de error de la línea de comandos */
if (n=='\0') error(program_name);
2. ¿Qué tal veis el programa, está correcto? ¿estilo, mejoras, etc?
¿Hago bien con usar strtod?
/*
* Hacer un programa que calcule y muestre por pantalla los N números
* primos introducidos en la línea de comandos.
* El parámetro N será obligatorio, y en caso de no introducirlo
* se mostrará un error con la ayuda pertinente.
*
* primos.c
* 21 de Agosto de 2004.
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define TRUE 1
#define FALSE 0
int error(char *program_name);
int main (int argc, char **argv){
char *program_name;
char *ptr[256];
double n; /* veces */
int i;
int resto=0;
int cociente;
int es_primo=FALSE;
program_name=argv[0];
/* Chequeo de error de la línea de comandos */
if (argc!=2) error(program_name);
n=strtod(argv[1],ptr);
/* Si n no es un número */
if (n=='\0') error(program_name);
for (i=n;i>=1;i--){
es_primo=TRUE;
/* si solo es divisible por si mismo y la unidad es primo */
for (cociente=n;cociente>=1;cociente--)
{
if (i!=cociente && cociente!=1)
{
resto=i%cociente;
/* Si el resto es cero ya no es primo */
if (resto==0) es_primo=FALSE;
}
}
if (es_primo==TRUE) printf ("%.0f Es primo\n",n);
n--;
}
return (0);
}
/* Mensaje de error */
int error(char *program_name){
fprintf (stderr,"Error:\nUso: %s <veces>\n",program_name);
fprintf (stderr,"Donde <veces> ha de ser un número distinto de cero\n");
exit (1);
}
adgkfalsd
2004-10-03 09:47:26 UTC
Permalink
Post by barro
Hola Asile
No tengo mucho tiempo pero sí una sugerencia: la determinación de que un
número es primo se puede hacer por algoritmos más eficientes (rápidos) que
la búsqueda lineal que has hecho. Aplica la criba de Eratóstenes (un
múltiplo de primo es no primo) empezando por abajo, por ejemplo. Hay
infinidad de algoritmos, en Google busca "Sieve algorithms" por ejemplo ...
Hola,

recuerdo que existen diversos tests de primalidad utilizados
fundamentalmente en criptografía. Éstos se basan en principios
estadísticos, determinando si un número es no primo. Aplicándolos cierto
número de veces se va reduciendo la probabilidad de que un número sea
primo.

De los nombres de los métodos principales no me acuerdo ahora.

Loading...