Professional Documents
Culture Documents
PROGRAMACION.
INTRODUCCION:
Este manual ha sido creado con el fin de ayudar al tcnico programador para poder realizar
el mantenimiento necesario y/o modificacin del cdigo fuente , en el cual se especifican
algunas de las funciones utilizadas en el programa y para que sirven, la funcion principal del
proyecto es leer un archivo de texto contenedor de expreciones aritmeticas las cuales son leidas y
resueltas atravez de procedimientos que tienen como base la utilizacion de pilas y colas asi como
la creacion de nuestras propias librerias.
return NULL;
p = cola.ini;
cola.ini = (*cola.ini).siguiente;
return p;
}
----------------------------------------------------------------------------------------------------------------------------------Lo que hace esta funcion es posicionar el apuntador en la posicion siguiente de la pila y liberar la
posicion en donde se encuentra el apuntador
void liberar(struct queue &cola)
{
struct nodo *p;
while (cola.ini != NULL)
{
p = cola.ini;
cola.ini = (*cola.ini).siguiente;
free(p);
}
cola.ini = NULL;
cola.fin = NULL;
}
salir=true;
lexema[strlen(lexema)-1]='\0';
}
}
----------------------------------------------------------------------------------------------------------------------------------Validamos la apertura del archivo de entrada a leer, si es NULL nos mostrara: Error al abrir
archivo!! archivo no existe!! , de lo contrario el programa se ejecutara
/*abre el archivo de entrada*/
int abre_arch(char nombre[40])
{
file_in = fopen(nombre,"r");
if(file_in == NULL)
{
// gotoxy(17,9);
printf("Error al abrir archivo!! archivo no existe!!
// gotoxy(17,10);
printf(" ***Presione <ENTER> para salir*** \n\r");
return 0;
}
else
return(1);
}
\n\r");
/*estado Numero*/
----------------------------------------------------------------------------------------------------------------------------------Cuando el programa contiene un numero, busca el siguiente digito
void numero()
{
if (isdigit(token)) // Busca el siguiente digito
estado= E_num;
else
{
if((token==' ')||(token=='\t')) //fin de linea
lexema[strlen(lexema)-1]='\0';
else
{
ReturnFile2(); // siguiente lexema
salir=true;
lexema[strlen(lexema)-1]='\0';
}
}
}
/* estado punto */
int abre_archivo(char *nom1)
{
file_in=fopen(nom1,"r");
if (file_in!=NULL) return true;
else return false;
};
/* identifica las reservadas*/
int identifica_reservada()
{
char lexema2[150];
strcpy(lexema2,lexema);
int i=0;
for (i=0;i<strlen(lexema);i++)
lexema2[i]=toupper(lexema2[i]); // Convierte a mayusculas el ID //
i=0;
while (i < 21)
{
if (strcmp(Rec_Res[i].reservada,lexema2)==0)
{
strcpy(lexema,lexema2);
estado = Rec_Res[i].codigo;
i = 21;
}
else
i++;
};
return estado;
};
----------------------------------------------------------------------------------------------------------------------------------/*funcion principal que devuelve el token*/
lexico Token(int tipo)
{
lexico RegLex; // devuelve el componente lexico y el atributo //
estado =E_inicial;
strcpy(lexema,"");
strcpy(letra," ");
Fin = false;
salir=false;
while (!salir && token!=EOF)
{
lee_car();
letra[0]=token;
letra[1] = 0;
strcat(lexema,letra);
switch (estado){
case E_inicial :
Inicial(); break;
case E_identificador : Identificador();
break;
case E_num:
numero();
break;
default:
salir=true;
lexema[strlen(lexema)-1]='\0';
ReturnFile2();
break;
}//switch
}//while
if (token == EOF)
Fin=true;
if(estado == E_identificador && strlen(lexema) > 35)
estado = E_texto;
if (estado == E_identificador && tipo == 1)
estado =identifica_reservada();
strcpy(RegLex.C_lex,lexema);
RegLex.atrib = estado;
return RegLex;
}
void cerrar_archivo()
{
fclose(file_in);
}
void cerrararch()
{
fclose(file_out);
}
1 // estado numerico
2 // estado signo "+"
3 // estado signo "-"
4 // estado signo "*"
5 // estado signo "/"
6 // estado signo "("
7 // estado signo ")"
#define E_OPERANDO
#define E_OPERADOR
#define E_UNDEF
10 // define un operando
11 // define un operador
-1
struct elemento
{
int tipo;
int valor;
int precedencia;
double real;
};
struct nodo
{
struct elemento dato;
struct nodo *anterior;
struct nodo *siguiente;
};
struct queue
{
struct nodo *ini;
struct nodo *fin;
};
struct stack
{
struct nodo *top;
};
#endif
PROGRAMA PRINCIPAL
----------------------------------------------------------------------------------------------------------------------------------Declaramos las librerias necesarias para la utilizacion del programa incluyendo las librerias creadas
anteriormente
#include <stdio.h>
#include <iostream.h>
#include <conio.h>
#include "data.h"
#include "cola.h"
#include "pila.h"
#include "scanner.cpp"
----------------------------------------------------------------------------------------------------------------------------------Declaracin de funciones a utilizar
void leer_archivo(char nombre_archivo[40]);
struct queue convertir(struct queue &lista);
float evaluar(struct queue &lista);
void mostrar(struct queue &lista);
/* fin de la delcaracin de funciones*/
----------------------------------------------------------------------------------------------------------------------------------Iniciamos nuestro programa principal
void main()
{
char nom[40];
int opc;
textcolor(LIGHTRED);
gotoxy(33,4);cprintf("INSTRUCCIONES DE USO:" );
gotoxy(10,6);cprintf("1. Al leer el archivo con las expresiones aritmeticas, asegurarse");
gotoxy(10,7);cprintf(" de, presionar la tecla ENTER al final de la expresion ya que ");
gotoxy(10,8);cprintf(" si no se hace esto, el programa no reconocera ninguna ");
gotoxy(10,9);cprintf(" expresion, y por lo tanto se cerrara automaticamente
");
gotoxy(10,12);cprintf("2. La expresion debe estar bien escrita, si tiene algun error ");
gotoxy(10,13);cprintf(" no sera reconocida por el programa");
gotoxy(10,15);cprintf("Presione cualquier tecla para continuar...");
----------------------------------------------------------------------------------------------------------------------------------Creamos el menu principal de nuestro programa
getch();
do{
clrscr();
textcolor(LIGHTBLUE);
gotoxy(20,5);cprintf("UNIVERSIDAD MARIANO GALVEZ DE CHIMALTENANGO" );
gotoxy(30,6);cprintf("INGENIERIA EN SISTEMAS ");
gotoxy(40,11);cprintf("MENU: ");
gotoxy(35,12);cprintf("1. Leer archivo ");
gotoxy(35,13); cprintf("2. Instrucciones ");
gotoxy(35,14);cprintf("3. Salir ");
gotoxy(35,15);cprintf("OPCION: ");
cin>>opc;
----------------------------------------------------------------------------------------------------------------------------------Creamos un switch para poder elegir opcion a realizar en nuestro programa
switch (opc)
{
case 1:
clrscr();
//gotoxy(5, 5);
textcolor(LIGHTMAGENTA);
gotoxy(1,1);cprintf("Ingrese el nombre y direccion del archivo: ");
scanf("%s",nom);
//leemos el archivo de entrada
leer_archivo(nom);
break;
case 2:
clrscr();
textcolor(WHITE);
gotoxy(33,4);cprintf("INSTRUCCIONES DE USO:" );
gotoxy(10,6);cprintf("1. Al leer el archivo con las expresiones aritmeticas, asegurarse");
gotoxy(10,7);cprintf(" de, presionar la tecla ENTER al final de la expresion ya que ");
gotoxy(10,8);cprintf(" si no se hace esto, el programa no reconocera ninguna ");
gotoxy(10,9);cprintf(" expresion, y por lo tanto se cerrara automaticamente
");
gotoxy(10,12);cprintf("2. La expresion debe estar bien escrita, si tiene algun error ");
gotoxy(10,13);cprintf(" no sera reconocida por el programa");
gotoxy(10,15);cprintf("Presione cualquier tecla para continuar...");
getch();
break;
case 3:
clrscr();
textcolor(LIGHTBLUE);
gotoxy(20,5);cprintf("UNIVERSIDAD MARIANO GALVEZ DE CHIMALTENANGO" );
gotoxy(30,6);cprintf("INGENIERIA EN SISTEMAS ");
textcolor(YELLOW);
gotoxy(50,18);cprintf("CREADO POR:");
gotoxy(50,19);cprintf("\nGEISER TOASPERN 1990-10-11801");
gotoxy(50,20);cprintf("\nJOSUE BUCH 1990-10-14621");
getch();
break;
}
}while(opc!=3);
}
----------------------------------------------------------------------------------------------------------------------------------DEFINICION DE FUNCIONES
//leer_archivo: se encarga de leer el archivo de entrada
void leer_archivo(char nombre_archivo[40])
{
//variables locales
float val;
char str[50];
str[0]='\0';
//estructuras
struct lexico lex;
struct queue lista;
struct elemento dat;
//punteros
FILE *salida;
//inicializaciones
lista.ini = NULL;
lista.fin = NULL;
----------------------------------------------------------------------------------------------------------------------------------Abrimos el archivo de salida
salida = fopen("C:\\bc5\\salida.txt", "w");
if (abre_arch(nombre_archivo) == NULL)
{
gotoxy(5, 15);
printf("Error al crear archivo de salida ");
}
else{
textcolor(LIGHTBLUE);
gotoxy(5,15);
clrscr();
cprintf("Archivo creado exitosamente ");
gotoxy(5, 16);
cprintf("Revisar en C:\\bc5\\salida.txt");
gotoxy(5, 17);
cprintf("Presione cualquier tecla para regresar al menu ");
getch();
}
do{
lex=Token(1);
//si llegamos a un salto de linea evaluamos
if (lex.atrib == E_salto)
{
lista = convertir(lista);
val = evaluar(lista);
fprintf(salida, "%s = %0.2f\n", str, val);
liberar(lista);
str[0] ='\0';
}
else
{
if (lex.atrib == E_num)
{
dat.tipo = E_OPERANDO;
dat.valor = atoi(lex.C_lex);
dat.precedencia = 6;
}
else
{
dat.tipo = E_OPERADOR;
dat.valor = lex.atrib;
switch(lex.atrib)
{
case E_mas:
case E_min:
dat.precedencia = 1;
break;
case E_por:
case E_div:
dat.precedencia = 2;
break;
case E_parA:
case E_corcheteA:
dat.precedencia = 5;
dat.valor = E_parA;
break;
case E_parC:
case E_corcheteC:
dat.precedencia = E_UNDEF;
dat.valor = E_parC;
break;
}
}
//agregamos los datos leidos a una lista
insertar(lista, dat);
strcat(str, lex.C_lex);
}
} while(lex.atrib != E_inicial);
//finalizacin del proceso
fclose(salida);
}
----------------------------------------------------------------------------------------------------------------------------------Conververtirmos una expresin infija a postfija, para el manejo de los operadores por gerarquia
struct queue convertir(struct queue &lista)
{
return nueva;
}
//evaluar: evalua una expresin postfija y devuelve su valor
float evaluar(struct queue &lista)
{
//1. inicializamos la pila
struct stack pila;
pila.top = NULL;
struct nodo *node = NULL;
struct nodo *aux1;
struct nodo *aux2;
(*aux1).dato.real=(*aux2).dato.real / (*aux1).dato.real;
break;
}
//2.3.3 Se introduce el nuevo valor en la cima de la pila
push(pila, (*aux1).dato);
//liberamos la memoria
free(aux1);
free(aux2);
}
}
//3. obtener el valor de la expresin en la sima de la pila
aux1 = pop(pila);
return (*aux1).dato.real;
}