Hogy lehetséges ezt a programozási feladatot megoldani?
Azt szeretném megoldani,ha nem túl komplikált,hogy az egész beírómezőben,bármilyen műveleti jelet írnak, sor előtt, sor(ok) után, szám(ok) előtt, szám(ok) után, akkor elvégezze a feladatot, tehát,hogyha beírom, pl:
12+23-4/6*8+12/7777+55-777*9999, akkor végezze el ezt a bonyolult műveletet és erről egy másik beírómezőben adjon pontos végeredményt. Nagyon sok időt rászántam, hogy megtaláljam a megoldást, mindenre jutottam, csak vagy az
eredményt nem tudtam kihozni, vagy a program nem működött megfelelően. Próbálkoztam a seltextet bevonni,a gettextlent, a sellengthet, másik ciklust, ami a -1-et helyettesíti be, akár e j változóba, kivonni, tömbök alá venni az edit1.text-et[edit1.selstart]-tal, kivonni, osztani szorozni, mindenféle kombinációt, kicserélni az edit1.texteket, edit1.seltextekre, de nem sikerült a feladatot megoldanom normális működő módon. Ebben szeretnék segítséget kérni, ha lehet természetesen forráskóddal mellékelve, mert úgy vélem, hogy ez annál komplikáltabb dolog lehet, hogy szóban megértsem, mit hogyan kell tennem, vagy milyen további, esetleges függvényeket kell, hogy bevonjak a programba, amivel ezt működőképessé lehet varázsolni. Előre is köszönök, minden segítséget és megoldást.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,Strutils, ExtCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
procedure Edit1Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Edit1Change(Sender: TObject);
var sign:char;
i,w:integer;
begin
try
For i:=1 to length(edit1.Text) do
If not (edit1.Text[i] in ['0'..'9']) then
Begin
sign:=edit1.Text[i];
w:=i;
End;
Case sign of
'*': edit2.Text:= floattostr(strtofloat(LeftStr(edit1.Text,w-1)) * strtofloat(rightstr(edit1.Text,length(edit1.Text)-w)));
'/': edit2.Text:= floattostr(strtofloat(LeftStr(edit1.Text,w-1)) / strtofloat(rightstr(edit1.Text,length(edit1.Text)-w)));
'+': edit2.text:= floattostr(strtofloat(LeftStr(edit1.Text,w-1)) + strtofloat(rightstr(edit1.Text,length(edit1.Text)-w)));
'-': edit2.Text:= floattostr(strtofloat(LeftStr(edit1.Text,w-1)) - strtofloat(rightstr(edit1.Text,length(edit1.Text)-w)));
End;
except
On ECONVERTERROR DO BEGIN
end;
end;
end;
end.
Ez így nem is fog menni.
Fordított lengyelformára kell hozni, aztán onnantól kezdve már elég egyszerűen végrehajthatóak a műveletek.
Jól látom, hogy Delphi-ben kéne? Most nincs időm kódolni (meg Delphi-m sincs), este lehet, hogy nekiállok, most csak Erlang kódot tudnék adni, de az nagyon más. Az algoritmus egyébként a következő:
1) Lengyelformára hozod a kifejezést (wikipedián azt hiszem, még az algoritmusa is fent van). Lényegében egy vermet építesz a szövegben szereplő jelekből. Mindig csak egy karaktert nézel, elágazással lehet vizsgálni, hogy értelmezhető-e a jel, és ha igen, mit jelent. Nem kell bele strtofloat, ha szám volt a karakter, számként értelmezed, ha műveleti jel, műveleti jelként.
2) Kiértékeled a lengyelformát. Ez már egyszerű, mindig van két operandusod és egy operátorod, elvégzed a műveletet (ismét csak egy elágazással), és az eredményt berakod az első operandus helyére. Ismétled, amíg nem üres a verem, majd az eredményt kiírod.
lengyelformára is hozhatod, de azt is csinálhatod, hogy szétdarabolod operátorokra/operandusokra, elkezded keresni a szorzást/osztást balról jobbra, ha találsz egyet, elvégzed a két oldalán lévő operandusokkal, és berakod az eredményt a 3 token helyére, mint egy újabb
aztán ez addig megy, míg van szorzás/osztás
akkor jöhet ugyanez összeadás/kivonás és készen vagy
Felesleges hőbörögnöd, ez nem a magyar mentalitás, hanem az "akkor tanul a gyerek, ha csinálja" megoldás. Én is remélem, hogy senki nem fog neked kész kódot linkelni, mert azzal téged foszt meg a gondolkodás terhétől, ami -hiszed vagy sem- rohadtul negatív dolog a számodra. Ha más oldja meg helyetted, akkor mi értelme volt a feladat megoldásának?
G.
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!