Bjarne Stroustrup Einführung in die Prog... Problem



  • Habe das zwar hinbekommen, aber viel zu umständlich.
    Habe das ohne While Schleife gemacht.
    Weil im buch stand nur mit if-else.



  • #include <iostream>
    using namespace std;
    
    int main()
    {
    	cout << "Bitte denken Sie sich eine ganzzahlige Zahl zwischen 1 und 100 aus." << endl;
    	cout << "Bitte mit j oder n antworten." << endl;
    	cout << "Ist ihre Zahl kleiner als 50 ( j oder n) ." << endl;
    	char a;
    	cin >> a;
    
    int b=50;
    int temp=25;
    
    	if(a=='j')
    	{
    		b-=temp;
    		cout << " Ist die Zahl kleiner als " << b << endl;
    		cin >> a;
    	}
    
    	else if(a=='n')
    	{
    		b+=temp;
    		cout << " Ist die Zahl kleiner als " << b << endl;
    		cin >> a;
    	}
    
    	if(a=='j')
    	{
    		temp/=2;
    		b-=temp;
    		cout << " Ist die Zahl kleiner als " << b << endl;
    		cin >> a;
    	}
    
    	else if(a=='n')
    	{
    		temp/=2;
    		b+=temp;
    		cout << " Ist die Zahl kleiner als " << b << endl;
    		cin >> a;
    	}
    
    	if(a=='j')
    	{
    		temp/=2;
    		b-=temp;
    		cout << " Ist die Zahl kleiner als " << b << endl;
    		cin >> a;
    	}
    
    	else if(a=='n')
    	{
    		temp/=2;
    		b+=temp;
    		cout << " Ist die Zahl kleiner als " << b << endl;
    		cin >> a;
    	}
    
    	if(a=='j')
    	{
    		temp/=2;
    		b-=temp;
    		cout << " Ist die Zahl kleiner als " << b << endl;
    		cin >> a;
    	}
    
    	else if(a=='n')
    	{
    		temp/=2;
    		b+=temp;
    		cout << " Ist die Zahl kleiner als " << b << endl;
    		cin >> a;
    	}
    
    	if(a=='j')
    	{
    		temp/=2;
    		b-=temp;
    		cout << " Ist die Zahl kleiner als " << b << endl;
    		cin >> a;
    	}
    
    	else if(a=='n')
    	{
    		temp/=2;
    		b+=temp;
    		cout << " Ist die Zahl kleiner als " << b << endl;
    		cin >> a;
    	}
    
    	if(a=='j')
    	{
    		temp=1;
    		b-=temp;
    		cout << " Ist die Zahl kleiner als " << b << endl;
    		cin >> a;
    	}
    
    	else if(a=='n')
    	{
    		temp=1;
    		b+=temp;
    		cout << " Ist die Zahl kleiner als " << b << endl;
    		cin >> a;
    	}
    
    	cout << "\n";
    	system("pause");
    	return 0;
    }
    


  • Zeto schrieb:

    Habe das zwar hinbekommen, aber viel zu umständlich.
    Habe das ohne While Schleife gemacht.
    Weil im buch stand nur mit if-else.

    Ich dachte, im Buch stand:

    Zeto schrieb:

    Hinweis: Verwenden Sie Operatoren < und <= sowie das If-Else Konstrukt.

    Das heißt ja nicht, dass nichts anderes verwendet werden darf ...



  • Einführung in die Programmierung mit C++, S. 35 schrieb:

    Companion Website
    Auf der Webseite zum Buch befindet sich eine übertragene Version der vollständigen Beispielsammlung zu dem Buch ... Die Webseite zu diesem Buch finden Sie unter www.pearson-studium.de. Am schnellsten gelangen Sie von dort zur Buchseiten, wenn Sie in das Textfeld Schnellsuche die Buchnummer 4005 eingeben und danach suchen lassen.

    Und die Sammlung umfasst 417 cpp-Dateien.



  • Zeus schrieb:

    Und die Sammlung umfasst 417 cpp-Dateien.

    Und keine einzige Lösung.



  • Wozu Lösungen?
    Es ist ja gerade Sinn und Zweck, dass du dich selber mit den Problemen beschäftigst und nicht nach 10 Minuten aufgibst und dir die Lösung anschaust.

    Das Buch hat so schon >1200 Seiten - wenn dann noch die Lösungen dazu kämen ....

    Für genau solche Probleme gibt es doch dann Foren wie dieses hier. Du versuchst es erstmal alleine, liest ggf. nochmal das Kapitel aufmerksamer durch oder ziehst ein anderes Buch zu rate, und wenn du dann immernoch Verständnissprobleme hast oder unbeantwortete Fragen, dann fragst du eben hier nach.

    Sei froh, dass im Buch überhaupt Übungsaufgaben gestellt werden, die mit dem bis dahin zu erwartetenden Kenntnisstand gelöst werden können. Als Anfänger ist es nicht unbedingt leicht sich selbs Aufgaben zu stellen.



  • Ich möchte eine Tabelle erstellen, in der nur Primezahlen aufgelistet werden.
    Mir wird z.b. die 143 angezeigt, aber das ist doch gar keine Primezahl.
    Könnt mir jemand helfen den Fehler zu finden.

    #include <iostream>
    
    void del()
    {
    	cin.sync();
    	cin.clear();
    }
    
    int main()
    {
    
    int step, x;
    
    	cout << "Bitte geben Sie das Zahlenmaximum an." << endl;
    	del();
    	cin >> x;
    
    	for (step=2; step<x ; step++)
    	{
    		if(step%2!=0 && step%3!=0 && step%5!=0  && step%7!=0 &&step%9!=0)
    		{
    			if(step==1)
    			{
    				;
    			}
    			else
    			{
    				cout << "Primzahl " << step << "\n";
    			}
    		}
    		else if(step==2||step==3||step==5||step==7)
    		{
    				cout << "Primzahl " << step << "\n";
    		}
    	}
    
    	cout << "\n";
    	system("pause");
    	return 0;
    }
    


  • Zeto schrieb:

    .
    Mir wird z.b. die 143 angezeigt, aber das ist doch gar keine Primezahl.

    Durch was kannst Du 143 denn teilen?



  • durch 11 sind genau 13.



  • Jo, und wo in Deinem Programm prüfst Du, ob durch 11 (oder 13) geteilt werden kann?



  • Gar nicht ,stimmmt, danke.



  • Ich bekomme das einfach nicht hin.
    Es sollen nur die Primzahlen ausgegeben werden.

    Das habe ich im int main stehen

    int prime_temp(0), max(0), step(0), temp(0), temp2;
    	bool ok=true;
    	vector<int>prime(prime_temp);
    
    	prime.push_back(2);
    	prime.push_back(3);
    
    	cout << "Bitte geben Sie das Tabellenende an (z.B. 100). ";
    	del();
    	cin >> max;
    
    	cout << "\n\n-----------------  Primezahlen-Tabelle  ----------------------\n\n";
    
    for(step=4; step<=max; ++step)           //     zahl hochzählen bis max erreicht ist.
    {
    	temp=prime.size();
    	ok=true;
    
            if(ok==true)
    		{
    			for(int i=0; i<prime.size();)
    			{
    					if(step%prime[prime_temp]!=0)
    					{
    
    							if(i+1==prime.size())
    							{
    								prime.push_back(step);
    								cout << step << " ist eine Primezahl " << endl;
    
    								/*for(int a=0; a<prime.size(); ++a){
    								cout << "prime[" << a << "]==" << prime[a] << '\n';
    								}*/
    
    							}
    							else
    							{
    							i++;	
    							}
    					}
    					else if(step%prime[prime_temp]==0)
    					{
    						temp2=prime.size();
    						i=temp2;
    					}
    			}
            }	
    		else
    		{
    		   ;
    		}
    }
    


  • Habs gelöst bekommen.

    bool ok;
    	int max, teiler, zahl, temp;
    	vector<int>prime;
    
    	cout << "Bitte geben Sie das Tabellenende an (z.B. 100): ";
        del();
        cin >> max;
    
        cout << "\n\n-----------------  Primezahlen-Tabelle  ----------------------\n\n";
    
    for(zahl=2; zahl<=max; zahl++)
    {
    	ok=true;
    	for(temp=0; temp<prime.size(); temp++)
    	{
    		if(zahl%prime[temp]==0)
    		{
    		ok=false;
    		}
    	}
    	if(ok==true)
    	{
    	prime.push_back(zahl);
    	cout << "\n V.Platz: " << temp << "\t\t Wert: " <<  prime[temp];
    	}
    }
    


  • Folgende Verbesserungen:

    - schreibe für den Test, ob eine Zahl prim ist, eine Funktion
    - Bei der Schleife, die einen Teiler der Zahl finden soll, reicht es bis Wurzel(Zahl) zu iterieren

    #include <iostream>
    #include <cmath>
    bool isPrime(int n)
    {
      if (n <= 0) return false;
      for(int i=2; i<std::sqrt(n); i++)
        if(n%i==0)
          return false;
      return true;
    }
    
    int main()
    {
      int o = 0;
    
      while(o<1)
      {
        std::cout << "Bitte Obergrenze angeben:" << std::endl;
        std::cin >> o;
      }
    
      for(int i=1; i < o; i++)
        std::cout << "Die Zahl " << i << isPrime(i) ? " ist eine Primzahl." : " ist keine Primzahl." << std::endl;
    
      return 0;
    }
    

    *Edit: Das hier nur die Primzahlen bis zur Obergrenze ausgegeben werden, ist so gewollt und hat gar nichts damit zu tun, dass ich die Aufgabenstellung nicht gelesen haben *hust* 🤡



  • Ich möchte vergleichen, ob im 0 dann im 1 , 2 usw der gleiche String drin steht.
    Was hier dran falsch?

    for(int q=0; q<names.size(); q++)	
    					{
    						if(names[q]==names.back())
    						{
    							age.pop_back();
    							names.pop_back();
    							ok=false;
    						}
    						else
    						{
    							;
    						}
    					}
    


  • ohne Definition von Names kann man da nur raten



  • #include <iostream>
    #include <string>
    
    void del()
    {
    	cin.sync();
    	cin.clear();
    }
    
    int main()
    {
    
    	vector<string>names;
    	string temp_n;
    	vector<int>age;
    	int temp_a;
    	bool ok=true;
    
    	while(ok==true)
    {
    		cout << "Geben Sie einen Namen und das Atler an." << endl;
    		del();
    		cin >> temp_n;
    			if(temp_n!="noname" && temp_n!="exit")
    			{
    				names.push_back(temp_n);
    				del();
    				cin >> temp_a;
    				age.push_back(temp_a);
    
    					if(temp_a>120 ||temp_a<1||cin.fail())
    					{
    						age.pop_back();
    						names.pop_back();
    						ok=false;
    						cout << "\nFalsche Eingabe fail  cin   . " << endl;
    					}
    					else
    					{
    						;
    					}
    
    					for(int q=0; q<names.size(); q++)	
    					{
    						if(names[q]==names.back())
    						{
    							age.pop_back();
    							names.pop_back();
    							ok=false;
    						}
    						else
    						{
    							;
    						}
    					}
    
    			}
    			else if(ok=false)
    			{
    				ok=false;
    			}
    }
    	for(int i=0; i<names.size(); i++)
    	{
    		cout << "\n\nV.Platz (Names): " << i << "\t\t Name:  " << names[i] ;
    		cout << "\nV.Platz (Age): "  << i << "\t\t Alter: " << age[i] ;
    	}
    
    	cout << "\n\n";
    	system("pause");
    	return 0;
    }
    

    Fehler gefunden
    Ab Zeile 43 hat er den letzten Vektorplatz mit dem letzten Platz verglichen. 😃

    Dupletfinder=names.size();
    					Dupletfinder-=1;
    					for(int q=0; q<Dupletfinder; q+=1)	
    					{
    						if(names[q]==names.back())
    						{
    


  • Bin nun bei Kapitel 6 dort soll ich eine Taschenrecher.cpp kompiliern und die Fehler beseitigen.
    Ich komme einfach nicht dahinter wo diese Fehler sind.
    Vielleicht könnt ihr mir helfen.
    Bei Zeile 69, müsste doch "==true" ergänzt werden, aber in der ganzen Funktion beschwert er sich full und buffer nicht zu kennen.

    //
    // Dieser Beispielcode stammt aus dem Aufgabenteil von Kapitel 6 des Buches
    // "Einführung in die Programmierung mit C++" von Bjarne Stroustrup
    //
    
    /*
    	Diese Datei heißt calculator02buggy.cpp
    
    	Ich habe 5 Fehler eingefügt, die korrigiert werden müssen, damit sich das Programm kompilieren lässt
    	Ich habe 3 logische Fehler eingefügt, die zu falschen Ergebnissen führen sollten
    
    	Versuchen Sie zunächst, die Fehler ohne Zuhilfenahme des Buches zu finden.
       Wenn dies zu mühsam wird, vergleichen Sie den Code mit dem Code im Buch (oder der Beispielsammlung)
    
    	Fröhliche Jagd!
    
    */
    
    #include "std_lib_facilities.h"
    
    //------------------------------------------------------------------------------
    
    lass Token {
    public:
        char kind;        // welche Kategorie von Token
        double value;     // für Zahlen: ein Wert  
        Token(char ch)    // erstelle ein Token aus einem char
            :kind(ch), value(0) { }    
        Token(char ch, double val)     // erstelle ein Token aus einem char und einem double
            :kind(ch), value(val) { }
    };
    
    //------------------------------------------------------------------------------
    
    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 
    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("putback(): Zurueckstellen nicht moeglich, Puffer voll");
        buffer = t;       // kopiere t in den Puffer
        full = true;      // Puffer ist jetzt voll
    }
    
    //------------------------------------------------------------------------------
    
    Token get()
    {
        if (full) {       // gibt es bereits ein fertiges Token?
            // Token aus dem Puffer entfernen
            full=false;
            return buffer;
        } 
    
        char ch;
        cin >> ch;    // beachten Sie, dass >> Whitespace-Zeichen wie 
                      // Leerzeichen, Zeilenumbruch, Tabulatorzeichen, etc. überspringt
    
        switch (ch) {
        case ';':    // für "Ausgeben"
        case 'q':    // für "Verlassen"
        case '(': case ')': case '+': case '-': case '*': case '/': 
            return Token(ch);        // jedes Zeichen repräsentiert sich selbst 
        case '.':
        case '0': case '1': case '2': case '3': case '4':
        case '5': case '6': case '7': case '9':
            {    
                cin.putback(ch);         // lege die Ziffer zurück in den Eingabestream
                double val;
                cin >> val;              // lies eine Gleitkommazahl 
                return Token('8',val);   // '8' repräsentiert "eine Zahl"
            }
        default:
            error("Ungueltiges Token");
        }
    }
    
    //------------------------------------------------------------------------------
    
    Token_stream ts;        // stellt get() und putback() zur Verfügung  
    
    //------------------------------------------------------------------------------
    
    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("')' expected);
                return d;
            }
        case '8':            // wir verwenden '8' zur Repräsentation einer Zahl
            return t.value;  // liefere den Wert der Zahl zurück
        default:
            error("Faktor erwartet");
        }
    }
    
    //------------------------------------------------------------------------------
    
    // 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();
            case '/':
                {    
                    double d = primary();
                    if (d == 0) error("Division durch null");
                    left /= d; 
                    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
            }
        }
    }
    
    //------------------------------------------------------------------------------
    
    int main()
    try
    {
        while (cin) {
            Token t = ts.get();
    
            if (t.kind == 'q') break; // 'q' für "verlassen"
            if (t.kind == ';')        // ';' für "jetzt ausgeben"
                cout << "=" << val << '\n';
            else
                ts.putback(t);
            val = expression();
        }
    	keep_window_open();
    }
    catch (exception& e) {
        cerr << "Fehler: " << e.what() << '\n'; 
        keep_window_open();
        return 1;
    }
    catch (...) {
        cerr << "Hoppla: unbekannte Ausnahme!\n"; 
        keep_window_open();
        return 2;
    }
    
    //------------------------------------------------------------------------------
    


  • Zeile 67 müsste so aussehen:

    Token Token_stream::get()
    

    Die restlichen Fehler kannst du dann noch selber suchen.
    Das "==true" ist übrigens nicht notwendig.



  • Zeto schrieb:

    Bei Zeile 69, müsste doch "==true" ergänzt werden,

    Nein, das wäre überflüssig. Der Ausdruck beim if wird immer auf wahrheit überprüft, das braucht man nicht mit true zu vergleichen. Kann man machen, gibgt aber auch nur wieder einen booleschen Ausdruck, der entweder true oder false ist. Man kanns dann natürlich immer weiter treiben...

    if ((true == (full == true)) == true)
    

    aber in der ganzen Funktion beschwert er sich full und buffer nicht zu kennen.

    Weil du get als freie Funktion definierst, die nichts mit Token_stream zu tun hat. Das ist bestimmt nicht beabsichtigt...


Anmelden zum Antworten