[Anfänger]Switch Case mit Funktion Code



  • Dieser Thread wurde von Moderator/in akari aus dem Forum VCL (C++ Builder) in das Forum C++ (auch C++0x) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Brauchst du beide:

    #include <cstdlib>   // -> Die C++ Variante von stdlib.h
    #include ...
    #include ...
    #include <stdlib.h>  // wenn du ohne diese Zeile auskommst, weg damit
    
    ...
    ...
        system("Pause"); // hab es nicht getestet - probier es mal ohne
    


  • Dankeschön alles funktioniert soweit ganz gut nur hab ich da noch ein Problem
    Ich hab in der Funktion noch eine Switchcase anweisung reingecodet mit einer do-while Schleife aber sobald ich aber E eingebe also Ende stürtzt das Programm ab hier mal der Quellcode von der Funktion:

    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 << "(E)xit" << endl;
    
    cout << "Eingabe: " << 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 ('E'):
                        case ('e'):
                             cout << "Programm wird beendet" << endl; //Programm Stürzt ab sobald ich e oder E eingebe mit der Meldung: "Yard Game.exe Funktioniert nicht mehr"
    
                             break;
    
                        default:
                             cout << "Keine Korrekte angabe" << endl;
                             break;
                        }
    


  • Wo und wie ist denn Auswahl definiert worden? Deine Verwendung sieht auf jeden Fall merkwürdig aus und provoziert vermutlich Index-Überschreitungen und daraus ergebende Folgefehler.



  • CStoll schrieb:

    Wo und wie ist denn Auswahl definiert worden? Deine Verwendung sieht auf jeden Fall merkwürdig aus und provoziert vermutlich Index-Überschreitungen und daraus ergebende Folgefehler.

    Es klappt nun es lag daran das ich die char Variabel Global war ich hab nun 2 Variabeln erstellt mit den namen Auswahl1 und Auswahl2
    Auswahl1 ist in der Main Funktion
    und Auswahl2 in der Start Funktion
    Danke für die hilfe an alle.



  • es lag daran das ich die char Variabel Global war

    Nein, es lag daran dass Array-Indizes in C++ bei 0 anfangen, und 2 daher der 3. Eintrag ist. In einem Array mit Grösse 2 gibt es aber keinen 3. Eintrag.



  • hustbaer schrieb:

    es lag daran das ich die char Variabel Global war

    Nein, es lag daran dass Array-Indizes in C++ bei 0 anfangen, und 2 daher der 3. Eintrag ist. In einem Array mit Grösse 2 gibt es aber keinen 3. Eintrag.

    Achso das wusste ich nicht hab daran nicht gedacht.
    Wie auch immer es funktioniert jetzt.



  • Hallo,
    Ich hab nun wieder einen Peinlichen fehler aber ich komm nicht drauf ihn zu lösen hab alles versucht aber ich komm nicht auf den fehler.
    Das Problem ist ich möchte das der Benutzer einen Namen eingibt und falls er sich verschrieben hat mit N für Nein den namen wieder neu schreiben kann.Aber das funktioniert nicht hier mal der quellcode

    string name;
    char name_geben;
        cout << "Das ist das Yard Game Spiel" << endl;
        do
        {
        cout << "Bitte schreibe deinen Namen: " << endl;
        cin>>name;
        cout << "Dein Name Lautet: " << name << endl;
        cout << "Bist du dir sicher? y/n"<< endl; //Mit y oder n kann ich garnicht antworten da er sofort mit der aufforderung "Bitte schreib deinen Namen ein" kommt zum unteren teil kommt er garnicht.
        switch(name_geben)
        {
                          case ('y'):
                          case ('Y'): 
                               cout << "Du bist dir mit den namen: " << name << " sicher." << endl;
                               break;
    
                          case ('N'):
                          case ('n'):
    
                               cout << "Du bist dir mit den namen: " << name << " nicht sicher.\nGib bitte einen neuen Namen ein." << endl;
                               cin>>name;
                               cout << "Dein Name lautet nun: " << name << endl;
                               break;
                          }
                          }
                          while(name_geben != 'n' && name_geben != 'N');
    

    Ich habs auch mit einer IF-Else schleife getestet aber es funktioniert nur einmal ich will das so haben solange er nicht mit Y oder y antwortet das er das immer wieder wiederholt.
    Hoffentlich hab ich es nicht zu kompliziert erklärt.



  • bero36 schrieb:

    Aber das funktioniert nicht

    Abgesehen davon, dass das keine Fehlerbeschreibung ist, hast du vergessen irgendetwas für name_geben einzulesen.



  • 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 😃


Anmelden zum Antworten