Wochentage / Array / Ausgabe



  • Hallo zusammen,

    ich wollte fragen, ob es in c++ möglich ist, wenn ich einen array habe, also

    char weekdays[7]=[Sunday, Monday, Thusday, Wednesday, Thursday, Friday, Saturday]
    

    und mir sage, dass sunday=0 ist monday=1 (wie initialisiere ich das???)

    dass wenn ich nun nach einer division eine zahl bekomme, z.bsp. 3, dass ich dann irgendwie auf den array zugreifen kann (pointer?) und mir für die drei wednesday ausgegeben wird etc?

    Danke für eure hilfe



  • Wie wäre es mit enum?



  • Hallo D,

    sorry enmu (steht wohl für enumerate), diese kenn ich leider (noch) nicht?

    Was müsste ich genau tun?



  • Hallo

    Siehe zum Beispiel hier oder jedes andere Grundlagentutorial/buch.

    bis bald
    akari



  • enum ist ein Aufzählungstyp, den man als Alternative für tausende const oder
    define definitionen verwenden kann.

    z.B. Monate:

    enum monat {
      JAN, FEB, MAR, APR, JUN, JUL, AUG, SEP, OKT, NOV, DEC
    };
    

    Die Namen zwischen den Klammern werden als Tag bezeichnet. Der erste Tag
    bekommt dabei standardmäßig den Wert 0. Die weiteren Werte werden jeweils um
    eins inkrementiert. Das kann man aber auch ändern:

    enum Monat {
      JAN=1, FEB, MAR, APR, MAI=12 // ...
    }
    

    (blödes Beispiel, ich weiß 😃 )

    Januar bekommt dabei den Wert 1, Februar 2, März 3, April 4 und Mai 12.

    Du kannst sie ganz einfach jetzt im Code verwenden:

    int blablabla = JAN; // blablabla bekommt den Wert 1
    


  • habe jetzt mal im code folgende anweisung vorgenommen

    enum arrweekdays={Sunday, Monday, Thusday, Wednesday, Thursday, Friday, Saturday};
    

    beim compilieren kommt aber immer:

    te.C:78: error: use of enum `arrweekdays' without previous declaration

    wieso? habe auch schon arrweekdays zuerst mal als array angelegt, aber dann kommt der fehler immer noch?

    Sieht jemand das problem?

    Frauke



  • Das Gleichheitszeichen ist überflüssig.



  • Wie wärs mit

    enum arrweekdays {Sunday, Monday, Thusday, Wednesday, Thursday, Friday, Saturday};
    

    ohne

    =
    

    . Dann gehts!

    Kann man sonst noch helfen? Scheinst ja noch nicht so ganz sattelfest zu sein,

    lg herbert



  • Merci, klar, jetzt seh ich es auch,

    zu Herbert:

    Ja, bin noch nicht so gut... aber ich lerne es schon.

    Ja, hilfe könnte ich noch in zwei sachen gebrauchen:

    1. Wenn ich nun dieses enum ding habe, also

    enum arrweekdays {Sunday, Monday, Thusday, Wednesday, Thursday, Friday, Saturday};
    

    und eine zahl zwischen 0-6 in einem int, zbsp. c=5.

    Wie bringe ich nun das programm dazu, das es Friday ausspuckt.

    Habe es mal mit einer for-Schlaufe und if versucht, aber der vergleich klappt nicht...

    2. Wenn ich nun habe

    int month
     std::cout << "The number of your month? ";
        std::cin >> month;
        } while (month <=0 || month >=13);
    

    dann wird ja dem month eine zahl zwischen 1 und 12 zugewiesen, wie bringe ich nun mein programm dazu, dass es z.bsp. dem januar (month ist also eins) eine 0 zuzuweisen (also eigtl 0=1), dem februar (month ist in demfall 2) eine 3 etc.

    zudem möchte ich ja später auf diese zahlen zurückgreifen, also wenn vom input kam 4 (April) soll dem April eine 6 zugewiesen werden, welche ich dann benutzen kann.

    Geht das auch mit enum?

    Lg Frauke



  • Ich glaube du suchst doch eher ein Array.

    char* weekdays[7] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
    
    for(int i = 0; i < 7; ++i)
    {
        std::cout << weekdays[i] << std::endl;
    }
    


  • Ja, aber mit array habe ichs auch schon versucht, aber das funktioniert eben auch nicht... hier gibt es gar keinen output, im fall unten möchte ich ja als output "Tuesday"...

    #include <iostream>
    int main ()
    {
    
    char* weekdays[7] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; 
     int c = 2;
    for(int i = 0; i < 7; ++i) 
       {
         if (c == *weekdays[i]) 
        std::cout << weekdays[i] << " ";
    
       }
     return 0;
    }
    

    Ist das denn wirklich so schwer?

    😞



  • #include <iostream>
    int main ()
    {
        const char* weekdays[] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
    
        unsigned int sel(0);
        std::cin >> sel;
        if (sel < 12) std::cout << weekdays[sel - 1] << std::endl;
    }
    

    Arrays ist der richtige Weg. Durch die Indexierung hast du eh eine feste ID einem Wert zugewiesen.



  • Hey D(Evil) Danke vielmals, das geht ja so wirklich...

    jetzt fehlt mir nur noch das mit den Monaten und der zahlenzuweisung, ob ich das noch hinbringe?

    Frauke



  • Wie? Also von Monatsnahmen zu Zahl?

    unsigned char get_month(const char* str_month)
    {
        const char* month[] = { "January", "February", ..., "December" };
        for (unsigned char i(0); i < 12; ++i)
            if (std::strcmp(month[i], str_month) == 0)
                return ++i;
        return 13;
    }
    

    ... wenn die Funktion dann 13 zurück gibt, war es wohl kein gültiger Monat 😛 Ansonsten gibt die bei "December" z.B. 12 zurück.

    std::strcmp
    Header: <cstring>
    Funktionskopf:

    int strcmp( const char *str1, const char *str2 );
    

    Aufgabe: Vergleich zweier char-Arrays auf Äquivalenz.

    unsigned char
    POD 8 Bit
    Wertebereich:

    assert(std::numeric_limits<unsigned char>::max() == 255);
    

    => 0 ... 255



  • Nein ich meinte nicht das, sondern, dass

    Dem Januar 0 zugewiesen wird
    Feb 3
    März 3
    April 6
    Mai 1
    Juni 4
    Juli 6
    August 2
    Sept 6
    Okt 0
    Nov 3
    Dez 5, wobei der jeweilige monat von std::cin >> month; kommt als month, also eine zahl ist, wobei month=1 (= Januar) ... month = 12 (Dezember)

    habs jetzt wie folgt gemacht, da ich month_value später wieder brauche...

    // Monatszuweisung
        if (month ==1) 
             month_value =0;
           else if (month ==2 || month==3 || month==11) 
             month_value = 3;
           else if (month ==4 || month==7) 
             month_value =6;
           else if (month ==5 ) 
             month_value =1;
           else if (month ==6) 
             month_value =4;
           else if (month ==8) 
             month_value =2;
           else if (month==8)
             month_value = 2;
           else if (month==9 || month==12)
             month_value = 5;
           else if (month==10)
             month_value = 0;
    

    umständlich, das prog funktioniert...



  • const char* arr_month[] = { "January", "February", ..., "December" };
    unsigned char month_value[12] = {0, 3, 3 ,6, 1, 4, 6, 2, 6, 0, 3, 5 };
    
    std::cout << "Wert " << 1 + 1 /* 0 indexiert */ << " ist der Monat " << arr_month[month_value[1]] << "zugewiesen!" << std::endl;
    

    oder was willst du haben? 😛



  • Also, soweit ich das sehe, hab ich ihn fertig...

    muss als nächstes dann die bestimmten funktionen auslagern damit es nicht mehr so "lastig ist".

    Ich will ja für ein gegebenes datum den wochentag berechnen, mit dem untenstehenden code geht es. Jetzt siehst du wohl auch (D)Evil für was ich das month und month_value zeugs brauche. Da ich mit arrays und pointer noch nicht so sattelfest bin, weiss ich eben nicht, wie ich dann genau denn monat weiter unten wieder einbau, der als input kam...

    #include <iostream>
    
    int main()
    {   int month;  
        int day;
        int year;
    
        std::cout << "The number of your day in month? ";
        std::cin >> day;
        do{
        std::cout << "The number of your month? ";
        std::cin >> month;
        } while (month <=0 || month >=13);
        do{   
        std::cout << "The number of the year (>= 1900)? ";
        std::cin >> year;   
        } while (year <1900);    
    
        // Berechnung der legalen Tage    
           if (month == 2){
    
           bool is_leap_year = ((year % 4 == 0 && year % 100 != 0)  || year % 400 == 0);  
           if (is_leap_year == true){
                if (day <1 || day >= 30)
                   std::cout << "Your date is not correct.";
                              }      
           else {     
                if (day <1 || day >= 29)
                    std::cout << "Your date is not correct";
                        	     }
             }   
                 // Monate mit 31 Tagen
                 if (month != 4 &&  month != 6 && month != 9 && month !=11 && month !=2){
    	         if (day <1 || day >= 32) 
                         std::cout << "Your date is not correct";
                     		     }
                 // Monate mit 30 Tagen
                 if (month == 4 ||  month == 6 || month == 9 || month ==11){
    	         if (day <1 || day >= 31) 
                         std::cout << "Your date is not correct";
    
    	     }        
    
      // Computation
    
         int HH = year/100;
         int YY = year%100;
         int DD = day;
         int  month_value;
         int corrigendum;
         int leap_year_corr=0;
    
         // month assignement
          if (month ==1) 
             month_value =0;
           else if (month ==2 || month==3 || month==11) 
             month_value = 3;
           else if (month ==4 || month==7) 
             month_value =6;
           else if (month ==5 ) 
             month_value =1;
           else if (month ==6) 
             month_value =4;
           else if (month ==8) 
             month_value =2;
           else if (month==8)
             month_value = 2;
           else if (month==9 || month==12)
             month_value = 5;
           else if (month==10)
             month_value = 0;
    
        // correction
    
           if (HH%4==1)
              corrigendum=4;
           else if (HH%4==2)
    	  corrigendum=2;
           else if (HH%4==3)
    	  corrigendum=0;    
            else if (HH%4==0)
    	  corrigendum=6;
    
        // Spec. correction
    
         if (month == 2 && day == 29){
    	    bool is_leap_year = ((year % 4 == 0 && year % 100 != 0)  || year % 400 == 0);  
              if (is_leap_year == true){
    	      (leap_year_corr)++;
                              } 
         }
    
         int  year_value = (YY+(YY/4))%7;	     
         int week_day= year_value+month_value + DD + corrigendum - leap_year_corr; 
         week_day=week_day%7;
    
         // Output
       const char* entire_days[] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; 
    
       if (week_day < 12)
       std::cout << "Your given date has been evaluated as a " << entire_days[week_day] << ". "; 
    
       return 0;
    }
    

Anmelden zum Antworten