Hilfe: Programm funktioniert nicht wenn ein cout befehl fehlt



  • Ich fange gerade an C++ zu lernen und hatte mir das Ziel gesetz ein Programm zu schreiben welches Tested ob eine Zahl eine Primzahl ist.
    Nach einigem rumprobieren funktionierte das Programm dann auch, aber wenn ich einen bestimmten (zu testzwecken genutzten) cout Befehl lösche funktioniert das Programm nicht mehr.
    Zusätzlich funktioniert es nicht wenn ich den Debug Modus benutze. (Also nur in Release Modus)
    Ich benutze Code::Blocks version 12.11.
    Der problematische cout Befehl liegt in Zeile 53.
    Ich kann einfach nicht verstehen warum das Programm ohne diesen Befehl nicht funktioniert.
    LG
    Sven

    //PrimzahlenTest
    #include <iostream>
    using namespace std;
    
    int iswhole(float number);
    int isprime(float in);
    
    int main()
    {
    //VAR
    float x;
    
    cout << "Primzahlentester\nGeben sie die Zahl ein!" << endl;
    cin >> x;
    
    cout << isprime(x) << endl;
    
    int zz;
    cout << "Geben sie eine belibige Zahl + ENTER ein" << endl;
    cin >> zz;
    
    return 0;
    }
    int iswhole(float number)
    {
        bool truefalse;
    
        while(number >= 1)
        {
            number--;
        }
        if(number==0)
        {
        truefalse = 1;
        }
        else
        {
        truefalse = 0;
        }
        return truefalse;
    
    }
    int isprime(float input)
    {
    bool bprime=0;
    int sum;
    int loop = input-1;
    float test;
    
    while(loop > 1)
     {
        test = input/loop;
        cout <<""; //<--Wenn ich diese Zeile lösche funktioniert das Programm nicht mehr :(
        sum+=iswhole(test);
        loop--;
     }
    if (sum==0)
        {
        bprime = 1;
        }
    return bprime;
    }
    


  • Hier erstmal der Code für mitlesende, formatiert und in die passenden Tags gesetzt.

    //PrimzahlenTest 
    #include <iostream> 
    using namespace std; 
    
    int iswhole(float number); 
    int isprime(float in); 
    
    int main() 
    { 
    	//VAR 
    	float x; 
    
    	cout << "Primzahlentester\nGeben sie die Zahl ein!" << endl; 
    	cin >> x; 
    
    	cout << isprime(x) << endl; 
    
    	int zz; 
    	cout << "Geben sie eine belibige Zahl + ENTER ein" << endl; 
    	cin >> zz; 
    }
    
    int iswhole(float number) 
    { 
        bool truefalse; 
    
        while(number >= 1) 
            number--; 
    
        if(number==0) 
    		truefalse = 1; 
    
        else 
    		truefalse = 0; 
    
        return truefalse; 
    
    }
    
    int isprime(float input) 
    { 
    	bool bprime=0; 
    	int sum; 
    	int loop = input-1; 
    	float test; 
    
    	while(loop > 1) 
    	{ 
    		test = input/loop; 
    		cout <<""; //<--Wenn ich diese Zeile lösche funktioniert das Programm nicht mehr :( 
    		sum+=iswhole(test); 
    		loop--; 
    	} 
    
    	if (sum==0) 
    		bprime = 1; 
    
    	return bprime; 
    }
    


  • "Funktioniert nicht" ist keine Fehlerbeschreibung. Genaue Fehlermeldung?



  • cout <<""; //<--Wenn ich diese Zeile lösche funktioniert das Programm nicht mehr :(
    

    Das ist nicht möglich. Dieses Statement hat praktisch überhaupt keine Auswirkung auf dein Programm.
    Gib mal eine genaue Fehlerbeschreibung. Ich versuche gleich mal, das Programm zu starten und sehe es mir an.

    Ein Problem bei deinem Code ist, dass du Fließkommazahlen verwendest, obwohl du das überhaupt nicht brauchst - und dadurch alles durcheinander bringst. Wieso verwendest du also float statt unsigned ?



  • Jonas OSDever schrieb:

    "Funktioniert nicht" ist keine Fehlerbeschreibung. Genaue Fehlermeldung?

    Das Programm giebt anstelle von entweder 0 oder 1 (Primzahl oder Keine Primzahl)
    nur 0 aus egal ob es eine Primzahl ist oder nicht.



  • cout<<""; verwendet man gerne, um den Optimierer in die Knie zu zwingen. Damit leere Schleifen nicht wegoptimiert werden.

    Dein Prog bewertet 7 bei mir im Debug-Modus als Primzahl und im Release-Modus als Nicht-Primzahl.

    Das deutet darauf hin, daß Du was gemacht hast, was undefiniertes Verhalten erzeugt. Auf Anhieb sehe ich, daß sum nicht initialisiert wurde. Ob's das schon war?



  • Du hast zumindest mal einen klassischen Anfängerfehler gemacht: error C4700: uninitialized local variable 'sum' used



  • Sone schrieb:

    cout <<""; //<--Wenn ich diese Zeile lösche funktioniert das Programm nicht mehr :(
    

    Das ist nicht möglich. Dieses Statement hat praktisch überhaupt keine Auswirkung auf dein Programm.
    Gib mal eine genaue Fehlerbeschreibung. Ich versuche gleich mal, das Programm zu starten und sehe es mir an.

    Ein Problem bei deinem Code ist, dass du Fließkommazahlen verwendest, obwohl du das überhaupt nicht brauchst - und dadurch alles durcheinander bringst. Wieso verwendest du also float statt unsigned ?[/quote]
    Das Programm giebt (egal ob Primzahl oder nicht) nur 0 aus anselle von 0 (Keine Primzahl) oder 1 (Primzahl)
    Es funktioniert aber auch nicht im Debug modus.

    Sone schrieb:

    Ein Problem bei deinem Code ist, dass du Fließkommazahlen verwendest, obwohl du das überhaupt nicht brauchst - und dadurch alles durcheinander bringst. Wieso verwendest du also float statt unsigned ?

    Ich habe (wie bereits gesagt) gerade erst angefangen C++ zu lernen.
    Ich wusste bis gerade noch nicht einmal das es etwas wie unsigned giebt.



  • volkard schrieb:

    Auf Anhieb sehe ich, daß sum nicht initialisiert wurde. Ob's das schon war?

    initialisieren heiß Wert zuweißen, oder ?
    Jedenfalls funktioniert das Programm jetzt, habe einfach.

    int sum;
    

    zu

    int sum=0;
    

    geändert und jetzt Funktioniert es.
    Danke für helfen.



  • Du hast ja schon deine Antwort gehabt. Uninitialisierte Variable. Aber wie gesagt, der Rest des Programms ist auch nicht gerade der beste. Warum ein rekursiver Ansatz fuer Primzahlen? Warum float?

    EDIT: Ich brauch ne Brille oder n groesseren Bildschirm...

    bool isPrime(unsigned number)
    {
        if(number < 2)
             return false;
    
        for(unsigned i = 2; i < number; ++i)
            if(number % i == 0)
                return false;
    
        return true;
    }
    


  • Aspecsi schrieb:

    Sone schrieb:

    cout <<""; //<--Wenn ich diese Zeile lösche funktioniert das Programm nicht mehr :(
    

    Das ist nicht möglich. Dieses Statement hat praktisch überhaupt keine Auswirkung auf dein Programm.
    Gib mal eine genaue Fehlerbeschreibung. Ich versuche gleich mal, das Programm zu starten und sehe es mir an.

    Ein Problem bei deinem Code ist, dass du Fließkommazahlen verwendest, obwohl du das überhaupt nicht brauchst - und dadurch alles durcheinander bringst. Wieso verwendest du also float statt unsigned ?

    Das Programm giebt (egal ob Primzahl oder nicht) nur 0 aus anselle von 0 (Keine Primzahl) oder 1 (Primzahl)
    Es funktioniert aber auch nicht im Debug modus.

    Sone schrieb:

    Ein Problem bei deinem Code ist, dass du Fließkommazahlen verwendest, obwohl du das überhaupt nicht brauchst - und dadurch alles durcheinander bringst. Wieso verwendest du also float statt unsigned ?

    Ich habe (wie bereits gesagt) gerade erst angefangen C++ zu lernen.
    Ich wusste bis gerade noch nicht einmal das es etwas wie unsigned giebt.[/quote]
    vergiss erstmal unsigned.
    denk dir sones vorschlag mit int.
    "wieso verwendest du float statt int" wäre dann die frage.



  • Jonas OSDever schrieb:

    Warum ein rekursiver Ansatz fuer Primzahlen?

    Da haste aber geschielt, alös Du den rekursiven Ansatz im Programm erkannt hast.



  • Ach Mist, hab statt iswhole isprime gelesen.



  • @Jonas OSDever
    Ich sehe das doch richtig das unsigned(int) für ganze positive zahlen ist, Richtig ?
    Ich habe einfach versucht (zu übungszwecken) selber ein Programm zu schreiben das Priemzahlen als solche kennzeichnen kann.
    Ich hatte zuerst einen ganz Falschen ansatz um die Primzahlen zu erkennen,
    daher die unnötigen float Variabeln.
    Ich werde den Code wohl noch einmal aufräumen müssen. 🙂
    Danke auch dir für die Hilfe .



  • ...



  • 1 (Primzahl)

    Ich glaube, ich habe dich missverstanden.

    Edit: Ja, habe ich. Hätte ich dir auch nicht zugetraut, nie nie.



  • ...



  • P.S.: unsigned ist die Kurzform von unsigned int , und unsigned int ist praktisch int - nur dass keine negativen Zahlen gespeichert werden können, und sich dadurch der Wertebereich für positive Zahlen verdoppelt.


Anmelden zum Antworten