鱼C论坛

 找回密码
 立即注册
查看: 1800|回复: 2

[已解决]C语言E17-18作业问题

[复制链接]
发表于 2022-10-20 10:20:46 | 显示全部楼层 |阅读模式

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

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

x
要求计算某年到某年的天数,可是我的算出来老是会多几天,(虽然知道有问题,但是感觉我这个思路是对的,就是不知道哪算错了),我先算年有多少天,然后再算最后年份相等的时候的月有多少天,最后算月相同时有多少天
int main(){
        long int Nian,Yue,Ri,sum=0;
        long int Xnian,Xyue,Xri;
        int a[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},i,j;
       
        printf("请输入您的生日(例如:1998,05,16):");
        scanf("%d,%d,%d",&Nian,&Yue,&Ri);
        printf("请输入今年的日期(例如:2021,10,23):");
        scanf("%d,%d,%d",&Xnian,&Xyue,&Xri);
       
        for(Nian;Nian<Xnian;Nian++){
                if(Nian%400==0  ||  (Nian%4==0 && Nian%100!=0)){
                        sum=sum+366;
                }else {
                sum=sum+365;
        }
}
           
       
                if(Xnian%400==0  ||  (Xnian%4==0 && Xnian%100!=0)){
                        for(Yue;Yue<Xyue;Yue++){
                                a[2]=29;
                                sum=sum+a[Yue-1];
                        }
                }else {
                        for(Yue;Yue<Xyue;Yue++){
                                sum=sum+a[Yue-1];
                }
        }
       
       
        if(Xnian%400==0  ||  (Xnian%4==0 && Xnian%100!=0)){
                        a[2]=29;
                                for(Yue;Yue=Xyue;){
                                sum=sum+a[Yue-1]-Ri+Xri;
                                break;
                        }
                }else {
                        for(Yue;Yue=Xyue;){
                                sum=sum+a[Yue-1]-Ri+Xri;
                                break;
                }
        }
       
        printf("您已经在这个地球上生活了:%ld 天",sum);
       
        return 0;
       
}
最佳答案
2022-10-20 11:36:12
本帖最后由 jackz007 于 2022-10-21 01:09 编辑

         计算天数首先应该考虑是否跨年,两种情况应该区别对待:
#include <stdio.h>

#define LEAP(Y) (! ((Y) % 400) || (! ((Y) % 4) && (Y) % 100))

int mday(int y , int m)
{
        int a[12] = {31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31} , r            ;
        r = a[m - 1]                                                                           ;
        if(m == 2 && LEAP(y)) r ++                                                             ;
        return r                                                                               ;
}

int main(void)
{
        long int Nian , Yue , Ri , sum = 0                                                     ;
        long int Xnian , Xyue , Xri                                                            ;
        int e , i                                                                              ;
        printf("  请输入您的生日(例如: 1998,05,16) : ")                                        ;
        scanf("%d,%d,%d", & Nian , & Yue , & Ri)                                               ;
        printf("请输入今年的日期(例如: 2021,10,23) : ")                                        ;
        scanf("%d,%d,%d", & Xnian , & Xyue , & Xri)                                            ;
        if(Xnian > Nian || Xnian == Nian && Xyue > Yue || Xnian == Nian && Xyue == Yue && Xri >= Ri) {
                if(Xnian == Nian) {
                        if(Xyue == Yue) sum = Xri - Ri                                         ;
                        else for(sum = Xri - Ri ; Yue < Xyue ; Yue ++) sum += mday(Nian , Yue) ;
                } else {
                        for(sum = Xri - Ri , i = 1 ; i < Yue ; i ++) sum -= mday(Nian , i)     ;
                        for(; Nian < Xnian ; Nian ++) sum += LEAP(Nian) ? 366 : 365            ;
                        for(Yue = 1 ; Yue < Xyue ; Yue ++) sum += mday(Xnian , Yue)            ;
                }
                printf("           您已经在这个地球上生活了: %ld 天\n" , sum)                  ;
        } else {
                fprintf(stderr , "日期输入错误\n")                                             ;
        }
}
        编译、运行实况:
D:\[00.Exerciese.2022]\C>g++ -o x x.c

D:\[00.Exerciese.2022]\C>x
  请输入您的生日(例如: 1998,05,16) : 2021,1,1
请输入今年的日期(例如: 2021,10,23) : 2022,10,20
您已经在这个地球上生活了:657 天

D:\[00.Exerciese.2022]\C>x
  请输入您的生日(例如: 1998,05,16) : 2021,10,20
请输入今年的日期(例如: 2021,10,23) : 2022,10,20
您已经在这个地球上生活了:365 天

D:\[00.Exerciese.2022]\C>x
  请输入您的生日(例如: 1998,05,16) : 2020,1,1
请输入今年的日期(例如: 2021,10,23) : 2020,3,1
您已经在这个地球上生活了:60 天

D:\[00.Exerciese.2022]\C>x
  请输入您的生日(例如: 1998,05,16) : 2021,12,31
请输入今年的日期(例如: 2021,10,23) : 2022,1,1
您已经在这个地球上生活了:1 天

D:\[00.Exerciese.2022]\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-20 11:08:19 | 显示全部楼层
这个代码一编译就有一大堆警告,输入格式符不匹配( long int 应该对应 %ld 而不是 %d ),变量未使用,无效果的表达式,用赋值作为判断条件。
for 语句的初始化部分如果无事可做可以省略,只留一个分号;确定只运行一次的部分可以不必要使用循环,实在想用可以试试 do{}while(0); ;以及个人认为导致问题的原因:请重新阅读处理最后一个月中的天数的部分,这个天数计算的逻辑正确吗?
另一个问题,考虑如输入生日为 2000,9,14 而今天是 2022,10,20 时的结果应该是?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-20 11:36:12 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-10-21 01:09 编辑

         计算天数首先应该考虑是否跨年,两种情况应该区别对待:
#include <stdio.h>

#define LEAP(Y) (! ((Y) % 400) || (! ((Y) % 4) && (Y) % 100))

int mday(int y , int m)
{
        int a[12] = {31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31} , r            ;
        r = a[m - 1]                                                                           ;
        if(m == 2 && LEAP(y)) r ++                                                             ;
        return r                                                                               ;
}

int main(void)
{
        long int Nian , Yue , Ri , sum = 0                                                     ;
        long int Xnian , Xyue , Xri                                                            ;
        int e , i                                                                              ;
        printf("  请输入您的生日(例如: 1998,05,16) : ")                                        ;
        scanf("%d,%d,%d", & Nian , & Yue , & Ri)                                               ;
        printf("请输入今年的日期(例如: 2021,10,23) : ")                                        ;
        scanf("%d,%d,%d", & Xnian , & Xyue , & Xri)                                            ;
        if(Xnian > Nian || Xnian == Nian && Xyue > Yue || Xnian == Nian && Xyue == Yue && Xri >= Ri) {
                if(Xnian == Nian) {
                        if(Xyue == Yue) sum = Xri - Ri                                         ;
                        else for(sum = Xri - Ri ; Yue < Xyue ; Yue ++) sum += mday(Nian , Yue) ;
                } else {
                        for(sum = Xri - Ri , i = 1 ; i < Yue ; i ++) sum -= mday(Nian , i)     ;
                        for(; Nian < Xnian ; Nian ++) sum += LEAP(Nian) ? 366 : 365            ;
                        for(Yue = 1 ; Yue < Xyue ; Yue ++) sum += mday(Xnian , Yue)            ;
                }
                printf("           您已经在这个地球上生活了: %ld 天\n" , sum)                  ;
        } else {
                fprintf(stderr , "日期输入错误\n")                                             ;
        }
}
        编译、运行实况:
D:\[00.Exerciese.2022]\C>g++ -o x x.c

D:\[00.Exerciese.2022]\C>x
  请输入您的生日(例如: 1998,05,16) : 2021,1,1
请输入今年的日期(例如: 2021,10,23) : 2022,10,20
您已经在这个地球上生活了:657 天

D:\[00.Exerciese.2022]\C>x
  请输入您的生日(例如: 1998,05,16) : 2021,10,20
请输入今年的日期(例如: 2021,10,23) : 2022,10,20
您已经在这个地球上生活了:365 天

D:\[00.Exerciese.2022]\C>x
  请输入您的生日(例如: 1998,05,16) : 2020,1,1
请输入今年的日期(例如: 2021,10,23) : 2020,3,1
您已经在这个地球上生活了:60 天

D:\[00.Exerciese.2022]\C>x
  请输入您的生日(例如: 1998,05,16) : 2021,12,31
请输入今年的日期(例如: 2021,10,23) : 2022,1,1
您已经在这个地球上生活了:1 天

D:\[00.Exerciese.2022]\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-20 13:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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