Witzprogramm schreiben ( Anfänger )



  • ich könnte wetten, es kommen in kürzester zeit mindestens zu zwei sachen aus deinem source kommentare, die aber nix mit dem eigentlichen problem zu tun haben (so wie meiner jetzt auch).. 🙂



  • @mata
    Ich versteh nicht ganz. Ist das falsch was ich geschrieben habe? Hat bisher immer super funktioniert. Klar das, dass nicht die Lösung der Aufgabe ist.



  • @AlternativEnde
    Vergiss bitte ganz schnell, was MrFryze geschrieben hat. Texte kannst du zB so einlesen

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main()
    {
        cout << "Gib einen Text ein: ";
        string text;
        cin >> text;
        //...
    }
    

    Wobei hier keine Leerzeichen beachtet werden. Ist dies erforderlich, dann solltest du dir mal getline anschaun.



  • Und bevor wieder Fragen kommen wie das geht, hier mal ein Beispiel

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main()
    {
        cout << "Gib einen Text ein: ";
        string text;
        getline(cin, text);
        //...
    }
    


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



  • 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



  • Ach so. Danke schön. Dann spreche/schreibe ich zur Zeit alt c++. Is ja cool. Also <iostream> und int main() sind jetzt im Trend. Ok. Cool



  • warum versuchts es net mit

    char wort[20];
    scanf("%s",&wort);
    

    oder mit

    char wort[20];
    wort=getchar();
    

    so hab ich des in der schule gelern...



  • weils hier das c++ forum is.



  • außerdem hat fryze den namespace vergessen.. müsste dann so aussehen

    std::cin
    std::cout

    ich mag die stream klassen nich..

    lieber
    gets(..);
    und printf(..); 😋



  • ich würde keine arrays nutzen. wer weiß schon wie lang sein witz wird? und im vorfeld 'char array[9999999]' zu nutzen wäre auch blödsinn.

    mein vorschlag, die strings (witze) in eine datei umleiten und als erstes zeichen z.B. '#' verwenden. dann kann auch zufällig ein string ausgegeben werden und er kann weitere hinzufügen.

    ich mein ja nur



  • Moin,

    MrFryze:
    Mir ist jetzt schon öfter aufgefallen, was du für Code geschrieben hast und ich sage dir, die meisten und i.d.R. auch ich reagieren auf iostream.h und so altes bzw. nie korrektes C++ ist einfach ein Augendorn.
    Arrays sind zwar syntaktisch korrekt, aber werden heute vielfach durch die STL ersetzt etc.
    Schlage vor, du informierst dich noch einmal besser, das ist für andere besser und sicher auch für dich, denn es nutzt keinem, wenn man dich sowieso nur verbessern würde.

    Nicht bös gemeint :),

    MfG Eisflamme



  • Mach Dir lieber einfach mal Gedanken darüber, wie Dein Programm grundsätzlich aussehen soll und such Dir nicht nur irgendwelche einzelnen Details zusammen mit denen Du dann bestenfalls ein Programm zusammen C&Pen kannst.

    Beschäftige Dich zunächst mit den Grundlagen, dann schau Dir uU mal SQLite oä genauer an und leg los. 🙂



  • Mit rand ()%ArraySize oder rand ()%vector.size () kannst du zufällig Witze raussuchen. Ich schlage vor, die Witze in einem vector von strings zu speichern, wo logischerweise jeder string ein Witz ist.
    Denkbar einfach. 🙂

    Edit: Und bevor einer kommt mit "% zerstört die bits" - Für so einen einfachen Zweck ist es egal.



  • MrFryze schrieb:

    Also <iostream> und int main() sind jetzt im Trend. Ok. Cool

    Mit *im Trend liegen* hat das nix zu tun. So wird es einfach vom aktuellen Standard definiert. Punkt.

    @ky_fr34k
    Die ...printf und ...scanf Funktionen verwendet man in C++ nicht mehr, das ist C. Sie sind zwar aus Gründen der Kompatibilität noch vorhanden, haben aber deutliche Nachteile ➡ Typsicherheit, Bufferoverflows

    enno-tyrant schrieb:

    ich würde keine arrays nutzen. wer weiß schon wie lang sein witz wird? und im vorfeld 'char array[9999999]' zu nutzen wäre auch blödsinn.

    mein vorschlag, die strings (witze) in eine datei umleiten

    Hast du dir mal meinen ersten Beitrag angeschaut? Da werden keine rohen char-Arrays verwendet. Du kannst dort auch beliebig lange Texte eingeben ohne irgendwelche Dateiumleitungen.



  • Danke für die vielen Antworten.
    Ok also ich habe folgendes gemacht...

    /* Dies ist ein Programm um einen Text einzulesen  */
    
    #include <iostream> 
    #include <string> 
    #include <conio.h>                                          // Windowskonform
    using namespace std;                                        // Unbekannt...
    
    int main() 
    { 
            string text, moin;                              // Variablendeklaration
    
        cout << "Gib einen Text ein: "; 
        getline(cin, text);                               // Befehl zur Texteingabe
        cout << "\n" << text << "\n" << endl;                     //Ausgabe 
    
        getline(cin, moin);
        cout << "\n" << moin; 
    
    getch();                                                      // Windowskonform
    }
    

    Dort wo unbekannt steht da weiß ich noch nicht was dieses using namespaces std bedeutet, dass kam in meinem Lehrgang noch nicht vor.
    Die Variablendeklaration habe ich an den Anfang gesetzt, damit man da besser durchblickt.. mich verwirrt das total, wenn die irgendwo mittendrin stehen.
    Dafür bin ich noch zu weit am Anfang 🙂



  • Zum namespace std:
    stell dir mal vor, du würdest eine tolle Bibliothek der, sagen wir, uvzGMBH benutzen. Diese hat eine tolle Funktion string& print(int), was auch immer die macht. Außerdem gibt es eine Funktion int sum(int,int), die du nicht brauchst. Dir fehlt nun die eine andere Funktion, die du in der Bibliothek der, sagen wir, abc-Gesellschaft gefunden hast. Dummerweise haben die aber auch eine Funktion int sum(int,int). Nun regt sich dein compiler auf, das die Funktion 2* definiert wird, klar. Eine übliche Möglichkeik wäre, das die Funktionen alle uvz_print, uvz_sum, abc_sum... heißen. Und genau das machen namespaces. Z.B. schreibt die uvzGMBH in der Bibliothek jetzt:

    namespace uvz
    {
        std::string& print(int)
        {
            //*mach_was_tolles*
        };
        int sum(uínt,int)
        {
            //*mach_noch_was_tolles*
        };
    };
    

    Nun kannst du sowas machen:

    #include "uvz.h"    //da ist print drin, sowie sum
    #include "abc.h"    //da ist sum drin.
    
    int main()
    {
        //sum(4,5);    //Fehler, gibts nicht
        abc::sum(4,5);    //korrekt
        uvz::sum(4,5);    //korrekt
        //using uvz::sum
        //sum(4,5);    //auch korrekt;
        using namespace abc;    //wir wollen alle Funktionen aus abc benutzen
        sum(4,5);    //auch korrekt
    };
    

    Ich hoffe dir ist das klarer geworden...



  • oder kurz gesagt:

    deine befehle die DU (in deinem sc) nutzt liegen im std-namensraum der include-dateien.

    du kannst nach dem includen 'using namespace std;' schreiben (was allerdings ziemlich prozessorlastig ist, da du ja nicht alle befehel brauchst) oder du schreibst die befehle an die du brauchst: using std::cout, std::endl; usw...

    oder vor jedem befhelseinsatz (macht sinn wenn du einen befehl nur einmal nutzt, dann brauchst du diesen auch nicht gleich angeben),

    #include...
    using std::cout;
    int main(){
    cout << "hallo ";
    cout << "welt" << std::endl;}



  • Ok das habe ich soweit verstanden.
    Nun muss ich erstmal nach der ersten Eingabe eine Fallentscheidung machen. Jenachdem was eingegeben wird soll er dann aus einer zweiten DAtei oder aber derselben etwas rausgeben.

    Korrekt ?



  • Ich würde ja Vorschlagen, das du den gegebenen Ansatz weiterspinnst. Du hast eine Datei, so nach dem Stil:

    #\ERKENNUNGSMERKMAL\:\WITZ\
    ...
    

    Eine richtige Datei könnte also so aussehen:

    #\ganztoll\:\Hier steht ein ganz tolter Witz.\
    #\nochbesser\:\Hier steht ein noch besserer Witz\
    ...
    

    Diese Witze lädst du dann in eine map, z.B.:

    map<string,string> die_witze;
    
    ifstream& einlesen(ifstream& i)
    {
        while(*es_sind_moch_witze_vorhanden*){
        char c=i.get();
        while(c!='#')
            c=i.get();
        c=i.get();
        while(c='\\')
            c=i.get();
        string erkennung;
        c=i.get();
        while(c!='\\')
        {
            erkennung.push_back(c);
            c=i.get();
        };
        string witz;
        c=i.get();
        while(c!=':')
            ...
        die_witze[erkennung]=witz;};
        return i;
    };
    

    Jetzt hast due die Witze in einer map. Wenn nun der Benutzer eine witz sehen möchte, schreibst du sowas wie:

    string eingabe;
    cin>>eingabe;
    try{cout<<die_witze.at(eingabe);}
    catch(exception&){cout<<"Fehlerhafte Eingabe!";};
    

Anmelden zum Antworten