Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Punkt vor Strich? (https://www.delphipraxis.net/8015-punkt-vor-strich.html)

Die Muhkuh 27. Aug 2003 07:58


Punkt vor Strich?
 
Ich hab nen Rechner programmiert der mit 2 bis 5 Zahlen rechnet allerding so wie man es ihm sagt also 5+4*2-5=13 eigentlich müsste ja 8 rauskommen.

Im Klarext wie kann ich dem Rechner "beibringen" das er Punkt vor Strich rechnet?

greetz

Spider

Illuminator-23-5 27. Aug 2003 08:03

Re: Punkt vor Strich?
 
du könntest von vorne bis hinten alles durchgehen und alle multiplikationen/divisionen erledigen und erst in einem 2. Schritt addition/subtraktion
5+4*2-5=
5+8-5=
8

Die Muhkuh 27. Aug 2003 18:22

Re: Punkt vor Strich?
 
Ähm ja schön, nur wie geht das??? Hast du nen Beispiel Code?

Illuminator-23-5 27. Aug 2003 18:31

Re: Punkt vor Strich?
 
wie speicherst du die rechnung? ich könnt dann im fall schnell was schreiben

Die Muhkuh 27. Aug 2003 18:52

Re: Punkt vor Strich?
 
Also hier ist der !!!gesamte!!! Code:
Delphi-Quellcode:
var
  Rechnen: TRechnen;
  a, b, c, d, e, f, g, z1, z2, z3, er : Extended;

implementation

uses Unit1, Unit2, Unit4, Unit5, Unit6, Unit7, shellapi;

{$R *.DFM}

procedure TRechnen.Button5Click(Sender: TObject);
begin
 
  if Combobox5.itemindex = 0 then
    begin
      a := strtofloat (Edit1.text);
      b := strtofloat (Edit2.text);

        case Combobox1.itemindex of
          0: er := a + b;
          1: er := a - b;
          2: er := a * b;
          3: er := a / b;
        end;
      Panel1.caption := floattostr (er);
    end;

  if Combobox5.itemindex = 1 then
    begin
      a := strtofloat (Edit1.text);
      b := strtofloat (edit2.text);
      c := strtofloat (Edit3.text);

        case Combobox1.ItemIndex of
          0: z1 := a + b;
          1: z1 := a - b;
          2: z1 := a * b;
          3: z1 := a / b;
        end;

        case combobox2.itemindex of
          0: er := z1 + c;
          1: er := z1 - c;
          2: er := z1 * c;
          3: er := z1 / c;
        end;
      Panel1.caption := floattostr (er);
     end;

    if Combobox5.itemindex = 2 then
      begin
        a := strtofloat (Edit1.text);
        b := strtofloat (Edit2.text);
        c := strtofloat (Edit3.text);
        d := strtofloat (Edit4.text);

          case Combobox1.itemindex of
            0: z1 := a + b;
            1: z1 := a - b;
            2: z1 := a * b;
            3: z1 := a / b;
          end;

          case combobox2.itemindex of
            0: z2 := z1 + c;
            1: z2 := z1 - c;
            2: z2 := z1 * c;
            3: z2 := z1 / c;
          end;

          case Combobox3.ItemIndex of
            0 : er := z2 + d;
            1 : er := z2 - d;
            2 : er := z2 * d;
            3 : er := z2 / d;
          end;
        Panel1.caption := floattostr (er);
      end;

    if Combobox5.itemindex = 3 then
      begin
         a := strtofloat (Edit1.text);
         b := strtofloat (Edit2.text);
         c := strtofloat (Edit3.text);
         d := strtofloat (Edit4.text);
         e := strtofloat (Edit5.text);

           case Combobox1.itemindex of
             0: z1 := a + b;
             1: z1 := a - b;
             2: z1 := a * b;
             3: z1 := a / b;
           end;

           case combobox2.itemindex of
             0: z2 := z1 + c;
             1: z2 := z1 - c;
             2: z2 := z1 * c;
             3: z2 := z1 / c;
           end;

           case Combobox3.ItemIndex of
             0 : z3 := z2 + d;
             1 : z3 := z2 - d;
             2 : z3 := z2 * d;
             3 : z3 := z2 / d;
           end;

           case Combobox3.ItemIndex of
             0 : er := z3 + d;
             1 : er := z3 - d;
             2 : er := z3 * d;
             3 : er := z3 / d;
           end;
         Panel1.caption := floattostr (er);
      end;

    if Combobox5.itemindex = 4 then
      begin
        f := strtofloat (Edit1.text);

        er := Sqr(f);
        Panel1.caption := floattostr (er);
      end;
    if Combobox5.ItemIndex = 5 then
      begin
        g := strtofloat (Edit1.text);

        er:= Sqrt(g) ;
        Panel1.caption := floattostr (er);
      end;
end;

procedure TRechnen.ComboBox5Change(Sender: TObject);
begin
  if Combobox5.ItemIndex = 0 then
    begin
      Edit1.visible := true;
      Edit2.visible := true;
      Edit3.visible := false;
      Edit4.visible := false;
      Edit5.visible := false;
      Edit1.text := '';
      Edit2.text := '';
      Edit3.text := '';
      Edit4.text := '';
      Edit5.text := '';

      Combobox1.visible := true;
      Combobox2.visible := false;
      combobox3.visible := false;
      Combobox4.visible := false;
      Combobox1.Text := '';
      Combobox2.Text := '';
      Combobox3.Text := '';
      Combobox4.Text := '';
      Combobox5.Text := '';

      Panel1.Caption := '';
     end;

  if Combobox5.itemindex = 1 then
    begin
      Edit1.visible := true;
      Edit2.visible := true;
      Edit3.visible := true;
      Edit4.visible := false;
      Edit5.visible := false;
      Edit1.text := '';
      Edit2.text := '';
      Edit3.text := '';
      Edit4.text := '';
      Edit5.text := '';

      Combobox1.visible := true;
      Combobox2.visible := true;
      combobox3.visible := false;
      Combobox4.visible := false;
      Combobox1.Text := '';
      Combobox2.Text := '';
      Combobox3.Text := '';
      Combobox4.Text := '';
      Combobox5.Text := '';

      Panel1.Caption := '';
    end;

  if Combobox5.itemindex = 2 then
    begin
      Edit1.visible := true;
      Edit2.visible := true;
      Edit3.visible := true;
      Edit4.visible := true;
      Edit5.visible := false;
      Edit1.text := '';
      Edit2.text := '';
      Edit3.text := '';
      Edit4.text := '';
      Edit5.text := '';

      Combobox1.visible := true;
      Combobox2.visible := true;
      combobox3.visible := true;
      Combobox4.visible := false;
      Combobox1.Text := '';
      Combobox2.Text := '';
      Combobox3.Text := '';
      Combobox4.Text := '';
      Combobox5.Text := '';

      Panel1.Caption := '';
    end;

   if Combobox5.itemindex = 3 then
     begin
       Edit1.visible := true;
       Edit2.visible := true;
       Edit3.visible := true;
       Edit4.visible := true;
       Edit5.visible := true;
       Edit1.text := '';
       Edit2.text := '';
       Edit3.text := '';
       Edit4.text := '';
       Edit5.text := '';

       Combobox1.visible := true;
       Combobox2.visible := true;
       combobox3.visible := true;
       Combobox4.visible := true;
       Combobox1.Text := '';
       Combobox2.Text := '';
       Combobox3.Text := '';
       Combobox4.Text := '';
       Combobox5.Text := '';

       Panel1.Caption := '';
     end;

   if Combobox5.itemindex = 4 then
     begin
       Edit1.visible := true;
       Edit2.visible := false;
       Edit3.visible := false;
       Edit4.visible := false;
       Edit5.visible := false;
       Edit1.text := '';
       Edit2.text := '';
       Edit3.text := '';
       Edit4.text := '';
       Edit5.text := '';

       Combobox1.visible := false;
       Combobox2.visible := false;
       combobox3.visible := false;
       Combobox4.visible := false;
       Combobox1.Text := '';
       Combobox2.Text := '';
       Combobox3.Text := '';
       Combobox4.Text := '';
       Combobox5.Text := '';

       Panel1.Caption := '';
     end;

   if Combobox5.itemindex = 5 then
     begin
       Edit1.visible := true;
       Edit2.visible := false;
       Edit3.visible := false;
       Edit4.visible := false;
       Edit5.visible := false;
       Edit1.text := '';
       Edit2.text := '';
       Edit3.text := '';
       Edit4.text := '';
       Edit5.text := '';

       Combobox1.visible := false;
       Combobox2.visible := false;
       combobox3.visible := false;
       Combobox4.visible := false;
       Combobox1.Text := '';
       Combobox2.Text := '';
       Combobox3.Text := '';
       Combobox4.Text := '';
       Combobox5.Text := '';

       Panel1.Caption := '';
     end;
end;
Das ist der doch nicht ganz gesamte Code(Der gesamte ist 850 Zeilen lang!) Wahrscheinlich hätte man einiges Verbessern können so weit bin ich nocht net!

alcaeus 27. Aug 2003 18:52

Re: Punkt vor Strich?
 
Hier einige Ansätze:
1. suche ein Punkt-Zeichen. Kopiere die Zahlen vom Zeichen davor bis zum Zeichen danach raus. Speicher aber Position und Länge des ursprünglichen Strings, es wird nützlich sein
2. Löse diese (einfache) Rechnung
3. Setze das Ergebnis anstatt des Ausdrucks wieder ein:
Delphi-Quellcode:
Delete(Rechnung, Start, Laenge);
Insert(Rechnung, Start,ZwErgebnis);
4. Wiederhole das ganze bis kein Punktzeichen mehr da ist
5. Rechne alle Strichrechnungen nach deinem Muster aus.

Das sollte helfen, wenn nicht, lass dir von Illu den code schreiben :wink:

Hansa 27. Aug 2003 18:54

Re: Punkt vor Strich?
 
Wie wäre es mit einer einfachen Klammerung :?:

Die Muhkuh 27. Aug 2003 18:54

Re: Punkt vor Strich?
 
Zitat:

Zitat von alcaeus
Hier einige Ansätze:
1. suche ein Punkt-Zeichen. Kopiere die Zahlen vom Zeichen davor bis zum Zeichen danach raus. Speicher aber Position und Länge des ursprünglichen Strings, es wird nützlich sein
2. Löse diese (einfache) Rechnung
3. Setze das Ergebnis anstatt des Ausdrucks wieder ein:
Delphi-Quellcode:
Delete(Rechnung, Start, Laenge);
Insert(Rechnung, Start,ZwErgebnis);
4. Wiederhole das ganze bis kein Punktzeichen mehr da ist
5. Rechne alle Strichrechnungen nach deinem Muster aus.

Das sollte helfen, wenn nicht, lass dir von Illu den code schreiben :wink:

Ich versteh nur Bahnhof!
Ich prgrammier erst seit nem Jahr mit viertel Jaht pause!

Die Muhkuh 27. Aug 2003 19:00

Re: Punkt vor Strich?
 
PS: Fallse jemand das Programm möchte dann kann er es sich unter www.mani007.de downloaden!

Hansa 27. Aug 2003 19:12

Re: Punkt vor Strich?
 
Mein Vorschlag ist doch etwas zu knapp: Ich meine den String um die Klammern zu erweitern und den dann auszuwerten. Das ganze läuft sowieso auf String-Manipulation hinaus. Das würde ich in Prozeduren aufteilen, dann sofern eine "(" kommt solange lesen bis ")" kommt. Den Ausdruck auswerten usw.

Illuminator-23-5 27. Aug 2003 19:30

Re: Punkt vor Strich?
 
ich glaub, du machst das ganze ein bisschenzu ungeschickt!
versuchs doch, wie beim normalen Windows-rechner zu machen, ein edit, und du rechnest immer gleich das zwischenergebnis aus!

Die Muhkuh 27. Aug 2003 20:10

Re: Punkt vor Strich?
 
@ Illu

kann auch sein!
Setzt mich mal dran und probiers mal aus das mit dem Windows Rechner! (Das ich da nicht selbst drauf gekommen bin!) :angle2:

moin339 27. Aug 2003 20:51

Re: Punkt vor Strich?
 
Moin!

Bei langen Rechnungen wäre es aber besser wenn man die ganze Rechnung is edit-Feld eintippen kann und dann erst auf "gleich" drückt. Man kann dann Tippfehler besser korigieren. Die besseren elektronischen Taschenrechner (also wirkliche Taschenrechner, keine PC-Programme) machen das ja auch so.

Die Muhkuh 27. Aug 2003 21:04

Re: Punkt vor Strich?
 
Na das mit dem WindowsRechner will net.

Hat jemand mal ein Beispiel code?

moin339 27. Aug 2003 21:08

Re: Punkt vor Strich?
 
Probier das ganze mal so wie Illuminator das gesagt hat:

Zitat:

Zitat von Illuminator-23-5
du könntest von vorne bis hinten alles durchgehen und alle multiplikationen/divisionen erledigen und erst in einem 2. Schritt addition/subtraktion
5+4*2-5=
5+8-5=
8

Wo ist denn genau dein Problem? Oder sollen wir den Taschenrechner schreiben ;-)

ciao, moin339 :coder:

Daniel B 27. Aug 2003 21:19

Re: Punkt vor Strich?
 
@Spider,

Bitte poste das nächste mal solch lange Prozeduren, bzw. Code-Schnippsel als Unit oder als TextFile, dann muss man nicht so arg lange Scrollen. Danke!

Die Muhkuh 28. Aug 2003 07:08

Re: Punkt vor Strich?
 
@Daniel B

werd ich machen!

@all

Ja ich komm nun trotdem nicht weiter. Hat den niemand nen Beispiel code für mich?

Illuminator-23-5 28. Aug 2003 17:45

Re: Punkt vor Strich?
 
ich hab hier mal was zusammengebastelt
Delphi-Quellcode:
function min(a, b: integer): integer;
begin
  case a>b of
    true: result := b;
    false: result := a;
  end;
end;

function max(a, b: integer): integer;
begin
  case a<b of
    true: result := b;
    false: result := a;
  end;
end;

function allAway(Rch: string): string;
var
  b, e, i: integer;
begin
  Rch := ' ' + rch + ' ';
  while max(pos('*', rch), pos('/', rch)) > 0 do begin
    i := min(pos('*', rch), pos('/', rch));
    if pos('*', rch) = 0 then
      i := pos('/', rch);
    if pos('/', rch) = 0 then
      i := pos('*', rch);
    b := i-1;
    e := i+1;
    while rch[b-1] in ['0'..'9'] do dec(b);
    while rch[e+1] in ['0'..'9'] do inc(e);
    if rch[i] in ['*', '/'] then begin
      case Rch[i] of
        '*': insert(IntToStr(StrToInt(copy(rch, b, i - b)) *  StrToInt(copy(rch, i + 1, e - i))), rch, e+1);
        '/': insert(IntToStr(StrToInt(copy(rch, b, i - b)) div StrToInt(copy(rch, i + 1, e - i))), rch, e+1);
      end;
      delete(rch, b, e - b + 1);
    end;
  end;
  result := copy(rch, 2, length(rch) - 2);
end;

Luckie 29. Aug 2003 15:59

Re: Punkt vor Strich?
 
Such mal nach Bei Google suchendelphi formelparser.

kasi 29. Aug 2003 18:44

Re: Punkt vor Strich?
 
Unter http://www.programmersheaven.com/zone2/cat265/2125.htm gibt es eine Komponente die das alles schon macht!
Sind nur 700 Zeilen Code und auch gut dazu geeignet, um zu lernen wie man das macht.

KASI

overmoon 29. Aug 2003 21:45

Re: Punkt vor Strich?
 
Ich habe im Laufe des Info-LKs auch einen Rechner programmiert.
Die Punkt-Vor-Strich-Rechnung habe ich implementiert, indem das Programm "Punkt-Vor-Strich-Klammern" gesetzt hat.

Man muss einfach den String nach '*' durchsuchen und von denen in beide Richtungen suchen wann ein '+' oder '-'. Aber aufpassen mit Klammern die noch auftreten; ab in den Keller mit ihnen (->Kellerautomat).

Aus 2+2*2 wird dann 2+(2*2)
Aus 2+(2+2)*2 wird 2+((2+2)*2)

Ich könnte die Funktion posten, aber ich will dir ja nicht die ganze Arbeit abnehmen... :wink:


Naja, letztlich ist es eigentlich ganz einfach, wenn man sich mal an ein paar Beispielen überlegt hat, wo die Klammern hinmüssen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz