Anfängerproblem - Primzahlenalgorithmus



  • Hallo liebes Forum,
    ich bin neu hier und muss gleich mit einer Frage nerven 😃 Ich habe beschlossen C++ zu lernen und habe mir ein Buch gekauft. Das war relativ spontan, aber es macht mir sehr Spaß und ich wollte nun ein einfaches Programm schreiben, welches mir Primzahlen bis zu einer gewissen Grenze ausgibt.

    Ich habe folgenden Code (Natürlich für euch mit Kommentaren versehen):

    #include <iostream>
    #include <cmath>
    using namespace std;
    
    int main()
    {
    		int p=2; //mögliche Primzahl
    		int g; // Grenze bis zu der Primzahlen berechnet werden
    		int q=0; // Variable für Schleifenbedingung
    		int t=2; // Teiler
    		int e;
    		cout << "Bitte Grenze eingeben:" ;
    		cin >> g;
    
    		while(q==0)
    		{	e= (p%t); //Wenn "p" eine Primzahl wäre, dürfte "e" nie 0 werden
    
    		if(e==0) // "e" ist 0, also ist "p" keine Primzahl; "p" wird erhöht und "t" wieder 2 gesetzt; Schleife fängt von vorne an
    			{++p; t=2;}
    
    		if((e!=0) || (t>=3)) // Bedingung für bessere Laufzeit, alle geraden Teiler werden vermieden
    			{t=t+2;}
    
    		if((e!=0) || (t=2)) // Sollte nur einmal pro Zahl für "p" erfüllt werden, dass erste Mal, wenn e!=0 ist könnte p eine Primzahl sein
    			{++t;}			// teiler wird erhöht, um p weiter zu prüfen
    
    		if(t>=(p/2)) // wenn t schließlich halb so groß ist wie p und nie e==0 war, ist p eine Primzahl, sie wird ausgegeben
    			{cout << p << endl; p++; t=2;}
    
    		if(g==p) // Wenn die Grenze g erreicht ist wird q um 1 erhöht und die Schleife stoppt
    		{q++;}
    		}
    		system("Pause");
    
    }
    

    Jetzt kommt mein Problem: Das Programm startet zwar einwandfrei und gibt auch alle Primzahlen aus (zumindest bis zu dem Punkt zu dem ich das jetzt im Kopf beurteilen konnte). ABER es gibt auch Zahlen wie 10 und 16 aus.
    Meine Frage: Warum werden diese Zahlen nicht als "Nicht-Primzahlen" erkannt...

    Ich hoffe ihr könnt mir helfen, ich denke ich habe irgendwo einfach einen Denkfehler...

    Vielen Dank,
    Niklas

    PS: Sobald ich mich halbwegs auskenne, werde ich mich natürlich mit Hilfe anderer revanchieren!



  • 1. Benne mal bitte deine Variablen etwas Aussagekräftiger. Der Name sollt einen Hinweis darauf geben, wofür sie denn da ist.

    2. Ich weiß ja nicht ob du da so aus deinem Buch lernst, aber die Einrückung ist nicht so optimal, bzw. deine {}.

    mfg



  • 1. Tut mir Leid, ich hatte gedacht, bei so wenigen Variablen reicht ein Kommentar oben wo sie definiert wurden...
    2. Ich fand so sah es relativ übersichtlich aus..und funktionieren tuts ja auch, hast du einen Verbesserungsvorschlag?


  • Mod

    hardware schrieb:

    1. Benne mal bitte deine Variablen etwas Aussagekräftiger. Der Name sollt einen Hinweis darauf geben, wofür sie denn da ist.

    Dies! Dein Code ist furchtbar schwer zu lesen.

    Mach aus deinen || mal && und aus dem t=2 in Zeile 24 ein t==2.



  • DANKESCHÖN! Es hat geklappt "||" zu "&&" hat es dann doch gemacht 🙂 Und tatsächlich bin ich nicht Schuld, die Internetseite von der ich den Operator und seine Funktion hatte, ist fehlerhaft 😮

    Tut mir Leid, nächstes Mal, mach ich den leserliche, einfach die Variablen besser benennen? Ich war wohl zu faul ihnen längere Namen zu geben 😃

    Vielen Dank nochmal 😉


  • Mod

    NNiklas schrieb:

    Und tatsächlich bin ich nicht Schuld, die Internetseite von der ich den Operator und seine Funktion hatte, ist fehlerhaft 😮

    Das kann ich kaum glauben. Das ist so einfach, das kann kaum jemand verwechseln. Welche Seite ist das und was sagt sie über die Bedeutung?

    Allgemein solltest du Wert auf gutes Lehrmaterial legen. Nichts ist schlimmer beim Lernen, als falsche oder schlechte Techniken zu lernen. Die wird man nämlich nur sehr schwer wieder los, wenn man sie sich angewöhnt hat. Gerade auf dem C++-Büchermarkt und im (deutschsprachigen) Internet schwirrt einiger Müll rum. Siehe meine Signatur für Tipps zu guten Büchern.



  • Die Seite finde ich nicht mehr, ist schon in paar Tage her.
    Thema und Überschrift war was mit 2 Bedingungen für if und der Autor hat die beiden Bedingungen mit "||" verknüpft. Vielleicht habe ich mich verlesen, vielleicht war die Überschrift zweideutig, vielleicht sogar falsch. Wer weiß, was zählt ist, dass dieser doofe Code endlich läuft 😃

    Ja, ich hätte wirklich mein Buch zu rate ziehen sollen. Habe das hier

    http://www.amazon.de/Visual-2010-umfassende-Handbuch-Computing/dp/3836216396/ref=sr_1_15?ie=UTF8&qid=1385241879&sr=8-15&keywords=c%2B%2B+galileo

    Bin eigentlich vollkommen zufrieden bis jetzt!


  • Mod

    NNiklas schrieb:

    Thema und Überschrift war was mit 2 Bedingungen für if und der Autor hat die beiden Bedingungen mit "||" verknüpft.

    Das kann ja auch gut sein, schließlich gibt es viele Möglichkeiten, mehrere Bedingungen zu verknüpfen. Das scheint dir gar nicht bewusst zu sein. || bedeutet, das die eine ODER die andere Bedingung wahr sein muss (oder auch beide), damit der Gesamtausdruck wahr ist. && bedeutet, dass die eine UND die andere Bedingung wahr sein müssen.

    Ja, ich hätte wirklich mein Buch zu rate ziehen sollen. Habe das hier

    http://www.amazon.de/Visual-2010-umfassende-Handbuch-Computing/dp/3836216396/ref=sr_1_15?ie=UTF8&qid=1385241879&sr=8-15&keywords=c%2B%2B+galileo

    Dies speziell kenne ich nicht. Der Verlag ist verdächtig, das er viele bekannt schlechte Bücher verlegt. Das heißt natürlich nicht, dass er nur schlechte Bücher verlegt, aber zumindest, dass es mit der Qualitätssicherung dort nicht so gut bestellt ist.

    Bin eigentlich vollkommen zufrieden bis jetzt!

    Das Problem dabei ist, das ein Anfänger gar nicht beurteilen kann, ob ein Buch fachlich gut ist. Dummerweise sind das naturgemäß die Leute, die auch Kritiken über die Bücher bei Amazon & Co. schreiben, da sie die Kunden für diese Bücher sind.
    http://xkcd.com/937/



  • Das scheint dir gar nicht bewusst zu sein.

    Doch das ist mir jetzt durchaus bewusst. Tatsächlich enthält mein Buch auch Operatorenlisten.

    Ich wollte ja nur ein bisschen Hilfe... Du demotivierst mich irgendwie ein bisschen. Dass ich nicht alles über C++ und Programmieren generell weiß nur weil ich die ersten 100 Seiten in einem beliebigen Buch darüber gelesen habe ist mir bewusst und wäre ja auch lächerlich dies anzunehmen. Trotzdem sollte es nicht Ziel sein, wenn ich um Hilfe in einem Forum suche, sich auf einige meiner, sicherlich auch fehlerhaften, Aussagen zu konzentrieren und diese zu ausschließlich zu kritisieren. Ein Hinweis auf meine Fehler und ein Tipp fürs nächste Mal würden vollkommen langen.

    Ich danke dir trotzdem für die Hilfe bei meinem kleinen Code. Ist schön, wenn das erste Programm, was man probiert zu schreiben, auch klappt.

    MfG


Anmelden zum Antworten