[英]c++ day of week for given date
我正在嘗試用 C++ 編寫一個簡單的程序,它返回給定日期的星期幾。
輸入格式為日、月、年。 我無法讓它與閏年一起工作。 當輸入年份是閏年時,我嘗試從a
變量中減去一個,但程序最終崩潰而沒有錯誤消息。
我會很感激任何建議,但請盡量保持簡單,我仍然是初學者。 為愚蠢的問題道歉,請原諒我的錯誤,這是我第一次在這個網站上發帖。
#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);
}
第一:不要編寫自己的函數,如果已經有可以處理相同問題的標准化函數。 關鍵是你可能很容易犯錯(我已經在你的weekday()
函數的第一行看到了一個錯誤,就像現在一樣),而標准化函數的實現已經過徹底測試,你可以確信它們提供了你應該得到的結果。
話雖如此,這是一種使用std::localtime和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;
}
您對閏年的理解是不正確的:
閏年是每 4 年,除非它可以被 100整除,但即便如此,如果它可以被 400 整除,它仍然是閏年。
可以在此處找到有關如何計算“天數”(dn)的清晰簡潔的說明。
獲得日期編號 (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;
}
您可以使用Boost C++ 庫中的公歷日期系統來查找給定日期的星期幾。 這是一個簡單的例子:
#include <boost/date_time.hpp>
#include <string>
#include <iostream>
const static std::string daysOfWeek[] = {
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
};
int getDayOfWeekIndex(int day, int month, int year) {
boost::gregorian::date d(year, month, day);
return d.day_of_week();
}
int main()
{
const int index = getDayOfWeekIndex(30, 07, 2018);
std::cout << daysOfWeek[index] << '\n';
}
此代碼打印Monday
。
舊問題的新答案,因為它們正在改變工具......
C++20 規范說以下內容將具有與問題中代碼的意圖相同的功能:
#include <chrono>
#include <format>
#include <iostream>
int
main()
{
using namespace std;
using namespace std::chrono;
year_month_day dmy;
cin >> parse("%d %m %Y", dmy);
cout << format("{:%A}", weekday{dmy}) << '\n';
}
今天可以通過使用這個免費的開源日期/時間庫來試驗這種語法,除了日期對象位於namespace date
而不是namespace std::chrono
中,並且格式字符串的語法略有改變。
#include "date/date.h"
#include <iostream>
int
main()
{
using namespace std;
using namespace date;
year_month_day dmy;
cin >> parse("%d %m %Y", dmy);
cout << format("%A", weekday{dmy}) << '\n';
}
我有同樣的問題,我能夠找到一個簡單的解決方案。
根據這篇文章:
“以下是Sakamoto、Lachman、Keith 和 Craver建議的用於計算日期的簡單函數。以下函數返回 0 表示周日,1 表示周一,等等。”
int dayofweek(int d, int m, int y)
{
static int t[] = { 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4 };
y -= m < 3;
return ( y + y / 4 - y / 100 + y / 400 + t[m - 1] + d) % 7;
}
當一個數能被 7 整除時會發生什么?
14 / 7 = 2 14 % 7 = 0
模運算符 (% n) 將返回一個從 0 到 n -1 的數字
如果 n 除以 7 余數永遠不會是 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";
}
嘗試使用 CTime 類
示例:
const CTime currTime = CTime::GetCurrentTime();
const int nWeekDay = currTime.GetDayOfWeek();
switch (nWeekDay)
{
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";
}
在上面的示例中,我使用的是當前時間,但您可以使用不同的方式,使用您想要的時間示例:
const CTime currTime = CTime(year,month, day, hours, minutes, seconds );
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.