Problem mit Arrayauffüllung

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
beumyz
Beiträge: 2
Registriert: Do 1. Jan 2015, 16:27

Problem mit Arrayauffüllung

Beitrag von beumyz »

Moin zusammen,

bei mir kommt es momentan zu einem Problem, das das Füllen eines Arrays betrifft. Ich schreibe eine ganz einfache Funktion, die Klammern ausmultiplizieren soll. Für '(3+2)*(1+4)' sollte sie also '3*1+3*4+2*1+2*4' ausgeben. In diesem Rahmen möchte ich gerne die einzelnen Summanden in ein Array schreiben. Dazu hab ich mir schon einen Klammerausdruck gegriffen, ihn im String l gespeichert und die äußere Klammer entfernt. Dann habe ich beispielsweise '3+2'. Ein Array suml aus Strings mit der richtigen Länge ist schon vorbereitet. Jetzt will ich die Summanden auch tatsächlich in dieses Array schreiben und dabei natürlich auch deren Vorzeichen mitnehmen, das aus der Operation + oder - davor resultiert. Mit den Integers i,posm,posp,pos und einem String w habe ich mir folgendes überlegt:

Code: Alles auswählen

//Summanden in Array schreiben
      for i:=0 to length(suml)-1 do
      begin
        posp:=AnsiPos('+',l);
        posm:=AnsiPos('-',l);
        if ((posp<posm) and (posp>0)) or (posm=0) then pos:=posp else pos:=posm; //erstes Plus oder Minus finden
        w:=AnsiLeftStr(l,pos-1);
        if pos=posm then w:='-'+w; //sofern negativ, Vorzeichen ergänzen
        suml[i]:=w;
        //bearbeiteten Teil abschneiden
        l:=AnsiRightStr(l,length(l)-pos);
      end;
Das klappt auch fast wunderbar - nur das der jeweils letzte Summand jeder Klammer wegfällt (ein leerer String '' wird). Daher meine Frage: Findet jemand den Grund oder weiß das Problem anders zu lösen?
Frohes Neues
beumyz

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Problem mit Arrayauffüllung

Beitrag von Michl »

Über welche möglichen Kombinationen sprichst Du?!

(3+2)*(1+4)
(-3+2)*(1+4)
(3-2)*(1+4)
(-3+2)*(1-4)
(-0.123+2.3)*(1.23-4.321)
2*(1+4)
(3+2-1)*(1+4)
etc.?!

Evtl. denke ich auch zu kompliziert, doch würde ich versuchen zuerst die einzelnen Klammerausdrücke herauszusuchen (wenn ich Dich richtig verstanden habe, machst Du das bereits) und im nächsten Schritt die Zahlen. Mit Zahl meine ich dann mit Vorzeichen z.B. würde aus "(-3+2)" ein Array of Integer (oder String oder Double...) die Werte "-3", "+2" enthalten oder "(1-4)" die Werte "+1", "-4". Danach würde ich diese wieder zusammensetzen.

PS: Ich rätsel ja gern, doch günstig ist bei so einer Fragestellung ein Minimalbsp. (am besten per Zip) beizufügen, da die meisten hier wahrscheinlich keine größere Lust haben, für die geposteten Codezeilen ein Bsp. zu erstellen.
PS2: Herzlich willkommen im Forum!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1627
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Problem mit Arrayauffüllung

Beitrag von corpsman »

Also wenn du Formeln ausrechnen willst, nimm doch meinen GenMathCalc
In Kombination mit dem Tokenizer hast du in wenigen Zeilen Code einen Mathe Solver ;).
--
Just try it

beumyz
Beiträge: 2
Registriert: Do 1. Jan 2015, 16:27

Re: Problem mit Arrayauffüllung

Beitrag von beumyz »

Hat sich mittlerweile schon von selbst geklärt. Der Fehler war, keine Fallunterscheidung für den Fall pos=0 durchzuführen; trotzdem danke. Die Linktipps schau ich mir mal an.

Antworten