2016-11-09 2 views
1

주어진 날짜에 요일을 반환하는 간단한 프로그램을 C++로 작성하려고합니다.주어진 날짜에 대한 C++ 요일

입력 형식은 일, 월, 년입니다. 나는 윤년으로 일할 수 없다. 입력 연도가 윤년 인 경우 a 변수에서 1을 뺀 것을 시도했지만 오류 메시지없이 프로그램이 종료됩니다.

나는 어떤 제안이라도 고맙겠지 만, 단순하게 유지하려고 노력한다. 나는 아직 초보자이다. 어리석은 질문에 사과하고 제 실수를 용서하십시오.이 사이트에 게시하는 것은 이번이 처음입니다.

#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

당신이 당신의 디버거에서 단계별로하면 어떻게됩니까? – MrEricSir

+0

날짜와 관련하여 간단한 프로그램과 같은 것은 없습니다 (Jon skeet에 문의하십시오). 그 기능은 이미 재창조 된 이유입니다. –

+1

계산을 수행하는 간단한 공식이 있습니다. https://en.wikipedia.org/wiki/Determination_of_the_day_of_the_week를 참조하십시오. –

답변

0

숫자가 7로 ​​나눌 때 어떻게됩니까?

7분의 14 = 2 14 % 7 = 0

모듈러스 연산자 (%의 N), N는 나머지 7 결코 분리되지 않은 경우 0 내지 N -1

숫자를 반환 7 때문에이 경우

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 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

자신의 기능을 사용하지 말라고 말하는 사람들의 말을 듣지 마십시오. – ComradeJoecool

+0

우리 모두는 재미있는 일이나 학습 경험을 위해이 일을하는 것을 알고 있습니다. – ComradeJoecool

+0

또한 요일에 대한 최종 프로그램이 올바르지 않을 수 있음을 명심하십시오. 그것은 윤년이 항상 4 년마다 발생하지 않는 까다로운 일이기 때문입니다. 예 윤년은 100 년에 발생하지 않지만 400 년에 발생합니다. 그래, 일정은 정말 까다로울 수 있습니다. 내 답변은 주로 프로그램이 충돌하는 이유에 대한 원인을 찾는 데 도움을주기위한 것입니다. – ComradeJoecool

2

첫 번째 : 동일한 문제를 처리 할 수있는 표준화 된 기능이 이미있는 경우 사용자 고유의 기능을 작성하지 마십시오. 요점은 쉽게 실수 할 수 있다는 것입니다 (그리고 지금은 weekday() 함수의 첫 번째 행에서 이미 볼 수 있습니다). 반면에 표준화 된 함수의 구현은 철저하게 테스트되었으므로 결과를 전달한다고 확신 할 수 있습니다 당신은 얻을 것으로 예상됩니다. 말했다되고 그건

, 여기 std::localtimestd::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

제안 해 주셔서 감사합니다. 그러나이 프로그램을 작성하는 전체 요점은 프로그래밍을 연습하고 C++의 구문을 이해하려고 시도하는 것입니다. 나는 완전히 다른 접근법을 제안한 것에 대해 당신을 비난 할 수는 없습니다, 왜냐하면 저는 이것을 내 게시물에서 언급하지 않았기 때문입니다. 그러나 더 많은 경험을 가진 좀 더 복잡한 프로그램을 작성할 때 이와 같은 것을 필요로한다면이 방법을 고려해야합니다! – OerllydSaethwr

+0

1 년, ~ 1,800 회 조회 및 단일 upvote oO가 아닙니다. 방금 고쳤어. @OerllydSaethwr 점수 근처의 녹색 체크 표시를 클릭하여이 답변을 수락하십시오. – YSC

+0

'std :: localtime'에 대한 해결책은 가능한 빨리 반환 값을 복사하는 것입니다 :'const std :: tm time_out = * std :: localtime (& time_temp);'. – YSC

1

년 도약을 구성하는 것에 대한 이해가 올바르지 않습니다

윤년이 매 4 년마다 제외입니다이 100으로 나눌 수있는 경우 BUT이라도 그렇다고해도 400으로 나눌 수 있다면 윤년입니다.

"일 수"(dn)을 계산하는 방법에 대한 명확하고 간결한 설명은 here입니다.

하루의 숫자 (dn)를 얻었 으면 계수 7을 수행하십시오. 결과는 요일 (dow)이됩니다.

여기 예제 구현 (날짜가 유효한 입력이 있는지 확인하지 않습니다)입니다 :

#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; 

} 
관련 문제