[Anfänger]Switch Case mit Funktion Code



  • Hat dir schon mal jemand gesagt, daß deine Einrückung grauenhaft ist?

    Ansonsten solltest du nur an einer Stelle in der Schleife den Namen abfragen, sonst kommst du nur durcheinander:

    string name;
    char korrekt;
    do
    {
      cout<<"Name eingeben"<<endl;
      getline(cin,name);//liest auch Namen mit Leerzeichen ein - bis zum ENTER
      cout<<"Ist "<<name<<" korrekt?"<<endl;
      cin.ignore();
      cin>>korrekt;
    }
    while(toupper(korrekt)!='Y');
    

    (beim Schreiben ist mir noch ein Fehler aufgefallen - du hast die Bedingung der Schleife vertauscht, dadurch kommst du zurück an den Anfang, wenn der Nutzer 'y' (oder irgendeinen Müll) eingegeben hat)

    PS: www.if-schleife.de 😃



  • CStoll schrieb:

    Hat dir schon mal jemand gesagt, daß deine Einrückung grauenhaft ist?

    Ansonsten solltest du nur an einer Stelle in der Schleife den Namen abfragen, sonst kommst du nur durcheinander:

    string name;
    char korrekt;
    do
    {
      cout<<"Name eingeben"<<endl;
      getline(cin,name);//liest auch Namen mit Leerzeichen ein - bis zum ENTER
      cout<<"Ist "<<name<<" korrekt?"<<endl;
      cin.ignore();
      cin>>korrekt;
    }
    while(toupper(korrekt)!='Y');
    

    (beim Schreiben ist mir noch ein Fehler aufgefallen - du hast die Bedingung der Schleife vertauscht, dadurch kommst du zurück an den Anfang, wenn der Nutzer 'y' (oder irgendeinen Müll) eingegeben hat)

    PS: www.if-schleife.de 😃

    Dankeschön für die hilfe ich werde es mir mit der Einrückung merken
    Und das mit den If-Schleifen.de kenne ich schon 🙂
    Aber es gibt da noch ein Problem irgentwie haut das nicht hin...
    Ich hab diesen Quellcode eingegeben

    string name;
    char korrekt;
    do
    {
      cout<<"Bitte Name eingeben"<<endl;
      getline(cin,name);//liest auch Namen mit Leerzeichen ein - bis zum ENTER
      cout<<"Ist "<<name<<" korrekt?"<<endl;
      cin.ignore();
      cin>>korrekt;
    }
    while(toupper(korrekt)!='Y');
    

    Aber sobald ich einen Namen eingebe und mit Y/y bestätige
    Kommt dieser komische fehler
    http://img849.imageshack.us/img849/8158/unbenanntyg.jpg
    Ist ein Screenshot
    Villeicht kannst du ja damit was anfangen
    Zudem kann ich auch nicht die frage ob es korrekt sei nicht beneinen.



  • Hmm, da habe ich wohl noch einen kleinen Fehler in dem Code versteckt 🤡 - wenn du dir mal ansiehst, was ignore() macht, solltest du ihn eigentlich finden können.



  • CStoll schrieb:

    Hmm, da habe ich wohl noch einen kleinen Fehler in dem Code versteckt 🤡 - wenn du dir mal ansiehst, was ignore() macht, solltest du ihn eigentlich finden können.

    Hm...Ich hab mal das

    cin.ignore();
    

    entfernt aber sobald ich beispielsweise n oder irgentwas anderes eingebe kommt sowas dabei raus
    Hier mal wieder ein Screenshot
    http://img8.imageshack.us/img8/5205/unbenanntcld.jpg



  • Das ignore() sollte wohl an eine andere Stelle. 🙂



  • cooky451 schrieb:

    Das ignore() sollte wohl an eine andere Stelle. 🙂

    Ich hab mal das

    cin.ignore();
    

    unter

    cin>>korrekt;
    

    geschrieben jetzt klappt es aber einiger massen
    Wenn ich jetzt nicht y drücke sonder no oder Nein schreibe kommt das dabei raus:
    http://img835.imageshack.us/img835/9307/unbenanntcu.jpg
    Ist ein Screenshot
    Ich versuche mein bestes aber mit

    cin.ignore();
    

    oder den anderen Code hab ich noch nie dran gearbeitet bitte helft mir auf die Sprünge.



  • #include <limits>
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    


  • cooky451 schrieb:

    #include <limits>
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    

    Wunderbar!
    Dankeschön funktioniert ich meld mich wieder falls ich ein Problem haben sollte.



  • Was spricht denn gegen

    string korrekt;
    
    getline(cin, korrekt);
    

    ?



  • Hallo,
    Ich hab mal wieder ein neues Problem
    Das irgentwie nicht lösbar für mich ist.
    Ich hab dran 1 Stunde gearbeitet aber es funktioniert einfach nicht egal was ich mache.
    Und nun bitte ich euch mir zu helfen.
    Bin noch ein neuling und aus fehlern lernt man.
    Also es geht um folgendes
    Ich hab eine Funktion erstellt und in dieser Funktion wird eine Klasse erstellt
    Und direkt da runter soll die Klasse einen Namen bekommen und daraufhin sollen die
    Einzelnen Variabeln bestimmt werden und danach sollen die Varibeln in einem Cout Befehl aufgerufen werden aber es funktioniert irgentwie nicht.
    Versteht mich nicht falsch ich bin kein Fan von Waffen oder jeglichem aber mit waffen lassen sich einfachere Variabel namen machen wie Name Preis Druch etc.
    Ich bin gegen Krieg und Waffen.

    Hier mal die fehlermeldungen:
    C:\Dev-Cpp\Yardgame2.cpp In function int func1(int)': 80 C:\\Dev-Cpp\\Yardgame2.cpp non-local function \func1(int)::M4 sturmgewaehr()' uses local type `func1(int)::M4'
    81 C:\Dev-Cpp\Yardgame2.cpp request for member `M4_Name' in `sturmgewaehr', which is of non-class type func1(int)::M4 ()()' 82 C:\\Dev-Cpp\\Yardgame2.cpp request for member \M4_preis' in `sturmgewaehr', which is of non-class type func1(int)::M4 ()()' 83 C:\\Dev-Cpp\\Yardgame2.cpp request for member \M4_druck' in `sturmgewaehr', which is of non-class type func1(int)::M4 ()()' 85 C:\\Dev-Cpp\\Yardgame2.cpp request for member \M4_Name' in `sturmgewaehr', which is of non-class type func1(int)::M4 ()()' 85 C:\\Dev-Cpp\\Yardgame2.cpp request for member \preis_M4' in `sturmgewaehr', which is of non-class type func1(int)::M4 ()()' 85 C:\\Dev-Cpp\\Yardgame2.cpp request for member \druck_M4' in `sturmgewaehr', which is of non-class type `func1(int)::M4 ()()'
    C:\Dev-Cpp\Makefile.win [Build Error] [Yardgame2.o] Error 1

    Und hier mal der Code von der Funktion und alles was damit zu tun hat

    int func1(int classic = 1);
    
    void AK::abzugdruck() //hier wird die Func1 aufgerufen
    {
    func1();
    staerke = 55;
    }
    
    int func1(int classic)
    {
    class M4 //Das ist die klasse
    {
    public:
    double preis_M4;
    string M4_Name;
    int druck_M4;
    };
    M4 sturmgewaehr();
    sturmgewaehr.M4_Name = "M4-Sturmgewaehr";
    sturmgewaehr.M4_preis = 25,500;
    sturmgewaehr.M4_druck = 25;
    cout << "Die Waffen werden für den Krieg gebraucht ):" << endl;
    cout << "Die " << sturmgewaehr.M4_Name() << " Kostet " << sturmgewaehr.preis_M4() << " Und hat einen Wiederstand von " << sturmgewaehr.druck_M4() << endl;  
    }
    

    Und hier mal der Komplette quelltext:

    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    void func();
    int func1(int classic = 1);
    
    class AK
    {
    string name;
    int staerke;
    public:
    double preis;
    string druck;
    //Rückgabewert <Name der Methode> Parameterliste
    void abzugdruck();
           
    //void setGeschwindigkeit(int g);
    int getstaerke();
    string getName();
           
    AK(string n);
    ~AK();
    };
           
    AK::AK(string n)
    {
    name = n;
    staerke = 50;
    preis = 2999;
    druck = "Mittlerer Druck";
    cout << "Die Waffe wurde verkauft" << name << endl;
    }
    
    AK::~AK()
    {
    cout << "Die Ak wurde verkauft" << endl;        
    }
    
    void AK::abzugdruck()
    {
    func1();
    staerke = 55;
    }
    int AK::getstaerke()
    {
    return staerke;    
    }
    
    string AK::getName()
    {
    return name;      
    }
    
    int main()
    {
    AK Automatikk("Automatik");
    Automatikk.abzugdruck();
    func();
    Automatikk.getstaerke();
    cout << "Du hast die AK abgefeuert Staerke = " << Automatikk.getstaerke() << endl;
    system("PAUSE");
    }
    
    void func()
    {
    AK Schalldampf("Schalldaempfer"); 
    }
    
    int func1(int classic)
    {
    class M4
    {
    public:
    double preis_M4;
    string M4_Name;
    int druck_M4;
    };
    M4 sturmgewaehr();
    sturmgewaehr.M4_Name = "M4-Sturmgewaehr";
    sturmgewaehr.M4_preis = 25,500;
    sturmgewaehr.M4_druck = 25;
    cout << "Die Waffen werden für den Krieg gebraucht ):" << endl;
    cout << "Die " << sturmgewaehr.M4_Name() << " Kostet " << sturmgewaehr.preis_M4() << " Und hat einen Wiederstand von " << sturmgewaehr.druck_M4() << endl;  
    }
    


  • Du hast da einen Klassiker erwischt: In Zeile 19 wird kein default-konstruiertes Objekt angelegt, sondern eine Funktion deklariert, die keine Parameter übernimmt und ein M4 zurückgeben soll.

    PS: Außerdem wird in C++ der Punkt als Dezimaltrenner verwendet, das Komma in sturmgewaehr.M4_preis = 25,500; hat eine andere Funktion.

    PPS: Und "Sturmgewehr" schreibt man ohne a 😃



  • CStoll schrieb:

    Du hast da einen Klassiker erwischt: In Zeile 19 wird kein default-konstruiertes Objekt angelegt, sondern eine Funktion deklariert, die keine Parameter übernimmt und ein M4 zurückgeben soll.

    PS: Außerdem wird in C++ der Punkt als Dezimaltrenner verwendet, das Komma in sturmgewaehr.M4_preis = 25,500; hat eine andere Funktion.

    PPS: Und "Sturmgewehr" schreibt man ohne a 😃

    Danke schön aber ich weiß leider nicht was ein default-konstruiertes Objekt ist ??
    Kannst/Könnt du/ihr mir ein Beispiel Zeigen
    Und das mit PS und PPS ist ja mal ein Fail von meiner seite aus das wird ausgebessert.

    Vielen Dank für die hilfe



  • Ein default-konstruiertes Objekt ist etwas, was du mit dem Default-Konstruktor angelegt hast (d.h. der Konstruktor ohne PArameter, den dir der Compiler zur Not auch selber anlegen kann). Sowas erhältst du am einfachsten durch die Angabe M4 sturmgewehr; (ohne die Klammern dahinter).



  • CStoll schrieb:

    Ein default-konstruiertes Objekt ist etwas, was du mit dem Default-Konstruktor angelegt hast (d.h. der Konstruktor ohne PArameter, den dir der Compiler zur Not auch selber anlegen kann). Sowas erhältst du am einfachsten durch die Angabe M4 sturmgewehr; (ohne die Klammern dahinter).

    Dankeschön jetzt klappts
    Edit: Doch nicht ich bekomm die Fehlermeldungen:
    C:\Dev-Cpp\Yardgame2.cpp In function int func1(int)': 85 C:\\Dev-Cpp\\Yardgame2.cpp no match for call to(std::string) ()'
    85 C:\Dev-Cpp\Yardgame2.cpp sturmgewehr.func1(int)::M4::preis_M4' cannot be used as a function 85 C:\\Dev-Cpp\\Yardgame2.cppsturmgewehr.func1(int)::M4::druck_M4' cannot be used as a function
    C:\Dev-Cpp\Makefile.win [Build Error] [Yardgame2.o] Error 1



  • Kann mir niemand helfen mit den Oben genannten Problem?



  • Um die Klassen-Member auszugeben benötigst du auch keine Funktions-Klammern.

    PS: Übrigens hat diese Klasse nicht besonders viel Sinn - sie ist außerhalb der Funktion nicht bekannt und enthält auch nichts wirklich sinnvolles.



  • CStoll schrieb:

    Um die Klassen-Member auszugeben benötigst du auch keine Funktions-Klammern.

    PS: Übrigens hat diese Klasse nicht besonders viel Sinn - sie ist außerhalb der Funktion nicht bekannt und enthält auch nichts wirklich sinnvolles.

    Ok Danke schön klappt jetzt alles perfekt.
    Und ich hab das nur gemacht damit ich klassen lerne.
    Villeicht brauch ich es ja eines Tages noch wer weiß.



  • bero36 schrieb:

    Und ich hab das nur gemacht damit ich klassen lerne.

    Wenn du Klassen kennenlernen willst, dann schreib dir auch eine ordentliche Klasse (inklusive Datenkapselung, Methoden und allem was dazugehört), nicht so ein schlecht getarntes struct.



  • CStoll schrieb:

    bero36 schrieb:

    Und ich hab das nur gemacht damit ich klassen lerne.

    Wenn du Klassen kennenlernen willst, dann schreib dir auch eine ordentliche Klasse (inklusive Datenkapselung, Methoden und allem was dazugehört), nicht so ein schlecht getarntes struct.

    Ok Danke werde ich machen.

    Ich habe leider ein neues Problem:
    Es geht um folgendes
    Ich mach grad so test sachen nix wichtiges.
    Ich arbeite zurzeit an solchen Menüs
    Also mit Switch Case und Do While - Schleife
    Mein Problem ist sobald ich im Menü mit einem Buchstaben etwas auswähle stürzt das Programm einfach ab
    Hier mal der Quellcode villeicht hilft mir ja einer.
    Danke das ihr mir hilft.

    #include <cstdlib>
    #include <iostream>
    #include <conio.h>
    #include <string>
    #include <limits>
    
    using namespace std;
    
    string name;
    string highscore(string highscore_game = "HighScore");
    string start(string newgame = "Game");
    int main()
    {
    string name;
    
    char korrekt;
    do
    {
      cout<<"Bitte Name eingeben"<<endl;
      getline(cin,name);//liest auch Namen mit Leerzeichen ein - bis zum ENTER
      cout<<"Ist "<<name<<" korrekt? (Bitte mit Yes oder yes antworten)"<<endl;
      cin>>korrekt;
      cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    
    }
    while(toupper(korrekt)!='Y'); 
    
    char Auswahl_1;
    do
    {
    cout << "(N)eues Spiel" << endl;
    cout << "(H)ighscore" << endl;
    cout << "(C)redits" << endl;
    cout << "(B)eenden" << endl;
    
    cout << "Eingabe 1: " << endl;
         cin>>Auswahl_1;
    
         switch(Auswahl_1)
         {
                        case ('N'):
                        case ('n'):
                             cout << "Neues Spiel wird gestartet" << endl;
                             start();
                             break;
    
                        case ('h'):
                        case ('H'):
                             cout << "Highscore Liste wird geladen" << endl;
                             highscore();
                             break;
    
                        case ('C'):
                        case ('c'):
                             cout << "Entwickler: Bero01 Copyright 2011" << endl;
                             break;
    
                        case ('B'):
                        case ('b'):
                             cout << "Programm wird beendet" << endl;
                             break;
    
                        default:
                             cout << "Keine Korrekte angabe" << endl;
                             break;
                        }
                        getch();
    
                        }
                        while(Auswahl_1 != 'B' && Auswahl_1 != 'b');
        system("Pause");
        return 0;
    }
    
    string start(string newgame)
    {
               cout << "Neues Spiel wurde gestartet" << endl;
               cout << "---------------------------" << endl;
               cout << "Game Maker wurde gestartet..." << endl;
    
    cout << "Um was fuer ein Spiel-Type soll es sich handeln?\n Bitte waehle aus: " << endl;
    
    cout << "(A)benteuer" << endl;
    cout << "(S)hooter" << endl;
    cout << "(R)ennen" << endl;
    cout << "(M)enue" << endl;
    char Auswahl_2;
    
    do
    {
    cout << "Eingabe 2: " << endl;
         cin >> Auswahl_2;
    
         switch(Auswahl_2)
         {
                        case ('A'):
                        case ('a'):
                             cout << "Du hast Abenteuer ausgewaehlt" << endl;
                             break;
    
                        case ('s'):
                        case ('S'):
                             cout << "Du hast Shooter ausgewaehlt" << endl;
                             break;
    
                        case ('R'):
                        case ('r'):
                             cout << "Du hast Rennen ausgewaehlt" << endl;
                             break;
    
                        case ('M'):
                        case ('m'):
                             cout << "Menu" << endl;
                             break;
    
                        default:
                             cout << "Keine Korrekte angabe" << endl;
                             break;
                        }
    }
                        while(Auswahl_2 != 'M' && Auswahl_2 != 'm');               
    system("Pause");
    return 0;
                        }
    
    string highscore(string highscore_game)
    {
           cout << "----------------------------" << endl;
           cout << "Highscore Liste wurde geladen" << endl;   
    
    }
    


  • bero36 schrieb:

    // irgendsone_bibliotheksdateien
    
    string start(string newgame = "Game");
    
    int main()
    {
      // irgendein_code
      switch(Auswahl_1)
      {
        case ('N'):
        case ('n'):
          cout << "Neues Spiel wird gestartet" << endl;
          start();
          break;
        // irgendwelche_weiteren_cases
      }
      return 0;
    }
    
    string start(string newgame)
    {
      // irgendein_code
      return 0;
    }
    

    Funktionsaufbau:

    Rückgabetyp Funktionsname(Parameter);

    Datentypen:
    Integer: 0
    Float: 0.0f
    Char: '0'
    String: "0"

    Finde den Fehler 😃


Anmelden zum Antworten