EmmyllyDev / Estrutur

0 stars 0 forks source link

Pilha - Avaliando expressão #1

Closed EmmyllyDev closed 11 months ago

EmmyllyDev commented 11 months ago

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: ");

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;
}

} 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); } }