来自C语言初学者的提问~

C语言初学者,本人才刚学完指针部分,这个对于我来说还是有难度的,打鱼晒网问题。

img

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <time.h>
using namespace std;
// 判断星期几
int getWeekDay(const int year, const int yday)
{
    int n = year - 1 + (int)((year - 1) / 4) - (int)((year - 1) / 100) + (int)((year - 1) / 400) + yday;
    return n % 7;
}
// 是否闰年
bool isLeapYear(const int year)
{
    return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
}
// 获取当天是一年中的第几天
int getYearDay(const int year, const int month, const int mday)
{
    int yday = 0;
    for (int i = 1; i < month; i++)
    {
        switch (i)
        {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            yday += 31;
            break;
        case 4:
        case 6:
        case 9:
        case 11:
            yday += 30;
            break;
        case 2:
            yday += (isLeapYear(year) ? 29 : 28);
            break;
        }
    }
    yday += mday;
    return yday;
}
// 计算两个日期的天数差(假设date1小于date2)
int getDayCount(const struct tm &date1, const struct tm &date2)
{
    int nday = 0;
    int yday1 = getYearDay(date1.tm_year + 1900, date1.tm_mon + 1, date1.tm_mday);
    int yday2 = getYearDay(date2.tm_year + 1900, date2.tm_mon + 1, date2.tm_mday);
    for (int i = date1.tm_year; i < date2.tm_year; i++)
    {
        if (isLeapYear(i + 1900))
            nday += 366;
        else nday += 365;
    }
    nday += (yday2 - yday1);
    return nday;
}
// 公历节日,随便弄15个。
const char* festivals[] = {
    "1,1", "元旦",
    "2,14", "情人节",
    "3,8", "妇女节",
    "3,12", "植树节",
    "3,15", "消费者权益日",
    "4,1", "愚人节",
    "4,5", "清明节",
    "5,1", "劳动节",
    "5,4", "青年节",
    "6,1", "儿童节",
    "7,1", "建党节",
    "8,1", "建军节",
    "9,10", "教师节",
    "10,1", "国庆节",
    "12,25", "圣诞节"
};
char *weekdays[] = { "日", "一", "二", "三", "四", "五", "六" };
void setDate(struct tm &date, const int year, const int month, const int day)
{
    date.tm_year = year;
    date.tm_mon = month;
    date.tm_mday = day;
}
void testDate1()
{
    int month, year, day;
    cout << "请输入你想知道的年月日(用逗号隔开):";
    scanf("%d,%d,%d", &year, &month, &day);
    //cin >> year >> month >> day;
    //距离元旦的天数
    int yday = getYearDay(year, month, day);
    // 将日期赋值到tm结构体中,方便函数调用
    struct tm date;
    setDate(date, year - 1900, month - 1, day);
    // 取得今天的时间,并转换为tm结构体
    time_t now = time((time_t*)NULL);
    struct tm *today = localtime(&now);
    int nday;
    // 将年月日换算成如20160412的整数然后进行比较,简单直观
    if (year * 10000 + (month - 1) * 100 + day >= 
        (today->tm_year + 1900) * 1000 + today->tm_mon *100 + today->tm_mday)
        nday = getDayCount(*today, date);
    else nday = getDayCount(date, *today);
    printf("%d,%d,%d离今天有%d天!\n", year, month, day, nday);
    int wday = getWeekDay(year, yday);
    cout << "是星期" << weekdays[wday] << endl;
    // 看看今天是什么节日
    char szDate[10] = { '\0' };
    sprintf(szDate, "%d,%d", month, day);
    for (int i = 0; i < 30; i+= 2)
    {
        if (strcmp(szDate, festivals[i]) == 0)
        {
            cout << "是" << festivals[i + 1] << "!\n";
            break;
        }
    }
}
void testDate2()
{
    struct tm date1900;
    setDate(date1900, 0, 0, 1);
    int year, month, day;
    cout << "请输入你想知道的年月日(用逗号隔开):";
    scanf("%d,%d,%d", &year, &month, &day);
    struct tm date;
    setDate(date, year - 1900, month - 1, day);
    // 求出所输入日期和1900年1月1日的日期差就能判断
    int ndays = getDayCount(date1900, date);
    // 三天打渔两天晒网,即每5天一个周期。
    int cycle = ndays % 5;
    // 对5求模,则结果是0-3的话就是打渔,否则就是晒网
    if (cycle < 3)
        cout << "这天是在打渔!" << endl;
    else
        cout << "这天是在晒网!" << endl;
}
int main()
{
    cout << "1. 离今天还有多少天!\n" <<
        "2. 是打渔还是晒网!\n" <<
        "3. 退出!" << endl;
    int op;
    do
    {
        cout << "请选择 1,2,3!\n";
        cin >> op;
        if (op < 1 || op > 3)
            continue;
        switch (op)
        {
        case 1:
            testDate1();
            break;
        case 2:
            testDate2();
            break;
        default:
            break;
        }
    } while (op != 3);
    system("pause");
    return 0;
}

望采纳