Witzprogramm schreiben ( Anfänger )



  • ky_fr34k schrieb:

    Mis2com schrieb:

    Arrays sind zwar syntaktisch korrekt, aber werden heute vielfach durch die STL ersetzt etc.

    was sind den STL??

    Standard Template Library.
    http://www.sgi.com/tech/stl/



  • Hmm also das verstehe ich nicht so ganz...

    Ich habe mir ein C++ Buch gekauft "Grundkurs Softwareentwicklung mit C++" von Dietrich May.
    Habe leider noch nichts entsprechendes gefunden.
    Ich bin dabei das Buch komplett zu lesen würde aber gerne als kleine Auflockerung erst dieses Mini Programm schreiben.

    Der ganze Code ist für mich unschlüssig 🙂
    Kann ich nich einfach eine Abfrage machen, die dann im programm per Zufall nen Witz rausliest Aufgrund der Kategorie die jemand eingegeben hat ?

    Gruß



  • devil81 schrieb:

    MrFryze schrieb:

    Entschuldigung ich kann immer nicht folgen. Was ist an meinem Vorschlag so falsch? Ich finde es gut das AlternativEnde so viele Vorschläge bekommt.

    Man verwendet bei STL headern kein .h mehr, da diese als deprecated
    d.h. veraltet eingestuft sind, und sie gibt es nur noch aus Kompitabilitätsgründen.
    Also statt <iostream.h> dann <iostream>.

    Und laut Standard gibt Main einen Wert (int) zurück, man schreibt also
    auch kein void main() mehr.

    Devil

    Das sind dann wohl die zwei Kommentare, von denen mata gesprochen hat 😃



  • Hallo zusammen !
    Nicht das ihr noch denkt ich hätte das programm aufgegeben.
    Mir kam eine andere Idee Hier der COde

    /* Dies ist ein Programm um einen Text einzulesen  */ 
    
    #include <iostream> 
    #include <string> 
    #include <conio.h>                                          // Windowskonform 
    using namespace std;                                        // Unbekannt... 
    
    int main() 
    { 
    
            string text;                              // Variablendeklaration 
    
        cout << "Witzkategorie eingeben: \n"; 
        getline(cin, text);                               // Befehl zur Texteingabe 
    
        if (text ==  witz )
    
            cout <<" Hier der witz ";  
    
             if (text != witz)
    
                cout <<"Fehleingabe";       
    
    getch();                                                    // Windowskonform 
    return 0;
    }
    

    Das Problem ist nur, dass es nicht funktioniert.. ALso die Abgleichung funktioniert nicht.. Oben kann man dann wenn das Programm fertig ist die Kategorie eingeben und er geht dann einfach in die Schleife und sucht dann per zufall ( ma schaun wie das geht ) einen Witz raus.
    So in der Art könnte das doch laufen oder ??
    Weiß nur nicht warum er da immer die Fehleingabe nimmt.

    Gruß



  • Ach eine kleine Sache noch.
    ich hatte "witz" auch erst als String angegeben, aber da das ja nicht ging hab ich es wieder entfernt, also das war mir schon klar 🙂



  • Erstmal

    if (text ==  witz )
    
            cout <<" Hier der witz ";  
    
             if (text != witz)
    
                cout <<"Fehleingabe";
    

    schreibt man eher so

    if (text ==  witz)
            cout <<" Hier der witz ";
        else
            cout <<"Fehleingabe";
    

    Und wie initialisierst du 'witz'? Und hast du auf Gross-/Kleinschreibung geachtet. Der == Operator von std::string vergleicht afaik case-sensitive.



  • Die Variante funktioniert in Windows mit DEVC++ nicht sowohl, als auch nicht mit BeIDE.
    Ich meine, aber das die dieselben Compiler verwenden.
    Egal ich bekomme folgenden Fehler

    Error : /boot/home/c/witz/witz.cpp: In function int main()': parse error before<'
    witz.cpp line 26 cout <<"Fehleingabe";

    Ich dachte ich mache die Witzkategorieen alle als string und dann die ganzen if´s hintereinander nach denen er dann auswählt.
    Gibts eine bessere Lösung ?
    Also quasi immer text == beamte oder ähnlich ... ?

    gruß



  • AlternativEnde schrieb:

    Error : /boot/home/c/witz/witz.cpp: In function int main()': parse error before<'
    witz.cpp line 26 cout <<"Fehleingabe";

    Keine Ahnung was dein Compiler hat, der Code ist jedenfalls korrekt. Bist du dir sicher, dass das der ist, welchen du compilierst?



  • Hi
    also ich würde das mit einem Switch Lösen:

    #include <iostream>
    #include <string>
    #include <conio.h>                                          
    using namespace std;                                        
    
    int main()
    {
        char eingabe = 0;
    	cout << "1: Mantawitz\n";
    	cout << "2: Blondienwitz\n";
    	cout << "3: Beamtenwitz\n";
    	cout << "\nWitzkategorie eingeben oder <ESC> fuer Exit:";
    	while (eingabe !=27)  // ESC als einzige Abbruchbedingung
    	{   
        	eingabe = getch();  // Warte auf Taste
    		switch (eingabe)   
    		{
    			case '1': cout << "\nDies ist ein Mantawitz.\n";
    			   break;
    			case '2': cout  << "\nDies ist ein Blondienwitz.\n";
    			   break;
    			case '3': cout << "\nDies ist ein Beamtenwitz.\n";
    		}
    	}
    
    	return 0;
    }
    

    In dem case rufst du eine Funktion auf der dir Zufällige einen witz in der Kategorie raussucht.

    Für besser Ausgabe empfehle ich dir "Improved Console" bei der du
    "GotoXY", "ClearScr", und Farben benutzen kannst.
    siehe hier -> http://www.c-plusplus.net/forum/viewtopic.php?t=86429

    (Weiß zwar nicht ob "conio.h" c++ konform ist, aber es ist die einzige Möglichkeit ein einzelens Zeichen zu bekommen glaub ich)



  • Hi !
    ja daran dachte ich auch schon, aber getch(); bekomme ich nicht in BeIDE oder ich weiß jedenfalls noch nicht wie.

    Was bedeutet eingabe != 27 .. ? Warum 27 ? Ist das das ASCII zeichen für ESC ?



  • Ich würde hier nicht mit Arrays arbeiten. Am besten du arbeitest mit doppelverketteten Listen weil du ja nie weiss wieviel Witze kommen



  • Mit Listen habe ich noch nie etwas gemacht...
    Ich habe jetzt aber den Zufallsgenerator eingebaut und das ganze sieht nun wie folgt aus...

    #include <iostream> 
    #include <string> 
    #include <conio.h>      
    #include <ctime>  
    #include<stdio.h>                                   
    using namespace std;                                         
    
    int main() 
    { 
        char eingabe = 0; 
        cout << "1: Mantawitz\n"; 
        cout << "2: Blondienwitz\n"; 
        cout << "3: Beamtenwitz\n"; 
        cout << "\nWitzkategorie eingeben oder <ESC> fuer Exit:"; 
        while (eingabe !=27)  // ESC als einzige Abbruchbedingung 
        {   
             eingabe = getch();  // Warte auf Taste 
            switch (eingabe)   
            { 
                case '1': cout << "\nDies ist ein Mantawitz.\n";
                   srand(time(NULL)); 
                    cout << rand()% 11 << endl; 
    
                 break; 
                case '2': cout  << "\nDies ist ein Blondienwitz.\n"; 
                   break; 
                case '3': cout << "\nDies ist ein Beamtenwitz.\n"; 
            } 
        }
    

    Derzeit bin ich noch am grübeln, wie ich den Witzen, die ich über cout ausgeben lassen kann eine Erkennungsnummer geben kann dann wäre das Problem gelöst.
    Das mit der Ausgabe der Zahl ist nur zu Vorführungszwecken gemacht..

    gruß



  • srand initialisiert den Zufallsgenerator, du solltest diese Funktion also einmalig, am besten zu Beginn des Programms, aufrufen.

    AlternativEnde ungeloggt schrieb:

    Derzeit bin ich noch am grübeln, wie ich den Witzen, die ich über cout ausgeben lassen kann eine Erkennungsnummer geben kann

    Wofür brauchst du das? Kannst du die Witze nicht einfach in ein Array (zB std::vector) speichern, und rand liefert dir praktisch den Index?



  • Hmm wie soll das denn gehen ?

    zB.

    char index[]

    Aber wie sollen da die Witze quasi rein ?
    Sowas hab ich noch nie gemacht.



  • Bin schon wieder ein Stückhen weiter.. 🙂

    #include <stdio.h>
    #include <iostream> 
    #include <conio.h>      
    #include <ctime>
    #include <iomanip.h>                                   
    
    int main() 
    { 
        int mantawitz[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };    
        srand(time(NULL));
        char eingabe = 0; 
        cout << "1: Mantawitz\n"; 
        cout << "2: Blondienwitz\n"; 
        cout << "3: Beamtenwitz\n"; 
        cout << "\nWitzkategorie eingeben oder <ESC> fuer Exit:"; 
        while (eingabe !=27)  // ESC als einzige Abbruchbedingung 
        {   
             eingabe = getch();  // Warte auf Taste 
            switch (eingabe)   
            { 
                case '1': 
                cout << "\nDies ist ein Mantawitz.\n";
                cout << endl << mantawitz[ rand()% 11 ];
    
                    break; 
                case '2': cout  << "\nDies ist ein Blondienwitz.\n"; 
                   break; 
                case '3': cout << "\nDies ist ein Beamtenwitz.\n";
                   break;
    
                 default:
                     cout << "\n *******Falscheingabe******* \n " << endl;
    
                 } 
        } 
    
        return 0; 
    }
    


  • Hallo !
    Ich habe gestern noch ne Menge rumprobiert, aber ich habe leider keine Möglichkeit gefunden, die Texte zu hinterlegen in einem Array so das sie ganz einfach aufgerufen werden vom Zufallsgenerator.
    Mit den Zahlen klappts ganz gut 🙂

    Ein kleiner Tipp wäre super



  • Hallo !
    Bin wieder einen riesen Schritt weitergekommen.
    Das einzige Problem was ich nun noch habe ist, dass er "Hallo" zum Beispiel zufällig mit l a h l l o oder ähnlich ausgibt.

    Hier das was ich gemacht habe....

    [cpp]
    #include <stdio.h>
    #include <iostream>
    #include <string.h>
    #include <conio.h>
    #include <ctime>
    #include <iomanip.h>

    int main()
    {
    srand(time(NULL));
    char mantawitz[3][10] = { "Hallo", "2", "3" }; // NEU !
    char eingabe = 0;
    cout << "1: Mantawitz\n";
    cout << "2: Blondienwitz\n";
    cout << "3: Beamtenwitz\n";
    cout << "\nWitzkategorie eingeben oder <ESC> fuer Exit:";
    while (eingabe !=27) // ESC als einzige Abbruchbedingung
    {
    eingabe = getch(); // Warte auf Taste
    switch (eingabe)
    {
    case '1':
    cout << "\nDies ist ein Mantawitz.\n";
    cout << endl << mantawitz[0] [ rand()% 11 ];

    break;
    case '2': cout << "\nDies ist ein Blondienwitz.\n";
    break;
    case '3': cout << "\nDies ist ein Beamtenwitz.\n";
    break;

    default:
    cout << "\n *******Falscheingabe******* \n " << endl;

    }
    }

    return 0;
    }



  • Vielleicht solltest du es mal so probieren

    cout << endl << mantawitz[rand() % 3];
    

    So wie du es bisher machst, gibst du ja immer nur ein Zeichen aus. Zudem besteht die Möglichkeit, dass du auf ungültigen Speicher zugreifst, da nicht jeder String 10(+1) Zeichen lang ist.



  • Das hilft mir nicht unbedingt, denn er gibt zB. Hallo immernoch einzelnd aus...



  • Ich dachte, genau das willst du. 😕 Was willst du denn ausgeben?


Anmelden zum Antworten