Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi String als Rechenzeichen (https://www.delphipraxis.net/151625-string-als-rechenzeichen.html)

SimonRap 25. Mai 2010 19:52


String als Rechenzeichen
 
Hi Leute,
ich habe mal ne komische Frage:
Kann man Strings als Rechenzeichen benutzen?
Also
Delphi-Quellcode:
...
VAR s:STRING; N,n2:INTEGER;
...
s:='*';
n2:=n(s[0])n;
...
versteht ihr was ich meine?
Irgendsowas?
So das dann n*n raus kommt?
Das wär echt praktisch
Meine Suche war bisher erfolglos...
Bitte um schnelle Antwort
MfG Simon

s.h.a.r.k 25. Mai 2010 19:54

Re: String als Rechenzeichen
 
Du musst schon abfragen, um welches Zeichen es sich handelt und das dann selbst machen.

Delphi-Quellcode:
var
  op : Char;
begin
  op := '*';
  if (op = '*') then
    n := n1 * n2
  else if (op = '+') then
    n := n1 + n2
  { usw.}
end;
Du könntest das Ganz auch noch via einer case-Anweisung machen.

Zitat:

Bitte um schnelle Antwort
Wir antworten alle so schnell, wie wir wollen :mrgreen:

SimonRap 25. Mai 2010 19:56

Re: String als Rechenzeichen
 
genau das usw.
is das Problem...
ich hab das nich mit VAR n sondern mit n1,n2,n3,n4,n5,..., bis zu n100
und * und + und - und /
Und das soll alles dynamisch von User kommen können...
da werden das schon paar 100 Zeilen Code

jaenicke 25. Mai 2010 19:57

Re: String als Rechenzeichen
 
Kurz: Nein, geht nicht

Lang: Hört sich so an als suchst du sowas wie Skripting. Sonst bleibt nur eine Fallunterscheidung wie gerade gepostet wurde.

Matze 25. Mai 2010 20:41

Re: String als Rechenzeichen
 
Irgendwas stimmt an deinem Konzept nicht.
Schreibe die Variablen doch in ein Array und gehe es in einer Schleife durch o.ä.

100 einzelne Variablen sind garantiert nicht notwendig.

Delphi-Quellcode:
var
  n: array[1..100] of string;

// bzw
var
  n: array of string;

SetLength(n, 100);

for i := Low(n) to High(n) do
begin
  // ...
end;

SimonRap 25. Mai 2010 21:51

Re: String als Rechenzeichen
 
se geht nich so sehr um die anzahl der variablen, sondern um die rechenoperationen...

Privateer3000 25. Mai 2010 22:04

Re: String als Rechenzeichen
 
Zitat:

Zitat von SimonRap
Hi Leute,
ich habe mal ne komische Frage:
Kann man Strings als Rechenzeichen benutzen?
Also
Delphi-Quellcode:
...
VAR s:STRING; N,n2:INTEGER;
...
s:='*';
n2:=n(s[0])n;
...

Bleibt die Frage, woher soll die Eingabe (String) kommen?
Usereingabe oder fester Ablauf?

SimonRap 25. Mai 2010 22:59

Re: String als Rechenzeichen
 
user (oder random^^)
aber dieser hat nur die wahl zwischen *,+,- und /

SimonRap 25. Mai 2010 23:10

Re: String als Rechenzeichen
 
Ok habs bisschen abgeändert...
Zahlen von 2 bis 5 (4 stück, keine doppelt, jede einmal) sollen mit den 4 Grundrechenarten !beliebig gerechnet werden...
Bis z.B. 18 rauskommt...
Also, da Punkt- vor Strich-Rechnung geht muss man erstmal ermitteln was das is
//nich wundern, der quellcode is verwirrend... liegt daran, dass ich ihn geschrieben habe^^
Delphi-Quellcode:
function stri(char:char):BOOLEAN;
begin
result:=false;
if char='+'then result:=true;
if char='-'then result:=true;
if char='*'then result:=false;
if char='/'then result:=false;
end;
function punk(char:char):BOOLEAN;
begin
result:=false;
if char='+'then result:=false;
if char='-'then result:=false;
if char='*'then result:=true;
if char='/'then result:=true;
end;
dann die möglichkeiten innerhalb einer Rechnung:
Delphi-Quellcode:
function op(VAR c1,c2,c3:CHAR):INTEGER;
begin
result:=0;
if (stri(c1))and (punk(c2))and (stri(c3)) then result:=1;
if (punk(c1))and (punk(c2))and (punk(c3)) then result:=2;
if (stri(c1))and (stri(c2))and (stri(c3)) then result:=3;
if (punk(c1))and (stri(c2))and (punk(c3)) then result:=4;
if (punk(c1))and (punk(c2))and (stri(c3)) then result:=5;
if (stri(c1))and (stri(c2))and (punk(c3)) then result:=6;
end;
und dann als timer im interval 1 abfragen:
Delphi-Quellcode:
VAR n1,n2,n3,n4:INTEGER; c1,c2,c3:CHAR; nc1,nc2,nc3:INTEGER; res:INTEGER; z1,z2,z3,z4,z5,z6:INTEGER;  erg:INTEGER;
begin
  application.ProcessMessages;
  n1:=random(4)+2;
  n2:=random(4)+2;
  n3:=random(4)+2;
  n4:=random(4)+2;
  nc1:=random(3)+1;
  nc2:=random(3)+1;
  nc3:=random(3)+1;
  c1:=itc(nc1);
  c2:=itc(nc2);
  c3:=itc(nc3);
  res:=op(c1,c2,c3);
  if res=4 then  // ausversehen 4 und 1 verstauscht
  begin
    if c1='+' then z1:=n1+n2;
    if c1='-' then z1:=n1-n2;
    if c3='+' then z2:=n3+n4;
    if c3='-' then z2:=n3-n4;
    if c2='*' then erg:=z1*z2;
    if c2='/' then erg:=round(z1*z2);
  end;
  if res=2 then
  begin
    if c1='*' then z1:=n1*n2;
    if c1='/' then z1:=round(n1/n2);
    if c2='*' then z2:=n3*z1;
    if c2='/' then z2:=round(z1/n3);
    if c3='*' then erg:=n4*z2;
    if c3='/' then erg:=round(z2/n4);
  end;
  if res=3 then
  begin
    if c1='+' then z1:=n1+n2;
    if c1='-' then z1:=n1-n2;
    if c2='+' then z2:=n3+z1;
    if c2='-' then z2:=z1-n3;
    if c3='+' then erg:=n4+z2;
    if c3='-' then erg:=z2-n4;
  end;
  if res=1 then
  begin
    if c2='*' then z1:=n2*n3;
    if c2='-' then z1:=round(n2/n3);
    if c1='+' then z2:=n3+z1;
    if c1='-' then z2:=n3-z1;
    if c3='+' then erg:=n4+z2;
    if c3='-' then erg:=z2-n4;
  end;// jetzt müsste es mit res=5 weitergehen, aber das funzt ja schon nich!
  if erg=18 then
  if (n1<>n2) and(n1<>n3) and (n1<>n4) and
     (n2<>n1) and(n2<>n3) and (n2<>n4) and
     (n3<>n1) and(n3<>n2) and (n3<>n4) and
     (n4<>n1) and(n4<>n2) and (n4<>n3) then
  begin
  timer1.Enabled:=false;
  listbox1.Items.Add(inttostr(n1)+' '+inttostr(n2)+' '+inttostr(n3)+' '+inttostr(n4)+' '+c1+' '+c2+' '+c3);
  end;
end;
keine fehler oder so... nur falsch... ich bekomme: 4 2 5 3 + * + (oder auch 4 3 5 2 + * - )<- auch 17
Moment... 2*5=10; 10+4=14; 14+3=17...
Wo ist mein Fehler?
Kann da einer helfen?
mfg simon
p.s. wie immer... nich meckern... so programmier ich nunmal^^
[edit]auf die aufgabe kam ich weil jemand mir das rätsel gestellt hatte^^[/e]

alzaimar 26. Mai 2010 05:52

Re: String als Rechenzeichen
 
Was Du haben willst, ist ein 'Mathe-Parser', oder auch 'Evaluator'. Das ist ein Programm, das mathematische Ausdrücke in Stringform der Art "8+3*(5/2-1)" ausrechnen kann.

Das ist gar nicht so leicht, denn Du musst ja z.B. auch Klammern mitzählen usw. Such mal nach den Begriffen hier im Forum. Da wirst Du ziemlich schnell fündig.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:27 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