解决一年中的一天 c++

Resolve day of the year c++

本文关键字:一天 c++ 一年 解决      更新时间:2023-10-16

我是编程新手,目前正在学习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>

div class="answers">

这是因为您传递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,以便在继续标记输入字符串之前对其进行验证。