float valores[MAX_LENGTH];
int variaveis = 0;
int op;
No* historico = NULL;
void menu() {
do {
printf("\n-------------MENU PRINCIPAL------------\n");
printf("1. Definição da expressão\n");
printf("2. Definição do valor das variáveis\n");
printf("3. Avalia expressão\n");
printf("4. Histórico de expressão\n");
printf("5. Sair\n");
printf("\nEscolha uma opção: ");
fflush(stdin);
if (scanf("%d", &op) != 1) {
printf("Erro! Por favor, tente novamente e insira um número.\n");
while (getchar() != '\n');
continue;
}
switch (op) {
case 1:
if (!definirExpressao()) {
continue;
}
break;
case 2:
if (!definirValores()) {
continue;
}
break;
case 3:
if (!avaliarExpressao()) {
continue;
}
break;
case 4:
exibir(historico);
continue;
case 5:
printf("\n----------------SAINDO DO PROGRAMA----------------\n");
liberar(historico);
exit(0);
default:
printf("Opção inválida. Tente novamente.\n");
continue;
}
bool definirValores() {
printf("\n-------------DEFINIÇÃO DE VALORES-----------\n");
if (posfixa[0] == '\0') {
printf("Erro! Defina a expressão antes de atribuir valores às variáveis.\n");
return false;
}
for (int i = 0; i < strlen(posfixa); i++) {
if (isalpha(posfixa[i])) {
char variavel;
printf("Digite o valor para a variável %c: ",posfixa[i]);
if(scanf("%f", &valores[variaveis])!= 1) {
printf("Erro! Por favor, tente novamente e insira um número.\n");
while (getchar() != '\n');
return false;
}
variaveis++;
}
}
return true;
}
bool avaliarExpressao() {
printf("\n-------------RESULTADO DA EXPRESSÃO-------------\n");
if (posfixa[0] == '\0') {
printf("\nErro! Defina a expressão antes de avaliá-la.\n");
return false;
}
MAIN.C
include "Pilha_f.h"
int main() { menu (); return 0; }
MENU.C
include
include
include
include
include
include
include "Pilha_f.h"
include "Pilha_c.h"
include "lista.h"
define MAX_LENGTH 100
PilhaC charPilha; PilhaF floatPilha;
char expressao[MAX_LENGTH]; char posfixa[MAX_LENGTH];
float valores[MAX_LENGTH]; int variaveis = 0; int op;
No* historico = NULL; void menu() { do { printf("\n-------------MENU PRINCIPAL------------\n"); printf("1. Definição da expressão\n"); printf("2. Definição do valor das variáveis\n"); printf("3. Avalia expressão\n"); printf("4. Histórico de expressão\n"); printf("5. Sair\n"); printf("\nEscolha uma opção: ");
} while (op != 5); }
bool definirExpressao() { printf("\n-------------DEFINIÇÃO DE EXPRESSÃO---------\n"); printf("\nDigite uma expressão matematica: "); scanf(" %s", expressao); converge(expressao, posfixa, &charPilha, &floatPilha); historico = adicionar(historico, expressao); return true; }
bool definirValores() { printf("\n-------------DEFINIÇÃO DE VALORES-----------\n"); if (posfixa[0] == '\0') { printf("Erro! Defina a expressão antes de atribuir valores às variáveis.\n"); return false; }
for (int i = 0; i < strlen(posfixa); i++) { if (isalpha(posfixa[i])) { char variavel; printf("Digite o valor para a variável %c: ",posfixa[i]); if(scanf("%f", &valores[variaveis])!= 1) { printf("Erro! Por favor, tente novamente e insira um número.\n"); while (getchar() != '\n'); return false; } variaveis++; } } return true; }
bool avaliarExpressao() { printf("\n-------------RESULTADO DA EXPRESSÃO-------------\n"); if (posfixa[0] == '\0') { printf("\nErro! Defina a expressão antes de avaliá-la.\n"); return false; }
float Resultado = avaliaExpressao(posfixa, &floatPilha, valores, variaveis); printf("Resultado da expressão: %2.0f\n", Resultado); return true; }
int Operador(char x) { return (x == '+' || x == '-' || x == '*' || x == '/'); }
int prio(char operator) { if (operator == '*' || operator == '/') { return 2; } else if (operator == '+' || operator == '-') { return 1; } return 0; }
void converge(const char expressao, char posfixa, PilhaC charPilha, PilhaF floatPilha) { int i, j = 0;
for (i = 0; expressao[i] != '\0'; i++) { char pt = expressao[i]; if (isdigit(pt) || pt == '.') { float number; sscanf(&expressao[i], "%f", &number); while (isdigit(expressao[i]) || expressao[i] == '.') { i++; } i--; empilharFloat(floatPilha, number); } else if (isalpha(pt)) { posfixa[j++] = pt; } else if (pt == '(') { empilharChar(charPilha, pt); } else if (pt == ')') { while (!Vazia(charPilha) && charPilha->valor[charPilha->topo] != '(') { posfixa[j++] = desempilharChar(charPilha); } if(Vazia(charPilha)) { printf("\n ERRO! A expressão NÃO está paratesiada corretamente\n"); return; } desempilharChar(charPilha); } else if (Operador(pt)) { while (!Vazia(charPilha) && prio(charPilha->valor[charPilha->topo]) >= prio(pt)) { posfixa[j++] = desempilharChar(charPilha); } empilharChar(charPilha, pt); } }
while (!Vazia(charPilha)) { posfixa[j++] = desempilharChar(charPilha); }
posfixa[j] = '\0'; printf("Expressão pósfixa: %s\n", posfixa); }
float avaliaExpressao(const char posfixa, PilhaF floatPilha, float valores, int variaveis) { for (int i = 0; posfixa[i] != '\0'; i++) { char pt = posfixa[i]; if (isdigit(pt)) { empilharFloat(floatPilha, pt - '0'); } else if (isalpha(pt)) { int Variavel = pt - 'A'; if (Variavel < 0 || Variavel >= variaveis) { printf("\n ERRO! Variável '%c' não definida.\n", pt); exit(1); } float valoresVariavel = valores[Variavel]; empilharFloat(floatPilha, valoresVariavel); } else if (Operador(pt)) { float operand2 = desempilharFloat(floatPilha); float operand1 = desempilharFloat(floatPilha); switch (pt) { case '+': empilharFloat(floatPilha, operand1 + operand2); break; case '-': empilharFloat(floatPilha, operand1 - operand2); break; case '': empilharFloat(floatPilha, operand1 * operand2); break; case '/': if (operand2 == 0) { printf("\n ERRO! Divisão por zero.\n"); exit(1); } empilharFloat(floatPilha, operand1 / operand2); break; default: printf("\n ERRO! Operador inválido.\n"); exit(1); } } }
return desempilharFloat(floatPilha); }
Pilha_f.c
ifndef PILHA_F_H
define PILHA_F_H
include "Pilha_c.h"
include "lista.h"
include
define MAX_LENGTH 100
typedef struct { float valor[MAX_LENGTH]; int topo; } PilhaF;
void menu(); void inicioFloat(PilhaF pilha); int PilhaVazia(const PilhaF pilha); void empilharFloat(PilhaF pilha, float n); float desempilharFloat(PilhaF pilha);
void converge(const char expressao, char posfixa, PilhaC charPilha, PilhaF floatPilha); float avaliaExpressao(const char posfixa, PilhaF floatPilha, float *valores, int variaveis);
bool definirExpressao(); bool definirValores(); bool avaliarExpressao();
endif
Pilha_f.h
include "Pilha_f.h"
include
include
void inicio(PilhaF *pilha) { pilha->topo = -1; }
int PilhaVazia(const PilhaF pilha) { return pilha->topo == -1; } int CheiaFloat(const PilhaF pilha) { return pilha->topo == MAX_LENGTH -1; }
void empilharFloat(PilhaF *pilha, float n) { pilha->valor[++pilha->topo] = n; }
float desempilharFloat(PilhaF *pilha) { if (!PilhaVazia(pilha)) { return pilha->valor[pilha->topo--]; } else if (CheiaFloat(pilha)) { printf("ERRO!! A pilha está cheia.\n"); exit(EXIT_FAILURE); } }
Pilha_c.h
ifndef PILHA_C_H
define PILHA_C_H
define MAX_LENGTH 100
typedef struct { char valor[MAX_LENGTH]; int topo; } PilhaC;
void inicioChar(PilhaC pilha); int Vazia(const PilhaC pilha); void empilharChar(PilhaC pilha, char n); char desempilharChar(PilhaC pilha);
endif
Pilha_c.c
include "Pilha_c.h"
include
include
void inicioChar(PilhaC *pilha) { pilha->topo = -1; }
int Vazia(const PilhaC *pilha) { return pilha->topo == -1; }
int Cheia(const PilhaC *pilha) { return pilha->topo == MAX_LENGTH -1; }
void empilharChar(PilhaC *pilha, char n) { pilha->valor[++pilha->topo] = n; }
char desempilharChar(PilhaC *pilha) { if (!Vazia(pilha)) { return pilha->valor[pilha->topo--]; } else if (Cheia(pilha)) { printf("ERRO!! A pilha está cheia.\n"); exit(EXIT_FAILURE); } }
lista.h
ifndef LISTA_H
define LISTA_H
define MAX_LENGTH 100
struct No { char expressao[MAX_LENGTH]; struct No* proximo; };
typedef struct No No;
void exibir(No historico); void liberar(No historico); No adicionar(No historico, const char* expressao);
endif
lista.c
include
include
include
include "lista.h"
No adicionar(No historico, const char expressao) { No novoNo = (No*)malloc(sizeof(No)); strcpy(novoNo->expressao, expressao); novoNo->proximo = historico; return novoNo; }
void exibir(No* historico) { printf("\n---------EXIBINDO HISTORICO DE EXPRESSÃO---------\n"); while (historico != NULL) { printf("%s\n", historico->expressao); historico = historico->proximo; } }
void liberar(No historico) { while (historico != NULL) { No temp = historico; historico = historico->proximo; free(temp); } }