Autor Beitrag
DerAlex
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mi 22.03.06 14:28 
Hallo erstmal.
Ich hab ein Problem und da ich nach dem Benutzen der Suchfunktion nichts gefunden habe Poste ich es mal.

Wir müssen für den Informatikunterricht einen Taschenrechner mit Langzahlaritmetik schreiben, welcher Rechnungen mit 2 Zahlen durchfüren soll. Also nur zB:

3234524564563567,2563465367548487*2345634563463456,786785785678

Muss also keine Kommastellen oder sonstiges können.
Die Einzelnen Rechenprozeduren stehen auch schon.
Unser Problem ist jetzt, das wir einen Parser schreiben müssen, der je die einzelnen vorkomma und nachkommerstellen je in einem String Speichert, weil wir die prozeduren so geschrieben haben, das die Vor und Nachkommerstellen aus einem String in eine Liste eingefügt werden.
Ausserdem muss der Parser natürlich auch die Rechenoperation erkennen und die bestimme Prozedur dann ausführen und dann das ergebis wieder ausgeben.

Also die Aufgaben wird zunächst in ein Memofeld eingegeben:
ME_Eingabe

Da Ich nicht genau weiss wie man sich schritt für schritt durch ein Memofeld arbeitet habe ich den Text im Memofeld erstmal einem String zugewiesen und mit der Hilfe einer for to do schleife und einer Zählvar. gehe ich jetzt diesen String durch:
VK = Vorkomma
NK = Nachkomma


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
Var 
Term: String;
VK1,NK1, VK2, NK2: String;{Hier sollen die Werte gespeichert werden}
Count: Integer;
 begin
  Term := Me_Eingabe.Text;
  for count:=1 to Length(Term) do
   begin
    
   end;
 end;



Und jetzt weiss ich nicht, wie ich den String durchsuchen lasse.
Ich wäre echt froh wenn ihr mir helfen könntet oder mir Tips gebt, wie ich das machen kann.

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Mi 22.03.06 14:34 
hey Alex,

ich hatte vor einiger zeit mal einen algo. geschrieben um wörter in einem memofeld zu suchen. vllt kannst du ja damit was anfangen. meine vorgehensweiße: von zeichen zu zeichen überprüfen, ob der text mit dem gesuchtem übereinstimmt ;)
hier der quellcode
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
...
var i, suchwort_laenge: integer;
    suchwort, text: string;
begin
 suchwort := suchwort_edit.Text;  
 suchwort_laenge := length(suchwort);

 for i := 0 to memo1.GetTextLen-1 do
  begin
   text := copy(memo1.Text,i+1,suchwort_laenge); // kopiert den teilstring in "text"
   if text = suchwort then // vergleicht teilstring mit suchwort 
    begin
     ....
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 22.03.06 14:39 
Na also bei zwei Zahlen, da bietet es sich doch an, einfach nach den einzelnen Operatoren mit Pos zu suchen, ich meine es dürfen ja keine weiteren vorkommen und auch Klammern sind ja nicht vorhanden. Da braucht man doch keinen Parser im eigentlichen Sinn.
Und dann muss ja nur noch ggf. beim Komma getrennt werden, welches ja auch per Pos gefunden werden kann.

Kleiner Denkanstoß (Ok, hatte ich vor, jetzt ist es ja fast fertig, aber das ging so schnell, naja, hab ichs halt schnell geschrieben):
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:
38:
39:
40:
41:
42:
43:
// Unter const ein Array mit den Operatoren definieren --> ops

var
  i, tmpPos: Integer;
  Vor_1, Nach_1, Vor_2, Nach_2, Operator: String;
begin
  // Operator suchen
  for i := 0 to High(ops) do
  begin
    tmpPos := Pos(ops[i], Expression);
    if tmpPos > 0 then
      Break;
  end;
  // Operator und die beiden Zahlen holen
  Operator := Copy(Expression, tmpPos, 1);
  Nach_1 := Trim(Copy(Expression, 1, tmpPos - 1));
  Delete(Expression, 1, tmpPos);
  Nach_2 := Trim(Expression);
  // Komma in Zahl 1 suchen
  tmpPos := Pos(',', Nach_1);
  if tmpPos > 0 then
  begin
    Vor_1 := Copy(Nach_1, 1, tmpPos - 1);
    Delete(Nach_1, 1, tmpPos);
  end
  else
  begin
    Vor_1 := Nach_1;
    Nach_1 := '';
  end;
  // Komma in Zahl 2 suchen
  tmpPos := Pos(',', Nach_2);
  if tmpPos > 0 then
  begin
    Vor_2 := Copy(Nach_2, 1, tmpPos - 1);
    Delete(Nach_2, 1, tmpPos);
  end
  else
  begin
    Vor_2 := Nach_2;
    Nach_2 := '';
  end;
end;


Aber wieso macht das ein Problem, wenn alles andere funktioniert? :gruebel:
chaoslion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45


Delphi 2k6 Prof,C,C#,Delphi
BeitragVerfasst: Mi 22.03.06 15:01 
moin!
also weiß nicht ob du es so meinst, aber ich hab da was ähnliches gemacht:

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:
procedure blatext(str:string);
var
  strlen,i,k,j:integer;
  VK,NK,werte:string;
begin
  VK:='';
  NK:='';
  strlen:=length(str);

  //term vor "=" filtern
  i:=1;
  while not ( i=strlen+1 ) and not ( str[i]= '=') do
    begin
      variable:=variable+str[i];
      i:=i+1;
    end;
  //term nach "=" filtern
  k:=i+1;
  while not ( k=strlen+1 ) and not ( str[k]= '(') do
    begin
      befehl:=befehl+str[k];
      k:=k+1;
    end;

  //term nach "(" filtern filtern
  j:=k+1;
  while not ( j=strlen+1 ) and not ( str[j]= ')') do
    begin
      werte:=werte+str[j];
      j:=j+1;
    end;


"test1=machewas(dadada)" <- eingegebene string
er filtert
test1,machewas und dadada raus..
so du kannst du eig auf dein programm mal versuchen anzuwenden..
DerAlex Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mi 22.03.06 23:10 
So danke Jungs.
ihr habt mir sehr geholfen.
brauchte anscheint nur einen kleinen denkanstoss :)

ich stell die tage ma den fertigen rechner rein.
dann könnt ihr schaun wie ich es gemacht hab.
und danke nochmal.