Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   ayúdenme a programar una calculadora científica (https://www.clubdelphi.com/foros/showthread.php?t=90511)

wolfteamI 29-06-2016 02:40:25

ayúdenme a programar una calculadora científica
 
hola amigos soy nuevo de paquete en este sitio XDXD
bueno soy un novato en esto de programación en delphi y espero que me ayuden.
para mi primer programa lo que intento hacer es una calculadora científica que pueda calcular múltiples ejercicios como por ejemplo.
10-2*5

por el momento ya programe lo que es una calculadora básica que +,-,*,/(y+x)

este es mi codigo.
Código Delphi [-]
unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm3 = class(TForm)
    edt1: TEdit;
    btn0: TButton;
    btn1: TButton;
    btn2: TButton;
    btn3: TButton;
    btn4: TButton;
    btn5: TButton;
    btn6: TButton;
    btn7: TButton;
    btn8: TButton;
    btn9: TButton;
    btncoma: TButton;
    btn11: TButton;
    btndivision: TButton;
    btnmultiplicacion: TButton;
    btnresta: TButton;
    btnsuma: TButton;
    btnc: TButton;
    btnb: TButton;
    edt2: TEdit;
    procedure btn0Click(Sender: TObject);
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
    procedure btn3Click(Sender: TObject);
    procedure btn4Click(Sender: TObject);
    procedure btn5Click(Sender: TObject);
    procedure btn6Click(Sender: TObject);
    procedure btn7Click(Sender: TObject);
    procedure btn8Click(Sender: TObject);
    procedure btn9Click(Sender: TObject);
    procedure btndivisionClick(Sender: TObject);
    procedure btnmultiplicacionClick(Sender: TObject);
    procedure btnrestaClick(Sender: TObject);
    procedure btnsumaClick(Sender: TObject);
    procedure btncomaClick(Sender: TObject);
    procedure btncClick(Sender: TObject);
    procedure edt1Change(Sender: TObject);
    procedure btnbClick(Sender: TObject);
    procedure btn11Click(Sender: TObject);
  private
    { Private declarations }
    op:string;
    suma:Double;
    resta:Double;
    producto:Double;
    division:Double;
    num1:Double;
    num2:Double;

    { Public declarations }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.btn0Click(Sender: TObject);
begin
edt1.Text:=edt1.Text+btn0.Caption;
end;

procedure TForm3.btncClick(Sender: TObject);
begin
edt1.Text:='';
end;

procedure TForm3.btncomaClick(Sender: TObject);
begin
edt1.Text:=edt1.Text+btncoma.Caption;
end;

procedure TForm3.btndivisionClick(Sender: TObject);
begin

edt1.Text:=edt1.Text+'/';

op:='/';
end;

procedure TForm3.btnmultiplicacionClick(Sender: TObject);
begin
edt1.Text:=edt1.Text+'*';
op:='*';
end;

procedure TForm3.btnrestaClick(Sender: TObject);
begin

edt1.Text:=edt1.Text+'-';

op:='-';
end;

procedure TForm3.btnsumaClick(Sender: TObject);

begin
edt1.Text:=edt1.Text+'+';
op:='+';
end;

procedure TForm3.edt1Change(Sender: TObject);
var
s,t:string;
begin
if edt1.Text=',' then
begin
  edt1.Text:='0'+','
end;
end;

procedure TForm3.btn11Click(Sender: TObject);
var
i,o,x:Integer;
a,b,c,d:string;
begin
 x:=Length(edt1.Text);
 a:=edt1.Text;
 i:=0;
 o:=0;
 repeat
   i:=i+1;
   o:=o+1;
   if a[i]='+' then
   begin
     d:=a[i];
     i:=x;
     o:=o+1
   end
   else
   begin
    if a[i]='-' then
    begin
      d:=a[i];
     i:=x;
     o:=o+1
    end
    else
    begin
      if a[i]='*' then
      begin
       d:=a[i];
       i:=x;
       o:=o+1
      end
      else
      begin
        if a[i]='/' then
        begin
          d:=a[i];
          i:=x;
          o:=o+1
        end
        else
        begin
          b:=b+a[i];
        end;
      end;
    end;
   end;
 until i=x ;
 for i := o to x do
   begin
     c:=c+a[i];
   end;
    if d='+' then
    begin
    try
      edt1.Text:=floatToStr((StrTofloat(b))+(StrTofloat(c)))
    except
      ShowMessage('datos no validos');

    end;
    end
    else
    begin
      if d='-' then
      begin
        try
         edt1.Text:=floatToStr((StrTofloat(b))-(StrTofloat(c)))
        except
      ShowMessage('datos no validos');

      end;
      end
      else
      begin
        if d='*' then
        begin
          try
          edt1.Text:=floatToStr((StrTofloat(b))*(StrTofloat(c)))
          except
           ShowMessage('datos no validos');
          end;
        end
        else
        begin
          if d='/' then
          begin
            try
             edt1.Text:=floatToStr((StrTofloat(b))/(StrTofloat(c)))
               except
              ShowMessage('datos no validos');
            end;
          end
          else
          begin
            ShowMessage('falta el operador:Ejemplo(x+y)');
          end;
        end;
      end;

    end;



end;

procedure TForm3.btn1Click(Sender: TObject);
begin
edt1.Text:=edt1.Text+btn1.Caption;
end;

procedure TForm3.btn2Click(Sender: TObject);
begin
edt1.Text:=edt1.Text+btn2.Caption;
end;

procedure TForm3.btn3Click(Sender: TObject);
begin
edt1.Text:=edt1.Text+btn3.Caption;
end;

procedure TForm3.btn4Click(Sender: TObject);
begin
edt1.Text:=edt1.Text+btn4.Caption;
end;

procedure TForm3.btn5Click(Sender: TObject);
begin
edt1.Text:=edt1.Text+btn5.Caption;
end;

procedure TForm3.btn6Click(Sender: TObject);
begin
edt1.Text:=edt1.Text+btn6.Caption;
end;

procedure TForm3.btn7Click(Sender: TObject);
begin
edt1.Text:=edt1.Text+btn7.Caption;
end;

procedure TForm3.btn8Click(Sender: TObject);
begin
edt1.Text:=edt1.Text+btn8.Caption;
end;

procedure TForm3.btn9Click(Sender: TObject);
begin
edt1.Text:=edt1.Text+btn9.Caption;
end;

procedure TForm3.btnbClick(Sender: TObject);
var
x:Integer;
s:string;
begin
s:=edt1.Text;
    x:=Length(s);
    Delete(s,x,1);
edt1.Text:=s;
end;

end.
bueno espero que me den alguna ayuda o idea o consejo de como puedo hacer un algoritmo para que pueda programar una calculadora científica
gracias.

Neftali [Germán.Estévez] 29-06-2016 09:48:05

Bienvenido al club.
Antes de nada, te recomiendo que revises la guía de estilo de los foros.

Estaría bien un título descriptivo en tu mensaje y algo más de concreción en tu pregunta, ya que es algo genérica.

Imagino que el procedimiento/evento btn11Click es el que correspode a realizar el cálculo.
Ese procedimiento lo has programado para trabajar con dos operadorandos y 1 operador, pero no te va a servir para más combinaciones (com la que necesitas), porque no puedes programar utilizando los IF todas las combinaciones posibles como has hecho ahí.
Debes enfocar ese procedimiento a generar un evaluador de expresiones (o utilizar uno ya existente si te dejan).

Si debes hacerlo tú, puedes pensar en un procedimiento similar a este:

Código Delphi [-]
function Evaluar(pExpresion:string):integer;
function Evaluar(pExpresion:string):single;
function Evaluar(pExpresion:string):double;

Que te permita evaluar algo como lo que comentas: 10-(5-3)*5

(1) Separar los operandos y operadores
(2) Evaluar los operando de forma individual por si son complejos del estilo a: (5-3)
(3) De forma recursiva o iterativa volver a evaluar teniendo en cuenta las prioridades.


Si tuvieras algo como esto:
10-(5-3)*5
Debes hacer por pasos:
-----------------------
10-(5-3)*5
----------------------- Aplanar
10
-
(5-3)
*
5
----------------------- Evaluar
10
-
2
*
5
----------------------- Evaluar
10
-
10
----------------------- Evaluar
0

Neftali [Germán.Estévez] 29-06-2016 10:03:54

Después de toda esta parrafada, acabado de recordar que las versiones nuevas de Delphi traen un evaluador.

Si usas (creo) una versión posterior a la XE2, puedes utilizar el evaluador que viene con LiveBindings.
En concreto en la Unit System.Bindings.EvalProtocol hay un método Evaluate (http://docwiki.embarcadero.com/Libra...nding.Evaluate) que permie evaluar una expresión.
Antes tendrás que compilarla con un método Compile (http://docwiki.embarcadero.com/Libra...ession.Compile) que hay en System.Bindings.Evaluator.

Si quieres ver un ejemplo de utilización, aquí tienes algunos:
https://theroadtodelphi.com/2012/07/...ion-evaluator/
http://stackoverflow.com/questions/1...using-icompile


La franja horaria es GMT +2. Ahora son las 05:35:12.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi