eryx Geschrieben 26. Oktober 2008 Geschrieben 26. Oktober 2008 Hallo zusammen, also ich hab als hausaufgabe bekommen ein programm zuschreiben das einen min und max wert abfragt und für diesen bereich alle primzahlen angibt. Es soll ein einfaches übungsprogramm sein deshalb soll auf die Sieb-methode verzichtet werden. so mein programm funktioniert, bis auf die kleinigkeit, dass es nach der schleife wieder alle zuvor bekannten primzahlen mit ausgibt.... kann mir einer sagen wo mein fehler liegt? hocke seit 3 stunden hier dran und bin am verzweifeln... danke schonmal! #include <iostream> #include <conio.h> using namespace std; int main() { int i =2; // Deklaration int eingabe_min; int eingabe_max; int prim; bool teiler = false; cout << " Primzahlenausgabe\n" << " \n"; //Eingabeaufforderung cout << " Bitte geben sie den minimalen und maximalen Bereich der Ausgabe an\n" << " \n"; cout << " Minimum: "; cin >> eingabe_min; cout << " \n"; cout << " Maximum: "; cin >> eingabe_max; cout << " \n"; cout << " Primzahlen von " << eingabe_min << " bis " << eingabe_max << ":\n\n\n"; while (eingabe_min <= eingabe_max) // Äußere Schleife { while (eingabe_min%2 > 0) // Überprüfung ob rest > 0 { for(int i=x; i<=eingabe_min; i++) { if (eingabe_min%i == 0) // Auf Prim überprüfen { teiler = true; } if (teiler == true) { cout << i << endl << "\n"; // Ausgabe } teiler= false; } eingabe_min++; } eingabe_min++; } getch(); return 0; } Zitieren
Klotzkopp Geschrieben 26. Oktober 2008 Geschrieben 26. Oktober 2008 so mein programm funktioniert, bis auf die kleinigkeit, dass es nach der schleife wieder alle zuvor bekannten primzahlen mit ausgibt....Dein Programm kann gar nicht funktionieren, weil es sich gar nicht kompilieren lässt. kann mir einer sagen wo mein fehler liegt? Wie kommst du darauf, dass es nur einer ist? Der auffälligste Fehler dürfte sein, dass du eine Variable x benutzt, die gar nicht deklariert ist. Selbst wenn man diesen Fehler möglichst sinnvoll behebt, funktioniert dein Programm nicht. Es gibt keine Primzahlen aus, sondern alle ungeraden Zahlen, mit allen ihren Teilern. Es gibt also jede Menge Zahlen aus, die gar keine Primzahlen sind (15, 21, 25 usw.) und die Primzahl 2 findet es nicht. Schreib doch erst mal ein Programm, das prüft, ob eine bestimmte Zahl eine Primzahl ist. Und wenn das ordentlich läuft, pack eine Schleife drumherum. Zitieren
flashpixx Geschrieben 26. Oktober 2008 Geschrieben 26. Oktober 2008 Algorithmen zur Berechnung von Primzahlen gibt es einige. Zusätzlich solltest Du die Sonderfälle (0,1,2) auch passend behandeln. (obwohl die 0 nicht als natürliche Zahl gilt) Def. Primzahl (Wiki): Eine Primzahl ist eine natürliche Zahl mit genau zwei natürlichen Zahlen als Teiler, nämlich der Zahl 1 und sich selbst. Zum Code: "if a==true" ist immer etwas unschön "if a" reicht völlig aus. Innerhalb der For-Schleife das "if eingeabe.... bis if teiler ==" lässt sich zusammen fassen. HTH Phil Zitieren
eryx Geschrieben 26. Oktober 2008 Autor Geschrieben 26. Oktober 2008 hehe okay werd ich mich jetzt ma dranmachen... es lebe die zeitumstellung, ei^ne stunde mehr ^^ ich studiere seit oktober das erste semester info und hab vorher noch nie programmiert ^^ habt erbarmen Zitieren
thomasn1985 Geschrieben 26. Oktober 2008 Geschrieben 26. Oktober 2008 for(int i=x; i<=eingabe_min; i++) Wie hier gesagt wurde, ist die Variable X nicht deklariert, benutz hier einfach eine feste Zahl, eine Variable wird hier nicht benötigt. Desweiteren musst du nicht bis eingabe_min durchgehen, sondern musst nur weniger Durchläufe benutzen, um zu testen, ob es sich um eine Primzahl handelt. Welche Zahlen du nehmen kannst, da sollst selbst drauf kommen. if (eingabe_min%i == 0) // Auf Prim überprüfen { teiler = true; } if (teiler == true) { cout << i << endl << "\n"; // Ausgabe } Hier überprüfst du, ob der Rest nach dem Teilen 0 ist (Die Zahl ist also teilbar und somit KEINE Primzahl. Danach gibst du halt den Teiler aus, durch dem die Zahl teilbar ist. Somit hast du eine Liste aller Teiler von ungraden Zahlen, da du die graden Zahlen richtigerweise am Anfang direkt ausschliesst. Zitieren
eryx Geschrieben 26. Oktober 2008 Autor Geschrieben 26. Oktober 2008 (bearbeitet) so hab das ganze programm nochmal neu geschrieben... sind aber noch einige fehler drinne... er gibt jetzt primzahlen aus, jedoch gibt er jede zahl die er findet die vorherigen auch mit an oO man man man ganz schön schwierig... #include <iostream> #include <conio.h> using namespace std; int main() { int MinPrimzahl; int MaxPrimzahl; int Primzahl, Divisor; bool istEinePrimzahl; cout << " Primzahlenausgabe\n" << " \n"; //Eingabeaufforderung cout << " Bitte geben sie den minimalen und maximalen Bereich der Ausgabe an\n" << " \n"; cout << " Minimum: "; cin >> MinPrimzahl; cout << " \n"; cout << " Maximum: "; cin >> MaxPrimzahl; cout << " \n"; cout << " Primzahlen von " << MinPrimzahl << " bis " << MaxPrimzahl << ":\n\n\n"; while (MinPrimzahl <= MaxPrimzahl) { for (Primzahl=2; Primzahl<=MinPrimzahl; Primzahl++) { istEinePrimzahl = true; // Pruefe, ob Primzahl wirklich eine Primzahl ist for (Divisor=2; istEinePrimzahl && Divisor<Primzahl; Divisor++) { // Ist das restlos teilbar? if (0==Primzahl % Divisor) { // Zahl ist teilbar, ist also keine Primzahl! istEinePrimzahl = false; } } // Pruefung ist beendet. // Wenn es eine Primzahl ist, ausgeben! if (istEinePrimzahl) { cout << " ," << Primzahl; } } MinPrimzahl++; } cout << endl ; getch(); } Bearbeitet 26. Oktober 2008 von eryx Zitieren
Klotzkopp Geschrieben 26. Oktober 2008 Geschrieben 26. Oktober 2008 Die äußere Schleife ist überflüssig. Lass einfach die for-Schleife von min bis max laufen. Zitieren
eryx Geschrieben 26. Oktober 2008 Autor Geschrieben 26. Oktober 2008 aaaaaaah sauber jetzt gehts :upps juhu ^^ vielen danke an alle :bimei bis zur nächsten hausaufagabe ^^ Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.