Autor Beitrag
safak67
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Fr 05.06.09 10:14 
Ich soll für mein Taschenrechner ein Parser schreiben(programmieren). Ich habe aber keine Ahnung wie das geht, wenn mir jemand helfen könnte wäre das cool.. Ich bin noch ein Noob was programmieren angeht aber ich muss das machen. wenn einer vllt ein beispiel quelltext hat oder wäre das gut.. der rechner soll z.B 5+4*2+4-3 rechnen können.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19276
Erhaltene Danke: 1741

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 05.06.09 10:25 
Zum Thema Parser gibt es ja schon einige Beiträge. Am besten ist es vermutlich, wenn du einfach erst einmal die Priorität der Rechenzeichen ignorierst. Dann kannst du einfach von vorne nach hinten zeichenweise durchgehen und bei einem Rechenzeichen die letzte Zahl entsprechend auslesen und verrechnen.
Das heißt, wenn du an den Operator kommst, nimmst du die Zahl davor und rechnest damit weiter.

Eins muss ich dazu aber doch noch sagen: Bevor das einen Sinn hat, solltest du deinen bisherigen Quelltext wirklich komplett verstanden haben. Sonst brauchst du gar nicht erst anfangen, dann wird das nur ein Herumraten.
Wenn dir da also etwas noch nicht klar sein sollte (und davon gehe ich nach deinen bisherigen Posts eigentlich sicher aus), dann frag in deinen Threads dazu erst einmal nach und wage dich dann an einen Parser...
zuma
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 660
Erhaltene Danke: 21

Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
BeitragVerfasst: Fr 05.06.09 10:31 
gemeint ist bestimmt, das du die Eingabe '5+4*2+4-3', die du als String bekommst, zerlegst und die einzelnen Zeichen auswertest. Also, was ist eine Zahl, was ein Operator.
Dazu kannst du den String Zeichenweise abklappern und dir dann die Zahlen und die Operatoren daraus in lokalen Variablen merken. wenn du alles 'geparst' hast, brauchst du 'nur' noch mit den Zahlen zu rechnen.
Beispiele für einen Taschenrechner findest du hier sicher genug, wenn du mal die SuFu benutzt.

@Jaenicke: Sicher hast du recht, aber als noob muss er nicht sofort perfekten Code schreiben, eine 'tut erstmal'-Lösung wird ihm mehr helfen, evtl. Freude am Programmieren zu bekommen. Wenn er die erstmal hat, wird er sich auch von alleine tiefer in die Materie 'einwühlen'.

_________________
Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
safak67 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Fr 05.06.09 11:29 
Hi also Beispiele für ein Taschenrechner habe gefunden, aber leider kein Beispiel von einem Parser. Also ich hab schon was zusammengebau aber der ist nicht ganz vollständig und fehlerhaft..
ffgorcky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: Fr 05.06.09 18:34 
Also ich denke, dass das Ganze für eine einfache, einzeilige Aufgabe doch in etwa so gehen müsste:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
function IsInt(Check: String): Boolean;  
begin  
 try  
  StrToInt(Check);  
  Result := True;  
 except  
  Result := False;  
 end;  
end;  

function endwertLinearBerechnen(Rechenaufgabe:String):Integer;
var momentaneZahl:string;
    ersterWert:bool;
    rechenArt, momentanerWert, vorherigerWert:Integer;//bei der rechenArt wäre dann 0=minus, 1=plus, 2=mal, 3=durch
begin
ersterWert:=true;
zahl1:=0;
for i:=0 to Length(Rechenaufgabe)-1 do
   begin
   if isInt(Rechenaufgabe[i]) then
      if ersterWert{=true} then //also wenn es der erste Wert ist:
          momentaneZahl:=momentaneZahl+Rechenaufgabe[i];
   else 
      begin            
      vorherigerWert:=momentanerWert;
      momentanerWert:=StrToInt(momentaneZahl);
      momentaneZahl:='';
      case Rechenaufgabe[i] of
         '/'{für durch}:rechenArt:=3
         'x'{für mal}:rechenArt:=2
         '+'{selbstredend}:rechenArt:=1
         '-'{selbstredend}:rechenArt:=0
      end//der Case-Anweisung
      ersterWert:=false;
      end;
   end;
end;

Wobei da ja immer die Frage ist, ob Du linear rechnen willst oder Punkt-vor-Strichrechnung beachten möchtest, was mit meinem Ansatz so (noch?) nicht geht...
...und Kommas kennt der auch noch nicht!

Ist aber noch in Bearbeitung! - Muss nur jetzt erst mal essen gehen!
- oder hilft Dir das schon weiter?

Ach vergiss meine Möglichkeit hier am besten wieder ganz!
Ich steige da im Moment leider nach meinem Abendbrot selber schon nicht mehr durch!
- Was natürlich auch an meinem am 23.7.2006 (durch Motorradunfall) abhanden gekommenden Kurzzeitgedächtnis liegen kann!...


Zuletzt bearbeitet von ffgorcky am Fr 05.06.09 19:39, insgesamt 2-mal bearbeitet
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Fr 05.06.09 18:46 
Ohne Punkt-Vor-Strich-Rechnung ist das doch sinnlos. Ein Parser, der die Grundrechenarten beherrscht, ist nicht trivial. Ich hätte mir sowas als Anfänger nicht zugetraut.

_________________
Na denn, dann. Bis dann, denn.
ffgorcky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: Fr 05.06.09 19:54 
Ich habe mir zwar das Thema 92686 noch nicht durchgelesen, aber der Titel klingt doch recht vielversprechend!
Tropby
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 71
Erhaltene Danke: 4

Vista, Win XP, Win 89
Turbo Delphi Ex.
BeitragVerfasst: Fr 05.06.09 19:58 
safak67 ist in beiden Themen der ersteller. Also denke ich, dass das andere Thema nicht die Lösung bietet.


EDIT:
Ich habe hier irgendwo einen Praser für soetwas liegen. Er ist zwar aus den anfängen meiner Programmierung aber er geht (so einiger maßen). Wenn ich den finde o.O dann kann ich den vielleicht nachher mal hochladen... Nur selber machen solltest du das ja schon ^^

_________________
Tropby
Jakob_Ullmann
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: Fr 05.06.09 20:13 
Ein Beispiel für nen Parser gibt's hier: delphi.zsg-rottenburg.de/parser.html. Ist auch alles schön erklärt. Ich bin mir allerdings nicht sicher, ob Rekursion für nen Anfänger das richtige Thema ist...
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19276
Erhaltene Danke: 1741

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 06.06.09 00:27 
Da das hier noch nicht verlinkt ist, hier gibts u.a. auch noch nen (langen) Crosspost zu dem Taschenrechner, da gehts mittlerweile um ein ähnliches Thema:
www.delphipraxis.net/topic159067.html
ffgorcky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: Sa 06.06.09 09:08 
Da wird wohl bei beiden user profile iconsafak67 der gleiche Ersteller sein.
Solch ein Name fiele mir zumindest nicht so schnell ein...

Es wäre also schön, wenn er auf das Thema als Crosspost verwiesen hätte!