calculadora de expressao em delphi nao calcula
05/11/2021
0
unit Calculadora;
interface
uses
SysUtils, Types, Classes, Variants, QTypes, QGraphics, QControls, QForms,
QDialogs, Dialogs, QStdCtrls;
type
TFCalculdora = class(TForm)
edvisor: TEdit;
bt1: TButton;
bt2: TButton;
bt3: TButton;
bt4: TButton;
bt5: TButton;
bt6: TButton;
bt7: TButton;
bt8: TButton;
bt9: TButton;
bt0: TButton;
btLimpar: TButton;
Igual: TButton;
btparD: TButton;
btparE: TButton;
Remover: TButton;
btSomar: TButton;
Subtrair: TButton;
Multiplicar: TButton;
Dividir: TButton;
btVazio: TButton;
LstTermo: TListBox;
LstOperador: TListBox;
Termo: TLabel;
Operador: TLabel;
Visor: TLabel;
procedure NumeroClick(Sender: TObject);
procedure btSomarClick(Sender: TObject);
procedure SubtrairClick(Sender: TObject);
procedure MultiplicarClick(Sender: TObject);
procedure DividirClick(Sender: TObject);
procedure IgualClick(Sender:TObject);
procedure btLimparClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure btparEClick(Sender: TObject);
private
{ Private declarations }
Operacao : Char;
Total :string;
v1,v2 : Double;
Ultimonumero : Double;
procedure AvaliarExpressao;
procedure Calcular(Operador: String = '');
procedure Limpar;
public
{ Public declarations }
end;
var
FCalculdora: TFCalculdora;
implementation
{$R *.xfm}
procedure TFCalculdora.NumeroClick(Sender: TObject);
begin
edvisor.Text := edvisor.Text + TButton(Sender).Caption;
end;
procedure TFCalculdora.btSomarClick(Sender: TObject);
begin
Operacao := '+' ;
Total := Total + FloatToStr(v1);
edvisor.Text := edvisor.Text + TButton(Sender).Caption;
end;
procedure TFCalculdora.SubtrairClick(Sender: TObject);
begin
Operacao := '-' ;
edvisor.Text := edvisor.Text + TButton(Sender).Caption;
end;
procedure TFCalculdora.MultiplicarClick(Sender: TObject);
begin
Operacao := 'X' ;
edvisor.Text := edvisor.Text + TButton(Sender).Caption;
end;
procedure TFCalculdora.DividirClick(Sender: TObject);
begin
Operacao := '/' ;
edvisor.Text := edvisor.Text + TButton(Sender).Caption;
end;
// Método que calcula a expressão já analisada e separada na pilha.
// Caso seja informado um operador como parâmetro, o cálculo deverá ser realizado até que
// seja desempilhado o operador informado (primeiro operador encontrado na pilha).
procedure TFCalculdora.Calcular(Operador: String);
var
v1: string;
v2: string;
Total, Oper , expressao: string;
i: integer;
caracter : Char;
begin
for i := 1 to Length(expressao) do begin
caracter := expressao[i];
case (caracter) of
'+': begin
Total := Total + edvisor.Text;
end;
'-':
begin
end;
'x':
begin
end;
'/':
begin
end;
'(':
begin
end;
')':
begin
Calcular('(');
end;
else // Se não for nenhum operador reconhecido, é termo
end;
end;
end;
// LstTermo.Items.Add(Total);
procedure TFCalculdora.IgualClick(Sender:TObject);
begin
AvaliarExpressao;
Calcular;
end;
procedure TFCalculdora.FormCreate(Sender: TObject);
begin
Limpar;
end;
procedure TFCalculdora.btLimparClick(Sender: TObject);
begin
Limpar;
end;
procedure TFCalculdora.Limpar;
begin
Ultimonumero := 0;
edvisor.Clear;
Operacao := '+' ;
Total := '0';
LstTermo.Clear;
LstOperador.Clear;
end;
procedure TFCalculdora.btparEClick(Sender: TObject);
begin
edvisor.Text := edvisor.Text + TButton(Sender).Caption;
end;
procedure TFCalculdora.AvaliarExpressao;
var
i: integer;
numero, expressao: String;
caracter: Char;
// Método interno para auxiliar na análise e processamento do termo
procedure EmpilhaNumero();
begin
if numero <> '' then begin // Caso exista termo na variável temporária
LstTermo.Items.Add(numero); // Inclui o termo na pilha de termos
numero := ''; // Limpa a temporária
end;
end;
begin
LstTermo.Clear;
LstOperador.Clear;
expressao := Trim(edvisor.Text); // Para remover espaços antes e depois da expressão, caso existam
for i := 1 to Length(expressao) do begin // Para cada caracter da expressão
caracter := expressao[i]; // Recupera o caracter da posição N da expressão
case (caracter) of // switch para verificar o que fazer com o caracter
'+': // se for o operador +, inclui na pilha de operadores
begin
EmpilhaNumero(); // Processa a variável temporária
LstOperador.Items.Add(caracter); // Inclui o operador
end;
'-': // se for o operador -, inclui na pilha de operadores
begin
EmpilhaNumero();
LstOperador.Items.Add(caracter);
end;
'x': // se for o operador x, inclui na pilha de operadores
begin
EmpilhaNumero();
LstOperador.Items.Add(caracter);
end;
'/': // se for o operador /, inclui na pilha de operadores
begin
EmpilhaNumero();
LstOperador.Items.Add(caracter);
end;
'(': // se for o operador (, inclui na pilha de operadores
begin
EmpilhaNumero();
LstOperador.Items.Add(caracter);
end;
')': // se for o operador ), calcula até encontrar um (
begin
EmpilhaNumero();
Calcular('(');
end;
else // Se não for nenhum operador reconhecido, é termo
numero := numero + caracter;
end;
end;
EmpilhaNumero();
end;
end.
interface
uses
SysUtils, Types, Classes, Variants, QTypes, QGraphics, QControls, QForms,
QDialogs, Dialogs, QStdCtrls;
type
TFCalculdora = class(TForm)
edvisor: TEdit;
bt1: TButton;
bt2: TButton;
bt3: TButton;
bt4: TButton;
bt5: TButton;
bt6: TButton;
bt7: TButton;
bt8: TButton;
bt9: TButton;
bt0: TButton;
btLimpar: TButton;
Igual: TButton;
btparD: TButton;
btparE: TButton;
Remover: TButton;
btSomar: TButton;
Subtrair: TButton;
Multiplicar: TButton;
Dividir: TButton;
btVazio: TButton;
LstTermo: TListBox;
LstOperador: TListBox;
Termo: TLabel;
Operador: TLabel;
Visor: TLabel;
procedure NumeroClick(Sender: TObject);
procedure btSomarClick(Sender: TObject);
procedure SubtrairClick(Sender: TObject);
procedure MultiplicarClick(Sender: TObject);
procedure DividirClick(Sender: TObject);
procedure IgualClick(Sender:TObject);
procedure btLimparClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure btparEClick(Sender: TObject);
private
{ Private declarations }
Operacao : Char;
Total :string;
v1,v2 : Double;
Ultimonumero : Double;
procedure AvaliarExpressao;
procedure Calcular(Operador: String = '');
procedure Limpar;
public
{ Public declarations }
end;
var
FCalculdora: TFCalculdora;
implementation
{$R *.xfm}
procedure TFCalculdora.NumeroClick(Sender: TObject);
begin
edvisor.Text := edvisor.Text + TButton(Sender).Caption;
end;
procedure TFCalculdora.btSomarClick(Sender: TObject);
begin
Operacao := '+' ;
Total := Total + FloatToStr(v1);
edvisor.Text := edvisor.Text + TButton(Sender).Caption;
end;
procedure TFCalculdora.SubtrairClick(Sender: TObject);
begin
Operacao := '-' ;
edvisor.Text := edvisor.Text + TButton(Sender).Caption;
end;
procedure TFCalculdora.MultiplicarClick(Sender: TObject);
begin
Operacao := 'X' ;
edvisor.Text := edvisor.Text + TButton(Sender).Caption;
end;
procedure TFCalculdora.DividirClick(Sender: TObject);
begin
Operacao := '/' ;
edvisor.Text := edvisor.Text + TButton(Sender).Caption;
end;
// Método que calcula a expressão já analisada e separada na pilha.
// Caso seja informado um operador como parâmetro, o cálculo deverá ser realizado até que
// seja desempilhado o operador informado (primeiro operador encontrado na pilha).
procedure TFCalculdora.Calcular(Operador: String);
var
v1: string;
v2: string;
Total, Oper , expressao: string;
i: integer;
caracter : Char;
begin
for i := 1 to Length(expressao) do begin
caracter := expressao[i];
case (caracter) of
'+': begin
Total := Total + edvisor.Text;
end;
'-':
begin
end;
'x':
begin
end;
'/':
begin
end;
'(':
begin
end;
')':
begin
Calcular('(');
end;
else // Se não for nenhum operador reconhecido, é termo
end;
end;
end;
// LstTermo.Items.Add(Total);
procedure TFCalculdora.IgualClick(Sender:TObject);
begin
AvaliarExpressao;
Calcular;
end;
procedure TFCalculdora.FormCreate(Sender: TObject);
begin
Limpar;
end;
procedure TFCalculdora.btLimparClick(Sender: TObject);
begin
Limpar;
end;
procedure TFCalculdora.Limpar;
begin
Ultimonumero := 0;
edvisor.Clear;
Operacao := '+' ;
Total := '0';
LstTermo.Clear;
LstOperador.Clear;
end;
procedure TFCalculdora.btparEClick(Sender: TObject);
begin
edvisor.Text := edvisor.Text + TButton(Sender).Caption;
end;
procedure TFCalculdora.AvaliarExpressao;
var
i: integer;
numero, expressao: String;
caracter: Char;
// Método interno para auxiliar na análise e processamento do termo
procedure EmpilhaNumero();
begin
if numero <> '' then begin // Caso exista termo na variável temporária
LstTermo.Items.Add(numero); // Inclui o termo na pilha de termos
numero := ''; // Limpa a temporária
end;
end;
begin
LstTermo.Clear;
LstOperador.Clear;
expressao := Trim(edvisor.Text); // Para remover espaços antes e depois da expressão, caso existam
for i := 1 to Length(expressao) do begin // Para cada caracter da expressão
caracter := expressao[i]; // Recupera o caracter da posição N da expressão
case (caracter) of // switch para verificar o que fazer com o caracter
'+': // se for o operador +, inclui na pilha de operadores
begin
EmpilhaNumero(); // Processa a variável temporária
LstOperador.Items.Add(caracter); // Inclui o operador
end;
'-': // se for o operador -, inclui na pilha de operadores
begin
EmpilhaNumero();
LstOperador.Items.Add(caracter);
end;
'x': // se for o operador x, inclui na pilha de operadores
begin
EmpilhaNumero();
LstOperador.Items.Add(caracter);
end;
'/': // se for o operador /, inclui na pilha de operadores
begin
EmpilhaNumero();
LstOperador.Items.Add(caracter);
end;
'(': // se for o operador (, inclui na pilha de operadores
begin
EmpilhaNumero();
LstOperador.Items.Add(caracter);
end;
')': // se for o operador ), calcula até encontrar um (
begin
EmpilhaNumero();
Calcular('(');
end;
else // Se não for nenhum operador reconhecido, é termo
numero := numero + caracter;
end;
end;
EmpilhaNumero();
end;
end.
Karina Scheid
Curtir tópico
+ 0
Responder
Clique aqui para fazer login e interagir na Comunidade :)