Discussion:
Ingresar solo datos numeriocs en un programa
(demasiado antiguo para responder)
quenties
2005-08-02 08:24:12 UTC
Permalink
Hola!
Pues eso:
Necesito una función que ingrese SOLO datos numericos para un programa
de calculo. Y si, por error, se da un tipo char- cualquier otro que no sea
un numero- avise y no salga del programa.
Gracias
Oscar Garcia
2005-08-02 09:09:05 UTC
Permalink
Post by quenties
Necesito una función que ingrese SOLO datos numericos para un programa
de calculo. Y si, por error, se da un tipo char- cualquier otro que no sea
un numero- avise y no salga del programa.
programa.c:1: error: too few arguments to function `ayudame'

¿Has probado con GNU Magic para Linux?:

Package: gnu_magic
Status: install ok installed
Installed-Size: 1
Maintainer: Merlin
Source: gnu_magic
Version: 1.0.1
Depends: libc6, libglib1.2 (>= 1.2.0-1), libstdc++2.8 (>= 2.90.26-1)
Description: a magic program
Gnu Magic performs the kind of tasks any other program tends to fail
miserably at. It is often used in repetitive and/or impossible tasks
for human beings, such as compressing your whole 2Gb /usr partition
into a 100Kb .tgz file, fixing kernel bugs, using WinModems in Linux
and creating drivers for devices no one has information about.
Note: Gnu Magic is known to run in Linux 2.0 and 2.2. We'd like to
hear from your experiences with other systems.

Aunque inicialmente no pone nada de que funcione en núcleos 2.4 y 2.6
lo hace perfectamente (usando repositorios backport). Se prevee
también compatibilidad con los futuros núcleos de Linux 2.8 y 3.0
usando GNU Magic 1.0.1 sobre su propio código fuente.

Se ha hablado incluso que funcione en Windows si cambias un par de
líneas de código que dan warnings y algún que otro error.

Más información de GNU Magic:
http://www.escomposlinux.org/humor/msg.php?txt1=linux&txt2=GNU-Magic
http://www.escomposlinux.org/humor/msg.php?txt1=linux&txt2=GNU-Magic2

Hoy me he levantado con este sentido del humor :)

Tal y como te he dicho en la primera línea: te faltan argumentos a la
función de "ayuda" que hacemos. Nos vendría muy bien algún que otro
ejemplo porque la verdad que no entiendo nada de nada.

¿La entrada de datos es el teclado en tiempo real? ¿Es la entrada
estándar? ¿Es un archivo? ¿Es un dispositivo?

¿La salida de datos es la salida estándar? ¿Es un archivo? ¿Es el
error estándar?

¿Qué formato numérico tienen los datos? ¿Qué formato numérico
necesitas a la salida?

Etc..

Un saludo.
--
Óscar Javier García Baudet
LinaresDigital
http://redstar.linaresdigital.com/
quenties
2005-08-02 10:01:51 UTC
Permalink
Post by Oscar Garcia
Post by quenties
Necesito una función que ingrese SOLO datos numericos para un programa
de calculo. Y si, por error, se da un tipo char- cualquier otro que no sea
un numero- avise y no salga del programa.
Tal y como te he dicho en la primera línea: te faltan argumentos a la
función de "ayuda" que hacemos. Nos vendría muy bien algún que otro
ejemplo porque la verdad que no entiendo nada de nada.
Veamos:
Para hacer el calculo de una matriz inversa-por ejemplo- y dando los datos
por teclado si ingreso sentido, humor, etc..., que no me los admita, que
solo admita caracteres que en ascii esté comprendido entre 47 y 58 - de 0
a 9-, el punto: para escribir reales. En caso de ingresar otro que me
siga pidiendo números- en gral, float- para poder calcular el determ, etc..
Post by Oscar Garcia
¿La entrada de datos es el teclado en tiempo real?
si, por teclado
¿Es la entrada estándar?
Post by Oscar Garcia
¿La salida de datos es la salida estándar? ¿Es un archivo? ¿Es el
error estándar?
¿Qué formato numérico tienen los datos? ¿Qué formato numérico
necesitas a la salida?
float
Post by Oscar Garcia
Etc..
Un saludo.
Oscar Garcia
2005-08-02 11:16:47 UTC
Permalink
Post by quenties
Para hacer el calculo de una matriz inversa-por ejemplo- y dando los datos
por teclado si ingreso sentido, humor, etc..., que no me los admita, que
solo admita caracteres que en ascii esté comprendido entre 47 y 58 - de 0
a 9-, el punto: para escribir reales. En caso de ingresar otro que me
siga pidiendo números- en gral, float- para poder calcular el determ, etc..
A mí me gusta siempre dividir los problemas grandes en otros más
pequeños que sean fácilmente implementados.

Por partes yo haría lo siguiente:

1.- Leer una línea de la entrada estándar (así puedes enviar un
archivo si lo deseas y te ahorras el teclear).
2.- Separar la cadena por el delimitador elegido (¿una coma? ¿un
espacio en blanco? ¿cualquiera de los dos? tú eres el programador y
puedes elegir lo que desees). La salida podría ser una matriz de como
máximo N elementos estáticos (para no complicarte la vida con listas)
y si la entrada tiene más de esos N elementos ignora el resto.
3.- Una a una convierte esas cadenas en valores numéricos usando por
ejemplo (float)atof(cadena).
4.- Asigna cada uno de esos valores a tu array de salida.
Post by quenties
Post by Oscar Garcia
¿La entrada de datos es el teclado en tiempo real?
si, por teclado
¿Es la entrada estándar?
Es la entrada estándar por defecto si no se especifica otra.

Por ejemplo, puedes guardar los datos de una matriz en un archivo y
enviárselo por la entrada estándar para evitar teclearlo en cada
prueba de la siguiente manera:

qstar:~$ ./mirpograma < matriz.txt

De esa forma el operador < cambia la entrada del teclado por lo que
haya en un archivo. Lo mismo con >, en vez de sacar la salida por
pantalla la guarda en un archivo.

También puedes usar | ("pipes" o tuberías) y otras cosillas que te
permite el sistema operativo para jugar con tus programas.
Post by quenties
float
Que no se te olvide hacer el (float) a la salida del atof ya que la
salida es un double y no un float (la conversión -casting- de todas
formas la hace solito, pero siempre es más -correcto- hacerlo uno
mismo).

Un saludo.
--
Óscar Javier García Baudet
LinaresDigital
http://redstar.linaresdigital.com/
Carlos
2005-08-02 18:12:23 UTC
Permalink
Post by quenties
Hola!
Necesito una función que ingrese SOLO datos numericos para un programa
de calculo. Y si, por error, se da un tipo char- cualquier otro que no sea
un numero- avise y no salga del programa.
Gracias
scanf().

$ cat sc.c
#include <stdio.h>
#include <stdlib.h>

#define MUERE(msj) do { \
fprintf(stderr,"ERROR (l.%d): %s\n", __LINE__, msj);\
exit(1);\
} while (0)

int main (void)
{
float x, vector[3];
int res, i;

puts("tres números y un multiplicador, vamos:");
for (i=0; i<3; i++) {
res = scanf("%f", &vector[i]);
if (!res) MUERE("no es un float");
if (res == EOF) MUERE("eof");
}
res = scanf("%f", &x);
if (!res) MUERE("no es un float");
if (res == EOF) MUERE("eof");

puts("resultado:");
for (i=0; i<3; i++) { printf("%f ", vector[i]*x); }
puts("");

return 0;
}
$ gcc -Wall -o sc sc.c
$ ./sc
tres números y un multiplicador, vamos:
9.00032 1.3344
6543.21 2.0000001
resultado:
18.000641 2.668800 13086.419922
$ ./sc
tres números y un multiplicador, vamos:
3.434554 3.433hola 4.0001
ERROR (l.17): no es un float
$

Un posible problema de scanf es que acepta números que empiezan con
punto, por lo que interpreta "1.2.3.4" como "1,2", "0,3", "0,4".

Suerte.
Carlos
2005-08-02 18:59:20 UTC
Permalink
Post by Carlos
Post by quenties
Hola!
Necesito una función que ingrese SOLO datos numericos para un
programa de calculo. Y si, por error, se da un tipo char- cualquier
otro que no sea
un numero- avise y no salga del programa.
^^ caramba, me comí este "no"
Post by Carlos
Post by quenties
Gracias
scanf().
Esta versión no sale del programa cuando se ingresa algo que no sea un
número, sino que saltea los caracteres inválidos:

$ cat sc.c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define MUERE(msj) do { \
fprintf(stderr,"ERROR (l.%d): %s\n", __LINE__, msj);\
exit(1);\
} while (0)

int main (void)
{
float x, vector[3];
int res, i;

puts("tres números y un multiplicador, vamos:");
for (i=0; i<3; i++) {
res = scanf("%f", &vector[i]);
if (!res)
{
scanf("%*[^0-9.-]");
fprintf(stderr, "me salteo basura "\
"ante el campo %d\n", i+1);
i--;
}
if (res == EOF) MUERE("eof");
}
do {
res = scanf("%f", &x);
if (!res)
{
scanf("%*[^0-9.-]");
fprintf(stderr, "salteo basura\n");
}
if (res == EOF) MUERE("eof");
} while (!res);

puts("resultado:");
for (i=0; i<3; i++) { printf("%f ", vector[i]*x); }
puts("");

return 0;
}
$ gcc -Wall -o sc sc.c
$ ./sc
tres números y un multiplicador, vamos:
### akj asdk a 10 ksj ka 20 --ds - sad- 30 kjkasd 2
me salteo basura ante el campo 1
me salteo basura ante el campo 2
me salteo basura ante el campo 3
me salteo basura ante el campo 3
me salteo basura ante el campo 3
me salteo basura ante el campo 3
salteo basura
resultado:
20.000000 40.000000 60.000000
$

Suerte.
quenties
2005-08-03 07:22:15 UTC
Permalink
Post by Carlos
#define MUERE(msj) do { \
fprintf(stderr,"ERROR (l.%d): %s\n", __LINE__, msj);\
exit(1);\
} while (0)
He estado leyebdo fprintf, pero, no me entero muy bien como funciona el
mensaje MUERE...
Post by Carlos
Muy agradecido.
quenties
Carlos
2005-08-03 13:35:42 UTC
Permalink
Post by quenties
Post by Carlos
#define MUERE(msj) do { \
fprintf(stderr,"ERROR (l.%d): %s\n", __LINE__, msj);\
exit(1);\
} while (0)
He estado leyebdo fprintf, pero, no me entero muy bien como funciona el
mensaje MUERE...
Para verlo funcionar, basta con correr el programa y apretar ^D antes de
ingresar ningún número. Para ver cómo se expande el macro, se pueden
abrir dos xterms, una al lado de la otra. En una se corre
"gcc -E sc.c | less", y en la otra "less sc.c". En ambas se va al final
(tecla ">") y se comparan las diferencias.

Suerte.
Post by quenties
Post by Carlos
Muy agradecido.
No fue nada.

Loading...