primzahl feststellung



  • dieses programm soll eigentlich eine zahl einlesen können, diese überprüfen und dann feststellen, ob die eingelesene zahl eine primzahl ist.

    letzteres macht es aber nicht und ich habe keine ahnung warum!!

    vl könnte mir jemand helfen!!

    #include <iostream.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <dos.h>
    #include <math.h>
    
    int ueberpruefen(int);
    int primzahl(int);
    
    int main()
    {
     int x,y,z;
     clrscr();
    
     cout<<"Geben sie eine Zahl ein: ";
     cin>>x;
    
     if((x>32000) || (x<0))
       {
        x=ueberpruefen(x);
       }
    
     y=primzahl(y);
    
     (y>0) && cout<<"Diese Zahl ist eine Primzahl!";
     (y==0) && cout<<"Diese Zahl ist keine Primzahl!";
    
     getch();
    }
    
    int ueberpruefen(int x)
    {
     do
       {
        cout<<"Bitte geben sie eine andere Zahl ein! ";
        cin>>x; 
       }
     while((x>32000) || (x<0));
    
     return(x);
    }
    
    int primzahl(int x)
    {
     int y,z;
     z=1;
    
     do
       {
        z++;
        y=x%z;
       }
    
     while ((z<pow(x, 0.5)) && (y!=0));
    
     return(y);
    }
    

    ich danke im voraus



  • #include <iostream.h>
    

    😕


  • Mod

    "Geht nicht" ist keine Fehlermeldung. Was genau macht denn dein Programm nicht, was du erwarten würdest?

    Und wo wir schon dabei sind:

    (y>0) && cout<<"Diese Zahl ist eine Primzahl!";
     (y==0) && cout<<"Diese Zahl ist keine Primzahl!";
    

    😮 Übst du für irgendeinen Obfuscation-Wettbewerb?



  • Zum Primzahlen berechnen gibt es hier schon eine gefühlte Milliarde Threads. Nutze einfach mal die Suchfunktion.


  • Mod

    Dein Fehler liegt übrigens hier:

    y=primzahl(y); // Muss  y=primzahl(x) heißen
    


  • thx sepp warst mir eine große hilfe.. diese variable hatte ich total übersehen
    thx nochmal



  • Dennoch solltest du deinen Code überarbeiten



  • Um deinen Code mal vollkommen auseinanderzunehmen:

    /* Die meisten dieser Header sind hoffnungslos veraltet, außerdem ist es
    meistens gut, Standard-Header von anderen Bibliotheksheadern zu trennen.
    #include <iostream.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <dos.h>
    #include <math.h>
    
    Das wird dann zu:*/
    
    #include <iostream>
    #include <csdtlib>
    #include <cmath>
    
    #include <conio.h>
    #include <dos.h>
    
    using std::cout;
    using std::cin;
    
    /* int ueberpruefen(int); */
    // siehe unten
    int zahl_einlesen();
    bool primzahl(int);
    
    int main()
    {
      // Deklariere variablen erst da wo du sie brauchst!
      /* int x,y,z; */
    
      clrscr();
    
      // Achte auf eine einheitliche Ausrichtung deiner Klammern, das erhöht die Lesbarkeit ungemein.
      // vermeide Code-Duplizierung. Die Logik x>32000, das Einlesen usw. gehört nur an eine Stelle
    
      /* cout<<"Geben sie eine Zahl ein: "; */
      /* cin>>x; */
    
      /*  if ((x>32000) || (x<0)) */
    
      // spare nicht zu sehr an Leerzeichen, um die Lesbarkeit nicht zu gefährden
      int x = zahl_einlesen();
    
      // schreib was du meinst und nicht irgendwas was cool aussieht oder 
      // (fast) den gleichen Effekt hat
      if (primzahl(x)) 
        cout << "Diese Zahl ist eine Primzahl!";
      // decke immer alle Fälle ab
      else
        cout << "Diese Zahl ist keine Primzahl!";
    
      getch();
    }
    
    // gib den Funktionen sinnvolle Namen, diese hier überprüft nicht nur sondern liest auch ein.
    int zahl_einlesen()
    {
      int x;
      do
      {
        cout << "Bitte geben sie eine Zahl zwischen 0 und 32000 ein! ";
        cin >> x; 
      } while ((x > 32000) || (x < 0));
    
      return x;
    }
    
    // zusammengehörige Logik gehört an eine Stelle. 
    // Die Funktion soll schauen ob x prim ist, also sollte sie auch einen
    // Wahrheitswert zurückgeben und nicht irgendwas,
    // was dann noch weiter ausgewertet werden muss
    bool primzahl(int x)
    {
      int z = 1;
      int y;
      do
      {
        z++;
        y = x%z;
      } while ((z < std::pow(x, 0.5)) && (y != 0));
    
      return (y > 0);
    }
    

    Und das war nur der erste Durchgang. Ich seh z.B. nicht wo du <cstdlib> brauchst.
    Zu den Standard-Headern: wenn du tatsächlich ein Buch oder Tutorial hast, das dir <iostream.h> & Co beigebracht hat, dann solltest du das Buch ins Museum bringen bzw. den Autor des Tutorial anschreiben, dass er noch historische Dokumente im Netz hat. Der Standard brandmarkt diese Header als veraltet und das schon seit 12 Jahren.



  • Bin dir ja sehr dankbar für deine Verbesserungen, aber ich bin erst in der Ausbildung und wir verwenden einen sehr alten Compiler, welcher die Header nur so lesen kann.



  • meins schrieb:

    Bin dir ja sehr dankbar für deine Verbesserungen, aber ich bin erst in der Ausbildung und wir verwenden einen sehr alten Compiler, welcher die Header nur so lesen kann.

    und wieso verwendest du einen sehr alten compiler? welcher sinn steckt dahinter? 🙄



  • meins schrieb:

    Bin dir ja sehr dankbar für deine Verbesserungen, aber ich bin erst in der Ausbildung und wir verwenden einen sehr alten Compiler, welcher die Header nur so lesen kann.

    Wenn du daran interessiert bist, auch außerhalb der Berufschule hobby-mäßig oder später beruflich zu programmieren, dann solltest du zuhause einen aktuellen Compiler einsetzen. Das lässt sich durchaus gut trennen (und so groß sind die Unterschiede nun auch nicht).


Log in to reply