IltisvdT Geschrieben 18. November 2010 Geschrieben 18. November 2010 Hallo, ich soll ein Programm schreiben, dass die Primzahlen zwischen zwei Grenzen ausgibt. Ich habe folgenden Code: #include <stdio.h> int main (){ int zahla, zahlb, hilfa, hilfb, a=2,b; printf("Untere Grenze?:"); scanf("%d",&zahla); printf("Obere Grenze?:"); scanf("%d",&zahlb); hilfa=zahla; hilfb=zahlb; for(hilfa<hilfb;hilfa<hilfb;hilfa++){ for(a=2;a<=(hilfa-1);a++){ b=hilfa%a; switch({ case 0: break; default: { printf("%d\n",hilfa); break;} }} a=2;} return(0); } Die hilfa und hilfb hab ich eingebaut, weil ich dachte, ich bräuchte die Grenzen vielleicht nochmal. Er kompiliert das Programm auch, stürzt dann aber ab ohne eine einzige Zahl zu berechnen. Schreiben müssen wir in C. Vielen Dank schoneinmal Zitieren
Klotzkopp Geschrieben 18. November 2010 Geschrieben 18. November 2010 Er kompiliert das Programm auch, stürzt dann aber ab ohne eine einzige Zahl zu berechnen.Bei mir stürzt es nicht ab. Du solltest allerdings bedenken, dass es für eine Primzahl nicht ausreicht, wenn du eine einzige Zahl findest, die kein Teiler ist. Genau dann machst du aber schon die Ausgabe. Zitieren
Korhil Geschrieben 18. November 2010 Geschrieben 18. November 2010 #include <stdio.h> int main (){ int zahla, zahlb, hilfa, hilfb, a=2,b; printf("Untere Grenze?:"); scanf("%d",&zahla); printf("Obere Grenze?:"); scanf("%d",&zahlb); hilfa=zahla; hilfb=zahlb; for(hilfa<hilfb;hilfa<hilfb;hilfa++){ for(a=2;a<=(hilfa-1);a++){ b=hilfa%a; switch({ case 0: break; default: { printf("%d\n",hilfa); break;} }} a=2;} return(0); } Es wäre außerdem super, wenn du deinen Code ein wenig ansprechender präsentieren könntest, da ich so z.B. überhaupt keinen Bock habe, mich da durch zu kämpfen. Gehört auch zur höflichen Fragestellung, den Beitrag leserlich abzugeben. Zitieren
Korhil Geschrieben 18. November 2010 Geschrieben 18. November 2010 Auch wenn ich jetzt Augenkrebs bekomme Hast du überhaupt eine Ahnung von For-Schleifen ??? for(hilfa<hilfb;hilfa<hilfb;hilfa++) {...} Die Initialisierung hilfa<hilfb macht keinen Sinn !!! Du willst doch da nichts vergleichen, sondern einen Startwert für hilfa zuweisen (was durch die Anwenderabfrage ja eigentlich schon erledigt ist). Zitieren
IltisvdT Geschrieben 18. November 2010 Autor Geschrieben 18. November 2010 Entschuldigt bitte die schlechte Darstellung. Ich habe das ausm Editor kopiert, da sahs gut aus(also mit tabs usw) und dann hab ich auf Beitrag erstellen geklickt und dann sah es so aus. Nächstes mal werde ich darauf achten. @Korhil: Wie du sagst soll ja einfach nur die for-Schleife losgehen. Was liegt da näher als ein bedingung zu nehmen, die immer erfüllt is? Und das ist diese ja, dadurch, dass die untere Grenze idR immer kliener ist als die obere. natürlich gibt es schönere Möglichkeiten, aber hauptsache es funktioniert? Zitieren
IltisvdT Geschrieben 18. November 2010 Autor Geschrieben 18. November 2010 Bei mir stürzt es nicht ab. Du solltest allerdings bedenken, dass es für eine Primzahl nicht ausreicht, wenn du eine einzige Zahl findest, die kein Teiler ist. Genau dann machst du aber schon die Ausgabe. Könnte man es also vielleicht so machen, das man das Produkt aller Reste nimmt? Wenn das ungleich 0 ist, müsste es ja ein Primzahl sein, oder? Dann müsste ichs mit float machen, richtig? oder geht das insgesamt noch einfacher? Zitieren
Korhil Geschrieben 18. November 2010 Geschrieben 18. November 2010 Entschuldigt bitte die schlechte Darstellung. Ich habe das ausm Editor kopiert, da sahs gut aus(also mit tabs usw) und dann hab ich auf Beitrag erstellen geklickt und dann sah es so aus. Nächstes mal werde ich darauf achten. @Korhil: Wie du sagst soll ja einfach nur die for-Schleife losgehen. Was liegt da näher als ein bedingung zu nehmen, die immer erfüllt is? Und das ist diese ja, dadurch, dass die untere Grenze idR immer kliener ist als die obere. natürlich gibt es schönere Möglichkeiten, aber hauptsache es funktioniert? Schau dir bitte noch mal an, wie eine for-Schleife funktioniert !!! Ich habe von er Initialisierung und nicht von der Überprüfung der Abbruchbedinung gesprochen: for ( Initialisierung; Bedingung; Schrittweite ) Zitieren
Klotzkopp Geschrieben 18. November 2010 Geschrieben 18. November 2010 Könnte man es also vielleicht so machen, das man das Produkt aller Reste nimmt? Wenn das ungleich 0 ist, müsste es ja ein Primzahl sein, oder?Das ist richtig. Aber eigentlich kannst du die Prüfschleife abbrechen, wenn du einen Teiler findest. Bricht die Schleife vorzeitig ab, ist es keine Primzahl, läuft sie durch, ohne dass ein Teiler gefunden wird, ist es eine. Zitieren
lilith2k3 Geschrieben 18. November 2010 Geschrieben 18. November 2010 Sieb des Eratosthenes ? Wikipedia Immer sehr beliebt Zitieren
IltisvdT Geschrieben 18. November 2010 Autor Geschrieben 18. November 2010 Hoffe mal, dass die Tabs nun richtig angezeigt werden und der Code ansprechend angezeigt wird. Also wir haben nun eure Tipps soweit wie es geht umgesetzt. Das Programm funktioniert auch, allerdings zeigt er noch alle Zahlen an, die nicht den Rest 0 haben.. ich habe im Moment nur leider keine Idee wie man dies ändern könnte(auch das Sieb des Erasthotener hilft mir nicht viel weiter). Hättet ihr diesbezüglich vielleicht noch einen Tipp? Hier der Code: #include <stdio.h> int main () { int zahla, zahlb, a, b; printf("Untere Grenze?:"); scanf("%d",&zahla); printf("Obere Grenze?:"); scanf("%d",&zahlb); for(; zahla<zahlb; zahla++) { for(a=2;a<=(zahla-1);a++) { b=zahla%a; switch( { case 0: break; default: { printf("%d\n", zahla); break; } } } } return(0); }[/code] Zitieren
Klotzkopp Geschrieben 18. November 2010 Geschrieben 18. November 2010 Das Programm funktioniert auch, allerdings zeigt er noch alle Zahlen an, die nicht den Rest 0 haben..Wenn ein Programm nicht tut, was es soll, nennt man das üblicherweise nicht "funktionieren" Hättet ihr diesbezüglich vielleicht noch einen Tipp?Wieso noch einen? Setz doch erst mal die Tipps um, die du schon bekommen hast. Wenn du einen Teiler findest, ist es keine Primzahl. Wenn du keinen Teiler findest, ist es eine. Ob du keinen findest, kannst du aber erst wissen, wenn die Schleife komplett durchgelaufen ist. Vorher darfst du also auch keine Ausgabe machen. Zitieren
Korhil Geschrieben 19. November 2010 Geschrieben 19. November 2010 Hoffe mal, dass die Tabs nun richtig angezeigt werden und der Code ansprechend angezeigt wird. Also wir haben nun eure Tipps soweit wie es geht umgesetzt. Das Programm funktioniert auch, allerdings zeigt er noch alle Zahlen an, die nicht den Rest 0 haben.. ich habe im Moment nur leider keine Idee wie man dies ändern könnte(auch das Sieb des Erasthotener hilft mir nicht viel weiter). Hättet ihr diesbezüglich vielleicht noch einen Tipp? Hier der Code: #include <stdio.h> int main () { int zahla, zahlb, a, b; printf("Untere Grenze?:"); scanf("%d",&zahla); printf("Obere Grenze?:"); scanf("%d",&zahlb); for(; zahla<zahlb; zahla++) { for(a=2;a<=(zahla-1);a++) { b=zahla%a; switch( { case 0: break; default: { printf("%d\n", zahla); break; } } } } return(0); }[/code] Führe noch eine Variable vom Typ boolean ein, die sich merkt, ob ein Teiler gefunden wurde (in deinem switch-case[wobei man soetwas eigentlich nur dann nimmt, wenn mehr als zwei Möglichkeiten vorhanden sind]). Beachte dabei, das für jede neue Zahl die Variable erst einmal wieder auf false gesetzt werden muss. Nach der Schleife überprüfst du, ob sie noch den Wert false hat, dann darfst du die Zahl ausgeben, sonst nicht. Zitieren
IltisvdT Geschrieben 19. November 2010 Autor Geschrieben 19. November 2010 Ich hab es nun hinbekommen, dass nur Primzahlen ausgespuckt werden:) Vielen Dank für die Tipps! Der Vollständigkeit halber hier einfach noch der Code: #include <stdio.h> int main () { int zahla, zahlb, a, b, prim; printf("Untere Grenze?:"); scanf("%d",&zahla); printf("Obere Grenze?:"); scanf("%d",&zahlb); for(; zahla<zahlb; zahla++) { prim=0; for(a=2;a<=(zahla-1);a++) { b=zahla%a; if(b==0) prim=1; } if(prim==0) printf("%d\n", zahla); } return(0); } Geht sicherlich eleganter aber wir sind zufrieden solange es funktioniert;) Zitieren
Korhil Geschrieben 19. November 2010 Geschrieben 19. November 2010 Und wenn du jetzt noch nicht die Lust verloren hast, dann könnte man den Code/Algorithmus auf Performance trimmen. Schlagworte: - obere Teilergrenze = Wurzel aus Zahl - ab 3 nur noch ungerade Zahlen testen - nur Primzahlen als mögliche Teiler verwenden - ... Damit kannst du das Programm locker auf 10% der jetzt benötigten Zeit herunter drücken, was sich natürlich nur bei größeren Zahlenbereichen bemerkbar macht für den Anwender. 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.