Enumerationen Aufgabe



  • Servus, hab folgendes Problem:

    Ich muss eine kleine Aufgabe über Enumerationen lösen, jedoch habe ich keine Ahnung wie ich das umsetzen soll.

    Aufgabenstellung: ,,Schreiben Sie ein Programm, das nach Eingabe einer Monatszahl die zugehörige
    Anzahl Tage des Monats liefert (ohne Berücksichtigung von Schaltjahren).
    Deklarieren Sie für die Lösung eine Enumeration, die für jeden Monat einen
    Enumerator mit Zuweisung der Anzahl Tage umfasst. Definieren Sie auch eine
    Variable dieses Enumerationstyps, in der die Anzahl Tage des abgefragten Monats
    abgelegt wird."

    Beispieldialog (Eingaben sind Kursiv):
    Bitte geben Sie den gewuenschten Monat ein: 9
    Anzahl Tage: 30

    Vielen Dank



  • @zerosuggar sagte in Enumerationen Aufgabe:

    Vielen Dank

    Null Problemo 👍

    . o O ( die Aufgabenstellung ist wieder mal selten dämlich. und zwar so dämlich, daß sie nichtmal lösbar ist. )



  • Also mit Howard Hinnants date.h löst sich das so:

    #include "date.h"
    (...)
    int monat = 9;
    std::cout << static_cast<unsigned>((date::year(2015)/monat/date::last).day()) << '\n';
    

    Ich habe hier 2015 gewählt, weil das kein Schaltjahr ist. Zum Glück ist in der date.h vieles constexpr, also geht auch

    constexpr unsigned lastDay(int month) {return static_cast<unsigned>((date::year(2015)/month/date::last).day()); }
    enum class MonthDays { Jan = lastDay(1), Feb = lastDay(2), Mar = lastDay(3), Apr = lastDay(4), ... };
    

    Ich verstehe den Sinn aber noch nicht so recht, insbesondere ist mir unklar, was mit "Definieren Sie auch eine Variable dieses Enumerationstyps, in der die Anzahl Tage des abgefragten Monats abgelegt wird." gemeint ist bzw. wozu sowas gut sein sollte. So ein enum, wo mehrere Einträge identische Werte haben (z.B. Jan und Mar), sind merkwürdig.



  • @wob sagte in Enumerationen Aufgabe:

    So ein enum, wo mehrere Einträge identische Werte haben (z.B. Jan und Mar), sind merkwürdig.

    Ich dachte, das sei nichteinmal erlaubt ... deshalb auch meine Aussage "und zwar so dämlich, daß sie nichtmal lösbar ist." oben.



  • Erlaubt ist das schon, aber nur mit der Enumeration kommt man hier nicht weit, da man ein Array benötigt, um die Zuordnung (Monatsindex -> Anzahl_Tage) zu haben (eine Enumeration kann man ja nicht durchiterieren).


  • |  Mod

    Das erschreckende ist, das die Aufgabenstellung offensichtlich Copy&Paste ist. Es ist also nicht so, dass der Threadersteller eine gute Aufgabe falsch wieder gegeben hätte (was leider oft vorkommt).

    @zerosuggar: Die Aufgabe ist unlösbar. Und zwar nicht einfach nur unlösbar in dem Sinne, das man ein bisschen was ändern müsste und sie würde lösbar, sondern wirklich krass unlösbar. So als ob der Aufgabensteller nicht den Hauch einer Ahnung hätte, wovon er schreibt. Und erst recht nicht ausprobiert hat, seine eigene Aufgabe zu lösen, denn das wäre sofort aufgefallen, dass das so nicht geht. Wer diese Aufgabe gestellt hat, hat Enums fundamental missverstanden. Tatsächlich machen Enums nahezu das Gegenteil dessen, was der Aufgabensteller zu denken scheint.

    Von einem Lehrer, der selber einfachste Grundlagen nicht versteht, und seinen eigenen Stoff nicht hinterfragt, kannst du nichts lernen. In diesem Fall ist es sogar so schlimm, dass man bei diesem Lehrer nicht einmal Punkte für die Hausaufgaben oder Klausuren bekommen kann, da die Aufgaben so falsch sind, dass sie nicht lösbar sind. Wenn du nur irgendwie kannst, nimm unbedingt Abstand von diesem Lehrer!

    PS: Damit du auch eine "Lösung" hast: Die Aufgabenstellung ist relativ trivial mit einer map zu lösen. Tatsächlich könnte man in der Aufgabenstellung mehr oder weniger "enumeration" mit "map" ersetzen und man hätte fast eine funktionierende Aufgabe:

    #include <iostream>
    #include <map>
    #include <string>
    using namespace std;
    
    int main() 
    {
        map<int, string> months_of_the_year 
        {
            {1, "Januar"},
            {2, "Februar"},
            {3, "März"},
            {4, "April"},
            {5, "Mai"},
            {6, "Juni"},
            {7, "Juli"},
            {8, "August"},
            {9, "September"},
            {10, "Oktober"},
            {11, "November"},
            {12, "Dezember"},
        };
        map<string, int> days_per_month 
        {
            {"Januar", 31},	
            {"Februar", 28},	
            {"März", 31},	
            {"April", 30},	
            {"Mai", 31},	
            {"Juni", 30},	
            {"Juli", 31},	
            {"August", 31},	
            {"September", 30},	
            {"Oktober", 31},	
            {"November", 30},	
            {"Dezember", 31},
        };
        
        for(int month; cin >> month; )
        {
            cout << "Monat " << month << " hat " << days_per_month[months_of_the_year[month]] << " Tage.\n";
        }
    }
    

    Obiges im "Sinne" der Aufgabenstellung. Wenn man etwas sinnvoller programmiert, dann macht man natürlich keine unnützen Umwege:

    #include <iostream>
    #import <map>
    using namespace std;
    
    int main()
    {
    	map<int, int> days_per_month
    	{
    		{1, 31}, {2, 28}, {3, 31}, {4, 30}, {5, 31}, {6, 30},
    		{7, 31}, {8, 31}, {9, 30}, {10, 31}, {11, 30}, {12, 31},
    	};
    	for (int month; cin >> month;)
    	{
    		cout << "Monat " << month << " hat " << days_per_month[month] << " Tage.\n";
    	}
    }
    


  • Inwiefern "krass unloesbar"? Man kann das schon so programmieren wenn man sich sklavisch an den Text hält, aber es ist totaler Schwachsinn und wird daher nie praktische Anwendung erfahren.


  • |  Mod

    @tggc sagte in Enumerationen Aufgabe:

    Inwiefern "krass unloesbar"? Man kann das schon so programmieren wenn man sich sklavisch an den Text hält, aber es ist totaler Schwachsinn und wird daher nie praktische Anwendung erfahren.

    Wie? Der erste und der zweite Satz gehen einfach nicht zusammen:
    @zerosuggar sagte in Enumerationen Aufgabe:

    Deklarieren Sie für die Lösung eine Enumeration, die für jeden Monat einen
    Enumerator mit Zuweisung der Anzahl Tage umfasst. Definieren Sie auch eine
    Variable dieses Enumerationstyps, in der die Anzahl Tage des abgefragten Monats
    abgelegt wird."



  • Doch, wieso sollte das nicht gehen? Muss ich es dir erst notieren?

    Deine Antwort ist übrigens falsch, du hast keine Variable, welche die Anzahl des abgefragten Monats hat.



  • Bis zu

    Definieren Sie auch eine
    Variable dieses Enumerationstyps, in der die Anzahl Tage des abgefragten Monats
    abgelegt wird.

    dachte ich dass es sich da wohl um eine auf C++ umdefinierte Aufgabenstellung für Java handelt.



  • Hatte mal ähnliches Problem.

    Habe jetzt keinen Link, aber ich habe es so in Erinnerung, dass <map>, <set>, <unordered_map>,<unordered_set>glaube die Daten entweder sortieren oder die Reihenfolge bei der Eingabe nicht garantieren. Also ich brauchte es dabei für die "Indizes" für <vector>, und die Reihenfolge war auf einmal durcheinandergeraten.

    @seppj sagte in Enumerationen Aufgabe:

    Wer diese Aufgabe gestellt hat, hat Enums fundamental missverstanden.

    Also intuitiv finde ich das auch, da für die Anzahl Tage von Monaten int oder unsigned int oder ähnliches geeigneter erscheint.

    Edit 1: Also würde am ehesten (da die Anzahl der Tage von Monaten konstant bleiben) so machen:

    enum
    {
        monthlenght_a = 28,
        //monthlenght_b = 29,
        monthlenght_c = 31,
        monthlenght_d = 32,
    };
    

  • |  Mod

    @tggc sagte in Enumerationen Aufgabe:

    Doch, wieso sollte das nicht gehen? Muss ich es dir erst notieren?

    Ja, bitte!

    Deine Antwort ist übrigens falsch, du hast keine Variable, welche die Anzahl des abgefragten Monats hat.

    Natürlich habe ich das nicht. Wie sollte das auch gehen? Das ist der unmögliche Teil!

    @titan99_ sagte in Enumerationen Aufgabe:

    Habe jetzt keinen Link, aber ich habe es so in Erinnerung, dass <map>, <set>, <unordered_map>,<unordered_set>glaube die Daten entweder sortieren oder die Reihenfolge bei der Eingabe nicht garantieren. Also ich brauchte es dabei für die "Indizes" für <vector>, und die Reihenfolge war auf einmal durcheinandergeraten.

    Inwiefern interessiert hier die Reihenfolge?



  • @seppj sagte in Enumerationen Aufgabe:

    @tggc sagte in Enumerationen Aufgabe:

    Doch, wieso sollte das nicht gehen? Muss ich es dir erst notieren?

    Ja, bitte!

    Deine Antwort ist übrigens falsch, du hast keine Variable, welche die Anzahl des abgefragten Monats hat.

    Natürlich habe ich das nicht. Wie sollte das auch gehen? Das ist der unmögliche Teil!

    Man denke sich bitte die restliche Tipparbeit dazu. Oder hast du Grund für Punktabzug?

     enum Days{
        Unknown = 0,
        Jan =31,
        Feb =28,
        Mar =31
        //...
    };
    
    int main()
    {
        Days d = Unknown;
        std::cout << "Eingabe? ";
        std::string inp;
        std::cin >> inp;
      
        if (inp == "1")
        {
            d = Jan;
        }
        if (inp == "2")
        {
            d = Feb;
        }
        //...
      
        std::cout << "Anzahl = " << (int)d << "\n";
    }
    

  • |  Mod

    @tggc sagte in Enumerationen Aufgabe:

    Man denke sich bitte die restliche Tipparbeit dazu. Oder hast du Grund für Punktabzug?

    Nein. Ich hatte nicht geahnt, zu welchen Tiefen man sinken kann/muss, um die Aufgabe doch zu lösen. Wunderbar grauenhaft.



  • Das ist aber genau das Niveau, das ich aus Informatikunterricht in der Schule erinnere...



  • Das schlimmste an der Aufgabe ist IMO der enum selbst. Weil es komplett beknackt ist und eine schwere Verletzung des principle of least astonishment dass man einen enum hat der pro Monat eine Konstante definiert, aber nicht kollisionsfrei.

    Die if/switch/table-lookup Sache dagegen finde ich voll OK, sowas hat man ja oft.


Anmelden zum Antworten