segunda-feira, 30 de março de 2009

Calculadora em C utilizando pilhas

Olá, exemplo muito básico, mas muito básico mesmo, de uma calculadora com as 4 operações básicas feito no Dev-C++ utilizando a linguagem C e também o conceito de pilhas. Este programa pede para o usuário digitar dois valores e armazena eles em uma pilha (vetor), depois pede para o usuário informar a operação desejada, desempilha os valores e armazena eles em variáveis auxiliares, isso poderia ser tirado fora mas pro melhor entendimento preferi deixar assim, feita a operação é armazenado o resultado na pilha novamente e chamado a função que exibe o resultado final.



/*
Name: Calculadora
Author: Bol�var Arthur Butzke
Date: 23/03/09 21:52
Description: Calculadora. Programa que utilize pilhas para efetuar as opera��es b�sicas:
adi��o, subtra��o, divis�o e multiplica��o.
*/
/* Bibliotecas de Fun��es */
#include <stdio.h>
#include <stdlib.h>
/* Constantes */
#define MAX 10
#define BASE 0
/* Vari�veis */
int TOPO=0, OPERACAO=0;
float VETOR[MAX], VALOR=0, N1=0, N2=0, RESULTADO=0;
/* Fun��o para inserir elementos na pilha */
void EMPILHAR(float VALOR)
{
if (TOPO == MAX)
printf("Buffer OverFlow - Pilha Cheia.\n");
else
VETOR[TOPO] = VALOR;
TOPO++;
}
/* Fun��o para retirar elementos da pilha */
float DESEMPILHAR()
{
if (TOPO == BASE)
printf("Buffer UnderFlow! Pilha Vazia.\n");
else
{
TOPO--;
RESULTADO = VETOR[TOPO];
}
return RESULTADO;
}
/* Fun��o para efetuar as opera��es */

void CALCULA()
{
int RESULT = 0;

if (OPERACAO == 1) {
printf("\nOperacao de Adicao\n");
N1 = DESEMPILHAR();
N2 = DESEMPILHAR();
RESULTADO = N1 + N2;
printf("\n%f + %f = %f\n",N1,N2,RESULTADO);
EMPILHAR(RESULTADO);
RESULT = 1;
}
if (OPERACAO == 2) {
printf("\nOperacao de Subtracao\n");
N1 = DESEMPILHAR();
N2 = DESEMPILHAR();
RESULTADO = N1 - N2;
printf("\n%f - %f = %f\n",N1,N2,RESULTADO);
EMPILHAR(RESULTADO);
RESULT = 1;
}
if (OPERACAO == 3) {
printf("\nOperacao de Multiplicacao\n");
N1 = DESEMPILHAR();
N2 = DESEMPILHAR();
RESULTADO = N1 * N2;
printf("\n%f * %f = %f\n",N1,N2,RESULTADO);
EMPILHAR(RESULTADO);
RESULT = 1;
}
if (OPERACAO == 4) {
printf("\nOperacao de Divisao\n");
N1 = DESEMPILHAR();
N2 = DESEMPILHAR();
RESULTADO = N1 / N2;
printf("\n%f / %f = %f\n",N1,N2,RESULTADO);
EMPILHAR(RESULTADO);
RESULT = 1;
}
// printf("Operacao informada invalida. Operacoes validas sao:\n adicao (+)\n subtracao (-)\n multiplicacao (*)\n divisao (/)\n");
if (RESULT==0)
{
printf("\nOperacao nao encontrada. \n1 -> Adicao\n2 -> Subtracao\n3 -> Multiplicacao\n4 -> Divisao\nInforme a operacao novamente: ");
scanf("%d",&OPERACAO);
CALCULA();
}

}
/* Fun��o para exibir o resultado */
void MOSTRARESULTADO()
{
printf("Resultado da operacao e' %f\n",VETOR[BASE]);
}

/* Fun��o Principal */
int main()
{
int AUXILIAR=1;
printf("\n Calculadora 1.0\n");
while (AUXILIAR != 0)
{
printf("\nDigite o valor1: ");
scanf("%f",&N1);
EMPILHAR(N1);
printf("\nDigite o valor2: ");
scanf("%f",&N2);
EMPILHAR(N2);
printf("\n1 -> Adicao\n2 -> Subtracao\n3 -> Multiplicacao\n4 -> Divisao");
printf("\nDigite a operacao: ");
scanf("%d",&OPERACAO);
CALCULA();
MOSTRARESULTADO();
printf("\nDigite 0 para sair ou 1 para realizar outra operacao: ");
scanf("%d",&AUXILIAR);
// nencess�rio para limpar a pilha ap�s realizar uma opera��o, sem isso vai mostrar sempre o resultado da primeira opera��o.
TOPO = BASE;
}
return 0;
}


Para entender melhor o conceito de pilhas, pense em uma pilha de pratos, quando você precisa de um prato você vai e retira o que está em cima, quando não precisa mais, você coloca ele em cima novamente, assim, sempre o último prato empilhado é o primeiro que sai, leia este post sobre listas encadeadas para saber mais.

Nenhum comentário:

Postar um comentário