Primzahlen ausgeben



  • keine Ahnung ob man sich hier grossartig vorstellt.
    Aber freut mich euch kennenzulernen!
    Ja also ich hab mir mal wieder vorgenommen c++ zu lernen und muss dazu sagen ich bin jetz
    nicht die hellste Kerze im Kronleuchter. Ist auch mein 5. Anlauf in 10 Jahren oder so hab
    immer nach kurzer Zeit aufgegeben. Diesmal hab ich endlich mal n gutes Buch gefunden(primer)
    und die Motivation hält noch an. Ich werd mich dieses Mal durchackern.

    In der Zwischenzeit wollt ich mal n kleines Programm schreiben das Primzahlen(0-500) ausgibt.
    Ich weiss, das kommt sicher zum 1000. Mal und so aber ich möcht auch wirklich nur n paar
    kleine Tipps und nicht die Lösung aufm Tablett.
    Also mein Ansatz war 2 Variablen, eine while Schleife und eine if Funktion.

    #include <iostream>
    
    
    int main(void){
      
      int a =0 ,  n = 2;                                                               //Hier fängts wohl schon an mit welchem Werten fang ich an?
            
            while( a <= 500 ) {                                                  
                    a++;
                                if(a%n! = 0){                                           //Mein Hauptproblem, liegt in den Funktionsparametern...
                                std::cout << a << std::endl;               //.. da fehlt der entscheidende Teil, ich würd am liebsten durch.. 
                                std::cout << n << std::endl;               //..eine ansteigende Zahlenmenge dividieren lassen. Aber Habs jetz nach 2 Tagen..
                                system("pause");                                //.. mit den Werkzeugen die ich schon kann noch nicht rausbekommen.
                                      
                                }
                           
                  
      
    
                      }
                
    return 0 ;
                             
              
    }    
    

    Für die meisten hier ist das sicher nicht schwer.. Also wenn ihr mir nur son kleinen Tipp geben könnt für mein Erfolgserlebnis.
    Wär echt cool (ach die Ausgabe von n war nur zu meinem Verständnis)

    Danke ☺



  • Schreibe dir ersteinmal eine Funktion, welche für eine Zahl berechnet, ob es sich um eine Primzahl handelt:

    bool IsPrime(int number)
    {
      // ....
    
      return true; // or false
    }
    

    Und dann kannst du diese Funktion mit verschiedenen Zahlen (in einer Schleife) aufrufen.

    Tipp: Auch für obige Funktion benötigst du eine Schleife.



  • also sone schleife in der schleife?
    an das mit der bool hab ich auch schon gedacht.. ok ich geh dann mal zurück in die Schreikuppel
    Besten Dank!!!!!



  • @Th69 ok ich brauch ein bisschen Hilfe ob ich völlig aufm Holzweg bin 😞
    sind die scopes richtig?
    ich glaub ich hab mir zuviel vorgenommen da gibts viele offene Fragen..

    das hab ich bisher(nicht lachen):

    #include <iostream>
    
    int x;
    
    bool IsPrime(int number){
         
                     for(number = 1; number<=500; number++)
                     {
                           if(x%number==0)
                           
                                          return true;
                     }
         
                            }
    
    int main(void){
        int x =1;
                   while(x<=500)
                   {
                              if(true){
                              x=IsPrime();
                              }
                               else{x++;}  
                                 
                                 
                                 }
                   
                                
      
        
          
          
           }
              
                       return 0 ;
                             
              
    }    
    
    
    


  • @nochSoEiner wie ist denn eine Primzahl definiert?



  • nur durch 1 und sich selbst teilbar..



  • @nochSoEiner Das heisst die Funktion ist falsch..



  • Ja, du mußt den übergebenen Parameter number sinnvoll benutzen (anstatt ihn als Schleifenvariable zu überschreiben).

    Und du müßtest einen Compiler-Fehler in Z. 21 erhalten, denn der Aufruf ist falsch:

    if (IsPrime(x))
    {
       // x is a prime number
    }
    


  • @nochSoEiner Die Funktion heißt IsPrim.

    Die sollte also nur dann true zurück geben, wenn es eine Primzahl ist.
    Wenn sie durch eine andere Zahl teilbar ist, dann false.

    Zudem hat in der Funktion die 500 nichts, aber auch gar nichts zu suchen.
    Da ist nur number bekannt.



  • Danke für eure Mühen ich hab jetz aber immer noch denn gleichen Knoten im Kopf
    das ist der aktuelle Stand:(bin schon lange wach xD)

    #include <iostream>
    
    int x;
    
    bool IsPrime(int number){
         
                     for(number = 1; number<=500; number++)
                     {
                           if(x%number==0){
                                           std::cout << number << std::endl;
                           
                                          return true;
                                          }
                                          else{
                                          return false;
                                          }
                     }
         
                            }
    
    int main(void){
        int x =0;
                   while(x<=500)
                   {
                              if(true){
                              
                              IsPrime(x);
                              std::cout << x << std::endl;
                              x++;
                              system("pause");
                              }
                               else{ 
                                 
                                 }
                   
                                
      
        
          
          
           }
           }
              
                  
    


  • Ok mit den Hinweisen werd ichs schon irgendwann rauskriegen..
    ich bleib noch dran.



  • @nochSoEiner keine globalen Variablen (wie das merkwürdige x)



  • ok so weit so gut aber der Kollege meinte doch ich soll ne schleife Verwenden in der isPrime() war da nur der header falsch?
    oder genauer nur das <= 500???



  • Für Heute leg ichs auf Eis aber Morgen hagelts Primzahlen.
    Bis dann und danke



  • eine for schleife passt da besser denke ich @nochSoEiner dann fällt auch die globale variable weg.



  • ja, ich denke mir fehlt noch n bischen die klare Sicht.. Aber wenigstens hab ich mal ne Funktion mit bool gemacht und aufgerufen
    da bin ich schon relativ glücklich.. denn Rest pack ich auch noch



  • @nochSoEiner sagte in Primzahlen ausgeben:

    ok so weit so gut aber der Kollege meinte doch ich soll ne schleife Verwenden in der isPrime() war da nur der header falsch?
    oder genauer nur das <= 500???

    wenn du wissen willst, ob die Zahl 13 prim ist, brauchst du keine 500.

    Naiv betrachtest du, ob eine Zahl zwischen 1 und 13 (also von 2 bis 12) ganzzahliger Teiler von 13 ist.

    Dass sie prim ist, kannst du erst sagen, wenn du (fast) alle Zahlen getestet hast.



  • Überlege dir als erstes, was du eigentlich wissen willst.

    Ist deine Fragestellung also:
    a) Ist eine bestimmte Zahl eine Primzahl?
    b) Welche Zahlen im Bereich 1..n sind Primzahlen?

    Die Antwort auf Frage b) kannst du mit einer Schleife und der Fragestellung a) beantworten:
    Für alle Zahlen i von 1 bis n: wenn mit Hilfe von a) festgestellt wird, dass i prim ist, gib i aus.

    Also fang also erst einmal an, die Frage für eine einzige Zahl zu beantworten, also Aufgabe a) zu lösen. Es ist immer eine gute Idee, gleich einen Test zu schreiben. Zum Beispiel so wie hier in meinem Beispielcode unten. Bearbeite NUR den Bereich, wo "bitte ausfüllen" steht. Ändere nichts außerhalb (außer du brauchst weitere Header wie zB <cmath>, falls du eine Wurzel ziehen willst).

    #include <iostream>
    #include <utility>
    
    bool isPrime(int n) {
        // hier musst du testen, ob die Zahl n eine Primzahl ist
        // bitte ausfüllen
    }
    
    bool test_isPrime() {
        auto allOk = true;
        std::pair<int, bool> testData[] = {{1, false},  {2, true},   {3, true}, {4, false},
                                           {5, true},   {6, false},  {7, true}, {9, false},
                                           {181, true}, {183, false}};
        for (const auto &p : testData) {
            auto result = isPrime(p.first);
            if (result != p.second) {
                std::cout << std::boolalpha << "isPrime-Berechnung falsch für " << p.first
                          << ": erwartet war " << p.second << ", erhalten: " << result << "\n";
                allOk = false;
            }
        }
        if (allOk)
            std::cout << "Alle Tests von isPrime erfolgreich!\n";
        return allOk;
    }
    
    int main() {
        test_isPrime();
    }
    

    Du kannst dir alternativ hierzu einen anderen Weg ausdenken, wie du die Primzahlen von 1..n alle zusammen berechnest. Ich würde an deiner Stelle aber erstmal mit obigem Weg anfangen. Wenn du da fertig bist, geben wir gern weitere Hinweise.



  • Ok jetzt kommt noch n array hinzu 😃 da freu ich mich schon drauf aber ist echt ungelogen bin schon seit gestern (inder Nacht!!!)
    Wach..
    Und bool Erbsenhirn(lernkapazität <1 && Schlafmangel >500){
    kein Plan = kein Sinn return to bed
    }
    xD
    zieh mir Akte x rein und geh jetz pennen liebe Leute:
    ist n geiles Forum, hätt nicht so viele posts erwartet.
    peace



  • @nochSoEiner Das Array ist in der Funktion, die IsPrim testet.
    Diese Funktion braucht dich derzeit überhaupt nicht zu interessieren.