鱼C论坛

 找回密码
 立即注册
查看: 1643|回复: 7

有些代码看不懂,想问一下友友

[复制链接]
发表于 2023-3-25 13:57:15 | 显示全部楼层 |阅读模式

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

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

x
#include <stdio.h>

int main()
{
        long count = 0; // count用于存放一共活了多少天
        int year1, year2; // year1是你的生日年份,year2是今天的年份
        int month1, month2;
        int day1, day2;
        int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

        printf("请输入你的生日(如1988-05-20):");
        scanf("%d-%d-%d", &year1, &month1, &day1);

        printf("请输入今年日期(如2016-03-28):");
        scanf("%d-%d-%d", &year2, &month2, &day2);

        while (year1 <= year2)
        {
                days[1] = (year1 % 400 == 0 || (year1 % 4 == 0 && year1 % 100 != 0)) ? 29 : 28;         //请问?29:28是什么意思
                while (month1 <= 12)
                {
                        while (day1 <= days[month1 - 1])
                        {
                                if (year1 == year2 && month1 == month2 && day1 == day2)
                                {
                                        goto FINISH; // 跳出多层循环才被迫用goto语句
                                }
                                day1++;
                                count++;
                        }
                        day1 = 1;
                        month1++;
                }
                month1 = 1;
                year1++;
        }

FINISH: printf("你在这个世界上总共生存了%d天\n", count);

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-25 14:00:31 | 显示全部楼层
这段代码是一个简单的计算你在这个世界上生存了多少天的程序。你需要输入你的生日和当前日期,程序会计算出你活了多少天。

关于你的问题,?29:28 是C语言中的条件运算符(也称三元运算符),它的形式为:condition ? expression_if_true : expression_if_false。

在这个代码中,days[1] = (year1 % 400 == 0 || (year1 % 4 == 0 && year1 % 100 != 0)) ? 29 : 28; 这一行是判断输入的年份是否是闰年。如果是闰年,则二月份有29天,否则就是28天。具体的规则如下:

1、如果年份能被400整除,那么它是闰年(如2000年)。
2、如果年份能被4整除但不能被100整除,那么它也是闰年(如2020年)。

如果 year1 % 400 == 0 || (year1 % 4 == 0 && year1 % 100 != 0) 这个条件为真(即是闰年),则 days[1] 被赋值为29,否则赋值为28。

程序中的循环结构用于遍历输入的生日到当前日期之间的每一天,累加计算总天数。当遍历到输入的当前日期时,使用 goto FINISH; 语句跳出多层循环。最后,程序将输出你在这个世界上生存的总天数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-3-25 14:00:37 | 显示全部楼层
好像都有点看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-25 14:06:48 | 显示全部楼层

那你还是得回去巩固巩固一下语法呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-25 15:52:31 | 显示全部楼层
#include <stdio.h>

int main()
{
    long count = 0; // 用于存放一共活了多少天的变量
    int year1, year2; // 生日年份和今天的年份
    int month1, month2; // 生日月份和今天的月份
    int day1, day2; // 生日日期和今天的日期
    int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 每个月的天数

    // 输入生日和今天的日期
    printf("请输入你的生日(如1988-05-20):");
    scanf("%d-%d-%d", &year1, &month1, &day1);

    printf("请输入今年日期(如2016-03-28):");
    scanf("%d-%d-%d", &year2, &month2, &day2);

    // 使用循环计算总天数
    while (year1 <= year2) { // 遍历年份
        // 计算闰年的 2 月份天数
        days[1] = (year1 % 400 == 0 || (year1 % 4 == 0 && year1 % 100 != 0)) ? 29 : 28;

        while (month1 <= 12) { // 遍历月份
            while (day1 <= days[month1 - 1]) { // 遍历日期
                // 如果到了今天的日期,跳出循环
                if (year1 == year2 && month1 == month2 && day1 == day2) {
                    goto FINISH; // 跳出多层循环,到 FINISH 标签处继续执行
                }

                day1++; // 将日期加 1
                count++; // 总天数加 1
            }

            day1 = 1; // 日期重新从 1 开始
            month1++; // 月份加 1
        }

        month1 = 1; // 月份重新从 1 开始
        year1++; // 年份加 1
    }

FINISH:
    printf("你在这个世界上总共生存了%d天\n", count); // 输出总天数

    return 0;
}

------------------------------------------------------------------------------------
代码可以优化一下,下面是优化的写法
#include <stdio.h>

// 判断是否为闰年,返回二月份天数
int days_in_feb(int year)
{
    if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
        return 29; // 是闰年,二月份有29天
    } else {
        return 28; // 不是闰年,二月份有28天
    }
}

int main()
{
    long count = 0; // 计数器,用于统计生存天数
    int year1, year2, month1, month2, day1, day2;

    // 输入生日日期
    printf("请输入你的生日(如1988-05-20):");
    scanf("%d-%d-%d", &year1, &month1, &day1);

    // 输入今天日期
    printf("请输入今年日期(如2016-03-28):");
    scanf("%d-%d-%d", &year2, &month2, &day2);

    // 遍历年份,从生日所在年份到今天所在年份
    for (int year = year1; year <= year2; year++) {
        int days_in_month; // 当前月份的天数

        // 遍历月份,从1月到12月
        for (int month = 1; month <= 12; month++) {
            // 根据月份判断当前月份的天数
            if (month == 2) { // 二月份需要判断是否为闰年
                days_in_month = days_in_feb(year);
            } else {
                days_in_month = (month == 4 || month == 6 || month == 9 || month == 11) ? 30 : 31;
            }

            // 遍历日期,从1号到当月最后一天
            for (int day = 1; day <= days_in_month; day++) {
                // 判断当前日期是否在生日和今天之间
                if (year == year1 && month < month1) { // 生日月份之前,跳过循环
                    continue;
                }
                if (year == year1 && month == month1 && day < day1) { // 生日当月,但日期在生日之前,跳过循环
                    continue;
                }
                if (year == year2 && month > month2) { // 今天月份之后,终止循环
                    break;
                }
                if (year == year2 && month == month2 && day > day2) { // 今天当月,但日期在今天之后,终止循环
                    break;
                }

                count++; // 统计生存天数
            }
        }
    }

    // 输出生存天数
    printf("你在这个世界上总共生存了%ld天\n", count);

    return 0;
}

在优化后的代码中,将计算闰年的逻辑封装成了一个名为 days_in_feb 的函数。该函数接受一个年份作为参数,并返回该年份二月份的天数。

在主函数中,使用 for 循环来遍历日期。首先遍历年份,在每个年份中遍历月份,在每个月份中遍历日期。

在遍历日期时,使用 if 语句来判断是否需要跳过或终止循环。如果当前日期比生日早,则跳过;如果当前日期比今天晚,则终止循环。如果当前日期是要计算的日期,则将计数器加 1。

这样,就避免了使用 goto 语句,使代码更加清晰和易读。同时,将计算闰年的逻辑封装成了函数,使代码更加模块化和可维护。

------------------------------------------------------------------------------------
这样写代码可以代码少一点,修改的时候比较方便
#include <stdio.h>

int main()
{
    long count = 0; // 定义一个计数器,用于计算生存天数
    int year1, year2, month1, month2, day1, day2; // 定义变量,分别存储生日和今天的年月日

    printf("请输入你的生日(如1988-05-20):");
    scanf("%d-%d-%d", &year1, &month1, &day1); // 获取生日输入

    printf("请输入今年日期(如2016-03-28):");
    scanf("%d-%d-%d", &year2, &month2, &day2); // 获取今天日期输入

    for (int year = year1; year <= year2; year++) { // 遍历从生日年份到今天年份之间的所有年份
        for (int month = 1; month <= 12; month++) { // 遍历每个月份
            // 计算当前月份的天数
            int days_in_month = (month == 2) ? ((year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) ? 29 : 28) : ((month == 4 || month == 6 || month == 9 || month == 11) ? 30 : 31);
            // 计算当前月份的开始日期和结束日期
            int start_day = (year == year1 && month == month1) ? day1 : 1;
            int end_day = (year == year2 && month == month2) ? day2 : days_in_month;
            // 累加当前月份的生存天数
            count += end_day - start_day + 1;
        }
    }

    printf("你在这个世界上总共生存了%ld天\n", count); // 输出生存天数

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-25 19:05:03 | 显示全部楼层
不二猫猫 发表于 2023-3-25 15:52
------------------------------------------------------------------------------------
代码可以优 ...

宝,我运行出来有点问题。还有19-22行代码有点不太明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-25 19:05:49 | 显示全部楼层
isdkz 发表于 2023-3-25 14:00
这段代码是一个简单的计算你在这个世界上生存了多少天的程序。你需要输入你的生日和当前日期,程序会计算出 ...

okok,明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-26 19:31:04 | 显示全部楼层
三目运算符:也叫三元运算符。这个运算符的符号是: ? :
语法:
   表达式1 ? 表达式2 : 表达式3;
语义:
   先执行表达式1,执行完毕,表达式1的结果如果为真,那么执行表达式2,并且这个整体的运算式的结果是表达式2的结果,否则执行表达式3,运算式的结果是表达式3的结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 23:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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