Autor |
Beitrag |
xsus
      
Beiträge: 51
Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
|
Verfasst: Sa 01.10.11 14:22
Hey, ich bin neu hier, also sorry falls ich im falschen Topic gelandet bin ^^
Zu meinem Problem: Wir erhielten von der Schule folgende Aufgabe:
Schreibe ein Programm, das feststellt ob eine Zahl Primzahl ist.
Wir sind aber grade mal bei der 2. Stunde gewesen und uns sind nur die Variablen integer, string bekannt, sowie die for-Schleife, write(ln), read(ln), und der befehl "mod" ...also muss es iwie ausschließlich mit diesen befehlen gehen...ich habe schon Quelltexte gefunden, die waren aber alle mit vielen andren Befehlen ausgestattet...kann mir wer helfen?!
Bis jetzt habe ich folgenden Quelltext:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| program Primzahlen;
{$APPTYPE CONSOLE}
uses SysUtils; var n, t:integer; begin writeln ('Geben Sie die zu pruefende natuerliche Zahl ein!'); read (n); writeln; for t:=1 to n do if n mod t=0 then writeln (n,' durch ', t,' geht!') else writeln (n,' durch ',t, ' geht nicht!'); readln; readln; end. |
..das klappt soweit auch ganz gut, nur sagt er ja nicht ob es eine Primzahl ist oder nicht..alle versuche von mir schlugen fehl..und warum muss ich auf einmal 2 mal readln am endeschreiben? sonst reichte einmal damit das fenster geöffnet blieb?!...Vielen Dank..
Moderiert von Narses: I- durch Delphi-Tags ersetztModeriert von Narses: Topic aus Sonstiges (Delphi) verschoben am Sa 01.10.2011 um 15:42
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Sa 01.10.11 14:33
Schau Dir einmal in der Hilfe noch den Datentyp Boolean an.
Ansonsten, wenn Du es ohne diesen zusätzlichen Datentyp machen möchtest, musst Du mitzählen, wieviele Male die Division geklappt hat und am Ende prüfen, dass es 0 Mal geklappt hat.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Für diesen Beitrag haben gedankt: xsus
|
|
xsus 
      
Beiträge: 51
Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
|
Verfasst: Sa 01.10.11 14:44
ich füge also eine 3. variable z.b. (var ergebnis:boolean;) ein ?! ..soweit verstehe ich..diese variable regelt ob etwas richtig oder falsch ist...aber wie sage ich ihr das es richtig ist, wenn die zahl nur 2 mal teilbar ist?! und wie definiere ich für sie einen andren text als true und false? ..lg
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Sa 01.10.11 14:55
Ein Boolean-Wert ist das, was die IF-Anweisung zwischen If und Then erwartet, Du also eh bereits verwendet hast.
Grob gehst Du also so vor, dass Du einfach annimmst, dass N eine Primzahl ist und daher das Ergebnis mit True initialisierst. In der Schleife setzt Du dann für den Fall, dass N durch eine Zahl teilbar ist, dein Ergebnis auf False.
Am Ende gibst Du dann in Abhängigkeit deines Ergebnisses aus, ob prim oder nicht:
Delphi-Quelltext 1: 2: 3: 4:
| If Ergebnis Then WriteLn(N, ' ist prim.') else WriteLn(N, 'ist NICHT prim.'); |
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Für diesen Beitrag haben gedankt: xsus
|
|
xsus 
      
Beiträge: 51
Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
|
Verfasst: Sa 01.10.11 15:14
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Sa 01.10.11 15:24
xsus hat folgendes geschrieben : | hey, sorry...also ich kriegs echt net gebacken..ich habe jetzt folgenden quellcode und er zeigt immer an das es eine primzahl ist, bzw. das es keine ist..also wie ichs auch probiere..richtig geht es nicht..entweder alle oder keine !
hier der quellcode : |
Bitte nutze die Delphi-Tags für deinen Quelltext und rücke die verschiedenen Sachen etwas ein.
xsus hat folgendes geschrieben : | 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:
| program Primzahlen;
{$APPTYPE CONSOLE}
uses SysUtils;
var n, t: integer; ergebnis: boolean;
begin writeln ('Geben Sie die zu pruefende natuerliche Zahl ein!'); read (n); writeln;
ergebnis:=true;
for t:=1 to n do if n mod t=0 then ergebnis:=true else ergebnis:=false;
if ergebnis then writeln (n, ' ist eine Primzahl') else writeln (n, ' ist keine Primzahl');
readln; readln; end. | |
Schauen wir doch einfach einmal genau auf deine Schleife:
Delphi-Quelltext 17: 18: 19: 20: 21: 22: 23:
| { ... } ergebnis:=true;
for t:=1 to n do if n mod t=0 then ergebnis:=true else ergebnis:=false; |
Vergleiche einmal die Aussage dieser Schleife mit meiner Beschreibung von oben. Wenn die Zahl durch T teilbar ist, setzt Du das Ergebnis auf Primzahl, wenn nicht, so setzt Du das Ergebnis auf 'keine Primzahl'. Nun zählt, da Du das Ergebnis bei jedem Durchlauf der Schleife immer wieder überschreibst nur der letzte Durchlauf.
Im Gegensatz dazu habe ich oben in meiner Beschreibung geschrieben, dass dass Du am Anfang das Ergebnis einmal auf Ja setzt und im Falle der Teilbarkeit sagst, dass es keine Primzahl ist. Die korrigierte Schleife sähe dementsprechend eher wie folgt aus:
Delphi-Quelltext 17: 18: 19: 20: 21:
| { ... } ergebnis:=true;
for t:=1 to n do if n mod t=0 then ergebnis:=false; |
Wobei in dieser Schleife noch ein weiterer Fehler ist (betrifft Zeile 19), den Du findest, wenn Du Dir die Definition von Primzahlen noch einmal genau anschaust und insbesondere darauf achtest, welche Teiler Du überhaupt betrachten musst.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Für diesen Beitrag haben gedankt: xsus
|
|
xsus 
      
Beiträge: 51
Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
|
Verfasst: Sa 01.10.11 15:36
ich habe es jetzt erstmal so abgeändert wie du mir geschrieben hast. Es tut mir echt leid, aber ich bin halt totaler anfänger. Was eine Primzahl ist, ist mir schon klar. Eine Zahl, die nur durch 1 und durch sich selbst teilbar ist! Aber wie ich es dem pc halt sage..das ist die andre sache ^^ ...Jedenfalls ist mir schonmal aufgefallen, dass er mir nur bei 0 sagt, es sei ne Primzahl ..ich sehe eher einen fehler in zeile 20 ..weil die schleife sagt doch nur, dass er von 1 bis zu meiner eingegebenen zahl alle durchprobiert..das müsste ja richtig sein?! lg
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Sa 01.10.11 15:39
Zeile 20 ist schon korrekt, da sie die Teilbarkeit prüft. Der Fehler liegt in Zeile 19, da für eine Primzahl ja uninteressant ist, DASS sie durch 1 und N teilbar ist, wichtig sind nur alle Teiler dazwischen, dass sie durch eben diese NICHT zu teilen geht, also von 2 bis zum Vorgänger von N. Versuch diesen Bereich mal in Zeile 19 auszudrücken.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Für diesen Beitrag haben gedankt: xsus
|
|
xsus 
      
Beiträge: 51
Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
|
Verfasst: Sa 01.10.11 15:42
|
|
HenryHux
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: Sa 01.10.11 17:29
Du kannst sogar einiges an Rechenzeit sparen, wenn du von 2 bis Wurzel(zu berechnender Zahl) rechnest.
lg
Für diesen Beitrag haben gedankt: xsus
|
|
pdelvo
      
Beiträge: 55
Erhaltene Danke: 11
|
Verfasst: Sa 01.10.11 21:50
und sobald du einen Teiler gefunden hast kannst du die Schleife abbrechen. das spaart auch noch leistung 
Für diesen Beitrag haben gedankt: xsus
|
|
xsus 
      
Beiträge: 51
Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
|
Verfasst: Sa 01.10.11 21:57
Zitat: | und sobald du einen Teiler gefunden hast kannst du die Schleife abbrechen. das spaart auch noch leistung  |
und Zitat: | Du kannst sogar einiges an Rechenzeit sparen, wenn du von 2 bis Wurzel(zu berechnender Zahl) rechnest.
lg |
....wie mach ich dass denn ? 
|
|
Boldar
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: Sa 01.10.11 22:01
Delphi-Quelltext 17: 18: 19:
| { ... } for t:=2 to trunc(sqrt(n)) do if n mod t=0 then ergebnis:=false; |
sqrt() berechnet die Quadratwurzel, und trunc schneidet dann die Nachkommastellen ab.
Dafür musst du maths unter uses eintragen.
Eine Schleife kann man mit break; verlassen.
Für diesen Beitrag haben gedankt: xsus
|
|
bole
      
Beiträge: 107
Erhaltene Danke: 15
win 10
|
Verfasst: Sa 01.10.11 23:05
Noch ne Korrektur und Ergänzung meinerseits...
Zitat: | Dafür musst du maths unter uses eintragen. |
Die unit heisst math
Zitat: | Eine Schleife kann man mit break; verlassen. |
Vielleicht bin ich schon Aufgefallen als absoluter Gegner von solchen Konstrukten! Schleifen mit Break zu verlassen ist extrem unübersichtlich denn Berak ist eigentlich ein getarntes Goto und dies ist meiner Ansicht nach zu vermeiden!
übersichtlicher ist in diesem Fall eine WHILE Schleife:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| i:=2; while (i<trunc(sqrt(n))) and (ergebnis) do begin; if n mod i=0 then ergebnis:=false; inc(i); end; |
Eigentlich musst Du noch überprüfen das die Input Zahl der Definition entspricht, als Prim- oder nicht Prim sein kann.
de.wikipedia.org/wiki/Primzahl
Zitat: | Eine Primzahl ist eine natürliche Zahl, die größer als eins und nur durch sich selbst und durch eins teilbar ist. Eine Primzahl ist also eine natürliche Zahl mit genau zwei natürlichen Zahlen als Teiler. Die kleinsten Primzahlen sind |
Das Programm wird zwar nicht abstürzen, aber es ist nicht so schön wenn es ausgibt 1 sei eine Primzahl... Denn das stimmt nicht!
Falls Dich das Programmieren mehr interessiert als die paar wenigen Befehle die ihr bisher in der Schule behandelt habt kann ich Dir den Crashkurs von Christian S. ans Herz legen.
Gruss
Bole
_________________ ein programm macht nicht das was du willst sondern was du schreibst!
Für diesen Beitrag haben gedankt: xsus
|
|
Boldar
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: Sa 01.10.11 23:43
Für diesen Beitrag haben gedankt: BenBE, Martok, xsus
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 02.10.11 05:21
Nur zur Info: Schleifen sind alles Jumps, wie sollt e es sonst auch anders funktionieren. 
Für diesen Beitrag haben gedankt: xsus
|
|
rushifell
      
Beiträge: 306
Erhaltene Danke: 14
|
Verfasst: So 02.10.11 09:44
Mathe ist bei mir schon sehr lange her, aber würde es zum Überprüfen auch reichen, wenn man überprüft ob die Zahl durch 2,3,5 oder 7 teilbar ist? Das ist nur ne Idee von mir und basiert nicht auf einer mathematischen Regel. Aber ich weiss noch, dass wir in der Schule beim Testen, ob eine Zahl teilbar ist, die Zahl immer in ihre kleinsten Elemente zerlegt haben.
Gruß
|
|
Boldar
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: So 02.10.11 11:08
Und was ist mit 169?
Ist durch 13 teilbar und damit keine Primzahl.
In die kleinsten Elemente zerlegen stimmt schon, aber es reicht nicht nur 2, 3, 5 und 7 zu prüfen, sondern man muss bis sqrt(n) gehen. Genau genommen muss man nur auf Teilbarkeit durch Primzahlen testen, das nennt sich Sieb des Eratosthenes.
Für diesen Beitrag haben gedankt: xsus
|
|
xsus 
      
Beiträge: 51
Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
|
Verfasst: So 02.10.11 21:47
hallöchen, also ich habe jetzt die unit in math geändert und den rest auch! funktioniert..aber dazu muss erst die andere unit raus? kann mir das mit den unit's jmd genauer erklären?  ..danke erstmal! ...ehm mit der schleife..ich werde erstmal bei der for-schleife bleiben, nicht das ich zu sehr durcheinander komme...lehrer wird schon iwann später auf die anderen zurück kommen..(lerne nebenbei noch privat C...da herrscht schon genug verwirrung bei mir  )...wär noch einer so lieb mir zu erklären wie ich genau die schleife verlassen muss...break..okee..aber wie definiere und deklariere ich das ..das er die schleife verlässt, sobald er einen teiler gefunden hat.....auf das Problem, dass er mir anzeigt bei 0 und 1 ..es sei eine Primzahl, habe ich mit einer normalen benachrichtung erstmal auf den bug hingewiesen..wie kann ich ändern , dass er bei 0 und 1 sagt, das es nicht funktioniert?! dann müsste ich doch iwie angeben dass n ungleich 0 und 1 sein muss, ansonsten soll er halt fehler anzeigen oder so...?! liebe grüße un vielen dank 
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 02.10.11 22:08
xsus hat folgendes geschrieben : | hallöchen, also ich habe jetzt die unit in math geändert und den rest auch! funktioniert..aber dazu muss erst die andere unit raus? kann mir das mit den unit's jmd genauer erklären? ..danke erstmal! |
Schau zu Units mal im oben bereits verlinkten Crashkurs nach. Da steht das ganz gut drinnen erklärt. Kurzfassung: Das sind Sammlungen von Funktionen, Typen und Variablen.
xsus hat folgendes geschrieben : | ...ehm mit der schleife..ich werde erstmal bei der for-schleife bleiben, nicht das ich zu sehr durcheinander komme...lehrer wird schon iwann später auf die anderen zurück kommen.. |
Jup. Und ich bin auch nicht grad glücklich drüber, dass hier einige Besserwisser unbedingt mit sowas gleich anfangen mussten
xsus hat folgendes geschrieben : | (lerne nebenbei noch privat C...da herrscht schon genug verwirrung bei mir )... |
Was in C { und } sind, ist in Delphi Begin und End. Then in C weglassen und ansonsten ist die Syntax eigentlich fast gleich  Abgesehen von einigen Kleinigkeiten ...  Die Units kann man (grob) mit den Header-Files aus C vergleichen, wobei die in Delphi noch ein wenig anders funktionieren.
xsus hat folgendes geschrieben : | wär noch einer so lieb mir zu erklären wie ich genau die schleife verlassen muss...break..okee..aber wie definiere und deklariere ich das ..das er die schleife verlässt, sobald er einen teiler gefunden hat..... |
Delphi-Quelltext 1: 2: 3: 4: 5:
| If IstTeilbar Then Begin Ergebnis := False; Break; end; |
xsus hat folgendes geschrieben : | auf das Problem, dass er mir anzeigt bei 0 und 1 ..es sei eine Primzahl, habe ich mit einer normalen benachrichtung erstmal auf den bug hingewiesen..wie kann ich ändern , dass er bei 0 und 1 sagt, das es nicht funktioniert?! dann müsste ich doch iwie angeben dass n ungleich 0 und 1 sein muss, ansonsten soll er halt fehler anzeigen oder so...?! liebe grüße un vielen dank  |
Der einfachste Weg wäre, statt
Delphi-Quelltext
am Anfang einfach
Delphi-Quelltext
zu schreiben.
Der Ausdruck N>1 ist eine normale Bedingung, die einen Boolean zurückliefert und daher direkt einer Boolean-Variable zugewiesen werden kann. Funktioniert genauso übrigens auch in C.
OT: Wenn Du willst, kannst Du dich ja mal daran versuchen, dein fertiges Delphi-Programm nach C zu übersetzen. Hier im Forum können genug Leute auch C, so dass Du hier auch nachfragen kannst.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Für diesen Beitrag haben gedankt: xsus
|
|
|