C++ Primzahl-Prüfer

HWI

Cadet 2nd Year
Registriert
Okt. 2014
Beiträge
17
Hallo,

ich habe im Rahmen einer Referenzaufgabe zur Klausurvorbereitung einen Primzahl-Prüfer programmiert.

Allerdings gibt er mir zum Beispiel bei 51 -> Primzahl aus. Kann mir einer weiter helfen was ich übersehen haben / wo mein Fehler liegt.

Wäre über jeden Tipp dankbar.
Code:
#include <iostream.h>
#include <iomanip.h>
#include <conio.h>
#include <math.h>

int main()
{   //Primzahlen

    int zahl, x, y, z;
    
    cout << "Zahl: ";
    cin  >> zahl;
    
    if(zahl==0 || zahl==1)
    {
        cout << "Das gilt nicht!";
        goto ende;
    }
    
    
    for(x=2;x<=zahl-1;x++)
    {
        if(zahl%x==0)
        {
            y=1;
        }
        
        if(y==1)
        {
            cout << "Keine Primzahl";
            break;
        }       
        
        else
        {
        cout << "Primzahl";
        break;
        }
    }
     
    ende:;  
    
    
    cin.get();
    cin.get();
    return(0);
    
}

Mit freundlichen Grüßen HWI
 
Zuletzt bearbeitet:
Für die Lesbarkeit haben wir hier Code klammern

Code:
...

sonst: Fehlt da nicht ne zweite geschweifte klammer nach y= 1; um die for-schleife zu beenden.?
 
Zuletzt bearbeitet:
Finds so ohne Einrückungen schwer zu lesen, aber wenn ich das richtig sehe, brichst du durch die "if y==1"-Abfrage (das ich übrigens mit y als bool machen würde) die for-Schleife so oder so nach dem "x=2"-Versuch ab.

Edit @ Nilson: Die kommt halt erst nach dem else ... oder?
 
Zuletzt bearbeitet:
okay ja sorry kenne mich mit den tools hier noch nicht so aus...wie kann ich es denn besser lesbar machen Nilson? bzw. kann das nicht auch ein mod oder so schnell einfügen bevor ich mich da ewig nach suche...?!
 
["code"]["/code"] (ohne die "") drum. im erweiterten Editor die Schaltfläche #

@ ApeHunter

jo, die muss die if-Abfrage
 
In der erweiterten Editier-Ansicht bei den Tools - mittlere Zeile, drittes von rechts. Das Doppelkreuz/Raute/Hash-Symbol.

Edit: Mann, bin ich langsam :D
 
Im ersten Versuch teilst Du 51:2, natürlich ist dann das Ergebnis nicht 0 (Modulo) und er läuft in den Else-Ast (y==0) und steigt aus.

Ich würde die Schleife in sich schließen und erst am Schluß die if-Abfrage nach y==1 machen, dann läuft die Schleife zwar immer durch, aber die Erkennung ist 100%
 
Zuletzt bearbeitet:
Code:
#include <iostream.h>
#include <iomanip.h>
#include <conio.h>
#include <math.h>
 
int main()
{   //Primzahlen
 
    int zahl, x, y, z;
    
    cout << "Zahl: ";
    cin  >> zahl;
    
    if(zahl==0 || zahl==1)
    {
        cout << "Das gilt nicht!";
       return -1; //schöner als goto
    }
    
    
    for(x=2;x<=zahl-1;x++)
    {
        if(zahl%x==0)
        {
            y=1;
            break; // break hier hin
        }
        }//for hier zu machen

        if(y==1)
        {
            cout << "Keine Primzahl";
        }       
        
        else
        {
        cout << "Primzahl";
        }
    
     
    ende:;  
    
    
    cin.get();
    cin.get();
    return(0);
    
}
 
Zuletzt bearbeitet:
Also mit diesem Code sollte es funktionieren:
Code:
#include <iostream>
#include <cstdlib>

int main()
{
	int zahl=0;
	bool is_prime=true;

	std::cout << "Zahl: ";
	std::cin >> zahl;

	if (zahl < 2) std::cout << "Zahl muss > 1 sein!" << std::endl;

	else 
	{
     		for (int i = 2; i < zahl; i++) 
		     {
          			if ((zahl % i) == 0) is_prime = false;
     		}

     std::cout << is_prime << std::endl;
	}

	system("PAUSE");
	return 0;
}

Zu deinem Code:
1. die Überprüfung ob es eine Primzahl ist, muss aus der For-Schleife raus
2. Du solltest y initialisieren, da es bei dir nur mit einem Wert belegt wird, wenn es sich um keine Primzahl handelt
3. Du solltest dir "goto" abgewöhnen, das kann gerade bei größeren Projekten die übersichtlichkeit enorm verschlechtern wenn man die ganze Zeit im Code hin- und herspringt.
 
ah okay danke euch das hab ich sogar verstanden ^^ und zu meiner "Programmierart", ich bin froh wenn ich mit der Klausur fertig bin, da das Fach eigentlich eher weniger zum Studium passt (HWI=Wirtschaftsingenieurwesen) aber leider ist es Pflicht. Daher verzeiht mir wenn auf goto etc. zurückgreife...ich bin froh wenn es überhaupt läuft :D und ich plane auch nicht mich in Zukunft weiter damit zu beschäftigen...

Aber vielen Dank nochmal das hat geholfen!
 
Zuletzt bearbeitet:
Zurück
Oben