Discussion:
Comprobación de argumentos junto strtod.
(demasiado antiguo para responder)
Asile
2004-08-19 00:46:30 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);
}
J.A. Gutierrez
2004-08-23 08:46:35 UTC
Permalink
Asile <***@ninguna.com> wrote:

: 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

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

if (!(( argc == 2 ) && ( 0 != ( n = atoi(argv[1] )))))
printf( "Error\n");
else
printf( "%d\n", n);


: 2. ¿Qué tal veis el programa, está correcto? ¿estilo, mejoras, etc?

#ifndef TRUE
: #define TRUE 1
#endif
#ifndef FALSE
: #define FALSE 0
#endif

: program_name=argv[0];

#define PATH_SEP '/'

if ((program_name = strrchr(argv[0], PATH_SEP)) != NULL)
program_name = program_name+1;
else
program_name = argv[0];
--
finger ***@shiva.cps.unizar.es for PGP /
.mailcap tip of the day: / La vida es una carcel
application/ms-tnef; cat '%s' > /dev/null / con las puertas abiertas
text/x-vcard; cat '%s' > /dev/null / (A. Calamaro)
Asile
2004-08-26 12:20:38 UTC
Permalink
Post by J.A. Gutierrez
: 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
: if (argc!=2) error(program_name);
: n=strtod(argv[1],ptr);
: if (n=='\0') error(program_name);
if (!(( argc == 2 ) && ( 0 != ( n = atoi(argv[1] )))))
printf( "Error\n");
else
printf( "%d\n", n);
: 2. ¿Qué tal veis el programa, está correcto? ¿estilo, mejoras, etc?
#ifndef TRUE
: #define TRUE 1
#endif
#ifndef FALSE
: #define FALSE 0
#endif
: program_name=argv[0];
#define PATH_SEP '/'
if ((program_name = strrchr(argv[0], PATH_SEP)) != NULL)
program_name = program_name+1;
else
program_name = argv[0];
Gracias por las correcciones J.A. muy buenas.

Loading...