]> git.llucax.com Git - z.facultad/75.42/euler.git/blob - grafico.c
Se mejora la impresión de error.
[z.facultad/75.42/euler.git] / grafico.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 "grafico.h"
19 #include <stdio.h>
20
21 void inicializar_linea(char* linea, char caracter, size_t cant) {
22     size_t j;
23     for (j = 0; j < cant; j++) {
24         linea[j] = caracter;
25     }
26     /* Temino la cadena con caracter nulo. */
27     linea[cant] = '\0';
28 }
29
30 Real resultados_max(Resultados* res, size_t pasos) {
31     size_t i;
32     Real   max = (*res)[0];
33     for (i = 1; i < pasos; i++) {
34         if ((*res)[i] > max) {
35             max = (*res)[i];
36         }
37     }
38     return max;
39 }
40
41 Real resultados_min(Resultados* res, size_t pasos) {
42     size_t i;
43     Real   min = (*res)[0];
44     for (i = 1; i < pasos; i++) {
45         if ((*res)[i] < min) {
46             min = (*res)[i];
47         }
48     }
49     return min;
50 }
51
52 void resultados_graficar(Resultados* res, size_t pasos, char punto, char blanco) {
53     /* Máximo valor de la función. */
54     Real min = resultados_min(res, pasos);
55     /* Mínimo valor de la función. */
56     Real max = resultados_max(res, pasos);
57     /* Paso utilizado para la representación de las líneasMínimo valor de la función. */
58     Real pasoh = (max - min) / (ALTO);
59     /* Variables de iteración. */
60     int  i;
61     int  j;
62     /* Buffer de la línea a imprimir. */
63     char linea[ANCHO];
64     /* Inicializa la línea. */
65     inicializar_linea(linea, blanco, ANCHO);
66     /* Por cada línea a dibujar. */
67     for (i = ALTO; i >= 0; i--) {
68         /* Se fija si hay algún punto que entre en el rango. */
69         for (j = 0; j < pasos; j++) {
70             /* Si está entre en el rango a imprimir, se agrega un punto. */
71             if (((min + pasoh * i) <= (*res)[j])
72                     && ((*res)[j] < (min + pasoh * (i + 1)))) {
73                 linea[j] = punto;
74             /* Si no, se lo deja en blanco. */
75             } else {
76                 linea[j] = blanco;
77             }
78         }
79         /* Imprime la línea actual. */
80         printf("%8.2f _%s\n", min + pasoh * i, linea);
81     }
82 }
83