]> git.llucax.com Git - z.facultad/75.42/euler.git/blob - tp1.h
eb00948a46ee8adab9424b67eb5295dfe7a08046
[z.facultad/75.42/euler.git] / tp1.h
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 /************************ BIBLIOTECAS USADAS *******************************/
19
20 /* Para utilizar printf(), fprintf() y stderr */
21 #include <stdio.h>
22 /* Para utilizar strtod(), EXIT_SUCCES y EXIT_FAILURE */
23 #include <stdlib.h>
24
25
26
27 /***************************** CONSTANTES **********************************/
28
29 /** Indica un valor verdadero */
30 #define TRUE 1
31
32 /** Indica un valor falso */
33 #define FALSE 0
34
35 /** Máxima cantidad de pasos a calcular. */
36 #define MAX_PASOS 70
37
38 /** Altura (en líneas) utilizadas para dibujar el gráfico. */
39 #define ALTO 20
40
41 /** Ancho (en líneas) utilizadas para dibujar el gráfico. */
42 #define ANCHO 70
43
44 /** Tiempo inicial. */
45 #define T0 0.0
46
47 /** Tiempo final por omisión. */
48 #define DEFAULT_TF 70.0
49
50 /** Valor inicial de la función por omisión. */
51 #define DEFAULT_F0 0.0
52
53 /** Valor del pas de iteración por omisión. */
54 #define DEFAULT_PASO 1.0
55
56
57
58 /******************************* MACROS ************************************/
59
60 /**
61  * \ref integracion "Calcula" el siguiente paso de la función numérica.
62  * Obtiene el siguiente valor de \f$ f \f$, integrando numéricamente la \ref
63  * funcion "ecuación diferencial" por el \ref metodo "método de euler".
64  * \f[
65  *     f_{t + step} = f_{(step, f_t)} = f_t + \frac{500 - f_t}{30} \cdot step
66  * \f]
67  *
68  * \note Se pone en un macro para poder reemplazar fácilmente la función sin la
69  *       pérdida de velocidad que agrega la indirección de un llamado a una
70  *       función.
71  */
72 #define FUNCION(paso, ft) ((ft) + ((500.0 - (ft)) / 30.0) * paso)
73
74
75
76 /************************ TIPOS DE DATOS UTILIZADOS ************************/
77
78 /**
79  * Tipo de dato utilizado para medir el tiempo y el valor de la función.
80  * Se define como un tipo de dato propio para cambiar fácilmente la precisión.
81  */
82 typedef float Real;
83
84 /**
85  * Vector que representa los resultados.
86  * El índice del vector representa el número de iteración (que multiplicado por
87  * el paso da el tiempo, o eje X). El contenido es el valor de la
88  * \ref funcion "función" en ese instante.
89  */
90 typedef Real Resultados[MAX_PASOS];
91
92
93
94 /********************************* FUNCIONES *******************************/
95
96 /**
97  * Imprime una explicación de como usar el programa.
98  *
99  * \param fh Archivo en donde imprimir el mensaje (ej: stdout o stderr).
100  */
101 void imprimir_uso(FILE* fh);
102
103 /**
104  * Carga (validando) un dato real en una variable.
105  * Si al validar hay algún error, muestra un mensaje por la salida de error y
106  * devuelve false.
107  *
108  * \param arg Argumento a cargar (y validar).
109  * \param var Variable en donde cargar el real.
110  * \param nom Nombre de la variable que se quiere cargar (para el mensaje de
111  *            error, en caso de haberlo).
112  *
113  * \return TRUE si se cargó bien, FALSE si no.
114  */
115 int argtod(const char* arg, Real* var, const char* nom);
116
117 /**
118  * Carga los datos necesarios por el \ref main "programa".
119  * Obtiene los datos desde los parámetros de la línea de comandos, validándolos
120  * y mostrando un mensaje de error en caso de haberlo.
121  *
122  * \param argc Cantidad de parámetros de línea de comandos ingresados.
123  * \param argv Parámetros de línea de comandos.
124  * \param paso Paso utilizado para las iteraciones.
125  * \param tf   Tiempo final.
126  * \param f0   Valor inicial de la función.
127  *
128  * \return TRUE si se cargaron bien, FALSE si no.
129  * \todo \b TODO Verificar que el paso no sea cero y que tf > ti.
130  * \todo \b TODO Agregar opciones para especificar caracter en blanco y de punto.
131  */
132 int cargar_datos(int argc, const char** argv, Real* paso, Real* tf, Real* f0);
133
134 /**
135  * \ref integracion "Calcula" todos los valores de la función.
136  *
137  * \param res  Vector donde se guardan los resultados.
138  * \param paso Paso de iteración.
139  * \param ti   Tiempo de inicio de la iteración.
140  * \param tf   Tiempo final de la iteración.
141  * \param f0   Valor inicial de la función.
142  *
143  * \return Cantidad de pasos realizados.
144  */
145 size_t calcular(Resultados* res, Real paso, Real ti, Real tf, Real f0);
146
147 /**
148  * Devuelve el valor máximo de los resultados.
149  *
150  * \param res   Vector de resultados.
151  * \param pasos Cantidad de pasos a iterar.
152  *
153  * \return Máximo resultado.
154  */
155 Real resultados_max(Resultados* res, size_t pasos);
156
157 /**
158  * Devuelve el valor mínimo de los resultados.
159  *
160  * \param res   Vector de resultados.
161  * \param pasos Cantidad de pasos a iterar.
162  *
163  * \return Mínimo resultado.
164  */
165 Real resultados_min(Resultados* res, size_t pasos);
166
167 /**
168  * Rellena una cadena de caracteres con un caracter arbitrario.
169  *
170  * \param linea    Cadena de caracteres.
171  * \param caracter Caracter utilizado para rellenar.
172  * \param cant     Cantidad de caracteres a rellenar.
173  */
174 void inicializar_linea(char* linea, char caracter, size_t cant);
175
176 /**
177  * Imprime un gráfico de los resultados por pantalla.
178  * Realiza un gráfico de la función por pantalla, imprimiendo línea por línea.
179  * Cada línea representa un rango de valores. En cada línea se dibuja el
180  * caracter \e punto si la función en el tiempo evaluado está en el rango de esa
181  * línea. Si no lo está se dibuja el caracter \e blanco.
182  *
183  * \param res    Vector de resultados a graficar.
184  * \param pasos  Cantidad de pasos a graficar.
185  * \param punto  Caracter utilizado para dibujar un punto de la función.
186  * \param blanco Caracter utilizado para dibujar un punto en blanco.
187  */
188 void resultados_graficar(Resultados* res, size_t pasos, char punto, char blanco);
189
190 /**
191  * Programa principal.
192  * Este es el programa que se encarga de resolver el trabajo práctico.
193  *
194  * \param argc Cantidad de parámetros de línea de comandos ingresados.
195  * \param argv Parámetros de línea de comandos.
196  *
197  * \return EXIT_FAILURE si hubo un error, si no EXIT_SUCCESS.
198  */
199 int main(int argc, const char** argv);
200