Programmieransatz für erstellung einer Menükarte



  • Hi,

    so, jetzt habe ich ein Array namens fleisch mit den Werten von 0 bis 6 mittels der for-Schleife befüllen lassen. Das Array wird dabei ja nur mit der VAriablen i befüllt.

    enum fleisch {
            Rind, Schwein, Huhn, Ente, Seelachs, Krabben, Tofu, Maxfleisch
        };
    
        enum gemuese {
            Paprika, Bambus, Sprossen, Bohnen, Zuckerschoten, Pilze, Maxgemuese
        };
    
        /*string fleisch[10] = {"Schwein", "Rind"};
            string gemuese[10] = {"Paprika", "Pilze"};
         */
    
        const int max = 10;
        int fleisch[] = {0};
    
        for (int i = 0; i < Maxfleisch; i++) {
            fleisch[i] = i;
        }
    
    return 0;
    }
    

    soweit so gut, jetzt würde ich das auch noch für die anderen Zutaten machen. Da habe ich nur dann am Ende das Problem, wie lasse ich mir denn die Namen der Zutaten ausgeben? Und eine Sinnvolle verknüfung ist mir auch noch nicht wirklich eingefallen.

    Hat da jemand evtl. noch einen kleinen (oder auch gerne einen großen) 🙂 Tipp für mich?

    Danke euch schon mal



  • Ich glaube:

    Namen ausgeben geht mit enum nicht. Das war das, worauf flames hinauswollte. Enum ist zwar ein aufzaehlungstyp, aber nicht in dem sinne. Bei enum wird begriffen einfach eine zahl zugeordnert, die sich pro begriff um 1 steigert, es sei denn man gibt den wett manuell ein.

    /ichglaube



  • Also ist enum hierfür der falsche Aufzählungstyp? Dann bin ich jetzt maximum verwirrt.



  • jo enum zu verwenden ist hier falsch bzw. nicht optimal. wenn man unbedingt auf enumatoren besteht muss man sich maps machen a la "std::map< <enum-typ>, std::string>"

    dann lieber doch der direkte weg über einen "std::vectorstd::string" und es so implementieren wie ich es gezeigt habe.



  • schrödinger schrieb:

    wie lasse ich mir denn die Namen der Zutaten ausgeben?

    #include <iostream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    int main() {
        enum fleisch {Rind, Schwein, Huhn, Ente, Seelachs, Krabben, Maxfleisch};
        char const * const Fleisch[] = {"Rind", "Schwein", "Huhn", "Ente", "Seelachs", "Krabben"};
    
        cout << Fleisch[Rind] << " oder " << Fleisch[Ente] << "?\n";
    }
    


  • Ja genau, so meinte ich das - und das einfach nur noch in die 4 verschachtelten Schleifen packen und fertig 😉



  • Hi,

    Danke für eure super Hilfe, werde es später mal probieren. Noch eine Frage an Th69, verstehe ich deinen Pseudocode so richtig, dass bei jedem Durchgang ein Wert aus fleisch genommen wird und dann in eine Variable g gespeichert wird?



  • @Caligulaminus
    hoffentlich hast du das nicht ernst gemeint.



  • asdfasdf schrieb:

    @Caligulaminus
    hoffentlich hast du das nicht ernst gemeint.

    Wo ist das Problem?



  • Nathan schrieb:

    asdfasdf schrieb:

    @Caligulaminus
    hoffentlich hast du das nicht ernst gemeint.

    Wo ist das Problem?

    der te wollte alle permutationen ausgeben. wieso macht man nicht einfach einen std::vectorstd::string für jede kategorie? in seinem konkreten listing zu bemängeln wäre:
    -alle fleischarten doppelt geschrieben
    -c-strings
    -wer Rind schreiben kann kann auch "Rind" schreiben



  • asdfasdf schrieb:

    Nathan schrieb:

    asdfasdf schrieb:

    @Caligulaminus
    hoffentlich hast du das nicht ernst gemeint.

    Wo ist das Problem?

    der te wollte alle permutationen ausgeben. wieso macht man nicht einfach einen std::vectorstd::string für jede kategorie? in seinem konkreten listing zu bemängeln wäre:
    -alle fleischarten doppelt geschrieben
    -c-strings
    -wer Rind schreiben kann kann auch "Rind" schreiben

    Seine Antwort bezog sich auf die Frage: Wie lass ich mir die Namen eines enums ausgeben. Dass ist die naheliegendste Lösung.
    (etwaige #-Tricks außen vorgelassen)



  • Also leider bin ich immernoch recht verwirrt von dieser Aufgabe, aber bin schon DAnk eureer Hife etwas weiter. Was mich jetzt auch noch mal interessieren würde ist,

    was bedeutet denn das hier?

    char const * const Fleisch[]....
    


  • Um das Menü authentischer zu machen fehlt noch die Option auf Hund



  • Das ist ein Zeiger auf ein char-Array. Also mehr oder weniger ein Dynamisches Array von Strings. An dieser Stelle wären Container besser. Oder gleich schon der Typ std::string



  • So,

    habe jetzt nochmal ein wenig an dem Program gebastelt, die Ausgabe funktioniert soweit schon mal, jetzt habe ich nur das Problem, das zuviel ausgegeben wird.

    main() {
        enum fleisch {Rind, Schwein, Huhn, Ente, Seelachs, Krabben, Maxfleisch};
        enum gemuese {Paprika, Bambus, Sprossen, Bohnen, Zuckerschoten, Pilze, Maxgemuese};
        enum sosse {Suesssauer, Curry, Soja, Erdnuss, Maxsosse};
    
        char const * const Fleisch[] = {"Rind", "Schwein", "Huhn", "Ente", "Seelachs", "Krabben"};
        char const * const Gemuese[] = {"Paprika", "Bambus", "Sprossen", "Bohnen", "Zuckerschoten", "Pilze"};
        char const * const Sosse[] = {"Süßsauer", "Curry", "Soja", "Erdnuss"};
        for (int i=0; i< Maxfleisch;i++){
            cout << Fleisch[i]<< " ";
            for (int j=0; j<Maxgemuese;j++){
                cout << Gemuese[j] << " ";
                for (int k=0 ; k < Maxsosse;k++){
                    cout << Sosse[k] << " ";
                }
            }
            cout << endl;
        }
    

    Die Ausgabe, so wie ich mir sie vorstelle ist:

    Rind Paprika Sußssauer
    Rind Paprika Curry
    ...

    Ich habe mir das ungfähr so gedacht

    for (int i = 0; i < Maxfleisch;) {
            if (k == Erdnuss){
                i++;
            }
            cout << Fleisch[i] << " ";
    

    doch das geht schief.

    jemand eine bessere Idee? (Wahrscheinlich ist jede andere Idee besser 🙂 )



  • Willst du, dass alle möglichen varianten ausgegeben werden oder jeweils ein ausgewählter artikel pro kategorie



  • es sollen alle Varianten ausgegeben werden.



  • Ups.



  • So,

    ich glaube es funktioniert.

    #include <iostream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    int main() {
    
        enum fleisch {
            Rind, Schwein, Huhn, Ente, Seelachs, Krabben, Maxfleisch
        };
    
        enum gemuese {
            Paprika, Bambus, Sprossen, Bohnen, Zuckerschoten, Pilze, Maxgemuese
        };
    
        enum sosse {
            Suesssauer, Curry, Soja, Erdnuss, Maxsosse
        };
    
        char const * const Fleisch[] = {"Rind", "Schwein", "Huhn", "Ente", "Seelachs", "Krabben"};
        char const * const Gemuese[] = {"Paprika", "Bambus", "Sprossen", "Bohnen", "Zuckerschoten", "Pilze"};
        char const * const Sosse[] = {"Süßsauer", "Curry", "Soja", "Erdnuss"};
    
        for (int i = 0; i < Maxfleisch;) {
            //cout << Fleisch[0] << " ";
            for (int j = 0; j < Maxgemuese;) {
                //cout << Gemuese[j] << " ";
                for (int k = 0; k < Maxsosse;) {
                    cout << Fleisch[i]<< " " << Gemuese[j] << " " << Sosse[k] << endl;
    
                    if (k == Erdnuss){
                        j++;
                        cout << endl;
                       if (j== Pilze){
                        i++;
                    }    
                    }
                    k++;
                }
            }
        }
        //cout << Fleisch[0] << " oder " << Fleisch[1] << "?\n";
    }
    


  • .. ich glaube Du hast da noch die Beilage vergessen - oder?

    Übrigens lässt sich die Aufgabe auch mit zwei in einander geschachtelten Schleifen lösen. Unabhängig von der Anzahl der Teile aus denen ein Menü besteht - durch eine zusätzliche Indirektion:

    #include <iostream>
    
    int main() 
    {
        using namespace std;
        // jedes Array muss am Ende einen Nullptr enthalten, um das Array-Ende unabhängig von der Art des Arrays zu erkennen.
        char const * const Fleisch[] = {"Rind", "Schwein", "Huhn", "Ente", "Seelachs", "Krabben", nullptr };
        char const * const Gemuese[] = {"Paprika", "Bambus", "Sprossen", "Bohnen", "Zuckerschoten", "Pilze", nullptr };
        char const * const Sosse[] = {"Süßsauer", "Curry", "Soja", "Erdnuss", nullptr };
        char const * const Beilage[] = {"Reis", "Nudeln", nullptr };
    
        const size_t N = 4; // Menue besteht aus 4 Teilen
        char const* const* basis[N]; // Zeiger auf konstante Zeiger auf konstanten Text
        basis[0] = Fleisch;
        basis[1] = Gemuese;
        basis[2] = Sosse;
        basis[3] = Beilage;
    
        char const* const* gericht[N];
        for( size_t i=0; i<N; ++i )
            gericht[i] = basis[i];
    
        bool weiter;
        do
        {
            // --   Ausgeben des aktuellen Gerichts
            for( size_t i=0; i<N; ++i )
                cout << (i>0? " + ": "") << *gericht[i];
            cout << endl;
    
            // --   Übergang zum nächsten Gericht
            weiter = false;
            for( size_t i=0; i<N; ++i )
            {
                if( *++gericht[i] != nullptr )
                {
                    weiter = true;
                    break;
                }
                gericht[i] = basis[i];
            }
        }
        while( weiter );
    }
    

    Gruß
    Werner


Anmelden zum Antworten