Kezdőoldal » Számítástechnika » Programozás » A kérdésem Delphiben az, hogy?

A kérdésem Delphiben az, hogy?

Figyelt kérdés

...hogyan tudom azt megoldani, hogy egy szövegmezőbe beírt két értéket, (egy operátor jel beiktatásával), akármilyen hosszú értéket, úgy kezeleje le a 4 alapművelettel, hogy annak eredménye egy másik beírómezőben megjelenjen?


Tehát, ha pl: az egyik editboxba beírom, hogy 542/2, akkor a másik editbox,ba jelenjen meg, ennek az eredménye. Ha pedig pl: azt írom, hogy 45678+12, akkor azt is végezze el és írja ki a végeredményét a másik editboxba. Tehát egy editboxon belül kezelje le a 4 alapművelet és írja ki egy másik boxba. Egy működő, de rossz példát beszúrok, szemléltetés képpen. Ennek az a baja, hogy csak két helyiértéket tud lekezelni az operátorokkal és nem "végtelent", vagy akármilyet.


procedure TForm1.Edit1Change(Sender: TObject);

begin


if (edit1.text <> '') and (edit2.Text <> '') then begin

end;


try

try



a:=strtoint(edit1.text[1]);

n:=edit1.text[2];

c:=strtoint(edit1.Text[3]);



{edit2.text:=floattostr(a)+'/'+ floattostr(c)+ '='+ floattostr(a/c);}



if n='+' then edit2.text:=floattostr(a)+'+'+ floattostr(c)+ '='+ floattostr(a+c);

if n='-' then edit2.text:=floattostr(a)+'-'+ floattostr(c)+ '='+ floattostr(a-c);

if n='*' then edit2.text:=floattostr(a)+'*'+ floattostr(c)+ '='+ floattostr(a*c);

if n='/' then edit2.text:=floattostr(a)+'/'+ floattostr(c)+ '='+ floattostr(a/c);


except

on EConvertError do

end;


except

on EAccessViolation do

end;

end;



procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

begin


try

if (Ord(key) = vk_back) then begin

edit1.clear;

edit2.Clear;

end;

except

on EAccessViolation do

end;

end;

end.


2011. nov. 22. 20:00
 1/5 2xSü ***** válasza:

Régen dolgoztam Delphiben. Valami ilyesmi lesz:

(Feltételezzük, hogy az Edit1 azért megfelelő formátumban van. Feltételeztem azt is, hogy a „bármilyen hosszú” számodra olyan számot jelenti, ami ábrázolható egy Delphi változóban.)


procedure TForm1.Edit1Change(Sender: TObject);

var hely:integer;

a,b:Extended;

c:char;

begin

try

Edit2.text:='Error';

hely:=pos('+',Edit1.text);

if (pos('-',Edit1.text)>0) then hely:=pos('-',Edit1.text);

if (pos('*',Edit1.text)>0) then hely:=pos('*',Edit1.text);

if (pos('/',Edit1.text)>0) then hely:=pos('/',Edit1.text);

if (hely>0) then begin

a:=StrToFloat(copy(Edit1.text,1,hely-1));

b:=strtofloat(copy(Edit1.text,hely+1,length(Edit1.text)));

c:=Edit1.text[hely];

case c of

'+': Edit2.text:=FloatToStr(a+b);

'-': Edit2.text:=FloatToStr(a-b);

'*': Edit2.text:=FloatToStr(a*b);

'/': Edit2.text:=FloatToStr(a/b);

end;

end;

finally

end;

end;

2011. nov. 22. 20:52
Hasznos számodra ez a válasz?
 2/5 2xSü ***** válasza:

Persze ennél jóval tömörebb megoldás is van, de talán így érthető, mi történik.


Elsőként megkeressük a műveleti jel helyét. Ennek ismeretében kettévágjuk az Edit1.text tartalmát és számmá konvertáljuk. A műveleti jel alapján elágaztatva elvégezzük a műveletet és beletesszük az edit2.text-ben.


Az egészet megfűszerezzük némi kivételkezeléssel, hogy a hibák esetén is legyen valami kiírva, illetve ne szálljon el az egész.

2011. nov. 22. 20:55
Hasznos számodra ez a válasz?
 3/5 A kérdező kommentje:
Köszönöm a megoldást, tökéletes!
2011. nov. 22. 21:04
 4/5 _Jessy_ ***** válasza:
Ez nem kezel akármilyen nagy számot :) Bocsánat, nem belekötni akartam, csak felvetni egy újabb problémát, programozás gyakorlatnak nem rossz: csináld meg úgy, hogy tényleg működjön nagy számokra. Mondjuk úgy 4-500 jegyűekre :)
2011. nov. 23. 08:35
Hasznos számodra ez a válasz?
 5/5 2xSü ***** válasza:

500 jegyű szám és pontos számítás esetén már kicsit valóban érdekesebb a feladat. (BC for Windows? :-) ) (Próbáltam már hasonlót, nem is olyan egyszerű, főleg ha a sebesség is szempont.)


Bár azt gondolom egy ilyen problémára nem a gyarkorikerdesek.hu-n szoktak válaszolni.


Másik oldalról meg vannak ilyen komponensek, ergo lehet nem is olyan sok idő megcsinálni, ha az ember felhasználja ezeket.

2011. nov. 23. 10:38
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!