Se agregan un par de archivos de prueba.
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
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:
--- /dev/null
+a = (-a)/pi
+b = (-a) * 2
+c = pi / ((-a) * 2) + b
--- /dev/null
+/* 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);
+}
+
--- /dev/null
+/* 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 */
#include "bool.h"
#include "equation.h"
+#include "equation_list.h"
#include "parser_common.h"
#include "parseerror.h"
#include "dllist.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,
#include "dllist.h"
#include <stdlib.h>
-size_t DLList_equation_print(DLList* l, FILE* fp);
-
-void DLList_equation_delete(DLList* l);
-
/* TODO:
*
* opcion1:
#include <string.h>
#include "memdebug_debugger.h"
+#include "equation_list.h"
#include "parser_equation.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>
fprintf(fh, " tp2 <arch_variables> <arch_ecuaciones>\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: ");
return buff[0];
}
+/**
+ * Menú de opciones.
+ */
void menu_loop(DLList* var_list, DLList* eq_list) {
char entrada;
print_menu();
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");
--- /dev/null
+a 30 -10 43.34
+b 45.65
+c -12e2
+pi 3.14159