学习_C语言小小计天工具

/*
 * 程序功能:计算出恋人相恋的天数
 * 程序设计思想:总天数 = 年差 + 月差 + 日差
 *
 *      年差:用for循环从起始年累计,逢闰年+一天
 *      月差:将月份与年份分离,先计算出该月与1月1日相差的天数,再在总天数上
 *      进行加减
 *      日差同理
 * 2014/05/29   codor   第一次修改
 *  新增功能:计算并显示出相恋第N天后的日期,加入选择界面    取名为code of love 1.0版
 * 2014/06/03   codor   第二次修改
 */

#include <stdio.h>
#include <stdlib.h>

int confirm(int,int,int);//判断日期输入是否正确
int change_month(int,int);//用于计算输入天数求得的月份
int count_month(int); //用于计算除去整数年后,剩余整数月的天数的函数
void what_day(int,int,int,int,int,int);//计算恋爱的天数
void love_day(int,int,int,int);//用于计算相恋第几天后的日期
int welcome();//欢迎界面
void bye();//退出界面
void stop_it();//控制刷屏
int leap_or_not(int year){  //用于判断是否是闰年的函数
    if(year % 400 == 0 || (year % 4 == 0 && year %100 != 0)){
            return 366;
    }
    else {
        return 365;
    }
}

char name1[20],name2[20];

int main(){

    int syear = 0, smonth = 0, sday = 0; //起始日期
    int lyear = 0, lmonth = 0, lday = 0; //结束日期 
    int getdate = 0;
    int boo = 0,option = 0;
    int s_iffirm = 1,l_iffirm = 1;


    welcome();
    printf("请输入您的选择:");
    scanf("%d",&boo);
    if(boo == 0){
            bye();
            return 0;
    }
 
    printf("请输入你的名字:");
    scanf("%s",name1);
    printf("请输入你伴侣的名字:");
    scanf("%s",name2);
    while(s_iffirm){
        printf("请输入相恋的年,月,日:\n");
        scanf("%d%d%d",&syear,&smonth,&sday);
        s_iffirm = confirm(syear,smonth,sday);
    }

    while(1){
        system("clear");
        printf("********************************************\n");
        printf("********************************************\n");
        printf("*********1、计算相恋的天数******************\n");
        printf("*********2、显示相恋N天后的日期*************\n");
        printf("*********0、退出程序************************\n");
        printf("********************************************\n");
        printf("********************************************\n");
        printf("请选择:");
        scanf("%d",&option);
        if(option == 1){
            while(l_iffirm){
                 printf("请输入今天的年,月,日:\n");
                 scanf("%d%d%d",&lyear,&lmonth,&lday);
                 l_iffirm = confirm(lyear,lmonth,lday);
                 if(lyear < syear){
                     printf("年份不能小于起始年份,请重新输入!\n");
                     l_iffirm = 1;
                 }
            }
            what_day(syear,smonth,sday,lyear,lmonth,lday);
            stop_it();
        }
        else if(option == 2) {
            printf("请输入你想要查看哪一天的日期:");
            scanf("%d",&getdate);
            love_day(syear,smonth,sday,getdate);
            stop_it();
        }
        else {
            bye();
            return 0;
        }
    }

}

int welcome(){
    system("clear");
    printf("********************************************\n");
    printf("********************************************\n");
    printf("********************************************\n");
    printf("********************************************\n");
    printf("********************************************\n");
    printf("**********欢迎使用计算日期功能!************\n");
    printf("********************************************\n");
    printf("**********继续请输入1,退出请输入0**********\n");
    printf("********************************************\n");
    printf("********************************************\n");
    printf("********************************************\n");
    printf("********************************************\n");
}
void bye(){
    system("clear");
    printf("\n********************************************\n");
    printf("********************************************\n");
    printf("**************Bye Bye !!********************\n");
    printf("********************************************\n");
    printf("********************************************\n");
}
void stop_it(){
    char stoping[4];
    printf("返回请输入任意数字:");
    scanf("%s",stoping);
}
int confirm(year,mth,day){
    if(year  < 1900 || year > 2050 ||
            mth < 1 || mth > 12 ||  
            day < 1 || day > 31){
        printf("输入错误,请重新输入\n");
        return 1;
    }
    if(mth == 2 || mth == 4 || mth == 6 || mth == 9 || mth == 11){
        if((mth == 2 && day > 29) || day > 30){
            printf("日期输入错误,小月不大于30,请重新输入\n");
            return 1;
        }
    }
    return 0;
}
int count_month(month){
    int sum1 = 0;
    switch(month){
        case  1:sum1 =  0;break;
        case  2:sum1 = 31;break;
        case  3:sum1 = 59;break;
        case  4:sum1 = 90;break;
        case  5:sum1 =120;break;
        case  6:sum1 =151;break;
        case  7:sum1 =181;break;
        case  8:sum1 =212;break;
        case  9:sum1 =243;break;
        case 10:sum1 =273;break;
        case 11:sum1 =304;break;
        case 12:sum1 =334;break;
        default:printf("输入错误,请核对!dd");break;
    }
    return sum1;
}

int change_month(year,month){
    switch(month){
        case  1:
        case  3:
        case  5:
        case  7:
        case  8:
        case 10:
        case 12:return 31;
        case  4:
        case  6:
        case  9:
        case 11:return 30;
        case  2:if(leap_or_not(year)%365){return 29;}
                    else {return 28;}
        default:printf("输入错误,请核对!cc");break;
    }
}

void what_day(syear,smonth,sday,lyear,lmonth,lday){
    int ssum = 0,lsum = 0;
    int ttl = 0;
    int i = 0;//用于循环,无实际意义
    ssum = count_month(smonth); //获得返回的天数
    lsum = count_month(lmonth);

    for(i = syear; i < lyear;i++){
        ttl += leap_or_not(i);
    }

    if(leap_or_not(syear) == 366 && smonth >2){
    //若为闰年,且日期在2月之后,则加1
        ssum++;
    }
    if(leap_or_not(lyear) == 366 && lmonth >2){
        lsum++;
    }
    ttl = ttl + lsum - ssum + lday - sday;
    printf("%s和%s相恋了%d天\n",name1,name2,ttl);
}

void love_day(year,month,day,getdate){
    int theday = getdate;
    while (getdate / leap_or_not(year)){
        getdate -= leap_or_not(year++);
    }
    while (getdate / (change_month(year,month))){
        getdate -= change_month(year,month++);
        if(month == 12){
            month = month % 12;
            year++;
        }
    }
    day = day + getdate;
    while (day / change_month(year,month)){
        day -= change_month(year,month++);
        if(month == 12){
            month = month % 12;
            year++;
        }
        printf("减去%d\n",day);
    }
    printf("你们相恋第%d天的日期是%d年%d月%d日\n",theday,year,month,day);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值