2016-11-09 4 views
1

Ich versuche, ein einfaches Programm in C++ zu schreiben, das den Wochentag für ein bestimmtes Datum zurückgibt.C++ Wochentag für gegebenes Datum

Das Eingabeformat ist Tag, Monat, Jahr. Ich kann es nicht mit Schaltjahren arbeiten lassen. Ich habe versucht, eins von der a Variable zu subtrahieren, wenn das eingegebene Jahr ein Schaltjahr ist, aber das Programm stürzt gerade ohne eine Fehlermeldung ab.

Ich würde mich über Vorschläge freuen, aber bitte versuchen Sie einfach zu bleiben, ich bin noch ein Anfänger. Entschuldigung für die dumme Frage, und bitte entschuldigen Sie meine Fehler, dies ist das erste Mal, dass ich auf dieser Seite poste.

#include <iostream> 
#include <string> 
#include <vector> 
#include <cmath> 
using namespace std; 


int d; 
int m; 
int y; 


string weekday(int d, int m, int y){ 
    int LeapYears = (int) y/ 4; 
    long a = (y - LeapYears)*365 + LeapYears * 366; 
    if(m >= 2) a += 31; 
    if(m >= 3 && (int)y/4 == y/4) a += 29; 
    else if(m >= 3) a += 28; 
    if(m >= 4) a += 31; 
    if(m >= 5) a += 30; 
    if(m >= 6) a += 31; 
    if(m >= 7) a += 30; 
    if(m >= 8) a += 31; 
    if(m >= 9) a += 31; 
    if(m >= 10) a += 30; 
    if(m >= 11) a += 31; 
    if(m == 12) a += 30; 
    a += d; 
    int b = (a - 2) % 7; 
    switch (b){ 
    case 1: 
     return "Monday"; 
    case 2: 
     return "Tuesday"; 
    case 3: 
     return "Wednesday"; 
    case 4: 
     return "Thursday"; 
    case 5: 
     return "Friday"; 
    case 6: 
     return "Saturday"; 
    case 7: 
     return "Sunday"; 
    } 
} 

int main(){ 
    cin >> d >> m >> y; 
    cout << weekday(d, m, y); 
} 
+3

Was passiert, wenn man durch sie in Ihrem Debugger Schritt? – MrEricSir

+0

Es gibt kein einfaches Programm, wenn es um Daten geht (gehen Sie ask jon skeet). Diese Funktionalität existiert bereits, warum erfinden Sie sie neu. –

+1

Es gibt eine einfache Formel für die Berechnung. Siehe https://en.wikipedia.org/wiki/Determination_of_the_day_of_the_week –

Antwort

0

Was passiert, wenn eine Zahl vollständig durch 7 teilbar ist?

14/7 = 2 14% 7 = 0

der Modulo-Operator (% N), kehrt eine Zahl von 0 bis n -1

wenn n von 7 der Rest unterteilt ist niemals werden 7 so

int b = (a - 2) % 7; 
    switch (b){ 
    case 1: 
     return "Monday"; 
    case 2: 
     return "Tuesday"; 
    case 3: 
     return "Wednesday"; 
    case 4: 
     return "Thursday"; 
    case 5: 
     return "Friday"; 
    case 6: 
     return "Saturday"; 
    case 7: 
     return "Sunday"; 
    } 
} 

In diesem Fall kann es nie

Versuchen sie, diese

Sonntag
int b = (a - 2) % 7; 
     switch (b){ 
     case 0: 
      return "Sunday"; 
     case 1: 
      return "Monday"; 
     case 2: 
      return "Tuesday"; 
     case 3: 
      return "Wednesday"; 
     case 4: 
      return "Thursday"; 
     case 5: 
      return "Friday"; 
     case 6: 
      return "Saturday"; 
     default: 
      return "Error"; 
     } 
+0

Höre nicht auf Leute, die sagen, dass du deine eigene Funktion nicht benutzen sollst. – ComradeJoecool

+0

Für alles, was wir wissen, tun Sie dies aus Spaß oder für eine Lernerfahrung. – ComradeJoecool

+0

Bitte beachten Sie auch, dass Ihr eventuelles Programm hinsichtlich des Wochentags nicht korrekt ist. Denn Schaltjahre sind knifflige Dinge, die nicht IMMER alle 4 Jahre passieren. Beispielhafte Schaltjahre finden nicht im Jahr 100 statt, aber sie kommen im Jahr 400 vor. Also, ja, Kalender können wirklich schnell knifflig werden. Meine Antwort ist hauptsächlich, Ihnen zu helfen, die Ursache zu finden, warum Ihr Programm abstürzt. – ComradeJoecool

2

Zuerst: Schreiben Sie nicht Ihre eigene Funktion, wenn es bereits standardisierte Funktionen gibt, die das gleiche Problem behandeln können. Punkt ist, dass Sie leicht einen Fehler machen können (und ich kann bereits eins in der ersten Zeile Ihrer weekday() Funktion sehen, wie es jetzt ist), während Implementierungen von standardisierten Funktionen gründlich getestet wurden und Sie können sicher sein, dass sie das Ergebnis liefern Sie werden erwartet, zu bekommen.

aber sagen, dass hier ein möglicher Ansatz std::localtime und std::mktime:

#include <ctime> 
#include <iostream> 

int main() 
{ 
    std::tm time_in = { 0, 0, 0, // second, minute, hour 
     9, 10, 2016 - 1900 }; // 1-based day, 0-based month, year since 1900 

    std::time_t time_temp = std::mktime(&time_in); 

    //Note: Return value of localtime is not threadsafe, because it might be 
    // (and will be) reused in subsequent calls to std::localtime! 
    const std::tm * time_out = std::localtime(&time_temp); 

    //Sunday == 0, Monday == 1, and so on ... 
    std::cout << "Today is this day of the week: " << time_out->tm_wday << "\n"; 
    std::cout << "(Sunday is 0, Monday is 1, and so on...)\n"; 

    return 0; 
} 
+0

Vielen Dank für Ihren Vorschlag, aber der ganze Sinn des Schreibens dieses Programms besteht darin, das Programmieren zu üben und zu versuchen, die Syntax von C++ zu verstehen. Ich kann Ihnen nicht vorwerfen, einen ganz anderen Ansatz vorgeschlagen zu haben, da ich dies in meinem Beitrag nicht erwähnt habe. Aber wenn ich jemals so etwas brauche, wenn ich ein komplexeres Programm mit mehr Erfahrung schreibe, werde ich diese Methode berücksichtigen! – OerllydSaethwr

+0

Ein Jahr, ~ 1800 Ansichten, und keine einzige Verbesserung oO. Habe es einfach repariert. @OerllydSaethwr Bitte akzeptieren Sie diese (oder eine andere) Antwort, indem Sie auf das grüne Häkchen neben der Bewertung klicken. – YSC

+0

Eine Lösung über 'std :: localtime' ist es, so schnell wie möglich eine Kopie seiner Rückgabe zu erstellen:' const std :: tm time_out = * std :: localtime (& time_temp); '. – YSC

1

Ihr Verständnis dessen, was Jahr einen Sprung bildet, ist falsch:

Ein Schaltjahr alle 4 Jahre ist AUSSER wenn es teilbar ist durch 100, ABER auch dann ist es immer noch ein Schaltjahr, wenn es durch 400 teilbar ist.

Eine klare und prägnante Erklärung zur Berechnung der "Tagesnummer" (dn) finden Sie unter here.

Sobald Sie die Tagesnummer (dn) haben, führen Sie einfach einen Modulus 7 durch. Das Ergebnis ist der Wochentag (dow).

Hier ist ein Beispiel-Implementierung (nicht überprüft, wenn das Datum gültig Eingang):

#include <iostream> 
#include <iomanip> 

typedef unsigned long ul; 
typedef unsigned int ui; 

// ---------------------------------------------------------------------- 
// Given the year, month and day, return the day number. 
// (see: https://alcor.concordia.ca/~gpkatch/gdate-method.html) 
// ---------------------------------------------------------------------- 
ul CalcDayNumFromDate(ui y, ui m, ui d) 
{ 
    m = (m + 9) % 12; 
    y -= m/10; 
    ul dn = 365*y + y/4 - y/100 + y/400 + (m*306 + 5)/10 + (d - 1); 

    return dn; 
} 

// ---------------------------------------------------------------------- 
// Given year, month, day, return the day of week (string). 
// ---------------------------------------------------------------------- 
std::string CalcDayOfWeek(int y, ul m, ul d) 
{ 
    std::string day[] = { 
    "Wednesday", 
    "Thursday", 
    "Friday", 
    "Saturday", 
    "Sunday", 
    "Monday", 
    "Tuesday" 
    }; 

    ul dn = CalcDayNumFromDate(y, m, d); 

    return day[dn % 7]; 
} 

// ---------------------------------------------------------------------- 
// Program entry point. 
// ---------------------------------------------------------------------- 
int main(int argc, char **argv) 
{ 
    ui y = 2017, m = 8, d = 29; // 29th August, 2017. 
    std::string dow = CalcDayOfWeek(y, m, d); 

    std::cout << std::setfill('0') << std::setw(4) << y << "/"; 
    std::cout << std::setfill('0') << std::setw(2) << m << "/"; 
    std::cout << std::setfill('0') << std::setw(2) << d << ": "; 
    std::cout << dow << std::endl; 

    return 0; 
} 
-1
int dayofweek(int day,int month,int year) 
{ 
    int arr[] = {0,3,2,5,3,5,1,4,6,2,4}; 
    if(month<3) 
     year--; 
    return ((year+year/4-year/100+year/400+arr[month-1]+day)%7); 
} 

int main() 
{ 
    int day,month,year; 
    cout<<"Enter the Date for which day of the week need to be find (DD/MM/YYYY)."<<endl; 
    cin>>day>>month>>year; 
    int x = dayofweek(day,month,year); 
    if(x==0) 
     cout<<"Sunday"<<endl; 
    else if(x==1) 
     cout<<"Monday"<<endl; 
    else if(x==2) 
     cout<<"Tuesday"<<endl; 
    else if(x==3) 
     cout<<"Wednesday"<<endl; 
    else if(x==4) 
     cout<<"Thursday"<<endl; 
    else if(x==5) 
     cout<<"Friday"<<endl; 
    else if(x==6) 
     cout<<"Saturday"<<endl; 

} 
Verwandte Themen