1 /* vim: set et sts=4 sw=4 fdm=indent fdl=1 fdn=1 fo+=t tw=80:
3 * Taller de Programación (75.42).
6 * Programa calculadora.
8 * Copyleft 2003 - Leandro Lucarella <llucare@fi.uba.ar>
9 * Puede copiar, modificar y distribuir este programa bajo los términos de
10 * la licencia GPL (http://www.gnu.org/).
12 * Creado: sáb ago 30 18:56:28 ART 2003
17 /** \mainpage Trabajo Práctico II
20 También puede ver <a href="../latex/refman.pdf">este documento en formato
25 También puede ver este documento en formato HTML en html/index.html.
28 \section consigna Consigna.
29 \subsection temas Temas a practicar.
30 - Estructura de un programa.
31 - Directivas y Macros.
34 - Estructuras de datos (Lista).
35 - Declaraciones / definiciones.
36 - Estructuras (struct) y tipos de datos del usuario (typedef).
40 \subsection introduccion Introducción.
41 El trabajo práctico consiste en desarrollar un programa capaz
42 de evaluar ecuaciones aritméticas, y se compone de dos partes,
43 un manejador de memoria y un módulo matemático.
45 \subsection parte1 Parte 1 - Memlist.
46 Desarrollar las funciones malloc2() y free2(), y las
47 correspondientes macros para que al llamar a malloc() y free()
48 se llamen estas funciones. Las nuevas funciones deben almacenar
49 información de la memoria alocada. Esta información debe incluir:
50 Puntero, cantidad de bytes alocados, hora, nombre y linea del
51 archivo donde se realizó el malloc.
53 Desarrollar una función MemList (), que liste los bloques de memoria
58 Dirección Bytes Archivo Linea Fecha Hora
59 0x48252342 300 ejemplo.c 200 20/08 10:30:30
60 0x48252342 400 ejemplo.c 1110 20/08 10:30:40
64 -# Los bloques liberados no deben ser listados.
65 -# Limitar el nombre del archivo a 20 caracteres.
67 \subsection parte2 Parte 2 - Calculadora.
69 Desarrolle un programa capaz de evaluar ecuaciones
70 aritméticas. Para ello deberá cargar en memoria dos archivos,
71 uno de los cuales contiene una lista de variables y otro una
72 lista de ecuaciones. Los nombres de estos archivos deben tomarse
73 por linea de comandos.
77 matem.exe var.txt eq.txt
80 Las variables deberán cargarse en una lista de estructuras en
81 memoria, y las ecuaciones en una lista de strings. Una vez hecho
82 esto, el programa deberá mostrar el siguiente menú:
87 3 - Evaluar ecuaciones
88 4 - Listar bloques de memoria alocados
92 - La opcion 1 debe listar las variables definidas e indicar
93 un alerta si alguna de ellas esta fuera del rango definido
95 - La opcion 2 debe listar las ecuaciones.
96 - La opcion 3 debe evaluar las ecuaciones definidas y recalcular
97 los valores de las variables.
98 - La opcion 4 debe listar los bloques de memoria alocados
100 - La opcion 5 debe terminar
103 En caso de producirse un error, se debe mostrar en memoria una
104 descripción del mismo, pero no debe interrumpirse la ejecución
109 a = 20 * 10 + (2 / b) * (pi + c)
112 \subsubsection archivo_variables Archivo de variables.
114 Archivo en formato texto, donde se almacenan variables,
115 con el siguiente formato:
117 [NOMBRE][espacios][VALOR][espacios][MINIMO][espacios][MAXIMO][salto de linea]
121 - \b \c NOMBRE: Es un string con el nombre de una variable.
122 - \b \c VALOR: Es el valor de la variable.
123 - \b \c MINIMO: Valor mínimo que puede tomar la variable.
124 - \b \c MAXIMO: Valor máximo que puede tomar la variable.
125 - \b \c espacios: Caracteres \c ' ' o \c '\\t'.
127 Los valores mínimo y máximo son opcionales. Si no están,
128 la variable es una constante y no puede ser modificada.
135 temperatura 25 -30 70
138 \subsubsection archivo_ecuaciones Archivo de ecuaciones.
140 Es un archivo de texto con el formato <em>variable =
141 ecuación</em>, donde ecuación es una ecuación con sintaxis C,
142 que puede contener los operadores: <tt>+</tt>, <tt>-</tt>,
143 <tt>*</tt>, <tt>/</tt>, <tt>(</tt>, <tt>)</tt>.
147 a = 10 * (b + a) * (b + 2*pi)
151 Puede suponerse que estas ecuaciones son válidas.
154 \section requerimientos Requerimientos y modo de uso.
155 \subsection plataforma Plataforma y compilador.
156 Este trabajo práctico fue realizado y probado bajo la plataforma Debian
157 GNU/Linux sid. El compilador utilizado fue GNU GCC versión 3.2.3 (la
158 versión 3.3.1 me daba un internal compiler error).
159 El ejecutable entregado corre bajo esta esta plataforma y su uso se
160 describe en la \ref uso "sección siguiente".
162 De todas formas, al estar programado sólo utilizando funciones ANSI C,
163 debería poder compilarse bajo cualquier plataforma y compilador que
164 soporte este estándar.
166 \subsection uso Modo de uso.
167 El programa debe ser llamado desde un intérprete de comandos. Necesita
168 dos parámetros pasados como argumento:
169 \verbatim ./tp2 arch_variables arch_ecuaciones \endverbatim
170 Donde \c arch_variables es el archivo que contiene las variables y
171 \c arch_ecuaciones es el archivo que contiene las ecuaciones.
174 \section conclusiones Conclusiones.
176 El trabajo práctico me terminó resultando bastante más complejo de lo que
177 esperaba. En particular tuve problemas con el manejo de cadenas de texto.
179 Otro problema fue la "sobrecarga" del malloc y free. Al principio tuve
180 problemas por poner los \c define antes del \c include de la stdlib.h, por
181 lo que cuando el compilador llegaba a la definición de malloc y free de la
182 stdlib.h me daba un error.
184 Otro problema con la "sobrecarga" del malloc y free fue que no pude hacer
185 que la \ref DLList "lista doblemente enlazada" lo use, ya que estaba siendo
186 usada por mis implementaciones de malloc y free y daría lugar a recursividad
187 infinita (al reservar memoria para un nodo de la lista, llamaria a mi malloc
188 que crearía otro nodo en la lista y así sucesivamente).
190 Algo poco significativo pero que aún así me gustaría nombrar es que la lista
191 de momoria reservada la recorro de atrás para adelante a la hora de hacer un
192 free() ya que es más probable que primero se libere la memoria que se
195 El manejo de errores quedó bastante aceptable. En parser_equation() está muy
196 completo y en las otras funciones de parseo es mucho más básico por falta de
197 tiempo para hacer una mejor implementación.