1 /* vim: set et ts=4 sw=4 fdm=indent fdl=1 fdn=1 fo+=t:
3 * Taller de Programación (75.42).
6 * Graficador de la solución de una ecuación diferencial por el método
7 * de Euler (explícito).
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/).
13 * Creado: sáb ago 23 16:59:01 ART 2003
18 /************************ BIBLIOTECAS USADAS *******************************/
20 /* Para utilizar printf(), fprintf() y stderr */
22 /* Para utilizar strtod(), EXIT_SUCCES y EXIT_FAILURE */
27 /***************************** CONSTANTES **********************************/
29 /** Indica un valor verdadero */
32 /** Indica un valor falso */
35 /** Máxima cantidad de pasos a calcular. */
38 /** Altura (en líneas) utilizadas para dibujar el gráfico. */
41 /** Ancho (en líneas) utilizadas para dibujar el gráfico. */
44 /** Tiempo inicial. */
47 /** Tiempo final por omisión. */
48 #define DEFAULT_TF 70.0
50 /** Valor inicial de la función por omisión. */
51 #define DEFAULT_F0 0.0
53 /** Valor del pas de iteración por omisión. */
54 #define DEFAULT_PASO 1.0
58 /******************************* MACROS ************************************/
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".
65 * f_{t + step} = f_{(step, f_t)} = f_t + \frac{500 - f_t}{30} \cdot step
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
72 #define FUNCION(paso, ft) ((ft) + ((500.0 - (ft)) / 30.0) * paso)
76 /************************ TIPOS DE DATOS UTILIZADOS ************************/
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.
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.
90 typedef Real Resultados[MAX_PASOS];
94 /********************************* FUNCIONES *******************************/
97 * Imprime una explicación de como usar el programa.
99 * \param fh Archivo en donde imprimir el mensaje (ej: stdout o stderr).
101 void imprimir_uso(FILE* fh);
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
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).
113 * \return TRUE si se cargó bien, FALSE si no.
115 int argtod(const char* arg, Real* var, const char* nom);
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.
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.
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.
132 int cargar_datos(int argc, const char** argv, Real* paso, Real* tf, Real* f0);
135 * \ref integracion "Calcula" todos los valores de la función.
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.
143 * \return Cantidad de pasos realizados.
145 size_t calcular(Resultados* res, Real paso, Real ti, Real tf, Real f0);
148 * Devuelve el valor máximo de los resultados.
150 * \param res Vector de resultados.
151 * \param pasos Cantidad de pasos a iterar.
153 * \return Máximo resultado.
155 Real resultados_max(Resultados* res, size_t pasos);
158 * Devuelve el valor mínimo de los resultados.
160 * \param res Vector de resultados.
161 * \param pasos Cantidad de pasos a iterar.
163 * \return Mínimo resultado.
165 Real resultados_min(Resultados* res, size_t pasos);
168 * Rellena una cadena de caracteres con un caracter arbitrario.
170 * \param linea Cadena de caracteres.
171 * \param caracter Caracter utilizado para rellenar.
172 * \param cant Cantidad de caracteres a rellenar.
174 void inicializar_linea(char* linea, char caracter, size_t cant);
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.
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.
188 void resultados_graficar(Resultados* res, size_t pasos, char punto, char blanco);
191 * Programa principal.
192 * Este es el programa que se encarga de resolver el trabajo práctico.
194 * \param argc Cantidad de parámetros de línea de comandos ingresados.
195 * \param argv Parámetros de línea de comandos.
197 * \return EXIT_FAILURE si hubo un error, si no EXIT_SUCCESS.
199 int main(int argc, const char** argv);