Autor |
Beitrag |
noo.bee
      
Beiträge: 120
|
Verfasst: So 13.06.10 16:45
folgende überlegung habe ich:
ich habe in einem memo knapp 1000 zeilen mit zahlen belegt. gegeben werden die variablen a - f durch benutzereingaben in ein edit-feld.
jetzt soll jede memozeile geprüft werden, wie oft in ihr der inhalt des edit-feldes vorkommt
bsp:
memo.lines:
1 4 6 2 8 7 5
2 4 5 7 9
1 3 5
inhalt der edit.felder
feld1 "3"
feld2 "7"
feld3 "1"
alle edit-felder werden nun mit jeder memozeile nacheinander abgeglichen. das ergebnis wäre also:
1. memo.line: 2 (treffer)
2. memo.line: 1 (treffer)
3. memo.line: 2 (treffer)
meine for-in schleife würde dann so aussehen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm2.Button1Click(Sender: TObject); var x1 : Integer; begin
for (a=strtoint(memo1.lines.text)) or (b=strtoint(memo1.lines.text)) or (c=strtoint(memo1.lines.text)) in Memo1.Lines do begin inc(x1);
end; |
warum bekomme ich folgende fehler ?
erwartet: Bezeichner, aber ( erhalten
erwartet: END, aber DO erhalten
erwartet: ., aber ; erhalten <-- das verschwindet, sobald ich das "end;" lösche, welches ich doch aber bei jedem "begin" brauche, oder ?
Zuletzt bearbeitet von noo.bee am So 13.06.10 18:52, insgesamt 1-mal bearbeitet
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: So 13.06.10 16:55
Hi
Delphi-Quelltext 1: 2: 3: 4:
| for (a:=strtoint(memo1.lines.text)) or (b:=strtoint(memo1.lines.text)) or (c:=strtoint(memo1.lines.text)) in Memo1.Lines do begin inc(x1) end; |
erst mal so gesehen
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
Für diesen Beitrag haben gedankt: noo.bee
|
|
noo.bee 
      
Beiträge: 120
|
Verfasst: So 13.06.10 17:04
denk ich grad falsch ? wollte nix zuweisen sonder vergleichen, deshalb nur "=" statt ":="
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: So 13.06.10 17:18
Ich glaube vergleichen macht man mit if
In einer For schleife kanst du links nur was zuweisen also
Delphi-Quelltext 1: 2: 3: 4: 5:
| For a := 1 to 100 do begin if (a = 50) or (a = 70) then exit; end; |
Was anderes habe ich bis jetzt noch nicht gesehen
Ansonsten musst Du ne While schleife nehmen. Dort kanst Du auch vergleichen!
oder
Delphi-Quelltext 1: 2: 3: 4:
| if (a=strtoint(memo1.lines.text)) or (b=strtoint(memo1.lines.text)) or (c=strtoint(memo1.lines.text)) in Memo1.Lines then begin inc(x1); end; |
Gruss ALf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
Für diesen Beitrag haben gedankt: noo.bee
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 13.06.10 18:20
Für diesen Beitrag haben gedankt: noo.bee
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: So 13.06.10 18:34
Sorry @ jaenicke Ich bezog dies auf
Delphi-Quelltext 1:
| for (a=...) or (b=...) |
Hab mich wieder mal blöd ausgedrückt
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
Für diesen Beitrag haben gedankt: noo.bee
|
|
noo.bee 
      
Beiträge: 120
|
Verfasst: So 13.06.10 18:50
Zitat: | man kann so "nur" alle Elemente einer Menge durchgehen, mehr nicht. |
wie lässt sich denn jede zeile durchsuchen und von jeder zeile das ergebnis ausgeben ? oder kann ich memo nur komplett durchsuchen und die gesamtsumme ausgeben lassen ? das wäre natürlich mächtig blöd :/
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 13.06.10 18:55
Die Frage ist vor allem, ob es grundsätzlich einstellige Zahlen sind oder auch mehrstellige vorkommen können.
Denn wenn es nur einstellig sein kann, dann reicht es zeichenweise zu arbeiten.
Für diesen Beitrag haben gedankt: noo.bee
|
|
noo.bee 
      
Beiträge: 120
|
Verfasst: So 13.06.10 19:19
mhhh, es können zahlen von 1-99 vorkommen... also leider auch zweistellig
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 13.06.10 19:55
Dann würde ich bei der geringen Anzahl an Zeilen einfach den trivialen Weg ohne Optimierung gehen und in jeder Zeile mit Pos nach jeder Zahl suchen.
Dabei muss auch beachtet werden, dass in mehrstelligen Zahlen nicht Teile als eine Zahl erkannt werden. Dafür können zum Beispiel die Leerzeichen einbezogen werden.
Für diesen Beitrag haben gedankt: noo.bee
|
|
noo.bee 
      
Beiträge: 120
|
Verfasst: Mo 14.06.10 17:27
ist POS nicht zur berechnung der position eines strings da ? versteh da nicht ganz, wie mir das bei meinem prob helfen soll 
|
|
Tropby
      
Beiträge: 71
Erhaltene Danke: 4
Vista, Win XP, Win 89
Turbo Delphi Ex.
|
Verfasst: Mo 14.06.10 20:29
Du kannst doch so suchen, ob die Zeichen (Zahlen) in der Zeile vorkommen. Wenn Pos größer 0 ist dann kommt er in der Zeile vor.
Delphi-Quelltext 1: 2: 3:
| for i := 0 to Memo.Lines.Count - 1 do if(pos('1', Memo.Lines[I]) > 0)then inc(x); |
Wenn jetzt eine Zahl aber öfters vorkommen kann in einer Zeile dann musst du das auch noch beachten.
_________________ Tropby
Für diesen Beitrag haben gedankt: noo.bee
|
|
noo.bee 
      
Beiträge: 120
|
Verfasst: Mo 14.06.10 21:02
also in den zeilen kommen keine zahlen doppelt vor. aber muss ich jetzt für a, b, c, d, e und f jedesmal
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| var a, b, c, d, e, f, x1 : Integer; var I: array[1..1000] of integer; begin for a := 0 to Memo1.Lines.Count - 1 do if(pos('1', Memo1.Lines[I]) > 0)then inc(x1); end; | schreiben ?
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Mo 14.06.10 21:29
Meine Damen und Herren,
nach langer Zeit mal wieder ein (hoffentlich) sinnvoller Post von mir.
Du deklarierst dir ein Array of Integer.
Dieses ist dynamisch und entspricht der Länge der Zeilen deines Memos.
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: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74:
| var meineTreffer: array of Integer; def_a, def_b, def_c, def_d, def_e, def_f: String; Treffer: Integer; Zeile: String; i: Integer; begin; setlength(meineTreffer, 0); setlength(meineTreffer, meinMemo.Lines.Count);
def_a:= edit_a.text; def_b:= edit_b.text; def_c:= edit_c.text; def_f:= edit_f.text;
Treffer:= 0;
for i:= 0 to meinMemo.Lines.Count-1 do begin Zeile:= meinMemo.Lines[i]; if length(Zeile) <= 0 then begin meineTreffer[i]:= 0; continue; end; if pos(def_a, Zeile) then inc(Treffer);
if pos(def_b, Zeile) then inc(Treffer);
if pos(def_f, Zeile) then inc(Treffer);
meineTreffer[i]:= Treffer; Treffer:= 0; end;
for i:= low(meineTreffer) to high(meineTreffer) do begin meinMemo.lines.clear; meinMemo.lines.add('Zeile ' + inttostr(i+1) + ': ' + IntToStr(meineTreffer[i]) + ' Treffer');
end; end; |
Geschafft. Ausm Kopf. Hoffentlich funktionstüchtig.
Guten Abend.
Stefan
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
Für diesen Beitrag haben gedankt: noo.bee
|
|
noo.bee 
      
Beiträge: 120
|
Verfasst: Mi 16.06.10 18:22
huu, erstmal danke für die hilfe. habs mal durchgeackert. sieht soweit gut aus ausser dass
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| if <span style="color: orange">pos(def_a, Zeile)</span> then inc(Treffer);
if <span style="color: orange">pos(def_b, Zeile)</span> then inc(Treffer);
if <span style="color: orange">pos(def_f, Zeile)</span> then inc(Treffer); |
alle nicht boolean sind
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Mi 16.06.10 18:27
pos() gibt nur den Index des gesuchten Zeichens im String zurück. Du könntest schreiben if pos(...) > 0 then, denn wenn das Zeichen nicht vorkommt, ist pos() null.
Für diesen Beitrag haben gedankt: noo.bee
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Mi 16.06.10 18:27
noo.bee hat folgendes geschrieben : | huu, erstmal danke für die hilfe. habs mal durchgeackert. sieht soweit gut aus ausser dass
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| if <span style="color: orange">pos(def_a, Zeile)</span> then inc(Treffer);
if <span style="color: orange">pos(def_b, Zeile)</span> then inc(Treffer);
if <span style="color: orange">pos(def_f, Zeile)</span> then inc(Treffer); |
alle nicht boolean sind |
Mea maxima culpa!
Natürlich ist die Rückgabe von pos() ein Integer.
Somit musst du prüfen if pos(def_a, zeile) > 0 then
Aber durch Lesen der Hilfe... 
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
Für diesen Beitrag haben gedankt: noo.bee
|
|
noo.bee 
      
Beiträge: 120
|
Verfasst: Mi 16.06.10 20:54
ja passt  habs durch probieren auch hinbekommen mit > 0. aber leider spuckt er mir immer nur die treffer der letzten zeile aus 
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Mi 16.06.10 20:59
Magst du mal bitte deinen Code posten? 
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
Für diesen Beitrag haben gedankt: noo.bee
|
|
noo.bee 
      
Beiträge: 120
|
Verfasst: Mi 16.06.10 21:10
ist eig. dein funktionierender code. hab nur sachen geändert wie die richtigen edits oder memos und sowas
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: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88:
| procedure TForm2.Button1Click(Sender: TObject); var meineTreffer: array of Integer; def_a, def_b, def_c, def_d, def_e, def_f: String; Treffer: Integer; Zeile: String; i: Integer; begin setlength(meineTreffer, 0);
setlength(meineTreffer, Memo1.Lines.Count);
def_a:= edit1.text; def_b:= edit2.text; def_c:= edit3.text; def_d:= edit4.text; def_e:= edit5.text; def_f:= edit6.text;
Treffer:= 0;
for i:= 0 to Memo1.Lines.Count-1 do begin Zeile:= Memo1.Lines[i];
if length(Zeile) <= 0 then begin meineTreffer[i]:= 0; continue; end;
if pos(def_a, Zeile) > 0 then inc(Treffer);
if pos(def_b, Zeile) > 0 then inc(Treffer);
if pos(def_c, Zeile) > 0 then inc(Treffer);
if pos(def_d, Zeile) > 0 then inc(Treffer);
if pos(def_e, Zeile) > 0 then inc(Treffer);
if pos(def_f, Zeile) > 0 then inc(Treffer);
meineTreffer[i]:= Treffer;
Treffer:= 0; end;
for i:= low(meineTreffer) to high(meineTreffer) do begin Memo2.lines.clear; Memo2.lines.add('Zeile ' + inttostr(i+1) + ': ' + IntToStr(meineTreffer[i]) + ' Treffer');
end; end; end. |
|
|
|