]> git.llucax.com Git - z.facultad/75.42/euler.git/blobdiff - tp1.c
Prácticamente se finaliza el TP, sólo quedan pulir detalles.
[z.facultad/75.42/euler.git] / tp1.c
diff --git a/tp1.c b/tp1.c
index f8b7c86c0924c502f8d91dc738828e7844b16250..7706605c055fde519a2db327ae1032970854adac 100644 (file)
--- a/tp1.c
+++ b/tp1.c
@@ -79,8 +79,6 @@ int cargar_datos(int argc, const char** argv, Real* paso, Real* tf, Real* f0) {
             return FALSE;
     }
     /* TODO Verificar que el paso no sea cero y que tf > ti. */
-    /* XXX - sacar */
-    printf("paso = %f, tf = %f, f0 = %f\n", *paso, *tf, *f0);
     return TRUE;
 }
 
@@ -99,16 +97,14 @@ size_t calcular(Resultados* res, Real paso, Real ti, Real tf, Real f0) {
     /* Itero paso a paso calculando el valor de la función. */
     for (i = 1; i < pasos; i++) {
         /* f(t+paso) = FUNCION(paso, f(t)) */
-        (*res)[i]       = FUNCION(paso, (*res)[i-1]);
-        /* FIXME sacar!!!! */
-        printf("i = %i, t = %.2f, f(t) = %.2f\n", i, (Real)i * paso, (*res)[i]);
+        (*res)[i]    = FUNCION(paso, (*res)[i-1]);
     }
     return pasos;
 }
 
-Real max(const Resultados* res, size_t pasos) {
-    size_t  i;
-    Real    max = (*res)[0];
+Real resultados_max(Resultados* res, size_t pasos) {
+    size_t i;
+    Real   max = (*res)[0];
     for (i = 1; i < pasos; i++) {
         if ((*res)[i] > max) {
             max = (*res)[i];
@@ -117,9 +113,9 @@ Real max(const Resultados* res, size_t pasos) {
     return max;
 }
 
-Real min(const Resultados* res, size_t pasos) {
-    size_t  i;
-    Real    min = (*res)[0];
+Real resultados_min(Resultados* res, size_t pasos) {
+    size_t i;
+    Real   min = (*res)[0];
     for (i = 1; i < pasos; i++) {
         if ((*res)[i] < min) {
             min = (*res)[i];
@@ -128,13 +124,56 @@ Real min(const Resultados* res, size_t pasos) {
     return min;
 }
 
+void inicializar_linea(char* linea, char caracter, size_t cant) {
+    size_t j;
+    for (j = 0; j < cant; j++) {
+        linea[j] = caracter;
+    }
+    linea[cant] = '\0';
+}
+
+void resultados_graficar(Resultados* res, size_t pasos, char punto, char blanco) {
+    /* Máximo valor de la función. */
+    Real min;
+    /* Mínimo valor de la función. */
+    Real max;
+    /* Paso utilizado para la representación de las líneasMínimo valor de la función. */
+    Real pasoh;
+    int  i;
+    int  j;
+    char linea[ANCHO];
+    min = resultados_min(res, pasos);
+    max = resultados_max(res, pasos);
+    pasoh = (max - min) / (ALTO);
+    printf("min: %f, max: %f, pasoh: %f\n", min, max, pasoh);
+    /* Inicializa la línea. */
+    inicializar_linea(linea, blanco, MAX_PASOS);
+    /* Por cada línea a dibujar. */
+    for (i = ALTO; i >= 0; i--) {
+        /* Se fija si hay algún punto que entre en el rango. */
+        for (j = 0; j < pasos; j++) {
+            /* Si está entre en el rango a imprimir, se agrega un punto. */
+            if (((min + pasoh * i) <= (*res)[j])
+                    && ((*res)[j] < (min + pasoh * (i + 1)))) {
+                linea[j] = punto;
+            /* Si no, se lo deja en blanco. */
+            } else {
+                linea[j] = blanco;
+            }
+        }
+        printf("%8.2f _%s\n", min + pasoh * i, linea);
+    }
+}
+
 int main(int argc, const char** argv) {
     /* TODO: Declaración de variables. */
     Resultados  resultados;
     size_t      pasos;
-    Real        paso  = DEFAULT_PASO;
-    Real        tf    = DEFAULT_TF;
-    Real        f0    = DEFAULT_F0;
+    Real        paso    = DEFAULT_PASO;
+    Real        tf      = DEFAULT_TF;
+    Real        f0      = DEFAULT_F0;
+    char        punto   = '*';
+    char        blanco  = ' ';
 
     /* Obtención de datos. */
     if (!cargar_datos(argc, argv, &paso, &tf, &f0)) {
@@ -144,10 +183,13 @@ int main(int argc, const char** argv) {
 
     /* Cálculo de la solución, dejando en un array los valores de cada paso. */
     pasos = calcular(&resultados, paso, T0, tf, f0);
+    /* XXX - sacar o poner más lindo. */
+    printf("paso = %f, tf = %f, f0 = %f, pasos = %i\n", paso, tf, f0, pasos);
 
     /* TODO: Barrido de pantalla de arriba hacia abajo consultando el array
      *       y dibujando los resultados pertinentes. */
-    /* TODO: Liberación de memoria y otras limpiezas, en caso de ser necesario. */
+    resultados_graficar(&resultados, pasos, punto, blanco);
+
     return EXIT_SUCCESS;
 }