解决一年中的一天 c++
Resolve day of the year c++
我是编程新手,目前正在学习C++
我有这段代码,例如,如果我是输入2018 2 32
则必须0
输出,但现在输出62
,我不知道如何解决这个问题。我需要帮助,想知道是否有人可以查看我的代码并告诉我它有什么问题?
#include <iostream>
using namespace std;
// pointer
const int january = 31;
const int february = 28;
const int isLeapFeb = 29;
const int march = 31;
const int april = 30;
const int may = 31;
const int june =30;
const int july = 31;
const int august = 31;
const int september = 30;
const int october = 31;
const int november = 30;
const int december = 31;
bool isLeap(int year) {
// menentukan tahun kabisat dan biasa
return (((year % 4) == 0) && (((year % 100) != 0) || ((year % 400) == 0)));
}
int monthLength(int year, int month, int day) {
// bulan dengan hari 31
if((month == 1) || (month == 3) || (month == 5) || (month == 7) || (month || 8) || (month == 10) || (month || 12))
{
if((day > 0) && (day < 32))
return true;
else
return false;
}
// bulan dengan hari 30
if((month == 4) || (month == 6) || (month == 9) || (month == 11))
{
if((day > 0) && (day < 31))
return true;
else
return false;
}
if(month == 2) // februari 28 hari
{
if((day > 0) && (day < 29))
return true;
else
return false;
}
if((isLeap(year))) // februari 29 hari
{
if((month == 2) && ((day > 0) && (day < 30)))
return true;
else
return false;
}
}
int dayOfYear(int year, int month, int day) {
// tahun 1582 Gregorian kalender mulai
int dayTotal = 0;
if(monthLength(year, month, day))
{
if(month == 1)
{
dayTotal = 0 + day;
}
if(month == 2)
{
dayTotal = january + day;
}
if((month == 3) && (year > 1582))
{
dayTotal = january + february + day;
if((month == 3) && (year > 1582) && (isLeap(year)))
{
dayTotal = january + isLeapFeb + day;
}
}
if((month == 4) && (year > 1582))
{
dayTotal = january + february + march + day;
if((month == 4) && (year > 1582) && (isLeap(year)))
{
dayTotal = january + isLeapFeb + march + day;
}
}
if((month == 5) && (year > 1582))
{
dayTotal = january + february + march + april + day;
if((month == 5) && (year > 1582) && (isLeap(year)))
{
dayTotal = january + isLeapFeb + march + april + day;
}
}
if((month == 6) && (year > 1582))
{
dayTotal = january + february + march + april + may + day;
if((month == 6) && (year > 1582) && (isLeap(year)))
{
dayTotal = january + isLeapFeb + march + april + may + day;
}
}
if((month == 7) && (year > 1582))
{
dayTotal = january + february + march + april + may + june + day;
if((month == 7) && (year > 1582) && (isLeap(year)))
{
dayTotal = january + isLeapFeb + march + april + may + june + day;
}
}
if((month == 8) && (year > 1582))
{
dayTotal = january + february + march + april + may + june + july + day;
if((month == 8) && (year > 1582) && (isLeap(year)))
{
dayTotal = january + isLeapFeb + march + april + may + june + july + day;
}
}
if((month == 9) && (year > 1582))
{
dayTotal = january + february + march + april + may + june + july + august + day;
if((month == 9) && (year > 1582) && (isLeap(year)))
{
dayTotal = january + isLeapFeb + march + april + may + june + july + august + day;
}
}
if((month == 10) && (year > 1582))
{
dayTotal = january + february + march + april + may + june + july + august + september + day;
if((month == 10) && (year > 1582) && (isLeap(year)))
{
dayTotal = january + isLeapFeb + march + april + may + june + july + august + september + day;
}
}
if((month == 11) && (year > 1582))
{
dayTotal = january + february + march + april + may + june + july + august + september + october + day;
if((month == 11) && (year > 1582) && (isLeap(year)))
{
dayTotal = january + isLeapFeb + march + april + may + june + july + august + september + october + day;
}
}
if((month == 12) && (year > 1582))
{
dayTotal = january + february + march + april + may + june + july + august + september + october + november + day;
if((month == 5) && (year > 1582) && (isLeap(year)))
{
dayTotal = january + isLeapFeb + march + april + may + june + july + august + september + october + november + day;
}
}
}
return dayTotal;
}
int main(void) {
int day, month, year;
cout << "Enter year month day: ";
cin >> year >> month >> day;
cout << dayOfYear(year, month, day) << endl;
return 0;
}
它编译但输出不正确。 我非常感谢您的帮助和反馈。非常感谢<</p>
这是因为您传递days
作为31
以及执行此行的时间:
if(month == 2)
{
dayTotal = january + day;
}
然后
dayTotal = 31 + 31; // = 62 which is what you see.
您需要使用调试器来发现此类错误,此外还需要添加一些验证以防止无效数据,例如02/31/2018
编辑:
根据@Slava的建议,我修改了我的答案。此实现使用单个正则表达式匹配来验证和提取日期的组成部分。这是代码:
#include <iostream>
#include <string>
#include <regex>
#include <exception>
using namespace std;
void parseDate(const string& date, int& year, int& month, int& day)
{
regex dateValidateRe(R"(^(d{4})-(d{1,2})-(d{1,2})$)");
smatch matches;
if (!regex_search(date, matches, dateValidateRe))
{
throw invalid_argument("Date format is incorrect");
}
year = stoi(matches[1]);
month = stoi(matches[2]);
day = stoi(matches[3]);
}
int main()
{
int year, month, day;
string date;
cin >> date;
try
{
parseDate(date, year, month, day);
}
catch (std::exception& ex)
{
cout << "Invalid input: " << ex.what() << endl;
}
cout << "The date entered was Year = " << year << " Month = " << month << " Day = " << day << endl;
return 0;
}
这是一个工作演示
**原始回复 **
您没有正确解析输入。您的输入2018-2-31
被解析为 2018 年、第 -2 个月和第 -31 天。您需要将日期解析为字符串,然后通过标记-
将该字符串分开以提取年、月和日。
下面是一个快速而脏的函数,可用于正确解析输入:
void parseDate(const string& date, int& year, int& month, int& day)
{
auto ypos = date.find("-");
string syear = date.substr(0, ypos);
auto mpos = date.find("-", ypos+1);
string smonth = date.substr(ypos+1, mpos-ypos-1);
string sday = date.substr(mpos+1);
year = stoi(syear);
month = stoi(smonth);
day = stoi(sday);
}
按如下方式更新您的主目录:
int main(void) {
int day, month, year;
cout << "Enter year month day: ";
string date;
cin >> date;
parseDate(date, year, month, day);
cout << dayOfYear(year, month, day) << endl;
return 0;
}
这应该会给你正确的结果。请更新 parseDate,以便在继续标记输入字符串之前对其进行验证。
相关文章:
- C++ Chrono 确定一天是否是周末?
- 编写了一个C++代码来检查表达式是否具有平衡括号并且我的代码未运行.我已经卡了一天了
- 我正在尝试制作一个程序,在添加 n 天(整数)后告诉一个人什么是一天(例如星期一等)
- std::get_time 没有解析一天
- 以秒为单位将时间从纪元转换为一年中的某一天?
- 解决一年中的一天 c++
- Strftime在iOS上返回一周中不正确的一天
- 一个月的最后一天?
- 泽勒全等编码,输出错误的一天
- C++计算一周中未来的一天
- C++输入日期获取哪一天
- 如何从structtm中减去一天,同时确保完整性
- 跨平台获取一天中的时间的方式
- 从日期开始计算一年中的某一天
- 将某个时间增加一天
- 我如何将一年中的某一天(1-365)转换为其等效日期(即2013年1月5日)C++
- C或C++代码,使用时区从epoch时间戳中获取一天中的小时数
- 如何用重载函数对一天中的时间进行乘除,例如10:00和5:00
- mongodbc++查询一天的范围
- 显示一年中新的每一天的新信息