]> git.llucax.com Git - z.facultad/75.42/calculadora.git/commitdiff
Se completa el TP. Aparentemente anda todo. Falta documentación.
authorLeandro Lucarella <llucax@gmail.com>
Tue, 16 Sep 2003 10:13:54 +0000 (10:13 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Tue, 16 Sep 2003 10:13:54 +0000 (10:13 +0000)
Se agregan un par de archivos de prueba.

Makefile
ecuaciones.txt [new file with mode: 0644]
equation_list.c [new file with mode: 0644]
equation_list.h [new file with mode: 0644]
parser_equation.c
parser_equation.h
parser_equation_test.c
tp2.c
variables.txt [new file with mode: 0644]

index 4301bc369d65a959f20638b86dfb418de9bb5d74..6fb57f72ad2ae54fa4d8b76873611c1bf90c8b6a 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -39,7 +39,8 @@ dllist_test: dllist.o
 memdebug_test: dllist.o meminfo.o memdebug.o
 
 parser_equation_test: dllist.o strutil.o meminfo.o memdebug.o parseerror.o \
 memdebug_test: dllist.o meminfo.o memdebug.o
 
 parser_equation_test: dllist.o strutil.o meminfo.o memdebug.o parseerror.o \
-       parser_common.o equation.o parser_equation.o
+       parser_common.o equation.o equation_list.o variable.o variable_list.o \
+       parser_equation.o parser_expression.o
 
 parser_variable_test: dllist.o strutil.o meminfo.o memdebug.o parseerror.o \
        parser_common.o variable.o variable_list.o parser_variable.o
 
 parser_variable_test: dllist.o strutil.o meminfo.o memdebug.o parseerror.o \
        parser_common.o variable.o variable_list.o parser_variable.o
@@ -49,7 +50,7 @@ parser_expression_test: dllist.o strutil.o meminfo.o memdebug.o parseerror.o \
 
 tp2: dllist.o strutil.o meminfo.o memdebug.o parseerror.o parser_common.o \
        variable.o variable_list.o parser_expression.o variable_list.o \
 
 tp2: dllist.o strutil.o meminfo.o memdebug.o parseerror.o parser_common.o \
        variable.o variable_list.o parser_expression.o variable_list.o \
-       parser_variable.o equation.o parser_equation.o
+       parser_variable.o equation.o equation_list.o parser_equation.o
 
 # Regla para borrar.
 clean:
 
 # Regla para borrar.
 clean:
diff --git a/ecuaciones.txt b/ecuaciones.txt
new file mode 100644 (file)
index 0000000..120a367
--- /dev/null
@@ -0,0 +1,3 @@
+a = (-a)/pi
+b = (-a) * 2
+c = pi / ((-a) * 2) + b
diff --git a/equation_list.c b/equation_list.c
new file mode 100644 (file)
index 0000000..67168e5
--- /dev/null
@@ -0,0 +1,99 @@
+/* vim: set et sts=4 sw=4 fdm=indent fdl=1 fdn=0 fo+=t tw=80:
+ *
+ * Taller de Programación (75.42).
+ *
+ * Ejercicio Número 2:
+ * Programa calculadora.
+ *
+ * Copyleft 2003 - Leandro Lucarella <llucare@fi.uba.ar>
+ * Puede copiar, modificar y distribuir este programa bajo los términos de
+ * la licencia GPL (http://www.gnu.org/).
+ *
+ * Creado: mar sep 16 05:52:09 ART 2003
+ *
+ * $Id$
+ */
+
+#include "bool.h"
+#include "strutil.h"
+#include "variable.h"
+#include "variable_list.h"
+#include "equation.h"
+#include "equation_list.h"
+#include "parseerror.h"
+#include "parser_expression.h"
+#include "dllist.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "memdebug_debugger.h"
+
+size_t DLList_equation_print(DLList* l, FILE* fp) {
+    size_t cant = 0;
+    Equation* eq;
+    for (eq = DLList_begin(l); DLList_have_more(l); eq = DLList_next(l)) {
+        cant += Equation_print(eq, fp);
+    }
+    return cant;
+}
+
+void DLList_equation_delete(DLList* l) {
+    if (l) {
+        while (!DLList_empty(l)) {
+            Equation_delete((Equation*)DLList_pop(l));
+        }
+    }
+    DLList_delete(l);
+}
+
+void DLList_equation_eval(DLList* vl, DLList* el, FILE* fp) {
+    float result;
+    Equation* eq;
+    Variable* var;
+    char* exp;
+    ParseError* error = ParseError_new();
+    if (!error) {
+        fprintf(fp, "Error: No se puede crear el manejo de errores.\n");
+        return;
+    }
+    for (eq = DLList_begin(el); DLList_have_more(el); eq = DLList_next(el)) {
+        if (!DLList_variable_find(vl, eq->variable)) {
+            fprintf(fp, "Error: No existe la variable '%s'.\n", eq->variable);
+            continue;
+        }
+        var = DLList_current(vl);
+        exp = strutil_copy_stripspaces(eq->expression, strlen(eq->expression));
+        if (!exp) {
+            fprintf(fp, "Error: No hay memoria para copiar la expresión.\n");
+            return;
+        }
+        if (!parser_expression(exp, strlen(exp), &result, vl, error)) {
+            free(exp);
+            ParseError_print(error, fp);
+            continue;
+        }
+        free(exp);
+        if (var->have_min && (result < var->min)) {
+            fprintf(fp, "Error: El valor de la variable '%s' no puede ser "
+                    "menor a %f (resultado: %f).\n", var->variable, var->min,
+                    result);
+            continue;
+        }
+        if (var->have_max && (result > var->max)) {
+            fprintf(fp, "Error: El valor de la variable '%s' no puede ser "
+                    "mayor a %f (resultado: %f).\n", var->variable, var->max,
+                    result);
+            continue;
+        }
+        /* Es constante. */
+        if (!var->have_min && !var->have_max) {
+            fprintf(fp, "Error: La variable (constante) '%s' no puede ser "
+                    "modificada (resultado: %f).\n", var->variable, result);
+            continue;
+        }
+        var->value = result;
+    }
+    ParseError_delete(error);
+}
+
diff --git a/equation_list.h b/equation_list.h
new file mode 100644 (file)
index 0000000..6d00a2b
--- /dev/null
@@ -0,0 +1,31 @@
+/* vim: set et sts=4 sw=4 fdm=indent fdl=1 fdn=1 fo+=t tw=80:
+ *
+ * Taller de Programación (75.42).
+ *
+ * Ejercicio Número 2:
+ * Programa calculadora.
+ *
+ * Copyleft 2003 - Leandro Lucarella <llucare@fi.uba.ar>
+ * Puede copiar, modificar y distribuir este programa bajo los términos de
+ * la licencia GPL (http://www.gnu.org/).
+ *
+ * Creado: lun sep 15 01:26:35 ART 2003
+ *
+ * $Id$
+ */
+
+#ifndef EQUATION_LIST_H
+#define EQUATION_LIST_H
+
+#include "bool.h"
+#include "dllist.h"
+#include <stdlib.h>
+#include <stdio.h>
+
+size_t DLList_equation_print(DLList* l, FILE* fp);
+
+void DLList_equation_delete(DLList* l);
+
+void DLList_equation_eval(DLList* vl, DLList* el, FILE* fp);
+
+#endif /* EQUATION_LIST_H */
index ebf36987c7d966e582b4361a0bc7b82e42f97990..abf55ce25eb06e2ad8a2a402d09f8940493d9994 100644 (file)
@@ -16,6 +16,7 @@
 
 #include "bool.h"
 #include "equation.h"
 
 #include "bool.h"
 #include "equation.h"
+#include "equation_list.h"
 #include "parser_common.h"
 #include "parseerror.h"
 #include "dllist.h"
 #include "parser_common.h"
 #include "parseerror.h"
 #include "dllist.h"
 
 #include "memdebug_debugger.h"
 
 
 #include "memdebug_debugger.h"
 
-size_t DLList_equation_print(DLList* l, FILE* fp) {
-    size_t cant = 0;
-    Equation* eq;
-    for (eq = DLList_begin(l); DLList_have_more(l); eq = DLList_next(l)) {
-        cant += Equation_print(eq, fp);
-    }
-    return cant;
-}
-
-void DLList_equation_delete(DLList* l) {
-    if (l) {
-        while (!DLList_empty(l)) {
-            Equation_delete((Equation*)DLList_pop(l));
-        }
-    }
-    DLList_delete(l);
-}
-
 #define PARSE_ERROR(str) ParseError_set_pos_message(error, str, i + 1, c)
 
 bool parser_equation(const char* line, size_t len, DLList* equation_list,
 #define PARSE_ERROR(str) ParseError_set_pos_message(error, str, i + 1, c)
 
 bool parser_equation(const char* line, size_t len, DLList* equation_list,
index c14470483ab6ece3742a094fa5c7caa1201b51e3..a26089329448292c97f36a7516242436b56bdf19 100644 (file)
 #include "dllist.h"
 #include <stdlib.h>
 
 #include "dllist.h"
 #include <stdlib.h>
 
-size_t DLList_equation_print(DLList* l, FILE* fp);
-
-void DLList_equation_delete(DLList* l);
-
 /* TODO:
  *
  * opcion1:
 /* TODO:
  *
  * opcion1:
index 2d9be3eb684a691205c6eef60f420babb2f5e63f..20f7efba798ce514a89ef46b914aedb3cf1da26e 100644 (file)
@@ -25,6 +25,7 @@
 #include <string.h>
 
 #include "memdebug_debugger.h"
 #include <string.h>
 
 #include "memdebug_debugger.h"
+#include "equation_list.h"
 #include "parser_equation.h"
 
 /**
 #include "parser_equation.h"
 
 /**
diff --git a/tp2.c b/tp2.c
index 145aa09c4f08f6fa21e42de03f420e377fc19ef4..3b3b1dd04361196e5fda463ab2924860d4fecce9 100644 (file)
--- a/tp2.c
+++ b/tp2.c
@@ -19,7 +19,7 @@
 #include "parser_variable.h"
 #include "parser_equation.h"
 #include "variable_list.h"
 #include "parser_variable.h"
 #include "parser_equation.h"
 #include "variable_list.h"
-/* TODO separar #include "equation_list.h" */
+#include "equation_list.h"
 
 #include <stdio.h>
 #include <stdlib.h>
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -41,15 +41,21 @@ void print_help(FILE* fh) {
     fprintf(fh, "  tp2 <arch_variables> <arch_ecuaciones>\n");
 }
 
     fprintf(fh, "  tp2 <arch_variables> <arch_ecuaciones>\n");
 }
 
+/**
+ * Dibuja el menú en pantalla.
+ */
 void print_menu(void) {
     printf("Menu:\n");
 void print_menu(void) {
     printf("Menu:\n");
-    printf("1. Listar variables.\n");
-    printf("2. Listar ecuaciones.\n");
-    printf("3. Evaluar ecuaciones.\n");
-    printf("4. Listar memoria.\n");
-    printf("5. Salir.\n");
+    printf("      1. Listar variables.\n");
+    printf("      2. Listar ecuaciones.\n");
+    printf("      3. Evaluar ecuaciones.\n");
+    printf("      4. Listar memoria.\n");
+    printf("      5. Salir.\n");
 }
 
 }
 
+/**
+ * Obtiene la selección del menú del usuario.
+ */
 char get_entrada(void) {
     char buff[BUFFER_SIZE];
     printf("Elija una opción: ");
 char get_entrada(void) {
     char buff[BUFFER_SIZE];
     printf("Elija una opción: ");
@@ -57,6 +63,9 @@ char get_entrada(void) {
     return buff[0];
 }
 
     return buff[0];
 }
 
+/**
+ * Menú de opciones.
+ */
 void menu_loop(DLList* var_list, DLList* eq_list) {
     char entrada;
     print_menu();
 void menu_loop(DLList* var_list, DLList* eq_list) {
     char entrada;
     print_menu();
@@ -81,8 +90,9 @@ void menu_loop(DLList* var_list, DLList* eq_list) {
                 DLList_equation_print(eq_list, stdout);
                 break;
             case '3': /* Evaluar ecuaciones */
                 DLList_equation_print(eq_list, stdout);
                 break;
             case '3': /* Evaluar ecuaciones */
-                /* TODO */
                 printf("Lista de variables después de evaluar:\n");
                 printf("Lista de variables después de evaluar:\n");
+                DLList_equation_eval(var_list, eq_list, stderr);
+                DLList_variable_print(var_list, stdout);
                 break;
             case '4': /* Listar memoria */
                 printf("Lista de memoria alocada:\n");
                 break;
             case '4': /* Listar memoria */
                 printf("Lista de memoria alocada:\n");
diff --git a/variables.txt b/variables.txt
new file mode 100644 (file)
index 0000000..2eb4cf6
--- /dev/null
@@ -0,0 +1,4 @@
+a 30 -10 43.34
+b 45.65
+c -12e2
+pi 3.14159