Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-06-2016
wolfteamI wolfteamI is offline
Registrado
NULL
 
Registrado: jun 2016
Posts: 1
Poder: 0
wolfteamI Va por buen camino
Talking 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;
    sumaouble;
    restaouble;
    productoouble;
    divisionouble;
    num1ouble;
    num2ouble;

    { 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.

Última edición por ecfisa fecha: 29-06-2016 a las 06:54:22. Razón: Etiquetas [delphi][/delphi]
Responder Con Cita
  #2  
Antiguo 29-06-2016
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.269
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 29-06-2016
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.269
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
¿Se pueden programar apps para iOS sin saber programar? nlsgarcia La Taberna 7 04-08-2014 11:09:36
calculadora cientifica jose.ignacio.ve Varios 23 08-05-2013 16:35:03
Calculadora Cientifica Gráfica en Delphi, paradox y OpenGL Apokalipsis Varios 5 26-01-2011 07:09:57
Ayudenme... EveElgrande Internet 14 25-07-2006 21:54:27
Ayudenme a Aprender Caray Varios 1 16-06-2006 03:31:52


La franja horaria es GMT +2. Ahora son las 18:14:43.


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
Copyright 1996-2007 Club Delphi