Autor |
Beitrag |
newbie333
      
Beiträge: 43
|
Verfasst: Sa 20.06.09 10:55
Hallo,
bin noch ziemlich unerfahren beim Programmieren. Wir lernen Delphi in der Schule und
sollen nun ein Programm programmieren, welches die Teiler einer Zahl in einem Memofeld ausgeben kann. Leider weiß ich nicht, wie man den "Text" in einem Memofeld verändern kann.
Deshalb hab ichs mit einem Editfeld gemacht:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TForm1.Button1Click(Sender: TObject); var n, rechnung: integer; begin n := strtoint(edit1.text); rechnung := 1; while n mod rechnung = 0 do begin
edit2.text := inttostr(rechnung); rechnung := rechnung +1; end;
end; end. |
Klar ist, dass das Programm so höchstens die 1 als Teiler ausgibt und nicht alle Zahlen.
Wie würde das mit einem Memofeld funktionieren?
Danke schonmal.
Moderiert von Gausi: Delphi-Tags hinzugefügt
|
|
newbie333 
      
Beiträge: 43
|
Verfasst: Sa 20.06.09 11:56
Ok, ich weiß jetzt wie das mit dem memofeld funktioniert, aber das Programm geht leider immer noch nicht..
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm1.Button1Click(Sender: TObject); var n, rechnung: integer; begin n := strtoint(edit1.text); rechnung := 1; while n mod rechnung = 0 do begin
Memo1.Lines[0] := inttostr(rechnung); rechnung := rechnung +1; Memo1.lines[1]:=inttostr(rechnung); end;
end; end. |
wenn ich für n 6 eingebe, kommt 6 und 6 raus bei 7 kommt 7 und 7 raus usw.
weiß jemand wo der Fehler liegt?
Und wenn ich jetzt noch mehr als 2 Teiler rausfinden will, nämlich alle, wie mach ich das dann?
Danke!
Moderiert von Gausi: Delphi-Tags hinzugefügt
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Sa 20.06.09 11:57
ich würde an die Aufgabe ein bisschen anders herangehen als du:
Pseudocode:
Quelltext 1: 2: 3: 4:
| für Alle Zeilen im Memofeld mache
wenn Zahl mod MöglicherTeiler = 0 dann Teilerliste.Add(MöglicherTeiler) |
Wenn du alle Zeilen eines Memos abklappern willst, kannst du so auf sie zugreifen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| var i : Integer; begin for i := 0 to Memo1.Lines.Count - 1 do Memo1.Lines[i] := 'Hallo'; end; |
|
|
newbie333 
      
Beiträge: 43
|
Verfasst: Sa 20.06.09 12:14
Den zweiten Teil hab ich verstanden, aber was ist das mit Teilerliste.Add(MöglicherTeiler)?
--- Moderiert von Narses: Beiträge zusammengefasst---
hab das nun so verstanden:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.Button1Click(Sender: TObject); var n, MoeglicherTeiler, i: integer; begin n := strtoint(edit1.text); MoeglicherTeiler:=1; if n mod MoeglicherTeiler = 0 then for i := 0 to Teilerliste.Lines.Count - 1 do Teilerliste.Lines[i] := inttostr(MoeglicherTeiler); n:=n-1;
end; end. |
kommt aber wieder nur die 1 raus
Moderiert von Gausi: Delphi-Tags hinzugefügt
|
|
bole
      
Beiträge: 107
Erhaltene Danke: 15
win 10
|
Verfasst: Sa 20.06.09 17:32
Hallo Newbee
So wie Ich Dein Problem verstanden habe soll dein Programm alle möglichen ganzzahligen Teiler der Zahl im Edit Feld ins Memo Feld schreiben. Wenn ich dein Problem richtig verstanden habe ist der Preudocode von nicht wirklich korrekt.
Meiner Meinung nach müsste es heissen
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| Zahl aus Edit lesen Teiler auf 1 initalisieren (Division durch 0 erzeugt einen Fehler)
Für jeden Teiler kleiner der Zahl mache (Schleifenanfang) Ist Zahl MOD Teiler = 0 dann Teiler ins Memo schreiben Teiler erhöhen (Schleifenende) |
Ich hoffe ich habe Dich richtig verstanden und der Pseudocode hilft Dir Weiter.
Gruss
Reto
_________________ ein programm macht nicht das was du willst sondern was du schreibst!
|
|
newbie333 
      
Beiträge: 43
|
Verfasst: Sa 20.06.09 21:20
Ok, für den ersten Teiler klappt das nun einwandfrei.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.Button1Click(Sender: TObject); var n, Teiler: integer; begin n := strtoint(edit1.text); Teiler:=1; while Teiler < n do begin if n mod teiler = 0 then Memo1.lines[0]:= inttostr(Teiler); Teiler:= Teiler+1; end; |
wie mache ich das mit den restlichen?
Danke!
Moderiert von Gausi: Delphi-Tags hinzugefügt
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Sa 20.06.09 21:36
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.Button1Click(Sender: TObject); var n, Teiler: integer; begin n := strtoint(edit1.text); Teiler:=1; while Teiler < n do begin if n mod teiler = 0 then Memo1.lines[0]:= inttostr(Teiler); Memo1.Lines.Add(IntToStr(Teiler)); Teiler:= Teiler+1; end; |
|
|
newbie333 
      
Beiträge: 43
|
Verfasst: So 21.06.09 11:45
Das funktioniert nun schon besser, hat aber immer noch Fehler..
Zum Einen bleibt ganz oben im Memofeld der Name des Memofeldes stehen
und zum Anderen bleiben die Zahlen vom vorherigen Teiler auch noch stehen..
ich habs versucht mit Memo1.lines.clear aber dann werden überhaupt keine Zahlen mehr ausgegeben..
Weiß jemand wie man den Fehler beheben kann?
der aktuelle Quelltext ist nun so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.Button1Click(Sender: TObject); var n, Teiler: integer; begin n := strtoint(edit1.text); Teiler:=1; while Teiler < n do begin if n mod teiler = 0 then Memo1.Lines.Add(IntToStr(Teiler)); Teiler:= Teiler+1; end; |
Danke für die Hilfe.
Moderiert von Gausi: Delphi-Tags hinzugefügt
Einloggen, um Attachments anzusehen!
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: So 21.06.09 13:25
Memo1.lines.clear ist schon richtig - wo hast du es denn hingeschrieben?
|
|
newbie333 
      
Beiträge: 43
|
Verfasst: So 21.06.09 14:29
Ja, da liegt glaub ich auch das Problem..
Delphi-Quelltext 1: 2: 3:
| Teiler:= Teiler+1; end; Memo1.lines.clear; |
hier hatte ichs..
Moderiert von Narses: Delphi-Tags hinzugefügt
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: So 21.06.09 14:35
Das ist natürlich nur bedingt sinnvoll, das memo zu leeren, nachdem du das interessante reingeschrieben hast - mehr Sinn macht es, wenn du das Memo löscht bevor du deine Teiler reinschreibst 
|
|
newbie333 
      
Beiträge: 43
|
Verfasst: So 21.06.09 14:48
Okay, ergibt Sinn
Funktioniert auch, aber irgendwie kommen bei 8 folgende Teiler raus:
4,5,6,7
bei 3: 1,2
was ist denn dieses mal noch falsch?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.Button1Click(Sender: TObject); var n, Teiler: integer; begin n := strtoint(edit1.text); Teiler:=1; while Teiler < n do begin if n mod teiler = 0 then Memo1.Lines.Clear; Memo1.Lines.Add(IntToStr(Teiler)); Teiler:= Teiler+1; end; |
Moderiert von Gausi: Delphi-Tags hinzugefügt
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: So 21.06.09 15:20
Logisch. Mal ein paar Dinge, von denen ich glaube, dass du sie noch nicht verstanden hast.
Memo1.Lines ist -- einfach gesagt -- der Inhalt des Memos (als StringListe). Jede Zeile ist ein String für sich. Das heißt also bei:
Quelltext
gilt:
Delphi-Quelltext 1: 2: 3:
| Memo1.Lines[0] = 'hallo'; Memo1.Lines[1] = 'welt'; Memo1.Lines[2] = '12345'; |
(analog dazu gilt auch: StrToInt(Memo1.Lines[2]) = 12345;)
Memo1.Lines.Clear löscht alle Zeilen!
Memo1.Lines.Add('das ist ein string'); fügt die Zeile das ist ein string hinten dazu (als letzte Zeile).
Delphi-Quelltext 1: 2: 3:
| if bedingung then tue1; tue2; |
heißt (unabhängig davon, wie weit tue2 eingerückt ist):
Quelltext 1: 2: 3: 4:
| falls bedingung wahr ist: führe nur dann tue1 aus;
führe unabhängig von bedingung tue2 aus; |
dagegen:
Delphi-Quelltext 1: 2: 3: 4: 5:
| if bedingung then begin tue1; tue2; end; |
bedeutet:
Quelltext 1: 2: 3:
| falls bedingung wahr ist: führe nur dann tue1 aus; führe auch nur dann tue2 aus; |
Und jetzt, warum ich dir das sage:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.Button1Click(Sender: TObject); var n, Teiler: integer; begin n := strtoint(edit1.text); Teiler:=1; while Teiler < n do begin if n mod teiler = 0 then Memo1.Lines.Clear; Memo1.Lines.Add(IntToStr(Teiler)); Teiler:= Teiler+1; end; |
Merkst du was?? Wenn ein Teiler gefunden wurde, wird die Liste gelöscht. Und es werden alle Werte von 1 bis n der Liste hinzugefügt. Das erklärt auch deine Ausgaben. Hast du eine Idee, wo das Memo1.Lines.Clear hin muss?
Und bitte rücke deinen Code ein. Das verschafft auch oft Klarheit:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.Button1Click(Sender: TObject); var n, Teiler: integer; begin n := strtoint(edit1.text); Teiler:=1; while Teiler < n do begin if n mod teiler = 0 then Memo1.Lines.Clear; Memo1.Lines.Add(IntToStr(Teiler)); Teiler:= Teiler+1; end; |
Da wird es auch offensichtlich.
edit: Im Übrigen eignet sich eine for-Schleife hier besser.
|
|
newbie333 
      
Beiträge: 43
|
Verfasst: So 21.06.09 15:35
tut mir leid, ich verstehs nicht..
müsste ich dann bei if noch begin und end einfügen?
und wo muss das Memo1.lines.Clear hin?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TForm1.Button1Click(Sender: TObject); var n, Teiler: integer; begin n := strtoint(edit1.text); Teiler:=2;
while Teiler < n do begin if n mod teiler = 0 then begin Memo1.lines.clear; Memo1.Lines.Add(IntToStr(Teiler)); Teiler:= Teiler+1; end;
end; |
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: So 21.06.09 15:46
deine Quellcode-Interpretation ist richtig. Aber sie erfüllt nicht die Aufgabenstellung.
1.) Der Teiler sollte unabhängig von der Bedingung erhöht werden. Ansonsten verfängst du dich in geschätzten 95% der Fälle in einer Endlosschleife (halt abhängig vom Zahlenbereich, ansonsten können wir das gut auf 100% anheben).  Das Problem gäbe es übrigens mit einer for-Schleife nicht.
2.) Es sollte vor der gesamten Rechnerei gelöscht werden, denn es sollen ja alle Teiler gefunden werden.
Dann sollte es klappen.
Noch als Tipp, aber nicht notwendig: Statt Teiler := Teiler + 1 kannst du auch einfach inc(Teiler); schreiben, wenn du willst.
|
|
newbie333 
      
Beiträge: 43
|
Verfasst: So 21.06.09 15:57
For-Schleifen hatten wir leider noch nicht, deshalb hab ich davon keine Ahnung.
Ich glaub ich habs soweit verstanden:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm1.Button1Click(Sender: TObject); var n, Teiler: integer; begin n := strtoint(edit1.text); Teiler:=1; Memo1.lines.clear; while Teiler < n do begin if n mod teiler = 0 then Memo1.Lines.Add(IntToStr(Teiler)); Teiler:= Teiler+1; end; end; end. |
Allerdings wird nie die letzte Zahl angegeben, also bei 5 die 5, bei 7 die 7 usw..
wie kann ich das denn machen?
Vielen Dank!
Moderiert von Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: So 21.06.09 16:04
newbie333 hat folgendes geschrieben : | Allerdings wird nie die letzte Zahl angegeben, also bei 5 die 5, bei 7 die 7 usw..
wie kann ich das denn machen?  |
Delphi-Quelltext
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: So 21.06.09 16:04
Du müsstest aus dem < ein <= machen ...
|
|
newbie333 
      
Beiträge: 43
|
Verfasst: So 21.06.09 16:07
Juhu es funktioniert endlich  Dankeschön!
|
|
bole
      
Beiträge: 107
Erhaltene Danke: 15
win 10
|
Verfasst: So 21.06.09 16:08
Hoi Newbie
Du musst die Bedingung der While Schleife ändern. Statt 'kleiner als' 'kleiner Gleich als', dann kommt auch die letzte Zahl.
Die Bedingung 'kleiner als' bedeutet ja wenn die Zahl gleich dem Teiler ist wird die Schleife abgebrochen. Da die Prüfung der Bedingung in der While Schleife vor den Schleifendurlauf gemacht wird bricht sie ab.
Gruss
Bole
_________________ ein programm macht nicht das was du willst sondern was du schreibst!
|
|