Programas en C

Embed Size (px)

Citation preview

Programas de Lenguajes y CompiladoresPrograma No. 1 (Separador de tokens) Programa No. 2 (Transformar de notacin infija a postfija) Programa No. 3 (Lectura de un archivo de texto)Braicot Espinoza Morn Universidad Autnoma del Estado de Morelos

ndice:Programa 1 (Separador de Tokens)2

Programa 2 (Notacin infija a postfija)..3

Programa 3 (Lectura de un archivo)8

1

Programa No1.1.) Descripcin del programa: Se encarga de separar los tokens de un archivo de texto, lo cual consiste en que el programa toma un archivo de texto llamado en este caso prueba.txt y muestra en pantalla este archivo separado por sus tokens. Este programa viene contenido en un solo archivo llamado Tokens.c 2.) Para compilarlo y ejecutarlo es de la siguiente forma: gcc Tokens.c -o tok ./tok Y automticamente despliega todos los tokens del archive prueb.txt Nota: El archivo que tiene que estar en la misma carpeta donde se compile el programa tokens.c es el archivo de texto prueba.txt

> /**************************************************************** > Braicot Espinoza Morn (Computacin) Facultad de Ciencias UAEM [email protected] ***************************************************************/ #include #include main() { FILE *Archivo; char Cadena[1000]; char *p; Archivo= fopen("prueba.txt", "rt"); while(fgets(Cadena,1000,Archivo)){ p=strtok(Cadena, " "); do{ printf("%s\n",p); } while(p=strtok(NULL," ")); } fclose(Archivo); } 2

Programa No2.1.) Descripcin del programa: Este programa transforma expresiones infijas a postfijas, la transformacin se lleva a cabo de la siguiente manera, se introduce una expresin infija con espacios en blanco como por ejemplo ( 10 * 5 ) + 12 e imprime despus la expresin ingresada pero en notacin postfija, es decir 10 5 * 12 +. Este programa viene dividido en tres partes el programa principal es el archivo postfija.c donde se encuentra el main y pide al usuario introducir la expresin infija, que despus se enva a una funcin convierteIP para transformarla en una expresin postfija. El segundo archivo es pila_lista.h donde se realiza todo el proceso de transformacin de la expresin, mediante una estructura pila y una lista. El tercer archivo que es postfija.h es donde se realiza la separacin de la expresin ingresada por el usuario y se pasan los tokens a la estructura pila y lista para el proceso de transformacin en una expresin postfija. 2.) Para compilarlo y ejecutarlo es de la siguiente forma: gcc postfija.c -o pos ./pos Nota: Los archivos que deben estar en la misma carpeta donde se compile el programa anterior son postfija.h y pila_lista.h

> #include #include "postfija.h" int main( int argc, char **argv ){ char expresion[201]; printf("\n*********************************************\n"); printf("Introduce una expresion infija,\nseparando cada elemento por un espacio,\nEjemplo: ( 10 * 3 )+ 19\n Introduce tu expresion: "); gets( expresion ); printf("\n**********************************************\n"); convierteIP( expresion ); return 0; } 3

> #include #include #define TRUE 1 #define FALSE 0 /****************************************/ /* Operaciones de la pila */ /***************************************/ struct pilad{ char valorpd[20]; int prioridad; struct pilad *sig; }; typedef struct pilad *PILAPTR; PILAPTR tope = NULL; int esVaciapd(){ return ( tope == NULL ) ? TRUE : FALSE; } void push( char *operador, int prioridad ){ PILAPTR nuevo_elemento = (PILAPTR) malloc( sizeof( struct pilad ) ); nuevo_elemento -> sig = esVaciapd() ? NULL : tope; strcpy( nuevo_elemento -> valorpd, operador ); nuevo_elemento -> prioridad = prioridad; tope = nuevo_elemento; } void pop(){ if( !esVaciapd() ){ PILAPTR temp_elemento = tope; tope = tope -> sig; free( temp_elemento ); } } char *get(){ return esVaciapd() ? "" : tope -> valorpd; } int prioridadTopePila(){ return esVaciapd() ? -1 : tope -> prioridad; }

4

/****************************************/ /* Operaciones de la lista */ /***************************************/ struct nodo_lde{ char elemento[20]; struct nodo_lde *izq; struct nodo_lde *der; }; typedef struct nodo_lde *NODOLDE; NODOLDE ref_lista = NULL; void inserta_lista( NODOLDE *lista, char *token ){ NODOLDE q, nuevo_nodo = ( NODOLDE ) malloc( sizeof( struct nodo_lde ) ); strcpy( nuevo_nodo -> elemento , token ); if( *lista == NULL ){ *lista = nuevo_nodo; (*lista) -> der = NULL; }else{ for( q = *lista; q -> der != NULL; q = q -> der ); q -> der = nuevo_nodo; nuevo_nodo -> izq = q; nuevo_nodo -> der = NULL; } (*lista) -> izq = NULL; } void elimina( NODOLDE *lista ){ if( ref_lista == *lista ){ *lista = (*lista) -> der; if( *lista != NULL ) (*lista) -> izq = NULL; }else{ if( ref_lista -> der == NULL ) ref_lista -> izq -> der = NULL; else{ ref_lista -> izq -> der = ref_lista -> der; ref_lista -> der -> izq = ref_lista -> izq; } } free( ref_lista ); }

5

void vaciaLista( NODOLDE *lista ){ NODOLDE p = *lista; while( p != NULL ){ ref_lista = p; p = p -> der; elimina( lista ); } } void imprimirLista( NODOLDE lista, char *tipo ){ printf("\nLista %s: ", tipo ); for( ref_lista = lista; ref_lista != NULL; ref_lista = ref_lista -> der ){ // Alguna otra accion con cada token. Usar ( ref_lista -> elemento ) */ printf("%s ", ref_lista -> elemento ); } printf("\n"); }

> #include "pila_lista.h" #define TRUE 1 #define FALSE 0 void convierteIP( char *expresion ){ NODOLDE infija = NULL, postfija = NULL, p; /* Creamos lista infija con los elementos de la expresion */ char *token = strtok( expresion, " " ); while( token != NULL ) { inserta_lista( &infija, token ); token = strtok( NULL, " " ); } /* Convertimos infija a expresion postfija */ for( p = infija; p != NULL; p = p -> der ){ if( esNumero( p -> elemento ) ){ // Es operando inserta_lista( &postfija, p -> elemento ); }else{ if( strcmp( p->elemento, ")" ) == 0 ){ // Token igual a ")" while( strcmp( get(), "(") != 0 && !esVaciapd() ){ inserta_lista( &postfija, get() ); pop(); } 6

pop(); // Removemos el parentesis. }else{ if( !esVaciapd() ){ push( p->elemento, obtenerPrioridadDe( p>elemento ) ); }else{ if( obtenerPrioridadDe( p->elemento ) > prioridadTopePila() ){ push( p->elemento, obtenerPrioridadDe( p->elemento ) ); }else{ inserta_lista( &postfija, get() ); pop(); } } } } } while( !esVaciapd() ){ inserta_lista( &postfija, get() ); pop(); } /* Imprimimos listas */ imprimirLista( infija, "infija" ); imprimirLista( postfija, "postfija" ); /* Vaciamos listas para liberar memoria */ vaciaLista( &infija ); vaciaLista( &postfija ); } /* Regresa la prioridad del operador int obtenerPrioridadDe( char *op ){ if( strstr("*/", op ) != NULL ) if( strstr("+-", op ) != NULL ) if( strstr("(", op ) != NULL ) return -1; } op */ return 2; return 1; return 0;

/* Regresa verdadero si la cadena n es un numero entero o flotante */ int esNumero( char *n ){ if( strcmp( n, "+" ) != 0 && strcmp( n, "-" ) != 0 && strcmp( n, "/" ) != 0 && strcmp( n, "*" ) != 0 && strcmp( n, "(" ) != 0 && strcmp( n, ")" ) != 0 ){ return TRUE; }else{ return FALSE; } }

7

Programa No3.1.) Descripcin del programa: Este programa realiza una lectura de un archivo y nos regresa la cantidad de bytes y el tiempo de lectura del mismo. Este programa realiza una lectura del archivo y lo guarda en un buffer, adems se calcula el tiempo que tarda de lectura del archivo mediante una estructura timeval y una funcin para obtener el tiempo llamada gettimofday as como tambin la cantidad de bytes que contiene el archivo a leer. Este programa esta compuesto de un solo archivo que es Lectura_Arch.c 2.) Para compilarlo y ejecutarlo es de la siguiente forma: gcc Lectura_Arch.c -o lect ./lect Nota: El archivo prueba.txt tiene que estar en la misma carpeta donde se compile y ejecute el programa Lectura_Arch.c para que funcione sin problemas.

/**************************************************************** > Braicot Espinoza Morn (Computacin) Facultad de Ciencias UAEM [email protected] ****************************************************************/ #include #include #include /*Esta funcion Realiza la resta del Tiempo Final-Tiempo Inicial*/ double timeval_diff(struct timeval *a, struct timeval *b) { return (double)(a->tv_sec + (double)a->tv_usec/1000000) -(double)(b>tv_sec + (double)b->tv_usec/1000000); }

8

/*Funcion principal*/ int main () { struct timeval t_ini; // Se delcara la estructura timeval t_ini y timeval t_fin struct timeval t_fin; double secs; // Se declara la variable secs de tipo double FILE * pFile; // Se define un puntero para realizar operaciones con archivos long size; gettimeofday(&t_ini, NULL); pFile = fopen( "prueba.txt","rt" ); if( pFile==NULL ){ printf( "Error al abrir archivo" ); else { fseek( pFile, 0, SEEK_END ); size = ftell( pFile ); fclose( pFile ); gettimeofday(&t_fin, NULL); secs = timeval_diff(&t_fin, &t_ini); printf("El tiempo es: %.16g milisegundos\n", secs * 1000.0); printf ( "El tamano del archivo es: %ld bytes.\n", size ); } return 0; }

9