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: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:}
不用担心,我将逐个回答你提出的五个问题。
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是为了确保在还没有计算出具体天数时,它的初始值是正确的。 你的问题不白痴,我很乐意帮你一一解答。
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。
希望以上的解答能帮到你。学习编程需要时间和耐心,不要急于求成,一步一步来。你的问题都很好,这表示你在积极思考和理解。继续加油!
sfqxx 发表于 2023-6-29 21:43
不用担心,我将逐个回答你提出的五个问题。
1. `while (day1
好的,谢谢你。大神,关于第一个问题我想要请教一下,为什么是while (day1 <= days)而不是`while (day1 <= days)? 本帖最后由 sfqxx 于 2023-6-30 20:05 编辑
努力学C的阿通 发表于 2023-6-30 19:48
好的,谢谢你。大神,关于第一个问题我想要请教一下,为什么是while (day1
最佳答案不是我的话,我就不解释了,请 问得最佳答案者 sfqxx 发表于 2023-6-30 20:03
最佳答案不是我的话,我就不解释了,请 问得最佳答案者
好的,还是谢谢你。你的答案对我也很有启发
页:
[1]