Forum
Tipps
News
Menu-Icon

C++ Primzahl-Ausgabe

Hallo. Ich wollte mir ein Programm erstellen, dass mir sagt, ob die Eingegebene Zahl eine Primzahl ist oder nicht.
Aber bei meinem Programm gibt er immer Unendlich mal aus: <<Ihre Zahl ist eine Primzahl!>> egal ob Primzahl oder nicht!
 

Zitat
#include <conio.h>
#include <iostream>

using namespace std;

int main()
{
    cout<<"Dies ist ein Programm, was Ihnen sagt,"<<endl;
    cout<<"ob Ihre eingegebene Zahl eine Primzahl ist."<<endl;
    found: cout<<"Bitte geben Sie Ihre (Prim-)Zahl ein."<<endl;
    int m ;
    int n;
    int wiederholen;
    bool isPrimzahl(int n);
    cin>>n;
    cout<<endl<<endl;
    for(;(n%m)>0;++m)
    {m!=1; m<n;
     cout<<"Ihre Zahl ist eine Primzahl."<<endl;}
    cout<<"Wollen Sie das Programm wiederholen?"<<endl<<endl;
    cout<<"  Ja: 1"<<endl;
    cout<<"Nein: 2"<<endl;
    cin>>wiederholen;
    if(wiederholen==1)
    {
         cout<<endl;
         goto found;
         }
    else if(wiederholen==2)
    {
         cout<<endl;
         return(0);
         } 
}

Antworten zu C++ Primzahl-Ausgabe:

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Hi,

• da gibts ne Menge zum einlesen

==> C++ primzahlen

Oha...
Falls es dich noch interessiert, was dein urspruenglicher Versuch falsch macht:
- die Variable m ist nicht initialisiert, d.h. du kriegst wenn du sie benutzt unvorhersehbare ergebnisse (z.B. in der for-Schleife)
- So Anweisungen wie m!=1; oder m<n; sind ...hmm... nutzlos. Die werden ausgewertet, dann steht da sowas wie true; oder false; Was sollte das bewirken?
- goto ist boese :-X nimm lieber ne Schleife...
- Was mach denn isPrimzahl()? Oder soll das ne Deklaration sein?
- Die Abfrage nach dem Wiederholen innerhalb der Pruefschleife ist sicherlich auch nicht das, was du wolltest
usw.

Du kriegst das Zeug aber schon durch den Compiler oder?

Jup das krieg ich wohl noch hin ;D

Dann probiere ich am besten selber noch ein wenig dran rum... vielleicht bekomme ich es ja jetzt mit deinen Tipps hin.
Dankeschön

« Letzte Änderung: 10.05.07, 13:44:35 von Speedy_92 »

Hey... So! Jetzt habe ich ein halbwegs durchschaubares Programm ;D! Nur mein Problem ist, er gibt es einfach falsch aus... Ach einfach mal Programm starten und Zahl eingeben...

 

Zitat

#include <conio.h>
#include <iostream>

using namespace std;

int main()
{
    cout<<"Dies ist ein Programm, was Ihnen sagt,"<<endl;
    cout<<"ob Ihre eingegebene Zahl eine Primzahl ist."<<endl;
    found: cout<<"Bitte geben Sie Ihre (Prim-)Zahl ein."<<endl;
    unsigned int Zahl;
    unsigned int wiederholen;
    unsigned int a;
    cin>>Zahl;
    cout<<endl<<endl;
    for(int a=2;a<Zahl;++a)
    {if((Zahl%a)>0)
    {cout<<"Ihre Zahl ist eine Primzahl!"<<endl<<endl;
   
    int a=Zahl;
     }
    else
    {cout<<"Ihre Zahl ist keine Primzahl!"<<endl<<endl;
     }}
   
    cout<<"Wollen Sie das Programm wiederholen?"<<endl<<endl;
    cout<<"  Ja: 1"<<endl;
    cout<<"Nein: 2"<<endl;
    cin>>wiederholen;
    if(wiederholen==1)
    {
         cout<<endl;
         goto found;
         }
    else if(wiederholen==2)
    {
         cout<<endl;
         return(0);
         } 
}

Kanns leider grad nicht ausprobieren, aber guck dir doch mal deinen Code genau an:

for(int a=2; a<Zahl; ++a) {
    if((Zahl%a)>0) {
        cout<<"Ihre Zahl ist eine Primzahl!"<<endl<<endl;
        int a=Zahl;
    } else {
        cout<<"Ihre Zahl ist keine Primzahl!"<<endl<<endl;
    }
}
Wenn Zahl%2 groesser 0 ist, d.h. wenn die Zahl nicht durch 2 teilbar ist, wird direkt ausgegeben, dass die Zahl ne Primzahl ist. Koennte doch aber auch durch 3, 4, 5 etc. teilbar sein oder? Das pruefst du gar nicht, da du danach a=Zahl setzt, was die Schleife abbrechen laesst, da die nur laeuft solange a<Zahl ist.
Die for-Schleife ist soweit OK aber innen musst du noch mal gucken:
bool prim = true;
for(int a=2; a<Zahl; ++a) {
    if((Zahl%a)==0) {
        cout<<"Ihre Zahl ist keine Primzahl!"<<endl<<endl;
        int a=Zahl;
        prim = false;
    }
}
if(prim) cout<<"Ihre Zahl ist eine Primzahl!"<<endl<<endl;
oder sowas in der Art

Danke funktioniert.
Aber ich verstehe nicht, wieso das funktioniert!
 


if(prim)

prim = false;

bool prim = true;
Und wieso muss ans Ende von der ersten if-Klammer noch ein  prim = false hin?
 
« Letzte Änderung: 14.05.07, 14:45:26 von Speedy_92 »

Du brauchst ja nen indikator, ob deine Zahl nun ne Primzahl ist oder nicht. In der Schleife kannst du nur feststellen, wenn es keine ist. Wenn es eine ist, merkst du das erst, wenn die Schleife zuende gelaufen ist und du nicht festgestellt hast dass es keine ist.
Oha- das ist schwerer zu erklaeren als mal eben zurechtzuhacken...

OK. Wir legen uns also einen Marker an:

bool prim = true;
Der ist true weil wir ja Optimisten sind und einfach davon ausgehen, dass die Zahl ne Primzahl ist. Trotzdem wird das in der Schleife nochmal ueberprueft ;D
Sollten wir feststellen, dass die Zahl keine Primzahl ist, koennen wir ne Meldung ausgeben und die Schleife abbrechen (das geschieht durch a=Zahl). Da wir aber auch nach der Schleife noch wissen wollen, ob die Zahl nu ne Primzahl war muessen wir in diesem Fall noch den Marker auf false setzen - weil is ja keine Primzahl.
Nach der Schleife gibts dann halt ne Meldung, dass die Zahl ne Primzahl ist (nur wenn sie es wirklich ist natuerlich). Falls dich die Syntax irritiert:
if(prim) cout<<"Ihre Zahl ist eine Primzahl!"<<endl<<endl;
ist aequivalent zu
if( prim == true ) {
    cout<<"Ihre Zahl ist eine Primzahl!"<<endl<<endl;
}
Noch Fragen? (Nein glaub ich dir nicht ;D)

HEHE... Ich liebe Fragen ;D
Ich verstehe nicht, was dies
 

bool prim = true;bringt... Es ist doch mit Nichts aus der If-Klammer verbunden- aus der If-Klammer bezieht sich nichts auf das.

Doch!

bool prim = true;
legt ne neue Variable vom Typ boolean an. Diese wird auch gleich mit true initialisiert. Diese Variable soll nach der for-Schleife true sein, wenn die Zahl ne Primzahl ist und false, wenn nicht.
Daher wird *in* der Schleife und innerhalb der if-"Klammer"
prim = false;
ausgefuehrt, d.h. die oben angelegte Variable auf false gesetzt. Genau das ist die Verbindung zu dem bool prim = true;
 

Tut mir leid... hatte mich falsch ausgedrückt...  ():-)
Ich meine, WIE kann die Variable die If-Klammer beeinflussen? Und WAS bewirkt sie?
 

Die Variable beeinflusst die if-Klammer gar nicht. Die if-Klammer beeinflusst die Variable.
Ich hab grad so das Gefuehl, dass ich nicht verstehe, was du nicht verstehst. ::)

Ich dich auch nicht  ;D

Das glaub ich dir  ;D

Ich meine, was bringt die Variable- was bewirkt sie?

Dann sind wir uns ja einig!!! ;D
Probier einfach mal aus, was passiert wenn du den Kram, den du nicht verstehst, ganz oder teilweise weglaesst. Und versuche zu verstehen, warum das Verhalten dann anders ist. Es koennte auch helfen, das Programm mal "zu Fuss" durchzugehen, d.h. guck dir den Code an und nimm z.B. an, der user haette 9 oder 7 eingegeben und gehe das Programm schritt fuer schritt durch, schreibe dir auf, welche Variable welchen Wert hat. Vielleicht wird es dadurch etwas klarer.

btw. falls Du den Code oben noch so verwendest, ersetze mal

int a=Zahl;
durch
a=Zahl;
(in der if-Klammer). Das koennte zu Mehrfachausgaben der "Die Zahl ist keine Primzahl"-Meldung fuehren
 

Na so langsam kommen wir uns doch schon näher  ;D  :P

Aber wir sind noch nicht ganz am Ziel!!!

Meine Frage immer noch: WAS BEWIRKT DIESES

  prim=falsein der If-Klammer... Soll es die abbrechen oder wie?

Und Ebenfalls in der zweiten If-Klammer: Was bringt dieses
 if( [b]prim[/b])
????
 
« Letzte Änderung: 15.05.07, 17:04:54 von Speedy_92 »

« Suche CAD Programmierer (w/m).exe erstellen mit Borland »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
Internet-Zugriffsprogramm
Ein Internet-Zugriffsprogramm, auch Browser genannt, stellt Internetseiten für den Benutzer dar. Am bekanntesten ist der Microsoft Internet Explorer, gefolgt vom kos...

Programm
Siehe Software...

C++
C++ ist eine von der ISO standardisierte Programmiersprache und eine erweiterte Form von C zur objektorientierten, generischen und prozeduralen Programmierung. Weitestgeh...