Probleme bei Tutorial (Programm zur Auflistung aller Primzahlen von 1 bis 100)



  • Hallo allerseits,

    ich arbeite gerade ein C++-Tutorial durch und bin noch sehr weit am Anfang. Als Aufgabe soll hier ein Programm geschrieben werden, dass alle Primzahlen von 2 bis 100 aufzählt. Wenn ich das Programm bei mir starte, dann zählt das Programm allerdings alle Zahlen von 2 bis 100 auf und nicht nur die Primzahlen. Nachdem ich schon ewig den Fehler suche und kleine Änderungen vornehme, muss ich jetzt aufgeben, es sei denn jemand von euch kann mir helfen.

    Falls Ihr mehr Infos braucht, sagt einfach Bescheid.

    Danke schon mal im Voraus

    #include <iostream>
    #include <windows.h>
    
    using namespace std;
    
    bool istPrim(int Zahl);
    
    int main()
    {  
      bool Prim;
      int Zahl=2;
    
      while (Zahl<=100)
      {
            Prim=istPrim(Zahl);
            if(Prim=true)
              cout<<Zahl<<" ist eine Primzahl"<<endl;
            else
            ;
            Zahl=Zahl+1;
      };
    
      system("PAUSE");
    
      return 0;   
    };
    
    bool istPrim(int Zahl)
    {
         bool Prim=true;
    
         for (int i=2;i<=Zahl-1;i=i+1)
         {
             if(Zahl%i==0)
              {
                Prim=false;
                break;
              }
         }  
      return Prim;  
    };
    


  • Zeile 16: if( Prim == true ) // muss '==' statt '=' heißen



  • jango157 schrieb:

    if(Prim=true)
    

    ist die Wurzel allen übels. Das muss Prim == true heißen.
    Abgesehen davon: hast du den Code 1:1 vom Tutorial kopiert? Konstrukte wie ... <= Zahl -1 machen mir irgendwie Angst...

    EDIT: Menno, wär ich nur 22 Sekunden schneller gewesen 😞



  • Hi.

    Zeile 16: Du machst eine Zuweisung, keinen Vergleich (= statt ==)

    gruß
    syntax

    [EDIT] Wenn der Lehrer nicht immer die Runde gehen würde, wär isch der schnellste gewesen. 🕶

    gruß
    syntax


  • Mod

    Apropos der Schnellste:

    cout << "2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97\n";
    

    ?



  • Hallo,
    also erstmal Ihr seid ja echt der Hammer! Großes Kompliment von mir für die extrem schnellen Antworten (Und dann auch noch die Richtigen!!!).

    Und zur möglichen 1:1 Kopie. Nachdem mein vollkommen selbst geschriebenes progrämmchen nicht funktioniert hat, habe ich mich tatsächlich immer mehr dem vorgegeben Teil aus dem Tutorial angenähert (zumindest bei der Funktion unten).

    PS: warum macht dir <=Zahl-1 Angst?

    Vielen vielen dank an alle



  • jango157 schrieb:

    PS: warum macht dir <=Zahl-1 Angst?

    Vielen vielen dank an alle

    Mir machts zwar keine Angst, aber ich finde <Zahl schöner und kürzer. 🙂

    gruß
    syntax



  • Ich finde < Zahl auch schöner. Und was nicht schön ist macht mir Angst 😃

    Abgesehen davon:

    if(...)
        cout << "foo";
    else
    ;
    

    Das ist auch unschön. Das else dürfte zwar von jedem schlauen Compiler wegoptimiert werden, aber warum schreibst du das überhaupt hin um dann ne leere Anweisung draus zu machen?

    EDIT:

    Zahl=Zahl+1;
    

    Auch unschön.



  • SeppJ schrieb:

    Apropos der Schnellste:

    cout << "2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97\n";
    

    ?

    Kann ich überbieten:

    puts("2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97\n");
    

    😃


  • Mod

    hustbaer schrieb:

    Kann ich überbieten:

    Das würde ich mal messen (mein Rechner ist aber im Moment zu ausgelastet für Benchmarks). ostream::operator<< ist schließlich überladen für C-Strings, daher sollte das eigentlich das gleiche sein.



  • SeppJ schrieb:

    hustbaer schrieb:

    Kann ich überbieten:

    Das würde ich mal messen (mein Rechner ist aber im Moment zu ausgelastet für Benchmarks). ostream::operator<< ist schließlich überladen für C-Strings, daher sollte das eigentlich das gleiche sein.

    Es ging glaub' ich nicht um die Geschwindigkeit sondern um die Anzahl der Zeichen...

    Abgesehen davon muss die Aufgabe ja Berechnung aller Primzahlen von ... heißen.



  • Nö mir ging's schon um die Geschwindigkeit 🤡

    SeppJ schrieb:

    hustbaer schrieb:

    Kann ich überbieten:

    Das würde ich mal messen (mein Rechner ist aber im Moment zu ausgelastet für Benchmarks). ostream::operator<< ist schließlich überladen für C-Strings, daher sollte das eigentlich das gleiche sein.

    Na gut, dann halt

    static const char tfpnutoh[] = "2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97\n";
    fwrite(tfpnutoh, 1, sizeof(tfpnutoh) - 1, stdout);
    

    🤡 🤡


  • Mod

    Jetzt kommen wir dem Ziel einer nicht nur absichtlich falsch verstandenen sondern auch absolut unleserlichen Lösung näher. 👍

    P.S.: In C++ natürlich cout.write(...). Den dadurch erzeugten Overhead beim Startup für die Konstruktion des cout-Objektes würde nicht nicht mitzählen.



  • Ich glaub nicht das er noch irgendwas von dem Zeugs versteht, was ihr schreibt :p .



  • Da sein Problem ja schon gelöst wurde, sollte das OK gehen. Behaupte ich mal. Wenn nicht einfach schreien.

    Man könnte jetzt ne TMP Version basteln. Also komplett inklusive Konvertierung ins Dezimalsystem und Konkatenierung der Ergebnisse.

    fwrite(black_template_magic_primes<100>::str, 1, black_template_magic_primes<100>::strlen, stdout);
    


  • hustbaer schrieb:

    Da sein Problem ja schon gelöst wurde, sollte das OK gehen. Behaupte ich mal. Wenn nicht einfach schreien.

    Man könnte jetzt ne TMP Version basteln. Also komplett inklusive Konvertierung ins Dezimalsystem und Konkatenierung der Ergebnisse.

    fwrite(black_template_magic_primes<100>::str, 1, black_template_magic_primes<100>::strlen, stdout);
    

    Mein Unnötigkeitssensor schlägt wieder aus... oha, 6.9 - ich glaube gar, hustbaer sitzt da wirklich dran.



  • Hacker, überleg mal. Wie kann ein Sensor der - sich in deinem Besitz befindend - immer auf Anschlag steht noch weiter ausschlagen? Das kann nicht gehen.

    Und nein, ich sitze da nicht dran.

    Obwohl es auch nicht notwendigerweise "unnötig" wäre, zumindest nicht subjektiv betrachtet. Kann man einiges dabei lernen, bzw. üben wenn es Dinge sind die man schon kann, aber vielleicht länger nicht mehr angewendet hat.



  • hustbaer schrieb:

    Hacker, überleg mal. Wie kann ein Sensor der - sich in deinem Besitz befindend - immer auf Anschlag steht noch weiter ausschlagen? Das kann nicht gehen.

    Ich hab Alufolie rumgewickelt und bediene das ding durch eine Angel und einen Stock, aber der Zeiger zittert immer noch ein bisschen 🤡

    Außerdem mach' ich eigentlich nie unnötige Sachen. Ich bin - in gewissen Zeiten - recht rational.


  • Mod

    hustbaer schrieb:

    Man könnte jetzt ne TMP Version basteln. Also komplett inklusive Konvertierung ins Dezimalsystem und Konkatenierung der Ergebnisse.

    Ei, das ist wirklich übel hart. Da bin ich mir selbst nach einigem Nachdenken nicht sicher, ob das überhaupt geht. Ich glaube man braucht aber mindestens variadic templates. Habe gerade keine Zeit, mir das genauer anzugucken.



  • Variadic Templates waren noch nie erforderlich, sie sind einfach eine Vereinfachung für Typlisten, wie aus dem Alexandrescu bekannt.



  • Kellerautomat schrieb:

    sie sind einfach eine Vereinfachung für Typlisten, wie aus dem Alexandrescu bekannt.

    Das ist Sepp sicherlich bekannt. Aber es sind generische Typlisten 🤡


Anmelden zum Antworten