yangzhixiaohuli 发表于 2023-10-13 09:21:08

求助一下

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

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

输出格式:
输出YES或NO。

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

这个题用c语言或者c++怎么做啊,谢谢大佬帮忙

isdkz 发表于 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。

希望能够帮到你!

陶远航 发表于 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);
    int month = stoi(tokens);
    int day = stoi(tokens);

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

    return 0;
}


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

注意,这个程序假设输入的年、月和日都是整数,并且没有进行错误处理。在实际使用中,你可能需要添加错误处理代码来处理不合法的输入。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案

Mike_python小 发表于 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;
}

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++中判断日期的合法性。如果有任何疑问,请随时追问。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页: [1]
查看完整版本: 求助一下