鱼C论坛

 找回密码
 立即注册
查看: 1261|回复: 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 | 显示全部楼层
  1. #include <stdio.h>

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

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

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

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

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

  24.                 day1++; // 将日期加 1
  25.                 count++; // 总天数加 1
  26.             }

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

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

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

  35.     return 0;
  36. }
复制代码


------------------------------------------------------------------------------------
代码可以优化一下,下面是优化的写法

  1. #include <stdio.h>

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

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

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

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

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

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

  32.             // 遍历日期,从1号到当月最后一天
  33.             for (int day = 1; day <= days_in_month; day++) {
  34.                 // 判断当前日期是否在生日和今天之间
  35.                 if (year == year1 && month < month1) { // 生日月份之前,跳过循环
  36.                     continue;
  37.                 }
  38.                 if (year == year1 && month == month1 && day < day1) { // 生日当月,但日期在生日之前,跳过循环
  39.                     continue;
  40.                 }
  41.                 if (year == year2 && month > month2) { // 今天月份之后,终止循环
  42.                     break;
  43.                 }
  44.                 if (year == year2 && month == month2 && day > day2) { // 今天当月,但日期在今天之后,终止循环
  45.                     break;
  46.                 }

  47.                 count++; // 统计生存天数
  48.             }
  49.         }
  50.     }

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

  53.     return 0;
  54. }

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

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

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

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

复制代码


------------------------------------------------------------------------------------
这样写代码可以代码少一点,修改的时候比较方便

  1. #include <stdio.h>

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

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

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

  10.     for (int year = year1; year <= year2; year++) { // 遍历从生日年份到今天年份之间的所有年份
  11.         for (int month = 1; month <= 12; month++) { // 遍历每个月份
  12.             // 计算当前月份的天数
  13.             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);
  14.             // 计算当前月份的开始日期和结束日期
  15.             int start_day = (year == year1 && month == month1) ? day1 : 1;
  16.             int end_day = (year == year2 && month == month2) ? day2 : days_in_month;
  17.             // 累加当前月份的生存天数
  18.             count += end_day - start_day + 1;
  19.         }
  20.     }

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

  22.     return 0;
  23. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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-5-14 03:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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