📄 exp.c
字号:
/*************************************************************Nombre: Villela Tinoco José CarlosMateria: Programación estructuradaProfesor: Dr. Dominique Decouchant"Evaluación de expresión"*************************************************************/#include <stdio.h>#include <stdlib.h>#include <math.h>#include <string.h>#define T 1#define F 0//Declaración de funcionesint expresion(char *, int *);int tratarSegmento(char *, int *);int leerOperando(char *, int *);int getValor(char *, int *);int esNumero(char);//MAINmain(int argc, char *argv[]){ //Verficamos que se haya introducido una expresion if(argc != 1) { char *cadena; register int i, j; int total; //Vemos cuantos caracteres son necesarios for(i = 1, total = 0; i < argc; i++) for(j = 0; argv[i][j] != '\0'; j++,total++); //Rservamos memoria incluyendo el caracter de fin de cadena cadena = (char*)malloc(sizeof(char) * (total + 1)); //Llenamos la cadena for(i = 1, total = 0; i < argc; i++) for(j = 0; argv[i][j] != '\0'; j++,total++) cadena[total] = argv[i][j]; int indice = 0; //Evaluamos la expresion total = expresion(cadena, &indice); printf("Resultado: %i\n", total); //Liberamos los recursos reservados free(cadena); } else printf("Error, no se introdujo una expresion...\n");}/************************************************************************Nombre: expresionParameteros: 1) cadena.- Cadena de la expresion 2) indice.- Indice actualDescripción: Evalua una expresion*************************************************************************/int expresion(char *cadena, int *indice){ int acum = 0; int acum2 = 0; char operador = '+'; char palabra = cadena[*indice]; //Recorremos mientras no encontremos el fin de cadena o un parentesis que abra while(palabra != '\0' && palabra != ')') { //Obtenemos el segmento acum2 = tratarSegmento(cadena, indice); //Verficamos que operación se debe llevar a cabo if(operador == '+') acum += acum2; else acum -= acum2; //Obtenemos la palabra siguiente palabra = cadena[*indice]; //Si es diferente del final de cadena o de cierre de parentesis if(palabra != '\0' && palabra != ')') { //Obtenemos el operador operador = palabra; (*indice)++; } } printf("Res: %i\n",acum); //Retornamos el valor final return acum; }/************************************************************************Nombre: tratarSegmentoParameteros: 1) cadena.- Cadena de la expresion 2) indice.- Indice actualDescripción: Evalua un segmento*************************************************************************/int tratarSegmento(char *cadena, int *indice){ //Iniciamos el acumulador con el valor actual int acum = leerOperando(cadena, indice); //Obtenemos el valor correspondiente int valor; //Obtenemos el operador char operador = cadena[*indice]; //Si el operador siguiente es una multiplicación o division while(operador == '*' || operador == '/' && operador != '\0') { //Incrementamos para posicionarnos en el siguiente caracter (*indice)++; //Obtenemos el siguiente valor y operador valor = leerOperando(cadena, indice); //Vemos que operación es if(operador == '*') acum *= valor; else acum /= valor; //Obtenemos el siguiente operador operador = cadena[*indice]; } //Retronamos el valor calculado return acum;}/************************************************************************Nombre: expresionParameteros: 1) cadena.- Cadena de la expresion 2) indice.- Indice actualDescripción: Lee un operando*************************************************************************/int leerOperando(char *cadena, int *indice){ //Si el caracter es un número, obtenemos su valor if(esNumero(cadena[*indice]) == T) return getValor(cadena, indice); //Si el caracter es un parentesis, tratamos el valor dentro del parentesis else if (cadena[*indice] == '(') { (*indice)++; int aux = expresion(cadena, indice); (*indice)++; return aux; }}/************************************************************************Nombre: expresionParameteros: 1) cadena.- Cadena de la expresion 2) indice.- Indice actualDescripción: Devuelve el valor entero de un operando*************************************************************************/int getValor(char *cadena, int *indice){ register int i; //Vemos hasta donde termina el número for(i = 0; esNumero(cadena[*indice + i]) == T; i++); //Reservamos el espacio requerido char *tmp = (char*)malloc(sizeof(char) * i); //Formamos la cadena del número for(i = 0; esNumero(cadena[*indice]) == T; (*indice)++, i++) tmp[i] = cadena[*indice]; tmp[i] = '\0'; //Convertimos la cadena a entero int val = atoi(tmp); //Liberamos la memoria reservada free(tmp); //Regresamos el valor return val;}/************************************************************************Nombre: esNumeroParameteros: 1) cadena.- caracter a verificarDescripción: Verifica si un caracter es una expresión*************************************************************************/int esNumero(char caracter){ if(caracter >= 48 && caracter <= 57) return T; else return F;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -