劉曦遠 2022-12-13 21:22 采纳率: 100%
浏览 106
已结题

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

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

img

  • 写回答

1条回答 默认 最新

  • Jettblue_jr 2022-12-13 21:35
    关注
    #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;
    }
    

    望采纳

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 12月21日
  • 已采纳回答 12月13日
  • 请采纳用户回复 12月13日
  • 创建了问题 12月13日

悬赏问题

  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装