NEXT_Prime; PREV_PRIME; DISPLAY_PRIMES



  • Hallo Leute!

    Bräuchte kurz eure Hilfe.

    Ich muss in meinem Program für Menu 2,3 die Primzahl nach und bevor der angegeben Zahl finden.

    Bis jetzt bin ich hier angekommen aber komme nicht richtig weiter...

    #include <iostream>
    
    using namespace std;
    const int EXIT = 5;
    
    //Forward declare menu function
    void test_prime (int number);
    void next_prime (int number);
    void menu();
    
    int main()
    {
    
        int option = EXIT;
        int number;
    
        //Declare any other needed variables and constants here
    
        do
        {
    
            //Display the menu
    
            menu();
            cin >> option;
    
            //Read user option
    
            switch (option) {
                case 1: cout << "Test prime? ";
                    cin >> number;
                    test_prime(number);
                    break;
                case 2: cout << "Next Prime? ";
                    cin >> number;
                    next_prime(number);
                    break;
                case 3: cout << "Prev Prime? ";
                    break;
                case 4: cout << "N? ";
                    break;
                case 5: cout << "Exiting ...";
                    break;
                default:cout << "Wrong choice!!!";
                    break;
            }   //End of switch
    
            //Handle user option
        }
    
        while (option != EXIT);
        return 0;
    }
    
    void menu(){
        cout << "=================\n"
        "1. Test Prime\n"
        "2. Next Prime\n"
        "3. Prev Prime\n"
        "4. Display Primes\n"
        "5. Exit\n"
        "=================\n";
    
        cout << "\nYour Choice: ";
    }
    
    void test_prime (int number)
    {    bool prime = true;
    
        if (number < 2)
        {
            prime = false;
        }
    
        for (int i = 2; i <=number/2; i++){
            if (number%i == 0){
                prime =  false;
    
            }}
    
        if (prime) cout<<"Number is prime" << "\n";
        else cout << "Number is not prime" << "\n";
    }
    
    void next_prime (int number)
    {
        number++;
        for(int i = 2; number%i == 0; i++ )
        {
            if(number%i != 0)
            {
                break;
            }
            else
                number++;
        }
    
    }
    

  • Mod

    Du zählst so lange weiter/zurück, bis du auf eine Zahl stößt, für die dein Primzahltest aus 1 anschlägt.



  • Jo, und damit Du das überhaupt mitkriegst, solltest Du Deine Funktionen mit einem Rückgabewert ausstatten und auf den jeweiligen Test beschränken. Die Ausgabe des Resultats sollte der Aufrufer übernehmen.



  • Sieh hier, nur ein paar kleine Änderungen an Deinem Programm:

    #include <iostream>
    
    using namespace std;
    const int EXIT = 5;
    
    //Forward declare menu function
    bool test_prime (int number);
    int next_prime (int number);
    void menu();
    
    int main()
    {
    
        int option = EXIT;
        int number;
    
        //Declare any other needed variables and constants here
    
        do
        {
    
            //Display the menu
    
            menu();
            cin >> option;
    
            //Read user option
    
            switch (option) {
                case 1: cout << "Test prime? ";
                    cin >> number;
                    if(test_prime(number))
                       cout << "Number is prime\n";
                    else
                       cout << "Number is not prime\n";
                    break;
                case 2: cout << "Next Prime? ";
                    cin >> number;
                    cout << "\n Next prime: " << next_prime(number) << '\n';
                    break;
                case 3: cout << "Prev Prime? ";
                    break;
                case 4: cout << "N? ";
                    break;
                case 5: cout << "Exiting ...";
                    break;
                default:cout << "Wrong choice!!!";
                    break;
            }   //End of switch
    
            //Handle user option
        }
    
        while (option != EXIT);
        return 0;
    }
    
    void menu(){
        cout << "=================\n"
        "1. Test Prime\n"
        "2. Next Prime\n"
        "3. Prev Prime\n"
        "4. Display Primes\n"
        "5. Exit\n"
        "=================\n";
    
        cout << "\nYour Choice: ";
    }
    
    bool test_prime (int number)
    {    bool prime = true;
    
        if (number < 2)
        {
            prime = false;
        }
    
        for (int i = 2; i <=number/2; i++){
            if (number%i == 0){
                prime =  false;
    
            }}
    
        if (prime) return true;
        return false;
    }
    
    int next_prime (int number)
    {
        for(++number; !test_prime(number); ++number);
    
        return number;
    
    }
    

  • Mod

    Und lass bitte diesen single-point-of-exit-Quark:

    bool test_prime (int number)
    {
    
        if (number < 2)
        {
            return false;
        }
    
        for (int i = 2; i <=number/2; i++){
            if (number%i == 0){
                return false;
    
            }}
    
        return true;
    }
    

    Schwupps! Nicht nur übersichtlicher und eine Variable weniger, sondern auch zahlreiche unnötige Iterationen gespart.



  • Vielen Dank!!!

    War ja nicht schwieriger als so....

    Habt ihr eine gute Quelle um Prev_Prime zu berechnen?



  • Ja! Nimm als Quelle next_prime!



  • Belli schrieb:

    Ja! Nimm als Quelle next_prime!

    Einfach nur den Gegenteil?



  • Du solltest darüber nachdenken, Dir eine andere Beschäftigung zu suchen.



  • Ich weiss das ist nicht meine stärkste Seite aber hab nur seit zwei Wochen damit angefangen.



  • Kann mir irgendjemand weiterhelfen??

    Es geht um die Prev_prime, also die letzte Primzahl und Display_prime, also die Primzahlen zwischen [1,N].

    Wäre sehr dankbar!!!



  • Harry1990 schrieb:

    Kann mir irgendjemand weiterhelfen??

    Es geht um die Prev_prime, also die letzte Primzahl und Display_prime, also die Primzahlen zwischen [1,N].

    Wäre sehr dankbar!!!

    Jetzt funktioniert Prev_prime!



  • Kann irgendjemand mir weiterhelfen?
    Prev_prime funktioniert nicht richtig wie es sollte....

    #include <iostream>
    
    using namespace std;
    const int EXIT = 5;
    
    //Forward declare menu function
    bool test_prime (int number);
    int prev_prime (int number);
    int next_prime (int number);
    void menu();
    
    int main()
    {
    
        int option = EXIT;
        int number;
    
        //Declare any other needed variables and constants here
    
        do
        {
    
            //Display the menu
    
            menu();
            cin >> option;
    
            //Read user option
    
            switch (option) {
                case 1: cout << "Test prime? ";
                    cin >> number;
                    if(test_prime(number))
                        cout << "Number is prime\n";
                    else
                        cout << "Number is not prime\n";
                    break;
                case 2: cout << "Next Prime? ";
                    cin >> number;
                    cout << "\nNext prime: " << next_prime(number) << '\n';
                    break;
                case 3: cout << "Prev Prime? ";
                    cin >> number;
                        cout << (prev_prime(number));
                        cout << "There's no previous prime";
                        cout << "\nPrevious prime of " << number << " is " << next_prime(number) << '\n';
                    break;
                case 4: cout << "N? ";
    
                    break;
                case 5: cout << "Exiting ...";
                    break;
                default:cout << "Wrong choice!!!";
                    break;
            }   //End of switch
    
            //Handle user option
        }
    
        while (option != EXIT);
        return 0;
    }
    
    void menu(){
        cout << "=================\n"
        "1. Test Prime\n"
        "2. Next Prime\n"
        "3. Prev Prime\n"
        "4. Display Primes\n"
        "5. Exit\n"
        "=================\n";
    
        cout << "\nYour Choice: ";
    }
    
    bool test_prime (int number)
    {
        if (number)
        {
            return false;
        }
    
        for (int i = 2; i <=number/2; i++){
            if (number%i == 0){
                return false;
    
            }}
    
            return true;
    }
    
    int next_prime (int number)
    {
        for(++number; !test_prime(number); ++number);
    
        return number;
    }
    
    int prev_prime (int number)
    {
        int oldPrime = number;
    
        if (number <= 2)
        {
            return false;
        }
            else {
                while (true) {
                if (test_prime (number) && number < oldPrime ){
                    return number;
                } --number;
            }
        }
    }
    


  • Du hast, warum auch immer, Deine test_prime - Funktion verhunzt.
    Damit funktioniert auch Test Prime und Next Prime natürlich nicht mehr.

    Sag mal: Was von dem ganzen Zeug hast Du selbst geschrieben und was hast Du von woanders her bekommen?
    Ich rate mal: Die main - Funktion und die menu - Funktion sind nicht von Dir.



  • Du solltest das wirklich in das C++-Forum schreiben:
    https://www.c-plusplus.net/forum/f15

    Wenn du regelmässig Probleme mit einer kritischen Funktion bekommst, würdest du üblicherweise automatisch prüfen, ob sie noch richtig funktioniert. Zum Beispiel etwa so:

    #define UNIT_TEST(e) \
        if (!(e)) { cout << "Unit test " << #e << " failed in line " << __LINE__ << endl; return 1; }
    
    int main()
    {
        ...
        UNIT_TEST(test_prime(1) == false);
        UNIT_TEST(test_prime(2) == true);
        UNIT_TEST(test_prime(100) == false);
        UNIT_TEST(test_prime(101) == true);
    }
    

    Auf diese Weise wäre dir aufgefallen, wo das Problem liegt.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (alle ISO-Standards) in das Forum C++ (alle ISO-Standards) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten