<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Taschenrechner mit integriertem &amp;quot;Prim_Check&amp;quot;]]></title><description><![CDATA[<p>Hey C++ler,</p>
<p>ich habe mit Hilfe des Buches:&quot;Einführung in die Programmierung mit C++&quot;,von Bjarne Stroustrup einen Taschnrechner entwickelt. Er besitzt einen meiner nach vernünftigen Fehlerabfangmechanismus, eine &quot;Hilfe&quot; Option,die Möglichkeit für den Benutzer eigene Variabalen zu definieren und zu benutzen,eine integrierte &quot;Prim_überprüfungs&quot; Option und er kann natürlich auch jegliche Ausdrücke ausrechnen.</p>
<p>Ich habe unteranderem die &quot;Prim_Check&quot; Option nachträglich eingefügt. Sie funktioniert auch so weit, doch eine Sache wurmt mich:</p>
<p>Wenn man 'c' eingibt um den &quot;Checker&quot; zu öffnen dann die zutestende Zahl eingibt, bekommt der Benutzer zurück ob es sich um eine Primzahl handelt oder nicht...so weit so gut....doch nach der Ausgabe:&quot;....ist eine/keine Primzahl&quot; ,fügt der Rechner immer noch die Fehlermeldung:&quot;Faktor erwartet&quot; an.<br />
Ich bin das mehrmals durchgegangen, aber ich finde den Grund nicht, stehe grade aufm Schlauch.</p>
<p>Hier der Code:</p>
<pre><code>#include &quot;../../../std_lib_facilities.h&quot;
#include &lt;cmath&gt;
#include &quot;conio.h&quot;

/*
   Einfacher Taschenrechner

   Die Grammatik für die Eingabe lautet:

   Berechnung:
      Anweisung
      Ausgeben
      Verlassen
      Berechnung Anweisung

   Anweisung:
      Deklaration
      Ausdruck

   Deklaration:
      &quot;let&quot; Name &quot;=&quot; Ausdruck

   Anweisung:
      Ausdruck
      Ausgeben
      Verlassen

   Ausgeben:
      ;

   Verlassen:
      q

   Ausdruck:
      Term
      Ausdruck + Term
      Ausdruck – Term
   Term:
      Faktor
      Term * Faktor
      Term / Faktor
      Term % Faktor
   Faktor:
      Zahl
      Name
      ( Ausdruck )
      – Faktor
      + Faktor
   Zahl:
      Gleitkommaliteral

   Die Eingabe kommt von cin über den Token_stream namens ts.
*/

//------------------------------------------------------------------------------

const char number = '8';    // t.kind==number bedeutet, dass t ein Zahlen-Token ist
const char quit   = 'q';    // t.kind==quit bedeutet, dass t ein Verlassen-Token ist
const char print  = ';';    // t.kind==print bedeutet, dass t ein Ausgeben-Token ist
const char name   = 'a';    // Name-Token
const char let    = 'L';    // Deklaration-Token
const string declkey = &quot;let&quot;;// Schlüsselwort für Deklarationen 
const string prompt  = &quot;&gt; &quot;;
const string result  = &quot;= &quot;; // zeigt an, dass danach ein Ergebnis folgt
const char prim = 'c';
const char Help = 'h';
//------------------------------------------------------------------------------

class Token {
public:
    char kind;        // welche Kategorie von Token
    double value;     // für Zahlen: ein Wert  
    string name;      // für Namen: der Name selbst
    Token(char ch)             : kind(ch), value(0)   {}
    Token(char ch, double val) : kind(ch), value(val) {}
    Token(char ch, string n)   : kind(ch), name(n)    {}
};

//------------------------------------------------------------------------------

class Token_stream {
public: 
    Token_stream();   // erstelle einen Token_stream, der aus cin liest 
    Token get();      // lies ein Token ein (get() ist anderswo definiert)
    void putback(Token t);    // lege ein Token zurück
    void ignore(char c);      // verwirf Zeichen bis und einschließlich des nächsten Vorkommens von c
private:
    bool full;        // befindet sich ein Token im Puffer?
    Token buffer;     // hier legen wir ein Token ab, das mit putback() zurückgestellt wurde
};

//------------------------------------------------------------------------------

// Der Konstruktor setzt full auf false, um anzuzeigen, dass der Puffer leer ist:
Token_stream::Token_stream()
:full(false), buffer(0)    // kein Token im Puffer
{
}

//------------------------------------------------------------------------------

// Die Memberfunktion putback() stellt ihr Argument zurück in den Puffer von Token_stream:
void Token_stream::putback(Token t)
{
    if (full) error(&quot;putback(): Zurueckstellen nicht moeglich, Puffer voll&quot;);
    buffer = t;       // kopiere t in den Puffer
    full = true;      // Puffer ist jetzt voll
}

//------------------------------------------------------------------------------

Token Token_stream::get() // liest Zeichen aus cin und baut Token auf
{
    if (full) {         // prüfe, ob es bereits ein fertiges Token gibt 
        full=false;
        return buffer;
    }  

    char ch;
    cin &gt;&gt; ch;    // beachten Sie, dass &gt;&gt; Whitespace-Zeichen wie 
                  // Leerzeichen, Zeilenumbruch, Tabulatorzeichen, etc. überspringt

    switch (ch) {
    case quit:
    case print:
	case prim:
	case Help:
	case '(':
    case ')':
    case '+':
    case '-':
    case '*':
    case '/': 
    case '%':
    case '=':
        return Token(ch); // jedes Zeichen repräsentiert sich selbst 
    case '.':             // ein Gleitkommaliteral kann mit einem Punkt beginnen 
    case '0': case '1': case '2': case '3': case '4':
    case '5': case '6': case '7': case '8': case '9':    // numerisches Literal
    {
        cin.putback(ch);// lege die Ziffer zurück in den Eingabestream
        double val;
        cin &gt;&gt; val;     // lies eine Gleitkommazahl 
        return Token(number,val);
    }
    default:
        if (isalpha(ch)) {
            string s;
            s += ch;
            while (cin.get(ch) &amp;&amp; (isalpha(ch) || isdigit(ch))) s+=ch;
            cin.putback(ch);
            if (s == declkey) return Token(let); // Schlüsselwort für Deklarationen
            return Token(name,s);
        }
        error(&quot;Ungueltiges Token&quot;);
    }
}

//------------------------------------------------------------------------------

void Token_stream::ignore(char c)
    // c repräsentiert die gesuchte Token-Kategorie
{
    // zuerst ein Blick in den Puffer:
    if (full &amp;&amp; c==buffer.kind) {
        full = false;
        return;
    }
    full = false;

    // now search input:
    char ch = 0;
    while (cin&gt;&gt;ch)
        if (ch==c) return;
}

//------------------------------------------------------------------------------

Token_stream ts;        // stellt get() und putback() zur Verfügung  

//------------------------------------------------------------------------------

class Variable {
public:
    string name;
    double value;
    Variable (string n, double v) :name(n), value(v) { }
};

//------------------------------------------------------------------------------

vector&lt;Variable&gt; var_table;

//------------------------------------------------------------------------------

double get_value(string s)
    // liefert den Wert der Variablen mit dem Namen s zurück
{
    for (int i = 0; i&lt;var_table.size(); ++i)
        if (var_table[i].name == s) return var_table[i].value;
    error(&quot;get: nicht definierte Variable &quot;, s);
}

//------------------------------------------------------------------------------

void set_value(string s, double d)
    // weist der Variablen mit dem Namen s den Wert d zu
{
    for (int i = 0; i&lt;var_table.size(); ++i)
        if (var_table[i].name == s) {
            var_table[i].value = d;
            return;
        }
    error(&quot;set: nicht definierte Variable &quot;, s);
}

//------------------------------------------------------------------------------

bool is_declared(string var)
    // ist var bereits in var_table?
{
    for (int i = 0; i&lt;var_table.size(); ++i)
        if (var_table[i].name == var) return true;
    return false;
}

//------------------------------------------------------------------------------

double define_name(string var, double val)
    // füge (var,val) in var_table ein
{
    if (is_declared(var)) error(var,&quot; doppelt deklariert&quot;);
    var_table.push_back(Variable(var,val));
    return val;
}

//------------------------------------------------------------------------------

double expression();    // Deklaration, damit primary() expression() aufrufen kann

//------------------------------------------------------------------------------

// behandelt Zahlen und Klammern 
double primary()
{
    Token t = ts.get();
    switch (t.kind) {
    case '(':           // behandle'(' Ausdruck ')'
        {
            double d = expression();
            t = ts.get();
            if (t.kind != ')') error(&quot;')' erwartet&quot;);
            return d;
        }
    case number:    
        return t.value;    // liefere den Wert der Zahl zurück
    case name:
        return get_value(t.name); // liefere Wert der Variablen zurück
    case '-':
        return - primary();
    case '+':
        return primary();
    default:
        error(&quot;Faktor erwartet&quot;);
    }
}

//------------------------------------------------------------------------------

// behandelt *, / und %
double term()
{
    double left = primary();
    Token t = ts.get(); // lies das nächste Token aus dem Token-Stream ein

    while(true) {
        switch (t.kind) {
        case '*':
            left *= primary();
            t = ts.get();
            break;
        case '/':
            {    
                double d = primary();
                if (d == 0) error(&quot;Division durch null&quot;);
                left /= d; 
                t = ts.get();
                break;
            }
        case '%':
            {    
                int i1 = narrow_cast&lt;int&gt;(left);
                int i2 = narrow_cast&lt;int&gt;(term());
                if (i2 == 0) error(&quot;%: Division durch null&quot;);
                left = i1%i2; 
                t = ts.get();
                break;
            }
        default: 
            ts.putback(t);        // stelle t wieder zurück in den Token-Stream
            return left;
        }
    }
}

//------------------------------------------------------------------------------

// behandelt + und –
double expression()
{
    double left = term();      // liest einen Token ein und wertet ihn aus
    Token t = ts.get();        // lies das nächste Token aus dem Token-Stream ein

    while(true) {    
        switch(t.kind) {
        case '+':
            left += term();    // werte Term aus und addiere
            t = ts.get();
            break;
        case '-':
            left -= term();    // werte Term aus und subtrahiere
            t = ts.get();
            break;
        default: 
            ts.putback(t);     // stelle t wieder zurück in den Token-Stream
            return left;       // keine weiteren + oder –; Antwort zurückliefern
        }
    }
}

//------------------------------------------------------------------------------

double declaration()
    // behandle: name = ausdruck
    // deklariere eine Variable namens &quot;name&quot; mit dem Anfangswert &quot;ausdruck&quot;
{
    Token t = ts.get();
    if (t.kind != name) error (&quot;Deklaration ohne Name&quot;);
    string var_name = t.name;

    Token t2 = ts.get();
    if (t2.kind != '=') error(&quot;= fehlt in der Deklaration von &quot;, var_name);

    double d = expression();
    define_name(var_name,d);
    return d;
}

//------------------------------------------------------------------------------

double statement()
{
    Token t = ts.get();
    switch (t.kind) {
    case let:
        return declaration();
    default:
        ts.putback(t);
        return expression();
    }
}

//------------------------------------------------------------------------------

void clean_up_mess()
{ 
    ts.ignore(print);
}

//-----------------------------------------------------------------------------
bool check(double n){
    if (floor(n) == ceil(n)){ //rudet n auf und ab und vergleicht die Ergebnisse
        return false;
    }
    else{
        return true;
    }

}

void Prim(){
    cout&lt;&lt;&quot;Geben Sie die zutestende Zahl ein: &quot;;
	bool i;
    double n;
	double r;
	int x = 0;
	double t =1;
	cin&gt;&gt;n;

         while(t&lt;=n){
              r = n/t;       
              i = check(r);    //i= test ob r integer oder double (0=true / 1=false)
                if(i==0){ 
                ++x;
                }
              ++t;
            }

            if(x==2){  //wenn r zweimal integer war dann n=Primzahl
               cout&lt;&lt;n&lt;&lt;&quot; ist eine Primzahl!&quot;;
            }
            else{
               cout&lt;&lt;n&lt;&lt;&quot; ist keine Primzahl!&quot;;
            }
		   if(n&lt;=0){ //Fehlerausgabe bei negativer (oder 0) Eingabe
				cout&lt;&lt;&quot;Fehler: Die Eingabe muss größer als 0 sein! &quot;;
			}
}
//------------------------------------------------------------------------------

void help();

void calculate()
{
    while (cin)
      try {
        cout &lt;&lt; prompt;
        Token t = ts.get();
        while (t.kind == print) t=ts.get();    // zuerst alle Ausgabe-Befehle verwerfen
        if (t.kind == prim)Prim();//Prim aufrufen
		if (t.kind == quit) return;// Programm verlassen
		if (t.kind == Help)help();//help aufrufen
        ts.putback(t);
        cout &lt;&lt; result &lt;&lt; statement() &lt;&lt; endl;
    }
    catch (exception&amp; e) {
        cerr &lt;&lt; e.what() &lt;&lt; endl;        // Fehlermeldung ausgeben 
        clean_up_mess();
    }
}

//------------------------------------------------------------------------------

void help()
{
	cout&lt;&lt;&quot;............Help............&quot;&lt;&lt;endl;
	cout&lt;&lt;endl;
	cout&lt;&lt;&quot;........Operationen........&quot;&lt;&lt;endl;
	cout&lt;&lt;endl;
	cout&lt;&lt;&quot;+&quot;&lt;&lt;endl;
	cout&lt;&lt;&quot;-&quot;&lt;&lt;endl;
	cout&lt;&lt;&quot;*&quot;&lt;&lt;endl;
	cout&lt;&lt;&quot;/&quot;&lt;&lt;endl;
	cout&lt;&lt;&quot;%&quot;&lt;&lt;endl;
	cout&lt;&lt;&quot;........Constants........&quot;&lt;&lt;endl;
	cout&lt;&lt;&quot;pi&quot;&lt;&lt;endl;
	cout&lt;&lt;&quot;e&quot;&lt;&lt;endl;
	cout&lt;&lt;&quot;........Options........&quot;&lt;&lt;endl;
	cout&lt;&lt;&quot;Enter...&quot;&lt;&lt;endl;
	cout&lt;&lt;&quot;...'c' to open the Prim_Check&quot;&lt;&lt;endl;
	cout&lt;&lt;&quot;...'let' to define new variables. Example: 'let x = 2'&quot;&lt;&lt;endl;
	cout&lt;&lt;&quot;...'q' to exit&quot;&lt;&lt;endl;
	getch();
	calculate();
}

//------------------------------------------------------------------------------

int main()
try {
    // predefine names:
    define_name(&quot;pi&quot;,3.1415926535);
    define_name(&quot;e&quot;,2.7182818284);
    calculate();

    keep_window_open();    // berücksichtige den Windows-Konsolenmodus 
    return 0;
}
catch (exception&amp; e) {
    cerr &lt;&lt; e.what() &lt;&lt; endl;
    keep_window_open(&quot;~~&quot;);
    return 1;
}
catch (...) {
    cerr &lt;&lt; &quot;Ausnahme\n&quot;;
    keep_window_open(&quot;~~&quot;);
    return 2;
}

//-----------------------------------------------------------------------------
</code></pre>
<p>Anbei noch eine Frage: Gibt es einen &quot;clear_screen&quot; befehl, der den Konsoleninhalt löscht damit man danach weiter machen kann? ich würde so etwas gerne nach dem Aufruf von &quot;help()&quot; einbauen, da es nervt wenn dann die ganzen Help-Hinweise in der Ausgabe bleiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/293959/taschenrechner-mit-integriertem-quot-prim_check-quot</link><generator>RSS for Node</generator><lastBuildDate>Sun, 16 Aug 2026 02:59:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/293959.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 14 Oct 2011 10:26:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Taschenrechner mit integriertem &amp;quot;Prim_Check&amp;quot; on Fri, 14 Oct 2011 10:26:49 GMT]]></title><description><![CDATA[<p>Hey C++ler,</p>
<p>ich habe mit Hilfe des Buches:&quot;Einführung in die Programmierung mit C++&quot;,von Bjarne Stroustrup einen Taschnrechner entwickelt. Er besitzt einen meiner nach vernünftigen Fehlerabfangmechanismus, eine &quot;Hilfe&quot; Option,die Möglichkeit für den Benutzer eigene Variabalen zu definieren und zu benutzen,eine integrierte &quot;Prim_überprüfungs&quot; Option und er kann natürlich auch jegliche Ausdrücke ausrechnen.</p>
<p>Ich habe unteranderem die &quot;Prim_Check&quot; Option nachträglich eingefügt. Sie funktioniert auch so weit, doch eine Sache wurmt mich:</p>
<p>Wenn man 'c' eingibt um den &quot;Checker&quot; zu öffnen dann die zutestende Zahl eingibt, bekommt der Benutzer zurück ob es sich um eine Primzahl handelt oder nicht...so weit so gut....doch nach der Ausgabe:&quot;....ist eine/keine Primzahl&quot; ,fügt der Rechner immer noch die Fehlermeldung:&quot;Faktor erwartet&quot; an.<br />
Ich bin das mehrmals durchgegangen, aber ich finde den Grund nicht, stehe grade aufm Schlauch.</p>
<p>Hier der Code:</p>
<pre><code>#include &quot;../../../std_lib_facilities.h&quot;
#include &lt;cmath&gt;
#include &quot;conio.h&quot;

/*
   Einfacher Taschenrechner

   Die Grammatik für die Eingabe lautet:

   Berechnung:
      Anweisung
      Ausgeben
      Verlassen
      Berechnung Anweisung

   Anweisung:
      Deklaration
      Ausdruck

   Deklaration:
      &quot;let&quot; Name &quot;=&quot; Ausdruck

   Anweisung:
      Ausdruck
      Ausgeben
      Verlassen

   Ausgeben:
      ;

   Verlassen:
      q

   Ausdruck:
      Term
      Ausdruck + Term
      Ausdruck – Term
   Term:
      Faktor
      Term * Faktor
      Term / Faktor
      Term % Faktor
   Faktor:
      Zahl
      Name
      ( Ausdruck )
      – Faktor
      + Faktor
   Zahl:
      Gleitkommaliteral

   Die Eingabe kommt von cin über den Token_stream namens ts.
*/

//------------------------------------------------------------------------------

const char number = '8';    // t.kind==number bedeutet, dass t ein Zahlen-Token ist
const char quit   = 'q';    // t.kind==quit bedeutet, dass t ein Verlassen-Token ist
const char print  = ';';    // t.kind==print bedeutet, dass t ein Ausgeben-Token ist
const char name   = 'a';    // Name-Token
const char let    = 'L';    // Deklaration-Token
const string declkey = &quot;let&quot;;// Schlüsselwort für Deklarationen 
const string prompt  = &quot;&gt; &quot;;
const string result  = &quot;= &quot;; // zeigt an, dass danach ein Ergebnis folgt
const char prim = 'c';
const char Help = 'h';
//------------------------------------------------------------------------------

class Token {
public:
    char kind;        // welche Kategorie von Token
    double value;     // für Zahlen: ein Wert  
    string name;      // für Namen: der Name selbst
    Token(char ch)             : kind(ch), value(0)   {}
    Token(char ch, double val) : kind(ch), value(val) {}
    Token(char ch, string n)   : kind(ch), name(n)    {}
};

//------------------------------------------------------------------------------

class Token_stream {
public: 
    Token_stream();   // erstelle einen Token_stream, der aus cin liest 
    Token get();      // lies ein Token ein (get() ist anderswo definiert)
    void putback(Token t);    // lege ein Token zurück
    void ignore(char c);      // verwirf Zeichen bis und einschließlich des nächsten Vorkommens von c
private:
    bool full;        // befindet sich ein Token im Puffer?
    Token buffer;     // hier legen wir ein Token ab, das mit putback() zurückgestellt wurde
};

//------------------------------------------------------------------------------

// Der Konstruktor setzt full auf false, um anzuzeigen, dass der Puffer leer ist:
Token_stream::Token_stream()
:full(false), buffer(0)    // kein Token im Puffer
{
}

//------------------------------------------------------------------------------

// Die Memberfunktion putback() stellt ihr Argument zurück in den Puffer von Token_stream:
void Token_stream::putback(Token t)
{
    if (full) error(&quot;putback(): Zurueckstellen nicht moeglich, Puffer voll&quot;);
    buffer = t;       // kopiere t in den Puffer
    full = true;      // Puffer ist jetzt voll
}

//------------------------------------------------------------------------------

Token Token_stream::get() // liest Zeichen aus cin und baut Token auf
{
    if (full) {         // prüfe, ob es bereits ein fertiges Token gibt 
        full=false;
        return buffer;
    }  

    char ch;
    cin &gt;&gt; ch;    // beachten Sie, dass &gt;&gt; Whitespace-Zeichen wie 
                  // Leerzeichen, Zeilenumbruch, Tabulatorzeichen, etc. überspringt

    switch (ch) {
    case quit:
    case print:
	case prim:
	case Help:
	case '(':
    case ')':
    case '+':
    case '-':
    case '*':
    case '/': 
    case '%':
    case '=':
        return Token(ch); // jedes Zeichen repräsentiert sich selbst 
    case '.':             // ein Gleitkommaliteral kann mit einem Punkt beginnen 
    case '0': case '1': case '2': case '3': case '4':
    case '5': case '6': case '7': case '8': case '9':    // numerisches Literal
    {
        cin.putback(ch);// lege die Ziffer zurück in den Eingabestream
        double val;
        cin &gt;&gt; val;     // lies eine Gleitkommazahl 
        return Token(number,val);
    }
    default:
        if (isalpha(ch)) {
            string s;
            s += ch;
            while (cin.get(ch) &amp;&amp; (isalpha(ch) || isdigit(ch))) s+=ch;
            cin.putback(ch);
            if (s == declkey) return Token(let); // Schlüsselwort für Deklarationen
            return Token(name,s);
        }
        error(&quot;Ungueltiges Token&quot;);
    }
}

//------------------------------------------------------------------------------

void Token_stream::ignore(char c)
    // c repräsentiert die gesuchte Token-Kategorie
{
    // zuerst ein Blick in den Puffer:
    if (full &amp;&amp; c==buffer.kind) {
        full = false;
        return;
    }
    full = false;

    // now search input:
    char ch = 0;
    while (cin&gt;&gt;ch)
        if (ch==c) return;
}

//------------------------------------------------------------------------------

Token_stream ts;        // stellt get() und putback() zur Verfügung  

//------------------------------------------------------------------------------

class Variable {
public:
    string name;
    double value;
    Variable (string n, double v) :name(n), value(v) { }
};

//------------------------------------------------------------------------------

vector&lt;Variable&gt; var_table;

//------------------------------------------------------------------------------

double get_value(string s)
    // liefert den Wert der Variablen mit dem Namen s zurück
{
    for (int i = 0; i&lt;var_table.size(); ++i)
        if (var_table[i].name == s) return var_table[i].value;
    error(&quot;get: nicht definierte Variable &quot;, s);
}

//------------------------------------------------------------------------------

void set_value(string s, double d)
    // weist der Variablen mit dem Namen s den Wert d zu
{
    for (int i = 0; i&lt;var_table.size(); ++i)
        if (var_table[i].name == s) {
            var_table[i].value = d;
            return;
        }
    error(&quot;set: nicht definierte Variable &quot;, s);
}

//------------------------------------------------------------------------------

bool is_declared(string var)
    // ist var bereits in var_table?
{
    for (int i = 0; i&lt;var_table.size(); ++i)
        if (var_table[i].name == var) return true;
    return false;
}

//------------------------------------------------------------------------------

double define_name(string var, double val)
    // füge (var,val) in var_table ein
{
    if (is_declared(var)) error(var,&quot; doppelt deklariert&quot;);
    var_table.push_back(Variable(var,val));
    return val;
}

//------------------------------------------------------------------------------

double expression();    // Deklaration, damit primary() expression() aufrufen kann

//------------------------------------------------------------------------------

// behandelt Zahlen und Klammern 
double primary()
{
    Token t = ts.get();
    switch (t.kind) {
    case '(':           // behandle'(' Ausdruck ')'
        {
            double d = expression();
            t = ts.get();
            if (t.kind != ')') error(&quot;')' erwartet&quot;);
            return d;
        }
    case number:    
        return t.value;    // liefere den Wert der Zahl zurück
    case name:
        return get_value(t.name); // liefere Wert der Variablen zurück
    case '-':
        return - primary();
    case '+':
        return primary();
    default:
        error(&quot;Faktor erwartet&quot;);
    }
}

//------------------------------------------------------------------------------

// behandelt *, / und %
double term()
{
    double left = primary();
    Token t = ts.get(); // lies das nächste Token aus dem Token-Stream ein

    while(true) {
        switch (t.kind) {
        case '*':
            left *= primary();
            t = ts.get();
            break;
        case '/':
            {    
                double d = primary();
                if (d == 0) error(&quot;Division durch null&quot;);
                left /= d; 
                t = ts.get();
                break;
            }
        case '%':
            {    
                int i1 = narrow_cast&lt;int&gt;(left);
                int i2 = narrow_cast&lt;int&gt;(term());
                if (i2 == 0) error(&quot;%: Division durch null&quot;);
                left = i1%i2; 
                t = ts.get();
                break;
            }
        default: 
            ts.putback(t);        // stelle t wieder zurück in den Token-Stream
            return left;
        }
    }
}

//------------------------------------------------------------------------------

// behandelt + und –
double expression()
{
    double left = term();      // liest einen Token ein und wertet ihn aus
    Token t = ts.get();        // lies das nächste Token aus dem Token-Stream ein

    while(true) {    
        switch(t.kind) {
        case '+':
            left += term();    // werte Term aus und addiere
            t = ts.get();
            break;
        case '-':
            left -= term();    // werte Term aus und subtrahiere
            t = ts.get();
            break;
        default: 
            ts.putback(t);     // stelle t wieder zurück in den Token-Stream
            return left;       // keine weiteren + oder –; Antwort zurückliefern
        }
    }
}

//------------------------------------------------------------------------------

double declaration()
    // behandle: name = ausdruck
    // deklariere eine Variable namens &quot;name&quot; mit dem Anfangswert &quot;ausdruck&quot;
{
    Token t = ts.get();
    if (t.kind != name) error (&quot;Deklaration ohne Name&quot;);
    string var_name = t.name;

    Token t2 = ts.get();
    if (t2.kind != '=') error(&quot;= fehlt in der Deklaration von &quot;, var_name);

    double d = expression();
    define_name(var_name,d);
    return d;
}

//------------------------------------------------------------------------------

double statement()
{
    Token t = ts.get();
    switch (t.kind) {
    case let:
        return declaration();
    default:
        ts.putback(t);
        return expression();
    }
}

//------------------------------------------------------------------------------

void clean_up_mess()
{ 
    ts.ignore(print);
}

//-----------------------------------------------------------------------------
bool check(double n){
    if (floor(n) == ceil(n)){ //rudet n auf und ab und vergleicht die Ergebnisse
        return false;
    }
    else{
        return true;
    }

}

void Prim(){
    cout&lt;&lt;&quot;Geben Sie die zutestende Zahl ein: &quot;;
	bool i;
    double n;
	double r;
	int x = 0;
	double t =1;
	cin&gt;&gt;n;

         while(t&lt;=n){
              r = n/t;       
              i = check(r);    //i= test ob r integer oder double (0=true / 1=false)
                if(i==0){ 
                ++x;
                }
              ++t;
            }

            if(x==2){  //wenn r zweimal integer war dann n=Primzahl
               cout&lt;&lt;n&lt;&lt;&quot; ist eine Primzahl!&quot;;
            }
            else{
               cout&lt;&lt;n&lt;&lt;&quot; ist keine Primzahl!&quot;;
            }
		   if(n&lt;=0){ //Fehlerausgabe bei negativer (oder 0) Eingabe
				cout&lt;&lt;&quot;Fehler: Die Eingabe muss größer als 0 sein! &quot;;
			}
}
//------------------------------------------------------------------------------

void help();

void calculate()
{
    while (cin)
      try {
        cout &lt;&lt; prompt;
        Token t = ts.get();
        while (t.kind == print) t=ts.get();    // zuerst alle Ausgabe-Befehle verwerfen
        if (t.kind == prim)Prim();//Prim aufrufen
		if (t.kind == quit) return;// Programm verlassen
		if (t.kind == Help)help();//help aufrufen
        ts.putback(t);
        cout &lt;&lt; result &lt;&lt; statement() &lt;&lt; endl;
    }
    catch (exception&amp; e) {
        cerr &lt;&lt; e.what() &lt;&lt; endl;        // Fehlermeldung ausgeben 
        clean_up_mess();
    }
}

//------------------------------------------------------------------------------

void help()
{
	cout&lt;&lt;&quot;............Help............&quot;&lt;&lt;endl;
	cout&lt;&lt;endl;
	cout&lt;&lt;&quot;........Operationen........&quot;&lt;&lt;endl;
	cout&lt;&lt;endl;
	cout&lt;&lt;&quot;+&quot;&lt;&lt;endl;
	cout&lt;&lt;&quot;-&quot;&lt;&lt;endl;
	cout&lt;&lt;&quot;*&quot;&lt;&lt;endl;
	cout&lt;&lt;&quot;/&quot;&lt;&lt;endl;
	cout&lt;&lt;&quot;%&quot;&lt;&lt;endl;
	cout&lt;&lt;&quot;........Constants........&quot;&lt;&lt;endl;
	cout&lt;&lt;&quot;pi&quot;&lt;&lt;endl;
	cout&lt;&lt;&quot;e&quot;&lt;&lt;endl;
	cout&lt;&lt;&quot;........Options........&quot;&lt;&lt;endl;
	cout&lt;&lt;&quot;Enter...&quot;&lt;&lt;endl;
	cout&lt;&lt;&quot;...'c' to open the Prim_Check&quot;&lt;&lt;endl;
	cout&lt;&lt;&quot;...'let' to define new variables. Example: 'let x = 2'&quot;&lt;&lt;endl;
	cout&lt;&lt;&quot;...'q' to exit&quot;&lt;&lt;endl;
	getch();
	calculate();
}

//------------------------------------------------------------------------------

int main()
try {
    // predefine names:
    define_name(&quot;pi&quot;,3.1415926535);
    define_name(&quot;e&quot;,2.7182818284);
    calculate();

    keep_window_open();    // berücksichtige den Windows-Konsolenmodus 
    return 0;
}
catch (exception&amp; e) {
    cerr &lt;&lt; e.what() &lt;&lt; endl;
    keep_window_open(&quot;~~&quot;);
    return 1;
}
catch (...) {
    cerr &lt;&lt; &quot;Ausnahme\n&quot;;
    keep_window_open(&quot;~~&quot;);
    return 2;
}

//-----------------------------------------------------------------------------
</code></pre>
<p>Anbei noch eine Frage: Gibt es einen &quot;clear_screen&quot; befehl, der den Konsoleninhalt löscht damit man danach weiter machen kann? ich würde so etwas gerne nach dem Aufruf von &quot;help()&quot; einbauen, da es nervt wenn dann die ganzen Help-Hinweise in der Ausgabe bleiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2131334</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2131334</guid><dc:creator><![CDATA[Golfi1812]]></dc:creator><pubDate>Fri, 14 Oct 2011 10:26:49 GMT</pubDate></item><item><title><![CDATA[Reply to Taschenrechner mit integriertem &amp;quot;Prim_Check&amp;quot; on Fri, 14 Oct 2011 10:29:27 GMT]]></title><description><![CDATA[<p>Mit dem clean_screen aht sich erledigt, nach ein wenig googeln und ausprobieren, bin ich auch</p>
<pre><code class="language-cpp">system(&quot;cls&quot;);
</code></pre>
<p>gestoßen. Klappt wunderbar.</p>
<p>Doch die unerwünschte Fehlermeldung bleibt.... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2131339</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2131339</guid><dc:creator><![CDATA[Golfi1812]]></dc:creator><pubDate>Fri, 14 Oct 2011 10:29:27 GMT</pubDate></item><item><title><![CDATA[Reply to Taschenrechner mit integriertem &amp;quot;Prim_Check&amp;quot; on Fri, 14 Oct 2011 11:01:28 GMT]]></title><description><![CDATA[<p>1. Kürze deinen Code auf das Wesentliche</p>
<p>2. Versuch, die while-Schleife in Prim() (und damit auch die check()-Rechnerei) durch diese zu ersetzen:</p>
<pre><code class="language-cpp">while (t &lt;= n) {
	if (!(n % t))
		++x;
	//optional: Frühzeitiges Verlassen der Schleife
	//if (x &gt; 2)
	//	break;
	++t;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2131351</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2131351</guid><dc:creator><![CDATA[*Rewind*]]></dc:creator><pubDate>Fri, 14 Oct 2011 11:01:28 GMT</pubDate></item></channel></rss>