]> git.llucax.com Git - z.facultad/75.42/euler.git/blob - tp1.c
Se mejora la impresión de error.
[z.facultad/75.42/euler.git] / tp1.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 #include "calculo.h"
20 #include "grafico.h"
21 /* Para utilizar printf() y stderr */
22 #include <stdio.h>
23 /* Para utilizar EXIT_SUCCES y EXIT_FAILURE */
24 #include <stdlib.h>
25
26 /** Tiempo inicial por omisión. */
27 #define DEFAULT_T0 0.0
28
29 /** Tiempo final por omisión. */
30 #define DEFAULT_TF 70.0
31
32 /** Valor inicial de la función por omisión. */
33 #define DEFAULT_F0 0.0
34
35 /** Valor del pas de iteración por omisión. */
36 #define DEFAULT_PASO 1.0
37
38 /** Caracter usado para dibujar un punto por omisión. */
39 #define DEFAULT_PUNTO '*'
40
41 /** Caracter usado para dibujar un punto blanco por omisión. */
42 #define DEFAULT_BLANCO ' '
43
44 /**
45  * Imprime una explicación de como usar el programa.
46  *
47  * \param fh Archivo en donde imprimir el mensaje (ej: stdout o stderr).
48  */
49 void imprimir_uso(FILE* fh) {
50     fprintf(fh, "\n");
51     fprintf(fh, "Modo de uso:\n");
52     fprintf(fh, "  tp1 [paso [tf [f0]]]\n");
53     fprintf(fh, "\n");
54     fprintf(fh, "Donde:\n");
55     fprintf(fh, "  paso: Paso a utilizar (%.2f por omisión).\n", DEFAULT_PASO);
56     fprintf(fh, "  tf:   Tiempo final (%.2f por omisión).\n", DEFAULT_TF);
57     fprintf(fh, "  f0:   Valor inicial de la función (%.2f por omisión).\n",
58             DEFAULT_F0);
59 }
60
61 /**
62  * Programa principal.
63  * Este es el programa que se encarga de resolver el trabajo práctico.
64  *
65  * \param argc Cantidad de parámetros de línea de comandos ingresados.
66  * \param argv Parámetros de línea de comandos.
67  *
68  * \return EXIT_FAILURE si hubo un error, si no EXIT_SUCCESS.
69  */
70 int main(int argc, const char** argv) {
71     /* Declaración de variables. */
72     Resultados  resultados; /* Vector de resultados. */
73     size_t      pasos; /* Cantidad de pasos a dibujar. */
74     Real        paso    = DEFAULT_PASO; /* Tamaño del paso */
75     Real        t0      = DEFAULT_T0; /* Tiempo inicial */
76     Real        tf      = DEFAULT_TF; /* Tiempo final */
77     Real        f0      = DEFAULT_F0; /* Valor inicial de la función */
78     char        punto   = DEFAULT_PUNTO; /* Caracter para dibujar un punto */
79     char        blanco  = DEFAULT_BLANCO; /* Caracter para dibujar un blanco */
80     /* Obtención de datos. */
81     if (!cargar_datos(argc, argv, &paso, &t0, &tf, &f0)) {
82         /* Si hay error, imprime mensaje con modo de uso y sale con error. */
83         imprimir_uso(stderr);
84         return EXIT_FAILURE;
85     }
86     /* Cálculo de la solución, dejando en un array los valores de cada paso. */
87     pasos = resultados_calcular(&resultados, paso, t0, tf, f0);
88     /* Impresión de variables principales. */
89     printf("\nt0 = %f | tf = %f | f0 = %f | paso = %f | pasos = %i\n\n", t0, tf, f0, paso, pasos);
90     /* Impresión del gráfico de la solución. */
91     resultados_graficar(&resultados, pasos, punto, blanco);
92     return EXIT_SUCCESS;
93 }
94