como converter ?

Delphi

24/05/2005

Tenho uma dúvia, se tenho

Var
a,b,c:real;
Begin
a:= strtofloat(edit1.text);
b:= strtofloat(edit2.text);
c:= a+b

Aí funciona direitinho, no caso acima temos uma adição, más suponhamos que eu queira determinar o tipo de calculo, soma, subtração, divisão ou multiplicação através de um edit , alguém já fez isto ? tipo

Var
a,b,c:real;
Begin
a:= strtofloat(edit1.text);
b:= strtofloat(edit2.text);
c:= a ´edit3.text´ b

más este aí num funciona se alguém tiver um palpite, agradeço...t+


Gigatel

Gigatel

Curtidas 0

Respostas

Marco Salles

Marco Salles

24/05/2005

Var a,b,c:real; Begin a:= strtofloat(edit1.text); b:= strtofloat(edit2.text); c:= a ´edit3.text´ b más este aí num funciona se alguém tiver um palpite, agradeço...t+ Porque voce não usa um alinhamentos de if


if edit3.text  =´+´ Then
  c:=a+b
else
  if edit3.text  =´-´ then
     c:=a-b
  else
     if edit3.text  =´*´ then
        c:=a*b
     else
         if edit3.text  =´/´ then
            c:=a/b
         else
            showmessage(´Operador not aplicado´);



GOSTEI 0
Gigatel

Gigatel

24/05/2005

[quote:6812171f2b=´Marco Salles´]
Var a,b,c:real; Begin a:= strtofloat(edit1.text); b:= strtofloat(edit2.text); c:= a ´edit3.text´ b más este aí num funciona se alguém tiver um palpite, agradeço...t+ Porque voce não usa um alinhamentos de if


if edit3.text  =´+´ Then
  c:=a+b
else
  if edit3.text  =´-´ then
     c:=a-b
  else
     if edit3.text  =´*´ then
        c:=a*b
     else
         if edit3.text  =´/´ then
            c:=a/b
         else
            showmessage(´Operador not aplicado´);
[/quote:6812171f2b]


Legal, más analiza mais a fundo, no meu caso presciso de 4 operações seria assim

a+b+c+d

neste caso eu teria que um bocado de if ..... é que tem firma que para se chegar ao valor de custo de uma determinada mercadoria tem que fazer uma série de cálculos primeiro, aí decidi colocar 4 campos para receber valores em porcento e mais 4 para os sinais de cálculos...más esta idéia é válida, se num tiver uma condição + fácil terei que usar esta mesmo...


GOSTEI 0
Gigatel

Gigatel

24/05/2005

deixa eu expor exatamente o X da questão

tenho 8 edit´s 4 deles recebem valores ( 1, 8, 20, etc. Depende da firma )para cálculos de porcentagem
e 4 que recebe sinais ( + - * / ) e fuciona assim tem um edit que recebe o valor de referencia, aí vem um edit o sinal de + ou - ou * ou / aí vem outro edit que vai receber um valor para o calculo, e isso se repete por 3 vezes..

seria assim

100 [+] [10] [+] [5] [+] [3] [+] [0] imagine que os colchetes seriam os edit´s...será muito complicado isto ?

Valew...



GOSTEI 0
Marco Salles

Marco Salles

24/05/2005

neste caso eu teria que um bocado de if


acho que naõ.. Voce pode colocar estes comando if em uma função
onde os parametros passados são a,b,edit1.text e o retorno é a operação

tipo isto:
function RetornarValorOperacao(a,b:Real;Texto:String):Real;
begin
  bla.. bla..
end;

assim:

:arrow: assim se voce quer fazer ::: [b:7d7e0e28de]e:=a+b+c+d [/b:7d7e0e28de].. acho que pode ser feito assim:
e:=RetornarValorOperacao(a,b,edit1.texto);
e:=RetornarValorOperacao(e,c,edit1.text);
e:=RetornarValorOperacao(e,d,edit1.text);


em outras palavras , voce pode aplicar as propriedas de comutação , adição etc das operaçoes quando lhe for conveniente.


GOSTEI 0
Andremuller

Andremuller

24/05/2005

Eu só retirei um edit com o operador porque se tu tem 4 edits com valores vão ser realizadas três operações entre eles.

Bom de qualquer forma segue o código que tu altera com a tua necessidade caso eu não tenha entendido o problema.

Pra ficar bom mesmo eu acho que seria interessante transformar o RealizaOperacao em recursivo, mas no momento estou sem tempo pra fazer isso.

procedure TForm1.Button3Click(Sender: TObject);

  function ConsisteOperadores(AOper: array of string): boolean;
  var
    i: integer;
  begin
    Result := True;
    for i := 0 to High(AOper) do
      if not ((Length(AOper[i]) = 1) and (AOper[i][1] in [´+´, ´-´, ´*´, ´/´])) then
      begin
        Result := False;
        Exit;
      end;
  end;

  function RealizaOperacao(AVal1, AVal2: real; AOper: string): Real;
   begin
    Result := 0;

    case AOper[1] of
      ´+´: Result := AVal1 + AVal2;
      ´-´: Result := AVal1 - AVal2;
      ´*´: Result := AVal1 * AVal2;
      ´/´: Result := AVal1 / AVal2;
    end;
  end;

var
  rResultado: real;
begin
  if not ConsisteOperadores([edtOper1.Text, edtOper2.Text, edtOper3.Text]) then
    raise Exception.Create(´Operadores inválidos.´);

  rResultado := RealizaOperacao(StrToFloat(edtVal1.Text), StrToFloat(edtVal2.Text), edtOper1.Text);
  rResultado := RealizaOperacao(rResultado, StrToFloat(edtVal3.Text), edtOper2.Text);
  rResultado := RealizaOperacao(rResultado, StrToFloat(edtVal4.Text), edtOper3.Text);
  Label1.Caption := FloatToStr(rResultado);
end;



GOSTEI 0
Gigatel

Gigatel

24/05/2005

agradeço pela atenção, deu tudo certo agora usei a função do andremuller valeu msm...funciona perfeitinho...t+


GOSTEI 0
Marco Salles

Marco Salles

24/05/2005

Amigo , so me responde uma coisa.. qual o resultado que vceo espera nesta operação

100 [+] [10] [*] [5] [/] [3]  


:?: :?: :?: :?:


GOSTEI 0
Gigatel

Gigatel

24/05/2005

[quote:1514591d2e=´Marco Salles´]Amigo , so me responde uma coisa.. qual o resultado que vceo espera nesta operação

100 [+] [10] [*] [5] [/] [3]  


:?: :?: :?: :?:[/quote:1514591d2e]

Amigo, isso foi só um exemplo. Era só para efeito de ordenação. más valeu mesmo pela atenção e muito obrigado, o função que o nosso amigo passou acima deu certinho, só tive que dar uns toques caseiros ( rsss ), muito obrigado galera....t+


GOSTEI 0
POSTAR