Parameter Problem. "bezeichner nicht definiert" obwohl in der Klasse vorhanden. -= gelöst =-



  • Was mir nicht gefällt, ist, dass du verdreifachten Code hast.
    Edit: Nein, verzehntfachten ! Z. 385, ~615 ++
    Edit²: Nein, verdreizehnfachten ! Z. 557 ++

    Edit: zu langsam ... 😕

    Z. 839 ist unlogisch. mach gleich alles am Stück.
    Ebenso 9 Zeilen weiter unten ...

    Und volkard hat recht. Funktionen in sich selbst aufzurufen kann in einer nicht mehr ohne Gewalt zu beendenden Rekursion enden. Gewöhn dir das ab.



  • Um dem Augenkrebs ein wenig entgegenzuwirken, habe ich mal ein wenig rumgespielt.
    Und bitte kein endl mehr nehmen, wenn '\n' gemeint ist und '\n' ans Ende schreiben und laß Funktionen möglichst nur einen Zweck erfüllen. Und generell versuchen, Code nicht mehrmals zu haben.
    So, der Anfang ist gemacht. Ist aber noch total unfertig. Habe viel Logik von Dir stehenlassen, die kann bestimmt noch vereinfacht werden.

    #include <iostream>
    #include <cmath>
    
    void clearScreen(){
        int i=system("clear");
        (void)i;//only to make the compiler happy
    }
    void _getch(){
    }
    
    using namespace std;
    
    void aKreis() {
    	double r=eingabeDouble("Bitte geben Sie den Radius des Kreises an.");
    	double aKreis = M_PI*r*r;
    	cout << "Die Formel lautet  Pi * r * r\n";
    	cout << "Der Flaecheninhalt des Kreises lautet daher: " << aKreis << '\n';
    }
    
    void uKreis() {
    	double r=eingabeDouble("Bitte geben Sie den Radius des Kreises an.");
    	double uKreis*pi*r;
    	cout << "Die Formel lautet 2 * Pi * r\n";
    	cout << "Der Umfang des Kreises lautet daher: " << uKreis << '\n';
    }
    
    void aDreieck() {
    	double h=eingabeDouble("Bitte geben sie die Hoehe des Dreiecks an.");
    	double g=eingabeDouble("Bitte geben Sie nun noch die Grundseite des Dreiecks an.");
    	double aDreieck = g*hoehe/2;
    	cout << "Die Formel lautet g * h : 2\n";
    	cout << "Die Flaeche des Dreiecks lautet daher: " << aDreieck << '\n';
    }
    
    void aRechteck() {
    	double a=eingabeDouble("Geben sie die Laenge des Rechtecks an.");
    	double b=eingabeDouble("Bitte geben Sie nun noch die Breite des Rechtecks an.");
    	double aRechteck;
    	cout << "\n\nDie Formel lautet a * b" << endl;
    	cout << "\nDer Flaecheninhalt des Rechtecks lautet daher: " << aRechteck << endl;
    }
    
    void vZylinder() {
    	double h=eingabeDouble("Bitte geben Sie die Hoehe des Zylinders an.");
    	double r=eingabeDouble("Bitte geben Sie nun noch den Radius des Zylinders an.");
    	double vZylinder = pi*r3*r3*hoehe2;
        cout << "\nDie Formel lautet Pi * r * r * h" <<endl;
        cout << "\nDas Volumen des Zylinders lautet daher: " << vZylinder << endl;
    }
    
    double eingabeDouble(char const* prompt){
        cout<<prompt;
        double result;
        cin>>result;//if throw
        return result;
    }
    
    int rechne(char const* name,int(f)()){
        clearScreen();
        for(;;){
            cout<<name<<'\n';
            f();
            cout << "Zur Hauptauswahl?\n"
                 << "(2) Ja\n"
                 << "(1) nochmal versuchen\n"
                 << "(0) beenden\n";
    		int wahl2;
    		if (cin >> wahl2) {
    			if (wahl2 == 2)
                    return HAUPTMENUE;
    			else if (wahl2 == 1)
                    continue;
    			else if (wahl2 == 0) 
    				return ENDE;
                else {
                    clearScreen();
                    cerr << "\aFalsche Eingabe! Sie werden zur Hauptauswahl geleitet." << endl;
                    _getch();
                    return HAUPTMENUE;
    			}
        }
    }
    
    int main() {
        int const ANZAHL=5;
        char const* namen[ANZAHL]{
            "Flaecheninhalt eines Kreises",
            "Umfang eines Kreises",
            "Flaecheninhalt eines Dreiecks",
            "Flaecheninhalt eines Rechtecks",
            "Volumen eines Zylinders",
        };
        void(*funktionen[ANZAHL])()={
            &aKreis,
            &uKreis,
            &aDreieck,
            &aRechteck,
            &vZylinder,
        }
    	cout << "Hauptauswahl\n";
    	for(int i=0;i!=ANZAHL;++i)
            cout<<namen[i]<<'\n';
        cout<<"("<<ANZAHL<<") Programm beenden\n"
    	cout<<"(20) Anleitung des Programms\n";
    
    	int wahl;
    	cin>>wahl;
        if(1<=wahl && wahl<=ANZAHL){
            rechne(name[wahl-1],funktion[wahl-1]);
        }
        else if(wahl==20){
    		clearScreen();
    		cout << "Geben Sie die Zahl ein" << endl;
    		break;
    	}
    	else {
    		clearScreen();
    		cout << "\aFalsche Eingabe! Sie werden zur Hauptauswahl geleitet." << endl;
    		_getch();
    		clearScreen();
    		prozess();
    	}
    	return 0;
    }
    


  • gelöscht



  • Noch ein paar Minuten gespielt.

    #include <iostream>
    #include <cmath>
    
    using namespace std;
    
    int const HAUPTMENU=1;
    int const ENDE=2;
    
    void clearScreen() {
    	int i=system("clear");
    	(void)i;//only to make the compiler happy
    }
    
    void _getch() {
    }
    
    double eingabeDouble(char const* prompt) {
    	cout<<prompt;
    	double result;
    	cin>>result;//if throw
    	return result;
    }
    
    void aKreis() {
    	double r=eingabeDouble("Bitte geben Sie den Radius des Kreises an.");
    	double aKreis = M_PI*r*r;
    	cout << "Die Formel lautet  Pi * r * r\n";
    	cout << "Der Flaecheninhalt des Kreises lautet daher: " << aKreis << '\n';
    }
    
    void uKreis() {
    	double r=eingabeDouble("Bitte geben Sie den Radius des Kreises an.");
    	double uKreis=M_PI*r;
    	cout << "Die Formel lautet 2 * Pi * r\n";
    	cout << "Der Umfang des Kreises lautet daher: " << uKreis << '\n';
    }
    
    void aDreieck() {
    	double h=eingabeDouble("Bitte geben sie die Hoehe des Dreiecks an.");
    	double g=eingabeDouble("Bitte geben Sie nun noch die Grundseite des Dreiecks an.");
    	double aDreieck = g*h/2;
    	cout << "Die Formel lautet g * h : 2\n";
    	cout << "Die Flaeche des Dreiecks lautet daher: " << aDreieck << '\n';
    }
    
    void aRechteck() {
    	double a=eingabeDouble("Geben sie die Laenge des Rechtecks an.");
    	double b=eingabeDouble("Bitte geben Sie nun noch die Breite des Rechtecks an.");
    	double aRechteck=a*b;
    	cout << "Die Formel lautet a * b" << '\n';
    	cout << "Der Flaecheninhalt des Rechtecks lautet daher: " << aRechteck << '\n';
    }
    
    void vZylinder() {
    	double h=eingabeDouble("Bitte geben Sie die Hoehe des Zylinders an.");
    	double r=eingabeDouble("Bitte geben Sie nun noch den Radius des Zylinders an.");
    	double vZylinder = M_PI*r*r*h;
    	cout << "\nDie Formel lautet Pi * r * r * h" <<'\n';
    	cout << "\nDas Volumen des Zylinders lautet daher: " << vZylinder << '\n';
    }
    
    int rechne(char const* name,void(funktion)()) {
    	clearScreen();
    	for(;;) {
    		cout<<name<<'\n';
    		(*funktion)();
    		cout << "Zur Hauptauswahl?\n"
    				 << "(2) Ja\n"
    				 << "(1) nochmal versuchen\n"
    				 << "(0) beenden\n";
    		int wahl2;
    		if (cin >> wahl2) {
    			if (wahl2 == 2)
    				return HAUPTMENU;
    			else if (wahl2 == 1)
    				continue;
    			else if (wahl2 == 0)
    				return ENDE;
    			else {
    				clearScreen();
    				cerr << "\aFalsche Eingabe! Sie werden zur Hauptauswahl geleitet." << endl;
    				_getch();
    				return HAUPTMENU;
    			}
    		}
    	}
    }
    
    int main() {
    	int const ANZAHL=5;
    	char const* namen[ANZAHL] {
    		"Flaecheninhalt eines Kreises",
    		"Umfang eines Kreises",
    		"Flaecheninhalt eines Dreiecks",
    		"Flaecheninhalt eines Rechtecks",
    		"Volumen eines Zylinders",
    	};
    	void(*funktionen[ANZAHL])()= {
    		&aKreis,
    		&uKreis,
    		&aDreieck,
    		&aRechteck,
    		&vZylinder,
    	};
    	for(;;){
            cout << "Hauptauswahl\n";
            for(int i=0; i!=ANZAHL; ++i)
                cout<<namen[i]<<'\n';
            cout<<"("<<ANZAHL+1<<") Programm beenden\n";
            cout<<"(20) Anleitung des Programms\n";
    
            int wahl;
            cin>>wahl;
            int weiter;
            else if(wahl==20) {
                clearScreen();
                cout << "Geben Sie die Zahl ein" << endl;
                _getch();
                continue;
            } else if (wahl==ANZAHL+1){
                break;
            }
            else if(wahl<1 || wahl>ANZAHL){}
                clearScreen();
                cout << "\aFalsche Eingabe! Sie werden zur Hauptauswahl geleitet." << endl;
                _getch();
                continue;
            }
            else{
                wahl=rechne(namen[wahl-1],funktionen[wahl-1]);
                if(wahl==ENDE)
                    break;
                else if(wahl==HAUPTMENU)
                    continue;
                else
                    //hmm
                    ;
            }
    	}
    	return 0;
    }
    


  • Hacker schrieb:

    Volkard, ist Z. 93 dein Ernst ?
    Ist das etwa ein C-Array ?

    Was ist daran so verkehrt?



  • Hacker schrieb:

    wird renoviert (dieser post)

    Ja, klar ist Zeile 93 mein Ernst. Damit will ich ihn unter anderem dazu anregen, ein Buch durchzulesen. Und es war gerade schneller zu tippen. Selber würde ich das wohl nicht stehen lassen. Oder doch? Weiß nicht. Ich würde das ganze Programm nicht so schreiben. Kann mich nicht sehr tief reindenken.



  • Nein, war eher als scherz gemeint, allerdings verstehe ich nicht ganz wieso. Auch nicht die C strings, das ist doch nicht gesund. 😃

    Aber egal. was ich sagen will, selbst nachdem du ihn verbessert hast - das war (und ist (?)) Müll.
    Man müsste das Grundgerüst neu überdenken.



  • Hacker schrieb:

    Auch nicht die C strings, das ist doch nicht gesund. 😃

    Altes Märchen.
    Die sind hier angemessener als std::string, sie werden ja nicht irgendwie "verarbeitet".



  • Vor allem wird hier die Allokation und das ganze Drumherum von std::string gespart. Die strings können somit direkt vom Compiler so wie sie da stehen in den Code eingefügt werden. Ich würde allerdings den Zeiger auch noch const machen.



  • 314159265358979 schrieb:

    Ich würde allerdings den Zeiger auch noch const machen.

    Ach, ich Deppchen. Ich habe überall const vergessen, zum Beispiel

    void aDreieck() {
        double const h=eingabeDouble("Bitte geben sie die Hoehe des Dreiecks an.");
        double const g=eingabeDouble("Bitte geben Sie nun noch die Grundseite des Dreiecks an.");
        double const aDreieck = g*h/2;
        cout << "Die Formel lautet g * h : 2\n";
        cout << "Die Flaeche des Dreiecks lautet daher: " << aDreieck << '\n';
    }
    


  • Mal ne Frage: was macht es für einen Sinn, den Wert Konstant zu machen, wenn es völlig ersichtlich ist, dass er nicht mehr verändert wird 😕
    Und könnte man 'g*h/2' nicht gleich in den Ausgabe-Stream schreiben ?
    Oder auch sowas:

    void aDreieck() 
    {
        double aDreieck =
        eingabeDouble("Bitte geben Sie die Grundseite des Dreiecks an.")*
        eingabeDouble("Bitte geben sie nun noch die Hoehe des Dreiecks an.")/2;
        cout << "Die Formel lautet g * h : 2\n"
                 "Die Flaeche des Dreiecks lautet daher: " << aDreieck << '\n';
    }
    

    Edit: hab grad die Antwort gesehen. Passt nicht 🙄



  • Hacker schrieb:

    Und könnte man 'g*h/2' nicht gleich in den Ausgabe-Stream schreiben ?

    Ja nein.
    Ich mag die extrem hochkomplizierte mathematische Berechnung in einer eigenen Zeile haben, um das Programm zu entwirren.



  • Hacker schrieb:

    Mal ne Frage: was macht es für einen Sinn, den Wert Konstant zu machen, wenn es völlig ersichtlich ist, dass er nicht mehr verändert wird 😕

    Ok, dann mache ich das const halt wieder weg.
    Aber jetzt weiß ich nicht, wieviel const überleben soll. Also bei Compilezeitkonstenten wie HAUPTMENU, ENDE und ANZAHL maxchen wir bestimmt ein const.
    Und wo lassen wir es weg? PI, welchen Zeiger meintest Du? Und soll der wirklich const sein oder nicht? Nach welcher Regelung?



  • Hacker schrieb:

    double aDreieck =
        eingabeDouble("Bitte geben Sie die Grundseite des Dreiecks an.")*
        eingabeDouble("Bitte geben sie nun noch die Hoehe des Dreiecks an.")/2;
    

    Nein, so etwas bitte nicht. Die Reihenfolge der Funktionsaufrufe ist undefiniert. Wenn sie das sein soll, braucht es mindestens eine Zwischenvariable.



  • Aber

    double aDreieck =
        eingabeDouble("Bitte geben Sie die Grundseite des Dreiecks an.")*
        eingabeDouble("Bitte geben sie die Hoehe des Dreiecks an.")/2;
    

    wäre spaßig, weil es zufällig nicht falsch wird.



  • @volkard: consts lassen, was nicht verändert werden muss, ist const 😉

    char const* const namen[ANZAHL] = { ... };
    

    Die Funktionszeiger würde ich instinktiv auch const machen, aber wo das const da hin soll, weiß ich nicht.



  • const char* const namen[ANZAHL] = { ... };
    

    oder 🤡



  • void(*const funktionen[ANZAHL])()=
    

    würde ein versehentliches

    funktionen[3]=&aKreis;
    

    verhindern.



  • Arbeitet der Compiler nicht von Links nach rechts ?
    Müssten die Funktionen in meinem Beispiel nicht nacheinander aufgerufen werden und nicht zufällig ? Oder ist das Compilerspezifisch ? 😕



  • 314159265358979 schrieb:

    @volkard: consts lassen, was nicht verändert werden muss, ist const 😉

    Also ich glaube fast, die Profis hauen nicht so viel const rein.


Anmelden zum Antworten