鱼C论坛

 找回密码
 立即注册
查看: 1277|回复: 3

[已解决]求助一下

[复制链接]
发表于 2023-10-13 09:21:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
7-8 表达式终极挑战-判断日期是否合法

输入格式:
在一行中三个正整数,分别表示年、月、日,期间可能使用空格 分隔,或采用斜杠/分隔或采用短横-分隔。

输出格式:
输出YES或NO。

输入样例1:
2049 5 31
输出样例1:
YES
输入样例2:
2100/2/29
输出样例2:
NO

这个题用c语言或者c++怎么做啊,谢谢大佬帮忙
最佳答案
2023-10-13 09:21:48
这道题需要判断输入的日期是否合法,可以按照以下步骤进行处理:

1. 读入年、月、日,可以使用scanf函数。
2. 判断年份是否为闰年,能被4整除但不能被100整除,或者能被400整除的年份为闰年。
3. 判断月份是否在1到12之间,如果不是则输出NO。
4. 判断日期是否在合法范围内,例如2月份的日期需要根据是否为闰年来判断。
5. 如果所有判断都通过,则输出YES,否则输出NO。

以下是C++代码实现:
#include <iostream>
using namespace std;

bool isLeapYear(int year) {
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}

int main() {
    int year, month, day;
    char c;
    cin >> year >> c >> month >> c >> day;
    if (month < 1 || month > 12) {
        cout << "NO" << endl;
        return 0;
    }
    int maxDay;
    switch (month) {
        case 2:
            maxDay = isLeapYear(year) ? 29 : 28;
            break;
        case 4:
        case 6:
        case 9:
        case 11:
            maxDay = 30;
            break;
        default:
            maxDay = 31;
            break;
    }
    if (day < 1 || day > maxDay) {
        cout << "NO" << endl;
        return 0;
    }
    cout << "YES" << endl;
    return 0;
}

以上代码中,isLeapYear函数用于判断是否为闰年,根据闰年的定义进行判断即可。在主函数中,首先读入年、月、日,然后判断月份是否在1到12之间,如果不是则输出NO。接着根据月份来计算出当月的最大天数,需要注意判断2月份的最大天数。最后判断输入的日期是否在合法范围内,如果是则输出YES,否则输出NO。

希望能够帮到你!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-13 09:21:48 | 显示全部楼层    本楼为最佳答案   
这道题需要判断输入的日期是否合法,可以按照以下步骤进行处理:

1. 读入年、月、日,可以使用scanf函数。
2. 判断年份是否为闰年,能被4整除但不能被100整除,或者能被400整除的年份为闰年。
3. 判断月份是否在1到12之间,如果不是则输出NO。
4. 判断日期是否在合法范围内,例如2月份的日期需要根据是否为闰年来判断。
5. 如果所有判断都通过,则输出YES,否则输出NO。

以下是C++代码实现:
#include <iostream>
using namespace std;

bool isLeapYear(int year) {
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}

int main() {
    int year, month, day;
    char c;
    cin >> year >> c >> month >> c >> day;
    if (month < 1 || month > 12) {
        cout << "NO" << endl;
        return 0;
    }
    int maxDay;
    switch (month) {
        case 2:
            maxDay = isLeapYear(year) ? 29 : 28;
            break;
        case 4:
        case 6:
        case 9:
        case 11:
            maxDay = 30;
            break;
        default:
            maxDay = 31;
            break;
    }
    if (day < 1 || day > maxDay) {
        cout << "NO" << endl;
        return 0;
    }
    cout << "YES" << endl;
    return 0;
}

以上代码中,isLeapYear函数用于判断是否为闰年,根据闰年的定义进行判断即可。在主函数中,首先读入年、月、日,然后判断月份是否在1到12之间,如果不是则输出NO。接着根据月份来计算出当月的最大天数,需要注意判断2月份的最大天数。最后判断输入的日期是否在合法范围内,如果是则输出YES,否则输出NO。

希望能够帮到你!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-13 09:21:59 | 显示全部楼层
这个问题可以通过创建一个函数来解决,该函数接收年、月和日作为参数,然后检查这个日期是否合法。这里有一个使用C++的示例:
#include <iostream>
#include <sstream>
#include <vector>
#include <string>

using namespace std;

bool isLeap(int year) {
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}

bool isValidDate(int year, int month, int day) {
    if(year < 1 || month < 1 || month > 12 || day < 1 || day > 31) 
        return false;

    if(month == 2) {
        if(isLeap(year) && day > 29) 
            return false;
        if(!isLeap(year) && day > 28) 
            return false;
    }

    if((month == 4 || month == 6 || month == 9 || month == 11) && day > 30) 
        return false;

    return true;
}

vector<string> split(const string &s, char delim) {
    stringstream ss(s);
    string item;
    vector<string> tokens;
    while (getline(ss, item, delim)) {
        tokens.push_back(item);
    }
    return tokens;
}

int main() {
    string input;
    getline(cin, input);

    vector<string> tokens = split(input, ' ');
    if(tokens.size() != 3) {
        tokens = split(input, '/');
        if(tokens.size() != 3) {
            tokens = split(input, '-');
        }
    }

    int year = stoi(tokens[0]);
    int month = stoi(tokens[1]);
    int day = stoi(tokens[2]);

    if(isValidDate(year, month, day)) {
        cout << "YES" << endl;
    } else {
        cout << "NO" << endl;
    }

    return 0;
}

这个程序首先定义了一个函数isLeap来判断一个年份是否是闰年,然后定义了一个函数isValidDate来判断一个日期是否合法。在main函数中,程序读取输入,然后使用空格、斜杠或短横线将输入分割成年、月和日,然后调用isValidDate函数来判断日期是否合法,最后输出结果。

注意,这个程序假设输入的年、月和日都是整数,并且没有进行错误处理。在实际使用中,你可能需要添加错误处理代码来处理不合法的输入。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-13 09:23:33 | 显示全部楼层
问题分析:

要判断一个日期是否合法,需要考虑以下几个方面:

1. 年份的范围:通常使用公历年份表示,可以限定在某个范围内(例如1900-2100)。
2. 月份的范围:合法的月份应介于1-12之间。
3. 不同月份的天数:不同月份有不同的天数,需要根据具体的年份和月份判断。
4. 闰年的处理:闰年的2月份有29天,平年只有28天。

根据以上分析,我们可以设计一个函数来判断日期是否合法。下面是使用C++实现的代码示例:
#include <iostream>#include <sstream>#include <string>bool isLeapYear(int year) {    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);}bool isValidDate(int year, int month, int day) {    if (year < 1900 || year > 2100 || month < 1 || month > 12 || day < 1)        return false;    static const int daysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};    // 处理闰年的2月份    if (month == 2 && isLeapYear(year))        return day <= 29;        return day <= daysInMonth[month - 1];}int main() {    std::string input;    std::getline(std::cin, input);    std::stringstream ss(input);    int year, month, day;    // 从输入字符串中解析年、月、日    ss >> year;    ss.ignore(); // 跳过分隔符    ss >> month;    ss.ignore(); // 跳过分隔符    ss >> day;    if (isValidDate(year, month, day))        std::cout << "YES" << std::endl;    else        std::cout << "NO" << std::endl;    return 0;}
代码说明:

1. isLeapYear()函数用于判断闰年,根据闰年的定义进行判断,返回true表示是闰年,返回false表示不是闰年。
2. isValidDate()函数用于判断日期是否合法。首先检查年份和月份的范围,然后根据月份和是否闰年来判断天数是否合法。
3. main()函数中,首先读取输入的日期字符串,然后使用std::stringstream进行解析,并传递给isValidDate()函数进行判断。最后根据判断结果输出"YES"或"NO"。

希望这个例子能帮助您理解如何在C/C++中判断日期的合法性。如果有任何疑问,请随时追问。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-5 21:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表