lilinki 2022-09-13 11:25 采纳率: 0%
浏览 55

c++/当前日期与你的生日之间间隔多少天?

c++/当前日期与你的生日之间间隔多少天?生日是出生日期吗?考虑闰年平年,运用结构化编程方法编写程序。结构化编程方法是结构体来写吗?

  • 写回答

1条回答 默认 最新

  • a5156520 2022-09-14 16:35
    关注

    结构化编程是一种编程范例,旨在通过广泛使用选择(if / then / else)和重复(while and for),块结构的结构化控制流构造来提高计算机程序的清晰度、质量和开发时间(引用自参考链接,更正),函数应该也是属于结构化编程的一种。生日应该是指出生的年月日。


    把相差的天数分为三部分计算即可,一部分是生日那年距离年尾的天数,一部分是今年1月1号到今日的天数,一部分是生日的第二年的1月1号到今年1月一号之间的天数,三者相加即为相差的天数,下面是一个实现,供参考:


    参考链接:
    结构化编程_全球百科
    结构化编程_百度百科
    函数式编程_百度百科
    使用Python计算今天距离公元1年1月1日的天数 验证数据正确性的测试代码
    闰年 每月多少天_百度知道
    c语言获取当前日期和时间_落春只在无意间的博客-CSDN博客_c语言获取当前日期

    #include <stdio.h>
    #include <time.h> 
    #include <string.h>
    
    //https://zhidao.baidu.com/question/33084105.html
    int leapDays [12]  ={31,29,31,30,31,30,31,31,30,31,30,31};  //闰年每月的天数 
    int ordinaryDays[12] ={31,28,31,30,31,30,31,31,30,31,30,31};  //平年每月的天数 
    
    //计算两个年份的11号之间有多少天数 
    
    long  getDays(int preyear, int year){
        
        //https://baijiahao.baidu.com/s?id=1637775291345587615&wfr=spider&for=pc  天数数据验证代码 
        if(year==preyear){  //如果为公元1年,则天数为0
            return 0;
        }
        else if(((year%4==0)&&(year%100!=0))||(year%400==0)){  //如果是公元年份 能被4整除,且不能被100整除,或者公元年份能别400整除则为闰年,即一年有366return (long)(366+getDays(preyear,year-1));
        }
        else{ //其他情况是平年365return (long)(365+getDays(preyear,year-1)); 
        }
    } 
    
    //计算生日的那年距离此年最后一天有多少天 
    //验证数据正确性的代码 https://www.py.cn/faq/python/17698.html 
    int birthdayYearDays(int year,int month,int day ){
        
        int days = 0;
        
        if(((year%4==0)&&(year%100!=0))||(year%400==0))    {
            
            days+=  leapDays[month-1]-day;
            for(int i=month;i<12;i++){
                
                days+= leapDays[i];
            }
        //    printf("生日是公元%d年%d月%d日,此年是闰年,距离此年年尾共有%d天.\n",year,month,day,days);
        }else{
            
            days+=  ordinaryDays[month-1]-day;
            for(int i=month;i<12;i++){
                
                days+= ordinaryDays[i];
            }    
            //printf("生日是公元%d年%d月%d日,此年是平年,距离此年年尾共有%d天.\n",year,month,day,days);
        }
        
        return days; 
    } 
    
    ////验证数据正确性的代码 https://www.py.cn/faq/python/17698.html 
    //计算年初到今天这天有多少天 
    int  thisYearGoDays(struct tm * t,int year,int month,int day){
        
        int days = 0;
        
        if((t->tm_year + 1900)==year){
            if(((year%4==0)&&(year%100!=0))||(year%400==0))    {
            
            
                for(int i=month-1;i<t->tm_mon+1-2;i++){
                    
                    days+= leapDays[i];
                }
                days+=  t->tm_mday-day-1;
            //    printf("今天是%d年%d月%d日,此年是闰年,从年初距离现在共有%d天.\n",year,month,day,days);
            }else{
                
                
                for(int i=month-1;i<t->tm_mon+1-2;i++){
                    
                    days+= ordinaryDays[i];
                }
                days+=  t->tm_mday-day-1;    
                //printf("今天是%d年%d月%d日,此年是平年,从年初距离现在共有%d天.\n",year,month,day,days);
            }
            
            
        }else if((t->tm_year + 1900)>year){
            if(((year%4==0)&&(year%100!=0))||(year%400==0))    {
            
            
                for(int i=0;i<t->tm_mon+1-1;i++){
                    
                    days+= leapDays[i];
                }
                days+=  t->tm_mday-1;
            //    printf("今天是%d年%d月%d日,此年是闰年,从年初距离现在共有%d天.\n",year,month,day,days);
            }else{
                
                
                for(int i=0;i<t->tm_mon+1-1;i++){
                    
                    days+= ordinaryDays[i];
                }
                days+=  t->tm_mday-1;    
                //printf("今天是%d年%d月%d日,此年是平年,从年初距离现在共有%d天.\n",year,month,day,days);
            }
        }
        
        return days; 
        
    }
    
    int main(void){
        
        int year, month,day;
        printf("请输入你的生日(格式:年-月-日):");
        scanf("%d-%d-%d",&year,&month,&day);
        int birthdayDays ;
        
        
        //https://blog.csdn.net/qq_39838607/article/details/120169453
        struct tm * t;   //tm结构指针
        time_t now;  //声明time_t类型变量
        time(&now);      //获取系统日期和时间
        t = localtime( &now);   //获取当地日期和时间
    
           //格式化输出本地时间
    //    printf("年:%d\n", t->tm_year + 1900);
    //    printf("月:%d\n", t->tm_mon + 1);
    //    printf("日:%d\n", t->tm_mday);
    
    
        long betweenDays ;
        //    printf("betweenDays=%ld\n",betweenDays);
        
            ////计算年初到今天这天有多少天 
            int thisYearDays ;
        //    printf("%d\n",thisYearDays) ;
        
            thisYearDays=thisYearGoDays(t,year,month,day) ;
        //    printf("thisYearDays=%d\n",thisYearDays);
            long allDays = 0;
        if(year==(t->tm_year + 1900)){
        //    printf("year=%d\n",year);
            birthdayDays = 0;
            betweenDays = 0;
            allDays = (long)(birthdayDays+thisYearDays+betweenDays);  
        }else if(year<(t->tm_year + 1900)){
            //计算生日的那年距离此年最后一天共有多少天 
            birthdayDays =birthdayYearDays(year,month,day)+1 ;
        //    printf("birthdayDays=%d\n",birthdayDays);
            ////计算两个年份的11号之间共有多少天数 
            betweenDays = getDays(year+1,t->tm_year + 1900)+1;
        //    printf("betweenDays=%d\n",betweenDays);
            allDays = (long)(birthdayDays+thisYearDays+betweenDays); 
        
        } 
         
        
        printf("从你的生日公元%d年%d月%d日,距离今天公元%d年%d月%d日共有%ld天。\n",year,month,day,t->tm_year + 1900,t->tm_mon+1,t->tm_mday,allDays);
        
        return 0;
    }
    

    img

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 9月14日
  • 创建了问题 9月13日

悬赏问题

  • ¥15 生成一个STM32F103veTX单片机程序,
  • ¥15 plus模型贡献度为nan
  • ¥25 使用cube ai 导入onnx模型时报错
  • ¥15 关于#微信小程序#的问题:用一个网页显示所有关联的微信小程序数据,包括每个小程序的用户访问量
  • ¥15 root的安卓12系统上,如何使apk获得root或者高级别的系统权限?
  • ¥20 关于#matlab#的问题:如果用MATLAB函数delayseq可以对分数延时,但是延时后波形较原波形有幅度上的改变
  • ¥15 使用华为ENSP软件模拟实现该实验拓扑
  • ¥15 通过程序读取主板上报税口的数据
  • ¥15 matlab修改为并行
  • ¥20 数据分析出错了,希望有能人看看,解决一下