C语言日历显示程序

要求:按一般的格式显示日历。

(1)输入一个年份,输出该年整年的日历。

(2)输入年和月,输出该月的日历。

(3)输入年、月和日,输出星期几,跟今天差多少天。

 

#include <stdio.h>
#include <time.h>
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
char mon[13][8]={"zore","一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"};
//判断是否为闰年
Isleapyear(int year){
    if((year%4==0 && year%100!=0) || year%400==0)
        return 1;
    else return 0;
}
//判断输入日期总共有多少天
int Alldays(int year,int month,int day)
{    int i,j=0;
    int alldays;
    int monthdays;
    for(i=1;i<year;i++)
        if(Isleapyear(i)) j=j+1;
    switch(month-1){
        case 0: monthdays = 0; break;
        case 1: monthdays = 31; break;
        case 2: monthdays = 59; break;
        case 3: monthdays = 90; break;
        case 4: monthdays = 120; break;
        case 5: monthdays = 151; break;
        case 6: monthdays = 181; break;
        case 7: monthdays = 212; break;
        case 8: monthdays = 243; break;
        case 9: monthdays = 273; break;
        case 10: monthdays = 304; break;
        case 11: monthdays = 334; break;
        case 12: monthdays = 365; break;
        default:    break;
    }
    alldays = (year-1)*365 + j + monthdays +day;
    if(Isleapyear(year) && month > 2) 
        alldays = alldays + 1;
    return alldays;
}
//判断开头几个空格
void kong(int k){
    int i;
        if(k<6){
        for(i=0;i<k+1;i++)
            printf("    ");}
    else if(k>=6 && k<8){
            for(i=0;i<k-6;i++)
                printf("    ");}
}
//状况1:输入年
void tou_year(int y){
    int i,j,k;    
        if(Isleapyear(y)) month[2]=29;
    k = Alldays(y-1,12,31); 
    k = k % 7;  //计算出k是星期几
    for(i=1;i<=12;i++){
    printf("%s\n",mon[i]);//输入门面
    printf("\n");
    printf("日  一  二  三  四  五  六\n");
    printf("---------------------------\n"); 
    kong(k);
    for(j=1;j<=month[i];j++){
        printf("%-4d",j);
        if((j+k+1)%7==0) printf("\n");
    }
        printf("\n");
        printf("\n");
        k=(k+month[i])%7;

    }
}
//状况2:输入年月
void tou_month(int y,int m){
    int j;
    int k;    
    if(Isleapyear(y)) month[2]=29;
    k = Alldays(y,m,0); 
    k = k % 7;  //计算出k是星期几
    printf("       ");
    printf("%d年",y);
    printf("%s\n",mon[m]);
    printf("日  一  二  三  四  五  六\n");
    printf("---------------------------\n");
    kong(k);
    for(j=1;j<=month[m];j++){
        printf("%-4d",j);
        if((j+k+1)%7==0) printf("\n");
    }
        printf("\n");


}
//状况3:输入年月日
void tou_day(int y,int m,int d){
    int k,k1;
    int y1,m1,d1;
    int minusday;
    time_t t;   //时间函数
    struct tm * lt;
    time (&t);
     lt = localtime(&t);
     y1 = lt->tm_year+1900;
     m1 = lt->tm_mon+1;
     d1 = lt->tm_mday;
    k = Alldays(y,m,d);
    k = k % 7;    //计算k的值得出星期几
    printf("%d年/%d月/%d日是:",y,m,d);
    switch(k){    
    case 0:printf("星期日\n"); break;
    case 1:printf("星期一\n"); break;
    case 2:printf("星期二\n"); break;
    case 3:printf("星期三\n"); break;
    case 4:printf("星期四\n"); break;
    case 5:printf("星期五\n"); break;
    case 6:printf("星期六\n"); break;
    }
    //超出int范围
    k = Alldays(y,m,d);
    k1 = Alldays(y1,m1,d1);
    minusday = k1 - k;  //计算两者相差的天数
    printf("今天是%d年/%d月/%d日,%d年/%d月/%d日距今天相差:%d天\n",y1,m1,d1,y,m,d,minusday);
}

        
#include <stdio.h>
int main(){
    int temp,y,m,d;
    char ch;
do{
    printf("请输入您选择的方案(1.查询年历2.查询月历3.输出星期几,跟今天差多少天\n");
    scanf("%d",&temp);
    switch(temp){
    case 1:printf("请输入年份(ep:2020):");
        scanf("%d",&y); printf("          %d年\n",y); tou_year(y);
      // 输入整年日历
        break;
    case 2:printf("请按照所给格式输入\n");printf("请输入年月(ep:2020,6):");
        scanf("%d,%d",&y,&m);  tou_month(y,m);
     //输入该月日历
        break;
    case 3:printf("请按照所给格式输入\n");printf("请输入日期(ep:2019,6,1):");
        scanf("%d,%d,%d",&y,&m,&d); tou_day(y,m,d);
    //输出星期几,跟今天差多少天
        break;
    default:      break;
    }
    printf("\n\n是否继续?(Y键继续,任意键退出)\n");
        getchar();
    scanf("%c",&ch);
}while(ch=='y' || ch=='Y');}

  • 8
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值