Suche den entscheidenden Tipp....



  • Halo,

    der Code tut FAST, was er soll. Warum listet er die 3 nicht als Primzahl, egal, wie ich an den Schleifenwerten rumfummele?

    #include <iostream>
    using namespace std;
    #include <string>
    #include <vector>
    #include <cstdio>
    #include <math.h>
    #include <stdbool.h>
    
    bool primzahl(); // Deklaration der Funktion
    bool primzahl(int x)// Bool Primzahlprüfung
    {
        int z = 1;
        int y;
        do
        {
            z=z+2;
            y = x%z;
        } while ((z < pow(x, 0.5)) && (y != 0));
    
        return (y > 0);
    }
    
    int main(int argc, const char * argv[])
    {
        for (int i=1;i<=20;i=i+2)
        {
            cout<<"Länge = "<<i<<" "<<endl;
            for (int index=i;index>0;index=index-2)
               {
                   bool c = primzahl(index);
                   switch (c)
                   {
                       //case false: cout << "uNPZ.\n ";  break;
                       case true: cout<<index<<" Prim. \n";
                   }
                }
            cout<<" "<<endl;
        }
        return 0;
    }
    


  • otto56 schrieb:

    Halo,

    der Code tut FAST, was er soll. Warum listet er die 3 nicht als Primzahl, egal, wie ich an den Schleifenwerten rumfummele?

    Mit "rumfummeln" wirst du keine Probleme lösen! Überlege doch lieber, was passiert, wenn du pimzahl(3) berechnest. z=1, nach dem Eintritt in die do-Schleife wird 2 addiert, also z=3. 3%3 ist 0. Also ist y=0. Du könntest das z.B. lösen, indem du aus do...while ein while... machst und die Abbruchbedingung zuerst überprüfst. Die Wurzel solltest du übrigens nur 1x berechnen und dann speichern, nicht bei jedem Schleifendurchlauf. Außerdem fehlt irgendwie eine Prüfung, ob x überhaupt ungerade ist...

    Außerdem:

    #include <iostream>
    using namespace std;
    #include <string>
    #include <vector>
    #include <cstdio>
    #include <math.h>
    #include <stdbool.h>
    

    Du brauchst hier nur iostream und math.h (oder cmath). Woher kennst du stdbool.h? Der ist in C++ total überflüssig.

    bool primzahl(); // Deklaration der Funktion
    

    Wasn das schon wieder? Was willst du mit einer Funktion primzahl() ohne Parameter anfangen?! Zumal du sie ja auch gar nicht implementierst!



  • wob schrieb:

    bool primzahl(); // Deklaration der Funktion
    

    Wasn das schon wieder? Was willst du mit einer Funktion primzahl() ohne Parameter anfangen?! Zumal du sie ja auch gar nicht implementierst!

    Dirk Louis, C++ s. S. 125 "Eine Funktion muß vor ihrem Aufruf deklariert sein, sonst kann der Compiler nichts mit dem Funktionsnamen anfangen."



  • bool primzahl(); // Deklaration der Funktion 
    bool primzahl(int x)// Bool Primzahlprüfung
    

    Hatten wir das nicht alles schon in deinem anderen Thema?
    Die Signaturen deiner Funktionen stimmen wieder nicht überein.

    Ich rate dir dringed noch mal dorthin zurück zu gehen und nochmal zu lesen und auch zu verstehen!



  • ich hab es so gemacht:

    bool primzahl(int x)// Bool Primzahlprüfung
    {
        int z = 3;
        int y;
       y = x%z;
        if (y==0 && x==3) //die Prüfung nur bei x=3 außer kraft setzen.
            y=1;
    
        while ((z < pow(x, 0.5)) && (y != 0))
        {
        z=z+2;
        }
        return (y > 0);
    }
    


  • temitemi schrieb:

    bool primzahl(); // Deklaration der Funktion 
    bool primzahl(int x)// Bool Primzahlprüfung
    

    Hatten wir das nicht alles schon in deinem anderen Thema?
    Die Signaturen deiner Funktionen stimmen wieder nicht überein.

    Ich rate dir dringed noch mal dorthin zurück zu gehen und nochmal zu lesen und auch zu verstehen!

    Hab gelöscht, war hier nur per drag und drop erschienen ...


  • Mod

    otto56 schrieb:

    ich hab es so gemacht:

    bool primzahl(int x)// Bool Primzahlprüfung
    {
        int z = 3;
        int y;
       y = x%z;
        if (y==0 && x==3) //die Prüfung nur bei x=3 außer kraft setzen.
            y=1;
        
        while ((z < pow(x, 0.5)) && (y != 0))
        {
        z=z+2;
        }
        return (y > 0);
    }
    

    Das ist ja schön für dich, aber hast du es auch einmal ausprobiert?



  • Ich nehme an, der Fehler liegt hier:

    int z = 1;
        int y;
        do
        {
            z=z+2;
    

  • Mod

    Als die beiden Hauptprobleme würde ich identifizieren:
    1. Konkret dieser Code: Mehr als die Hälfte der Funktion hat keinerlei Einfluss auf das Ergebnis! Die ganze z-Geschichte macht überhaupt nichts.
    2. Allgemein: Da ist überhaupt kein Konzept erkennbar, wie man Primzahlen erkennt. Die Vorgehensweise scheint nicht gewesen zu sein "Eine Primzahl ist als [...] definiert, ich setze nun diese Definition um", sondern

    vermutlicher Gedankengang schrieb:

    Primzahlen sind ungerade, also nehme ich alle geraden Zahlen heraus. Upps, 2 ist ja auch eine Primzahl, also frickele ich irgendetwas rum. Primzahlen sind auch nocht durch 3 teilbar, also nehme alle Zahlen raus, die nicht durch drei teilbar sind.

    Upps, 3 ist ja auch eine Primzahl! Also frickele ich irgendwas rum, um 3 reinzunehmen.

    Somit habe ich 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31. Passt also! Fertig.



  • ich brauch die 2 nicht, deswegen konnte ich es so machen, bislang funktioniert alles ...

    Danke Das mit dem while habe ich umgesetzt



  • otto56 schrieb:

    ich brauch die 2 nicht, deswegen konnte ich es so machen, bislang funktioniert alles ...

    Danke Das mit dem while habe ich umgesetzt

    Keine Ahnung wie dein aktueller Code ausschaut, aber der Primzahltest aus dem Beitrag von 13:01 funktioniert nicht.

    #include <iostream>
    #include <math.h>
    #include <time.h>
    
    bool primzahl(int x)// Bool Primzahlprüfung
    {
        int z = 3;
        int y;
       y = x%z;
        if (y==0 && x==3) //die Prüfung nur bei x=3 außer kraft setzen.
            y=1;
    
        while ((z < pow(x, 0.5)) && (y != 0))
        {
        z=z+2;
        }
        return (y > 0);
    }
    
    // main habe ich etwas aufgeräumt...
    int main(int argc, char *argv[])
    {
        clock_t start;
        start = clock();
    
        for (int i = 0; i < 1000; i++)
        {
            if (primzahl(i))
            {
                std::cout << i << std::endl;
            }
        }
    
        std::cout << clock() - start / CLOCKS_PER_SEC << " ms\n";
    }
    

    Ergebnis für die ersten Zahlen:

    1
    2
    3
    4
    5
    7
    8
    10
    11
    13
    14
    16
    17
    19
    20

    Edit: Nur der Vollständigkeit halber. Es ist mir schon klar, dass die Funktion in deinem Programm das nicht leistet, aber von einer Funktion mit so einer Signatur und dem Kommentar:

    bool primzahl(int x)// Bool Primzahlprüfung
    

    erwarte ich, dass sie genau das tut, nämlich jede beliebige ganze Zahl, darauf zu prüfen ob sie eine Primzahl ist.


Log in to reply