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