努力学C的阿通 发表于 2023-6-29 21:35:39

C语言 数组课后题 动手第二题

第二题是让我们 写一个生命计算器,要求用户输入生日,显示他在这个世界上活了多少天。源代码如下:
#include <stdio.h>

int main()
{
      long count1 = 0, count2; // count用于存放一共活了多少天
      int year1, year2, year3; // year1是你的生日年份,year2是今天的年份
      int month1, month2, month3;
      int day1, day2, day3;
      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);

      year3 = year1 + 80;
      month3 = month1;
      day3 = day1;

      while (1)
      {
                days = (year1 % 400 == 0 || (year1 % 4 == 0 && year1 % 100 != 0)) ? 29 : 28;
                while (month1 <= 12)
                {
                        while (day1 <= days)
                        {
                              if (year1 == year2 && month1 == month2 && day1 == day2)
                              {
                                        count2 = count1;
                                        printf("你在这个世界上总共生存了%d天\n", count2);
                              }

                              if (year1 == year3 && month1 == month3 && day1 == day3)
                              {
                                        printf("如果能活到80岁,你还剩下%d天\n", count1 - count2);
                                        printf("你已经使用了%.2f\%的生命,请好好珍惜剩下的时间!\n", (double)count2 / count1 * 100);
                                        goto FINISH;
                              }

                              day1++;
                              count1++;
                        }
                        day1 = 1;
                        month1++;
                }
                month1 = 1;
                year1++;
      }

FINISH: return 0;
}


对于上面的代码,小白我前面可以看懂,while那里开始有点不清楚了。主要的问题有下面五个:
第一,while (day1 <= days)这个代表什么意思?
第二,if (year1 == year2 && month1 == month2 && day1 == day2)代表什么?是指出生日期=存活日期吗?不太理解
第三, if (year1 == year3 && month1 == month3 && day1 == day3)代表什么?是指出生日期等于死亡日期?
第四,day1++; count1++;      day1 = 1; month1++;      month1 = 1;year1++;    这三组逻辑语言我大概能猜到是什么意思,应该是满足条件后层层递进的意思,但是我不是很理解他们的工作原理,能解释一下吗?
第五,count1是指存活到80岁时的生存天数吗?count2是指截止目前为止的生存天数吗?为什么开头是long count1=0?

小白,真的是小白,希望大神不要笑我的问题很白痴({:10_266:} )因为真的想了很久想不通才问的
                              
                              
                                       

Ewan-Ahiouy 发表于 2023-6-29 21:38:56

本帖最后由 Ewan-Ahiouy 于 2023-6-29 21:46 编辑

没关系,每个人刚开始学习都会有疑问。以下是对你提出的问题的解答:

1. while (day1 <= days) 的意思是,在当前月份的天数范围内循环执行一段代码。days 是从数组 days[] 中获取对应月份的天数。

2. if (year1 == year2 && month1 == month2 && day1 == day2) 的条件是检查当前日期是否与输入的日期相同,如果相同,则表示已经统计出了活了多少天。

3. if (year1 == year3 && month1 == month3 && day1 == day3) 的条件是检查当前日期是否达到了预定的终止日期,即满80岁。这里并没有将此判断定义为死亡日期,而只是作为一个时间点来进行计算和比较。

4. 下面是对逻辑语句的解释:
   - day1++ 和 count1++ 表示将当前天数加1,以及总生存天数加1。
   - day1 = 1 表示将天数重置为1,进入下一个月。
   - month1++ 表示将月份加1。
   - month1 = 1 表示将月份重置为1,进入下一年。
   - year1++ 表示将年份加1。

   这些语句的目的是在不断地增加日期,以便遍历所有的日期组合。

5. count1 表示从出生到满80岁预期寿命时所经过的天数。在代码开头将其初始化为0,因为刚开始还没有经过任何天数进行累计。而 count2 表示从出生到当前日期所经过的天数,当满足条件时才会对其赋值。

有用请设置“最佳答案”{:5_91:}

sfqxx 发表于 2023-6-29 21:43:06

不用担心,我将逐个回答你提出的五个问题。

1. `while (day1 <= days)`:这行代码的意思是当生日的天数小于等于对应月份的天数时,执行循环体内的操作。通过这个条件,可以使每个月的天数都加入计算。

2. `if (year1 == year2 && month1 == month2 && day1 == day2)`:这个条件判断是为了确定当前日期是否与输入的今天日期相同。如果相同,则表示已经统计到了截止目前为止的生存天数,并赋值给`count2`。

3. `if (year1 == year3 && month1 == month3 && day1 == day3)`:这个条件判断是为了确定当前日期是否等于预估的80岁生日日期(即死亡日期)。如果相同,则表示计算到了预估的寿命终点,并输出剩余天数和已使用生命的百分比。

4. `day1++; count1++;`:这两行代码的作用是将当前日期的天数加1,并将活了的总天数加1。`day1 = 1; month1++;`表示进入下一个月,将日期置为1,同时月份加1,继续循环。`month1 = 1; year1++;`表示进入下一年,将月份置为1,同时年份加1,继续循环。这样的逻辑使得循环能够依次计算每一天,直到满足结束条件。

5. `count1`存储从生日到预估寿命终点(80岁)之间的总天数,而`count2`存储从生日到目前为止的总天数。开头将`count1`初始化为0是为了确保在还没有计算出具体天数时,它的初始值是正确的。

isdkz 发表于 2023-6-29 21:44:44

你的问题不白痴,我很乐意帮你一一解答。

1.while (day1 <= days)这行代码的意思是:当给定月份的天数大于或等于出生日期时,执行循环。比如说,如果你是5月20日出生的,那么5月的天数就是31天,所以条件满足,会执行下面的代码块。这主要用于模拟一个月中的每一天。

2.if (year1 == year2 && month1 == month2 && day1 == day2)这行代码的意思是:当输入的当前日期与正在计算的日期(初始为出生日期,然后每次循环递增一天)完全一致时,执行下面的代码块。也就是说,这个代码段被用来确定到当前日期为止,你在世界上生存了多少天。

3.if (year1 == year3 && month1 == month3 && day1 == day3)这行代码的意思是:当正在计算的日期(即假设你能活到80岁时的日期)与你出生日期完全一致时,执行下面的代码块。这个代码段被用来计算如果你能活到80岁,那么你还剩下多少天。

4. 这些代码段的逻辑是这样的:

   ·day1++; count1++; :每次循环,日期和总天数都会增加1。也就是说,程序模拟了时间的推移,每天都在增加。
   ·day1 = 1; month1++; :当一个月的所有日期都被遍历后,日期会重置为1,月份会增加1。这表示进入了新的一个月。
   ·month1 = 1; year1++; :当一年的所有月份都被遍历后,月份会重置为1,年份会增加1。这表示进入了新的一年。

5. 是的, count1是指存活到80岁时的生存天数, count2是指截止目前为止的生存天数。这两个变量在代码开头被初始化为0是因为我们要用它们来计数。在开始计算前,这两个计数器都应该是0。

希望以上的解答能帮到你。学习编程需要时间和耐心,不要急于求成,一步一步来。你的问题都很好,这表示你在积极思考和理解。继续加油!

努力学C的阿通 发表于 2023-6-30 19:48:05

sfqxx 发表于 2023-6-29 21:43
不用担心,我将逐个回答你提出的五个问题。

1. `while (day1

好的,谢谢你。大神,关于第一个问题我想要请教一下,为什么是while (day1 <= days)而不是`while (day1 <= days)?

sfqxx 发表于 2023-6-30 20:03:05

本帖最后由 sfqxx 于 2023-6-30 20:05 编辑

努力学C的阿通 发表于 2023-6-30 19:48
好的,谢谢你。大神,关于第一个问题我想要请教一下,为什么是while (day1

最佳答案不是我的话,我就不解释了,请 问得最佳答案者

努力学C的阿通 发表于 2023-6-30 21:00:13

sfqxx 发表于 2023-6-30 20:03
最佳答案不是我的话,我就不解释了,请 问得最佳答案者

好的,还是谢谢你。你的答案对我也很有启发
页: [1]
查看完整版本: C语言 数组课后题 动手第二题