]> git.llucax.com Git - z.facultad/75.42/euler.git/blob - carga.c
Se completa el TP y la documentación.
[z.facultad/75.42/euler.git] / carga.c
1 /* vim: set et ts=4 sw=4 fdm=indent fdl=1 fdn=1 fo+=t:
2  *
3  * Taller de Programación (75.42).
4  *
5  * Ejercicio Número 1:
6  * Graficador de la solución de una ecuación diferencial por el método
7  * de Euler (explícito).
8  *
9  * Copyleft 2003 - Leandro Lucarella <llucare@fi.uba.ar>
10  * Puede copiar, modificar y distribuir este programa bajo los términos de
11  * la licencia GPL (http://www.gnu.org/).
12  *
13  * Creado: sáb ago 23 16:59:01 ART 2003
14  *
15  * $Id$
16  */
17
18 #include "carga.h"
19 /* Para utilizar fprintf() y stderr */
20 #include <stdio.h>
21 /* Para utilizar strtod() */
22 #include <stdlib.h>
23
24 int argtod(const char* arg, Real* var, const char* nom) {
25     /* Puntero al último caracter bien interpretado por strtod. */
26     char* err = NULL;
27     /* Realiza la conversión de un string a un Real */
28     *var = strtod(arg, &err);
29     /* Si el caracter donde apunta endptr es 0 es porque se interpretó toda la
30      * cadena bien */
31     if ((char)*err == '\0') {
32         return TRUE;
33     /* Si no, es que hubo error. */
34     } else {
35         fprintf(stderr, "Error: El parámetro '%s' debe ser un número ", nom);
36         fprintf(stderr, "real. Usted ingresó '%s' pero '%s' no ", arg, err);
37         fprintf(stderr, "pudo ser interpretado.\n");
38         return FALSE;
39     }
40 }
41
42 int cargar_datos(int argc, const char** argv, Real* paso, Real* t0, Real* tf,
43         Real* f0) {
44     switch (argc) {
45         /* Si no tiene parámetros usa los valores por omisión. */
46         case 1:
47             break;
48         /* Si tiene de 1 a 3 parámetros, los lee y valida, saliendo con un
49          * mensaje de error en caso de haberlo. */
50         case 4:
51             /* Hay 3 parámetros, lee el 3er parámetro. */
52             if (!argtod(argv[3], f0, "f0")) {
53                 return FALSE;
54             }
55             /* Continúa con el resto de los parámetros. */
56         case 3:
57             /* Hay al menos 2 parámetros, lee el 2do parámetro. */
58             if (!argtod(argv[2], tf, "tf")) {
59                 return FALSE;
60             }
61             /* Continúa con el resto de los parámetros. */
62         case 2:
63             /* Hay al menos 1 parámetro, lee el 1er parámetro. */
64             if (!argtod(argv[1], paso, "paso")) {
65                 return FALSE;
66             }
67             break; /* Finaliza el switch (no lee más parámetros). */
68         /* Hay demasiados parámetros, sale con mensaje de error. */
69         default:
70             fprintf(stderr, "Error: Demasiados parámetros.\n");
71             return FALSE;
72     }
73     /* El paso debe ser mayor que cero. */
74     if (*paso <= 0.0) {
75         fprintf(stderr, "Error: El paso (%f) debe ser mayor que cero.", *paso);
76         return FALSE;
77     }
78     /* El tiempo final debe ser mayor que el inicial. */
79     if (*t0 >= *tf) {
80         fprintf(stderr, "Error: El tiempo final (%f) no es mayor que ", *tf);
81         fprintf(stderr, "el tiempo inicial (%f).", *t0);
82         return FALSE;
83     }
84     return TRUE;
85 }
86