From 73f6c1a7fc94ede48cc5e38008649b994206b012 Mon Sep 17 00:00:00 2001 From: Leandro Lucarella Date: Tue, 16 Sep 2003 10:13:54 +0000 Subject: [PATCH] =?utf8?q?Se=20completa=20el=20TP.=20Aparentemente=20anda?= =?utf8?q?=20todo.=20Falta=20documentaci=C3=B3n.=20Se=20agregan=20un=20par?= =?utf8?q?=20de=20archivos=20de=20prueba.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- Makefile | 5 ++- ecuaciones.txt | 3 ++ equation_list.c | 99 ++++++++++++++++++++++++++++++++++++++++++ equation_list.h | 31 +++++++++++++ parser_equation.c | 19 +------- parser_equation.h | 4 -- parser_equation_test.c | 1 + tp2.c | 24 +++++++--- variables.txt | 4 ++ 9 files changed, 159 insertions(+), 31 deletions(-) create mode 100644 ecuaciones.txt create mode 100644 equation_list.c create mode 100644 equation_list.h create mode 100644 variables.txt diff --git a/Makefile b/Makefile index 4301bc3..6fb57f7 100644 --- 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 \ - 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 @@ -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 \ - parser_variable.o equation.o parser_equation.o + parser_variable.o equation.o equation_list.o parser_equation.o # Regla para borrar. clean: diff --git a/ecuaciones.txt b/ecuaciones.txt new file mode 100644 index 0000000..120a367 --- /dev/null +++ b/ecuaciones.txt @@ -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 index 0000000..67168e5 --- /dev/null +++ b/equation_list.c @@ -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 + * 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 +#include +#include + +#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 index 0000000..6d00a2b --- /dev/null +++ b/equation_list.h @@ -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 + * 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 +#include + +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 */ diff --git a/parser_equation.c b/parser_equation.c index ebf3698..abf55ce 100644 --- a/parser_equation.c +++ b/parser_equation.c @@ -16,6 +16,7 @@ #include "bool.h" #include "equation.h" +#include "equation_list.h" #include "parser_common.h" #include "parseerror.h" #include "dllist.h" @@ -25,24 +26,6 @@ #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, diff --git a/parser_equation.h b/parser_equation.h index c144704..a260893 100644 --- a/parser_equation.h +++ b/parser_equation.h @@ -22,10 +22,6 @@ #include "dllist.h" #include -size_t DLList_equation_print(DLList* l, FILE* fp); - -void DLList_equation_delete(DLList* l); - /* TODO: * * opcion1: diff --git a/parser_equation_test.c b/parser_equation_test.c index 2d9be3e..20f7efb 100644 --- a/parser_equation_test.c +++ b/parser_equation_test.c @@ -25,6 +25,7 @@ #include #include "memdebug_debugger.h" +#include "equation_list.h" #include "parser_equation.h" /** diff --git a/tp2.c b/tp2.c index 145aa09..3b3b1dd 100644 --- a/tp2.c +++ b/tp2.c @@ -19,7 +19,7 @@ #include "parser_variable.h" #include "parser_equation.h" #include "variable_list.h" -/* TODO separar #include "equation_list.h" */ +#include "equation_list.h" #include #include @@ -41,15 +41,21 @@ void print_help(FILE* fh) { fprintf(fh, " tp2 \n"); } +/** + * Dibuja el menú en pantalla. + */ 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: "); @@ -57,6 +63,9 @@ char get_entrada(void) { return buff[0]; } +/** + * Menú de opciones. + */ 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 */ - /* TODO */ 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"); diff --git a/variables.txt b/variables.txt new file mode 100644 index 0000000..2eb4cf6 --- /dev/null +++ b/variables.txt @@ -0,0 +1,4 @@ +a 30 -10 43.34 +b 45.65 +c -12e2 +pi 3.14159 -- 2.43.0