Denkfehler in if-Schleife



  • Hallo!
    Ich habe ein kleines Problem. Ich möchte gerne einen Zahlenbereich definieren und überprüfen, ob sich in diesem Zahlenbereich Primzahlen befinden. Das klappt soweit. Nun will ich aber verhindern, dass der Benutzer meinetwegen einen Zahlenbereich von 8-10 definiert und damit gar keine Primzahlen darin enthalten sind. Irgendwie komme ich aber nicht darauf, wie ich diese Bedingung mit meinem vorhandenen Code setzen muss.

    Folgend die beiden Funktionen....dass das mit dem else if nicht klappt ist irgendwie klar, denn wenn die erste Zahl die er durchläuft keine Primzahl ist bricht er sofort ab. Aber wie macht man es????

    Vielen Dank für eine Rückmeldung!

    [code]bool RSA::prime(double a)
    {
    	if (a==1) return false;
    	if (a==2) return true;
    
    	double falseee= fmod(a,2);
    	if (falseee==0) return false;
    
    	double s;
    	s= sqrt(a);
    
    	for(int i = 3; i <= s; i+=2)
    	{
    		double falsee = fmod(a,i);
    		if (falsee==0) return false;
    	}
    
    return true;
    }[/code]
    
    [code]unsigned long int RSA::Generieren()
    {
    	unsigned long int klein;
    	unsigned long int groß;
    	cout << "Definieren Sie einen Zahlenbereich in dem die Primzahlen generiert werden sollen!" << endl;
    	cout << endl;
    	cout << "Geben Sie die unterste Zahl des Zahlenbereiches ein: " << endl;
    	cin >> klein;
    	cout << "Geben Sie die oberste Zahl des Zahlenbereiches ein: " << endl;
    	cin >> groß;
    
    	for(int k=klein; k<=groß; k++)
    	{
    			if (prime(k)==true)
    			cout << k << " ,";	
    
    		//else if (prime(k)==false)	
    		//{
    		//	cout << "In diesem Zahlenbereich befinden sich keine Primzahlen!" << endl;
    		//	cout << "Starten Sie erneut mit der Eingabe!" << endl;
    		//	Generieren();
    		//}
    
    	}
    	cout << endl;
    
    	cin.ignore(1,'\n');
    	return 0;
    }[/code]
    

  • Mod

    unsigned long int RSA::Generieren()
    {
     bool primzahl_gefunden=false;
     do
     {
        unsigned long int klein;
        unsigned long int groß;
        cout << "Definieren Sie einen Zahlenbereich in dem die Primzahlen generiert werden sollen!" << endl;
        cout << endl;
        cout << "Geben Sie die unterste Zahl des Zahlenbereiches ein: " << endl;
        cin >> klein;
        cout << "Geben Sie die oberste Zahl des Zahlenbereiches ein: " << endl;
        cin >> groß;
        for(int k=klein; k<=groß; k++)
        {
                if (prime(k)==true)
                {
                  cout << k << " ,";   
                  primzahl_gefunden=true;
                }
        }
        if !(primzahl_gefunden)
        {
            cout << "In diesem Zahlenbereich befinden sich keine Primzahlen!" << endl;
            cout << "Starten Sie erneut mit der Eingabe!" << endl;
        }
     } while (!primzahl_gefunden)
     cout << endl;
    
     cin.ignore(1,'\n');
     return 0;
    }
    

    Wie kommt man auf so etwas? Im Prinzip durch Nachdenken. Wenn man dabei Hilfe benötigt, dann haben die Informatiker auch allerlei Hilfsmittel entwickelt, z.B. Flussdiagramme oder etwas moderner das Struktogramm. Wobei all diese Dinge hier maßlos übertrieben wären, solche Probleme mit ein oder zwei Verschachtelungen muss man im Kopf lösen können. Also: Üben!





  • @matze
    muss nicht sein oder?

    @sepp

    Ich bin doch kein Informatiker 😞

    "nur" Maschinenbauer.....

    Kleine Anmerkung:

    Es fehlt ein Semilkolon und das eine Ausrufezeichen in der if-Bedingung müsste so aussehen:

    if (!....)

    Vielen herzlichen Dank! Nun bin ich fertig mit den Nerven und mit meinem Beleg-den ich ja nun schon seit 1 1/2 Jahren zu liegen habe 😉 .
    400 Zeilen C++ Code in Form eines kleinen RSA-Programmes, welches auch noch funktioniert-da kann ich doch froh sein-vor allem, da ich vorher keinen Blassen von der Programmiererei hatte.....yippi 😃



  • miri schrieb:

    @matze
    muss nicht sein oder?

    Klar muss das sein. Ist doch witzig, reg' dich nicht auf. 🙂



  • aber ich hatte ein ernstzunehmendes Problem und wollte endlich mal fertig werden! Deshalb muss es nicht sein!^^


  • Mod

    miri schrieb:

    aber ich hatte ein ernstzunehmendes Problem und wollte endlich mal fertig werden! Deshalb muss es nicht sein!^^

    Doch! Es ist wichtig, sich erstens richtig auszudrücken (sonst wird man nicht ernst genommen) und zweitens sich genau auszudrücken (sonst wird man nicht verstanden). Die if-Schleife ist der erste Schritt auf einem Pfad, der dich vom rechten Weg abbringt. Es ist gut für dich, wenn dir dieser Fehler ausgetrieben wurde.



  • Woher soll ich denn solche Dinge wissen, wo ich doch kein Informatiker bin:-).

    Ich würde gerne mal wissen, ob Du das Wort Schraubenzieher benutzt;-).....na ja anyway nun!



  • Ja klar, ich hab son Ding mit dem kan nich Schrauben auch Ziehen 🙂

    Abgesehen davon, warum nimmst du double ? Gibts Primzahlen nun auch schon mit Nachkommastellen?



  • Das mit dem Double ist so ein Problem......ich muss das irgendwie machen, weil ich ja die Wurzel ziehen will.....und außerdem fmod verwende.

    Wenn Du einen besseren Vorschlag hast bin ich dafür natürlich offen^^!



  • Schraubenzieher ist Volksmund, "if Schleife" ist nur Blödsinn.

    Ich möchte mal wissen wo das herkommt, bzw. warum sich das so hartnäckig hält. Ich lese das immer nur von Anfängern, hab es noch nie in einem Tutorial, einer Doku, einem Artikel oder ähnlichem gelesen.



  • Ich meine wir können ja nun anfangen zu philosophieren.^^
    If-Schleife würde ich auch als Volksmund abstempeln-zumindest für die Leute, die keine Informatiker sind und sich nicht näher mit dem Thema beschäftigen. Eben genau wie Schraubenzieher.....



  • miri schrieb:

    Das mit dem Double ist so ein Problem......ich muss das irgendwie machen, weil ich ja die Wurzel ziehen will.....

    sqrt(static_cast<double>(a));
    

    und außerdem fmod verwende.

    Modulo-Operator.

    If-Schleife würde ich auch als Volksmund abstempeln-zumindest für die Leute, die keine Informatiker sind und sich nicht näher mit dem Thema beschäftigen.

    Die meisten Leute wissen, was ein Schraubenzieher ist und was man mit ihm macht. Wie viele haben schon mal was programmiert? Wie viele davon sagen if-Schleife?



  • Seit wann spricht der Volksmund über Informatik (bzw. hier "falsche" Informatik)?

    Zudem kannst du int nehmen, du brauchst weder fmod() (du kannst nämlich einfach a % b schreiben, wenn es sich um ints handelt) noch brauchst du wegen sqrt() gleich mit doubles zu rechnen.

    int limit = static_cast<int>(sqrt(static_cast<double>(number)));  //Abrunden reicht aus
    

    EDIT: zu spät 😃
    P.S.: Was ist denn nun am Schraubenzieher falsch (Außer vom reinen Wortsinn her)?



  • hustbaer schrieb:

    Ich lese das immer nur von Anfängern, hab es noch nie in einem Tutorial, einer Doku, einem Artikel oder ähnlichem gelesen.

    Vielleicht sind das alles Klettverschlussträger, die einfach nicht mehr wissen, was eine Schleife ist.


  • Administrator

    http://de.wikipedia.org/wiki/Schraubenzieher#Geschichte_und_Bezeichnung

    Schraubenzieher ist nicht mal Volksmund sondern gewollt und gab es noch vor Schraubendreher. If-Schleife ist einfach nur falsch, gab es nie, ist nicht gewollt, ist falsch, wird nicht im Volksmund verwendet, usw.

    Im übrigen: Was ist ein Informatiker? Das darf sich ja jeder schimpfen.

    Grüssli



  • Mach stattdessen einfach i * i <= a;



  • 314159265358979 schrieb:

    Mach stattdessen einfach i * i <= a;

    Das muss ja dann jedes Mal geprüft werden. Lohnt sich auf Dauer wahrscheinlich nicht.



  • Hm, da hast du wohl Recht. 🙂



  • Vielen Dank für die Tipps bezüglich dem Wurzel ziehen aus einem Integer. Das kannte ich noch nicht und muss es ja nun auch nicht verstehen. Klappt aber super!

    @dravere
    na ja.....also Wikipedia....

    und: Informatiker ist eben genauso Volksmund......jeder der von Informatiker spricht meint eigentlich wohl einen Programmierer:-)^^

    Ich würde mich beides nicht "schimpfen"-bin kein Programmierer und auch kein Informatiker, sondern habe Maschinenbau studiert, wobei ein Teil meines Masterstudiums auch Programmieren enthielt. Ich beschäftige mich eher mit tribologischen Fragestellungen und weiß auch nicht, warum man sich aufregen muss über irgendwelche Begrifflichkeiten in einem Forum von einem "Nicht-Programmierer"^^. Ich würde ja gerne mal hören wie ihr über Reibung und Verschleiß referieren würdet:-).

    Danke trotzdem des Hinweises. Ich werde mir merken, dass es wohl if-Bedingung heißt. Gibt es eigentlich eine for-Schleife?? 🙂


Anmelden zum Antworten