鱼C论坛

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

[已解决]小甲鱼C语言数组课后题

[复制链接]
发表于 2020-1-16 03:48:53 | 显示全部楼层 |阅读模式

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

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

x
  1. #include <stdio.h>

  2. /*先考虑从出生到当前日期经过几年,将这几年天数加起来。
  3. 然后再算出生那年剩多少天结束,以及当前日期是当前年份过了多少天,相加即得活过总天数*/

  4. int main()
  5. {
  6.         int i, j, k, n;
  7.         int a, b, c;
  8.         long int sum_years = 0, sum_months = 0;
  9.        
  10.         printf("请输入你的生日(如1988-05-20):");
  11.         scanf("%d-%d-%d", &i, &j, &k);
  12.        
  13.         printf("请输入今天日期(如2016-03-28):");
  14.         scanf("%d-%d-%d", &a, &b, &c);
  15.        
  16.         int num_years[a+1];
  17.        
  18.         for( ; i < a; ++i){                                                //i到a间隔几年
  19.                 if(i % 4 == 0){                                                //闰年将366天储存在数组中
  20.                         num_years[i] = 366;                                                       
  21.                 }
  22.                 else{
  23.                         num_years[i] = 365;                                //不是闰年将365天储存在数组中
  24.                 }
  25.         }
  26.         num_years[a] = '\0';
  27.         for( ; i < a ; i++)
  28.                 sum_years = sum_years + num_years[i];        //将数组中数求和
  29.         printf("%ld", sum_years);
  30. }
复制代码



第一部分,只算间隔几年,将这几年天数求和,为什么不行,运行之后输入示例年份,运行结果是0
请大佬指教是哪里出了问题
最佳答案
2020-1-16 06:44:19
你的第一个for循环在执行的过程中i不停的自加,再执行完之后等于a-1,那么你在执行第二个for循环的时候相当直接从a-1开始了,等于第二个for循环没有执行,输出的sum_years自然等于你的初始化的值,也就是零。解决方案就是你再执行第一次for循环之前,将i的值保存到一个新的变量里,第二次for循环里用新的变量作为判断条件而不是i。

修改过的代码如下:
  1. #include <stdio.h>

  2. /*先考虑从出生到当前日期经过几年,将这几年天数加起来。
  3. 然后再算出生那年剩多少天结束,以及当前日期是当前年份过了多少天,相加即得活过总天数*/

  4. int main()
  5. {
  6.         int i, j, k, n;
  7.         int a, b, c;
  8.         long int sum_years = 0, sum_months = 0;
  9.         
  10.         printf("请输入你的生日(如1988-05-20):");
  11.         scanf("%d-%d-%d", &i, &j, &k);
  12.         
  13.         printf("请输入今天日期(如2016-03-28):");
  14.         scanf("%d-%d-%d", &a, &b, &c);
  15.         
  16.         int num_years[a + 1];
  17.         int tmp = i;
  18.         
  19.         for( ; i < a; ++i){                                                                    //i到a间隔几年
  20.                 if(i % 4 == 0){                                                //闰年将366天储存在数组中
  21.                         num_years[i] = 366;                                                        
  22.                 }
  23.                 else{
  24.                         num_years[i] = 365;                                //不是闰年将365天储存在数组中
  25.                 }
  26.         }
  27.         num_years[a] = '\0';
  28.         for( ; tmp < a ; tmp++)
  29.                 sum_years = sum_years + num_years[tmp];        //将数组中数求和
  30.         printf("%ld", sum_years);
  31.         return 0;
  32. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-1-16 03:50:01 | 显示全部楼层
忘记说题目要求: 1. 写一个生命计算器,要求用户输入生日,显示他在这个世界上活了多少天?c<y
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-16 06:44:19 | 显示全部楼层    本楼为最佳答案   

回帖奖励 +30 鱼币

你的第一个for循环在执行的过程中i不停的自加,再执行完之后等于a-1,那么你在执行第二个for循环的时候相当直接从a-1开始了,等于第二个for循环没有执行,输出的sum_years自然等于你的初始化的值,也就是零。解决方案就是你再执行第一次for循环之前,将i的值保存到一个新的变量里,第二次for循环里用新的变量作为判断条件而不是i。

修改过的代码如下:
  1. #include <stdio.h>

  2. /*先考虑从出生到当前日期经过几年,将这几年天数加起来。
  3. 然后再算出生那年剩多少天结束,以及当前日期是当前年份过了多少天,相加即得活过总天数*/

  4. int main()
  5. {
  6.         int i, j, k, n;
  7.         int a, b, c;
  8.         long int sum_years = 0, sum_months = 0;
  9.         
  10.         printf("请输入你的生日(如1988-05-20):");
  11.         scanf("%d-%d-%d", &i, &j, &k);
  12.         
  13.         printf("请输入今天日期(如2016-03-28):");
  14.         scanf("%d-%d-%d", &a, &b, &c);
  15.         
  16.         int num_years[a + 1];
  17.         int tmp = i;
  18.         
  19.         for( ; i < a; ++i){                                                                    //i到a间隔几年
  20.                 if(i % 4 == 0){                                                //闰年将366天储存在数组中
  21.                         num_years[i] = 366;                                                        
  22.                 }
  23.                 else{
  24.                         num_years[i] = 365;                                //不是闰年将365天储存在数组中
  25.                 }
  26.         }
  27.         num_years[a] = '\0';
  28.         for( ; tmp < a ; tmp++)
  29.                 sum_years = sum_years + num_years[tmp];        //将数组中数求和
  30.         printf("%ld", sum_years);
  31.         return 0;
  32. }
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
WwangHB + 5 + 5 + 3 感谢楼主无私奉献!

查看全部评分

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

使用道具 举报

发表于 2020-1-16 10:35:32 | 显示全部楼层

回帖奖励 +30 鱼币

最大的问题就是第一次for循环的时候用的是出生的年份->i,在第二次循环的时候,i已经变成了当前的年份->a。
还有小问题,就是给年份的天数赋值的时候,没有考虑出生日期是否过了2月,过了2月就应该赋值下一年的天数。闰年判断也不太对。
  1. #include <stdio.h>

  2. /*先考虑从出生到当前日期经过几年,将这几年天数加起来。
  3. 然后再算出生那年剩多少天结束,以及当前日期是当前年份过了多少天,相加即得活过总天数*/

  4. int main()
  5. {
  6.     int i, j, k, n;
  7.     int a, b, c;
  8.     int year, month, day;
  9.     long int sum_years = 0, sum_months = 0;
  10.    
  11.     printf("请输入你的生日(如1988-05-20):");
  12.     scanf("%d-%d-%d", &year, &month, &day);
  13.    
  14.     printf("请输入今天日期(如2016-03-28):");
  15.     scanf("%d-%d-%d", &a, &b, &c);
  16.     n=a-year;
  17.     int num_years[n], flag=year;
  18.     if (month>2)flag+=1;
  19.     for( i=0; i < n; ++i){                                               //i到a间隔几年
  20.         if((flag+i)%100!=0&&(flag+i)%4==0||(flag+i)%400==0 ){        //闰年将366天储存在数组中
  21.             num_years[i] = 366;                                                        
  22.         }
  23.         else{
  24.             num_years[i] = 365;                                //不是闰年将365天储存在数组中
  25.         }
  26.     }
  27.     for( i=0; i < n ; i++)
  28.         sum_years = sum_years + num_years[i];        //将数组中数求和
  29.     printf("%ld", sum_years);
  30. }
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
WwangHB + 5 + 5 + 3 感谢楼主无私奉献!

查看全部评分

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

使用道具 举报

 楼主| 发表于 2020-1-17 00:31:30 | 显示全部楼层
rosta999 发表于 2020-1-16 06:44
你的第一个for循环在执行的过程中i不停的自加,再执行完之后等于a-1,那么你在执行第二个for循环的时候相当 ...

请问大佬为啥这么写就会不停的自加,而不是运行大括号里的内容然后在+1呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-17 00:32:58 | 显示全部楼层
sunrise085 发表于 2020-1-16 10:35
最大的问题就是第一次for循环的时候用的是出生的年份->i,在第二次循环的时候,i已经变成了当前的年份->a。 ...

大佬为啥会一直循环自加到当前年份,而不是运行一次+1呢,是因为i 没有赋初值么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-17 00:49:43 | 显示全部楼层
emmmmmm问了个白痴问题,明白了明白了 感谢大佬们
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-3 13:48:31 | 显示全部楼层

回帖奖励 +30 鱼币

我也犯过这种错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 13:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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