Primzahl oder nicht Primzahl !! hilfe



  • Gregor schrieb:

    @albani: Dein Programm ist scheiße. Überleg dir mal, was ausgegeben wird. Abgesehen davon ist es fehlerhaft.

    halt die fresse alter.



  • Nargaroth schrieb:

    wo liegt mein fehler?

    Vielleicht würde der Compiler gerne wissen, dass du den Namespace std nutzt. ...nur so geraten.



  • albani schrieb:

    halt die fresse alter.

    😃 Wenn du mit Kritik nicht klar kommst, dann darfst du halt keinen Code posten. :p

    ...aber ich werde es dir nochmal etwas genauer begründen. Du springst nach der Überprüfung, ob die Zahl durch 2 teilbar ist, mit dem return aus der Schleife heraus. Deine Ausgabe gibt eigentlich nur an, ob die Zahl durch 2teilbar ist oder nicht.



  • Gregor schrieb:

    Nargaroth schrieb:

    wo liegt mein fehler?

    Vielleicht würde der Compiler gerne wissen, dass du den Namespace std nutzt. ...nur so geraten.

    nach

    #include <iostream.h>
    

    ?
    wenn ich denn vielen "kontroversen" diskussionen zu dem thema glauben darf, ist #include <iostream.h> ein mittelbares äquivalent zu

    #include <iostream>
    
    using namespace std;
    

    in dem zusammenhang bitte ich darum, daß nicht immer nur "öh, <iostream.h> is veraltet, <iostream> is neu und viiiel besser!" geplärrt wird, sondern dann auch mal ne erklärung kommt, WARUM das denn besser sein soll.



  • Oh, ok. Dann liegt es wohl daran, dass iostream.h veraltet ist. 😃

    iostream ist 1. deshalb besser, weil es in Zukunft noch unterstützt wird und 2. deshalb besser, weil es Namespaces kennt. ...und bestimmt noch aus 1000 anderen Gründen.



  • Gregor schrieb:

    Oh, ok. Dann liegt es wohl daran, dass iostream.h veraltet ist. 😃

    iostream ist 1. deshalb besser, weil es in Zukunft noch unterstützt wird und 2. deshalb besser, weil es Namespaces kennt. ...und bestimmt noch aus 1000 anderen Gründen.

    k3wl. bringt leider nix, wenn man nicht weiß, was namenräume sein sollen. wenn mans wüßte, würde man nämlich auch um deren vorteile wissen und nicht fragen.
    soll heißen: wenn jemand schon nach sowas fragt, weiß er vermutlich nicht, was namenräume sind und wird deswegen mit dieser erklärung auch nix anfangen können.

    das soll jetz nich heißen, daß ich nicht wüßte, was namenräume sind- aber bis vor kurzem wußte ichs noch nicht. mittlerweile weiß ich es zwar, kann aber in der neuen schreibweise keinen vorteil erkennen (für mich persönlich jedenfalls nicht).



  • Als jemand, der nahezu nie mit C++ programmiert, rate ich einfach mal (mag sein, dass es noch 100 weitere Gründe für Namensräume in c++ gibt):

    1. Die Namensräume helfen dir, Konflikte durch doppelte Belegung von Namen zu vermeiden.

    2. Namensräume helfen dir, gerade in größeren Projekten, den Überblick zu behalten.



  • Gregor schrieb:

    1. Die Namensräume helfen dir, Konflikte durch doppelte Belegung von Namen zu vermeiden.

    hm... so viele namen, daß ich doubletten gehabt hätte, hab ich noch nie verwenden müssen. ich sagte ja auch: für mich persönlich.

    Gregor schrieb:

    2. Namensräume helfen dir, gerade in größeren Projekten, den Überblick zu behalten.

    also helfen sie mir nicht, da ich ja an keinen "größeren projekten" arbeite.

    versteh mich nicht falsch, ich akzeptiere ja, daß es für die genannten bedingungen vorteile hat. da aber kein anfänger quelltexte mit mehreren tausend zeilen produzieren will, existieren diese vorteile für ihn faktisch nicht. er merkt also unmittelbar nicht, daß er einen vorteil hat, kriegt aber immer zu hören "das is aber viel besser mit den namenräumen und so". und von der machart war leider die mehrzahl der postings, die sich auf die verwendung der alten/neuen header bezogen.



  • Um nochmal auf Nargaroth einzugehen 😉 , dein Programm is an sich korrekt, bei mir kompilierts auch, aber, ein auch oft in diesem Forum zitierter Satz ist "Funktioniert nicht ist keine ausreichende Fehlerbeschreibung". Was erhälst du denn für eine Fehlermeldung?

    Bzgl. Namespace kann ich scrub nur zustimmen, seit dem ich hier im Forum mitlese habe ich schon sehr oft gelesen, auf die Frage "warum geht dies oder das nicht, ich hab dies und das probiert" - "Deine Header sind veraltet", und das hilft einem Anfänger ja nu wirklich nicht. Auch wenn es so sein mag :).

    Gruß Mata



  • Kann es sein, daß die alten streams nicht alle templates waren? Und damit einige Möglichkeiten einfach nicht boten?



  • scrub schrieb:

    versteh ich nicht falsch, ich akzeptiere ja, daß es für die genannten bedingungen vorteile hat. da aber kein anfänger quelltexte mit mehreren tausend zeilen produzieren will, existieren diese vorteile für ihn faktisch nicht. er merkt also unmittelbar nicht, daß er einen vorteil hat, kriegt aber immer zu hören "das is aber viel besser mit den namenräumen und so". und von der machart war leider die mehrzahl der postings, die sich auf die verwendung der alten/neuen header bezogen.

    Ok, man entwickelt eine Programmiersprache wie C++ aber auch nicht, um Anfängern möglichst wenig Probleme dabei zu bereiten, ihr Hello-World zu schreiben. Man entwickelt sie auch nicht, damit jeder mal schnell ne Primzahlsuche schreiben kann. Das sind nämlich alles nur Spielereien. Programmiersprachen wie C++ werden für den ernsthaften Einsatz entwickelt und da hat man es nunmal oft mit sehr großen Projekten zu tun. Generell ist doch der Sinn von höheren Programmiersprachen, die Komplexität größerer Projekte in den Griff zu kriegen, bzw. größere Projekte durch besseres Management der Komplexität überhaupt erst zu ermöglichen.

    Als Anfänger muss man dann halt öfter mal in einen sauren Apfel beißen und eine Sache erstmal akzeptieren. Man kann nicht alles sofort verstehen, sondern braucht für einige Dinge erst einen Blickwinkel, für den man einiges an Erfahrung angesammelt haben muss.



  • Gregor schrieb:

    Als Anfänger muss man dann halt öfter mal in einen sauren Apfel beißen und eine Sache erstmal akzeptieren. Man kann nicht alles sofort verstehen, sondern braucht für einige Dinge erst einen Blickwinkel, für den man einiges an Erfahrung angesammelt haben muss.

    inzwischen bin ich da einer meinung mit dir. nur warum postet nicht mal jemand DAS zur entsprechenden thematik statt "das is alt, das is doof, das is neuer und besser"?

    ich würde auch nicht drauf wetten, daß ein signifikanter anteil der user hier umfangreiche und komplexe software produziert (so daß man namenräume "und so" ernsthaft benötigt, weils anders nicht mehr geht). lasse mich aber gern vom gegenteil überzeugen.



  • #include <iostream>
    using namespace std;
    
    int main()
    {	
    	int untere_schranke = 0,
    	    obere_schranke  = 0;
    
    	// Intval einlesen
    	cout<<"Geben Sie die unter Intervalgrenze ein: ";
    	cin>>untere_schranke;
    	cout<<"Geben Sie die obere Intervalgrenze ein: ";
    	cin>>obere_schranke;
    
    	int numberOfPrimes = 0;
    
    	for(int n = untere_schranke; n <= obere_schranke; n++)
    	{
    		// ist n eine Primzahl?
    		int teiler = 2;
    
    		while(n%teiler > 0 && teiler*teiler <= n)
    		{
    			teiler++;
    		}
    
    		if(teiler*teiler > n)
    		{
    			cout<<n<<endl;;
    			numberOfPrimes++;
    		}
    
    	}	
    
    	cout<<"Anzahl von Primzahlen im Intervall: "<<numberOfPrimes<<endl;	
    }
    

    Dieser Ansatz kann noch wieter optimiert werden - in dem man nur als potientielle Teiler die zwei und dann nur noch ungerade Zahlen testet - bzw. man als Potentielle Teiler nur Primzahlen testet...

    Infos zur Thematik: www.primzahlen.de

    By the way: Von der Electronic Frontier irgendetwas Organisation werden 100000 Dolar für eine 10 Millionen stellige Mersene Primzahl geboten



  • scrub schrieb:

    inzwischen bin ich da einer meinung mit dir. nur warum postet nicht mal jemand DAS zur entsprechenden thematik statt "das is alt, das is doof, das is neuer und besser"?

    Allein zum Thema iostream habe ich mir hier über die Jahre schon die Finger Wund geschrieben und ich bin da wahrlich nicht der Einzige. Informationen wie Auflistungen der wichtigsten Unterschiede, Referenzen der alten bzw. neuen Librarys, Whitepapers usw. findet man im Netz zu hauf und Links auf solche werden hier immer und immer wieder gepostet:
    Z.B:
    http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=iostream#Answ
    http://www.langer.camelot.de/Articles/Papers/IOStreams/IOStreams.htm

    Nicht immer hat man Lust und Zeit alles zum x-ten Mal hinzuschreiben. Also muss in vielen Fällen auch einfach mal das kurze "<iostream.h> ist kein Standard und sollte in neuen Projekten besser durch <iostream> ersetzt werden" ausreichen. Wenn ein Nutzer dann, und das passiert hier nur äußerst selten, tatsächlich mal an mehr als nur der unmittelbaren Lösung seines Problems interessiert sein sollte, dann kann er ja gerne nochmal nachfragen.

    Nichtsdestotrotz behaupte ich nach wie vor: Niemand kann wirklich C++ lernen ohne mindestens wirklich ein hervoragendes C++ Buch zulesen. Ein gutes Buch kann durch kein Tutorial, kein Forum und keine Internetseite dieser Welt ersetzt werden.



  • albani schrieb:

    😞 ich habe code vergessen

    #include <iostream.h>
    
    int main()
    {
      long a, b;
      cout <<"Zahl= ";
      cin >> a;
    
      for (b=2; b < a; b++)
      {
       if( a%b == 0)
        cout <<"Ist nicht ein Primzahl" << endl;
       else
        cout <<"Ist Primzahl" << endl;
      return 0;
     }
    
    }
    

    Dein Programm funksioniert gut für die zahlen grösser als 2.

    Warum die andere sagen stimmt nicht???



  • Ja? Dann probier's mal mit einer ungeraden Zahl, die keine Primzahl ist. Zum Beispiel 9 oder 15.

    MfG Jester



  • oder gib mal eine 1 ein.



  • Nargaroth schrieb:

    hallo leute !

    ich hab ein frage für euch; die frage ist :

    Bestimmen Sie, ob eine eingegebene natürliche Zahl eine Primzahl ist.

    ich hab was geschrieben aber das programm ist nicht kompiliert.

    #include <iostream.h>
    #include <conio.h>
    int main()
    {
    int a;
    bool prime=true;
    cout<<"Geben Sie bitte eine zahl ein: ";
    cin>>a;
    for(int divisor=a-1; divisor>1; divisor--)
    if(a%divisor==0)
    prime=false;
    if(prime)
    cout<<a<<" ist Primzahl"<<endl;
    if(!prime)
    cout<<a<<" is nicht Primzahl"<<endl;

    return 0;
    }

    wo liegt mein fehler?

    lg nargaroth

    letztes Jahr haben wir diese Beispiel so gemacht:

    #include <iostream.h>
    
    int main()
    {
     int x, y;
      cout <<"Zahl= ";
      cin >> x;
      y = 2;
      while(y < x)
       {
        if( x%y == 0)
         {
          cout << "ist nicht Primzahl" << endl;
          x = 0;
         }
         y = y + 1;
        } 
        if(x>0)   
        cout <<"Ist Primzahl" << endl;
      return 0;
     }
    


  • Oh nein... überlegt mal ganz genau was <iostream> denn ist.



  • #include <iostream.h>
    #include <math.h>
    
    bool isprim(int zahl)
    {
       if(zahl<4)return true;
       else if(!(zahl%2))return false;
       else
       {
          cout << endl << sqrt(zahl) << endl;
          for(int i=5;i<sqrt(zahl);i+=2)if(!(zahl%i)) return false;
          return true;
       }
    }
    int main(int argc, char* argv[])
    {
       int zahl;
       cin >> zahl;
       if(isprim(zahl)) cout << "Primzahl";
       else cout << "Keine Primzahl";
       return 0;
    }
    

    Der Vollständigkeit halber wiederholt. 🙄


Anmelden zum Antworten