c_输出日历

判断是否为闰年:

(year%4==0&&year%100!=0)||year%400==0)

计算闰年数

[(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400]     ,       [...]取整符号

计算某年第一天是星期几【法一】

ayas = y-1 + (y-1)/4 + (y-1)/400 - (y-1)/100 + D(D为所求那年剩余天数);ayas/7 的余数

反正挺麻烦的,直接记蔡勒公式叭

 

计算星期几

蔡勒(Zeller)公式。即w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
w:星期;

c:世纪-1

y:年份后两位;

m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的12月要看作上一年的1314月来计算,比如200311日要看作2002年的131日来计算);

d:日;[ ]代表取整,即只要整数部分。

以2049年10月1日(100周年国庆)为例,用蔡勒(Zeller)公式进行计算,过程如下:
蔡勒(Zeller)公式:w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
=49+[49/4]+[20/4]-2×20+[26× (10+1)/10]+1-1
=49+[12.25]+5-40+[28.6]
=49+12+5-40+28
=54 (除以7余5)
即2049年10月1日(100周年国庆)是星期5。

课本答案:利用字符串指针数组

#include<stdio.h>
#include<conio.h>

void calendar(int year,int mouth,int day,int fir_d);
void main()
{	

	//输入年份与月份 
	int year,month;
	printf("Enter year & month:");
	scanf("%d %d",&year,&month);
	
	
	static char *months[]={"January","February","March",\
	"April","May","June","July","August","Septrmber",\
	"October","November","December"};
	
	//处理平闰年2月天数不同 
	int days[12]={31,0,31,30,31,30,31,31,30,31,30,31};
	if((year%4==0 && year%100!=0 )||(year%400==0))  days[1]=29;
	else days[1]=28;
	
	//蔡勒(Zeller)公式。即w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1 ;所求月份第一天是周几
	int w,y,c,m;
	if(month < 3) y=year-1;
	else y=year;
	c = y/100;
	y = y%100;
	m = month;
	w = y + y/4 + c/4  - 2*c + 26*(m+1)/10;
	int fir_d = w%7;
	
	//输出日历头 
	printf("\t\t  %s %d\n",months[month-1],year); 
	printf("---------------------------------------------------\n");
	printf("Mon\tTue\tWed\tThu\tFri\tSat\tSun\t\n");
	
	int day = days[month-1];
	int i,j=1;
	while(j<fir_d){
		printf("\t");
		j++;
	}
	for(i=1;i<=day;i++){
		printf("%d\t",i);
		if((i+fir_d-1)%7 == 0)
			printf("\n");
	}

}

输出某年的日历:

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

//获取某一个月的最大天数 
int monthday(int,int );

//判断闰年 ,是返回1,不是返回0 
int isleapyear(int );

int main()
{
    int year,month,days,weekday;
    int i,d;

    printf("please input the year:\n");
    scanf("%d",&year);
    days = year-1+(year-1)/400+(year-1)/4-(year-1)/100;//计算某年第一天是星期几 
    
    for(month=1;month<=12;month++)
    {
        printf("\t\t****%d年--%d月****\n",year,month);
        printf("sun\tmon\ttues\twed\tthur\tfir\tsat\t\n");//表头
        i = 1;    d = 1;
        weekday = (days + 1)%7;  //求星期几 
        while(i<=weekday)   //输出前面的空格 
        {
            printf("\t");
            i++;
        } 
        
        //
        while(d<=monthday(month,year))     //输出一个月日期 
        {
            weekday = (days + 1)%7;
            if(weekday==6)   //最后一个是星期六,输出之后要换行 
                printf("%d\n",d);
            else             //不是星期六的输出后不换行 
                 printf("%d\t",d);
            if(d==monthday(month,year))  //一个月天数输出结束 
                 printf("\n");
             d++;
             days++;
        }
    }


}


int monthday(int month,int year)
{
switch(month)
    {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
        return 31;break;
        
        case 4:
        case 6:
        case 9:
        case 11:
        return 30;break; 
        
        case 2:
        if(isleapyear(year))    
        {
            return 29;//闰年29天 
            break;
        }
        else
        {
            return 28;
            break;
        }
        
    } 
    
}


int isleapyear(int year)
{
    if((year%4==0)&&(year%100!=0)||(year%400==0))
        return 1;
    else 
        return 0;
}

 输出指定某年某月的日历:

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

//获取某一个月的最大天数 
int monthday(int,int );

//判断闰年 ,是返回1,不是返回0 
int isleapyear(int );

int main()
{
    int year,month,days,weekday;
    int i,d;

    printf("please input the year:\n");
    scanf("%d %d",&year,&month);
    days = year-1+(year-1)/400+(year-1)/4-(year-1)/100;//计算某年第一天是星期几 
    

    printf("\t\t****%d年--%d月****\n",year,month);
    printf("--------------------------------------------------\n");
    printf("sun\tmon\ttues\twed\tthur\tfir\tsat\t\n");//表头

    i = 1;    d = 1;
    weekday = (days + 1)%7;  //求星期几 
    while(i<=weekday)   //输出前面的空格 
    {
        printf("\t");
        i++;
    } 
    
    //
    while(d<=monthday(month,year))     //输出一个月日期 
    {
        weekday = (days + 1)%7;
        if(weekday==6)   //最后一个是星期六,输出之后要换行 
            printf("%d\n",d);
        else             //不是星期六的输出后不换行 
             printf("%d\t",d);
        if(d==monthday(month,year))  //一个月天数输出结束 
             printf("\n");
         d++;
         days++;

    }
    printf("--------------------------------------------------\n");



}


int monthday(int month,int year)
{
switch(month)
    {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
        return 31;break;
        
        case 4:
        case 6:
        case 9:
        case 11:
        return 30;break; 
        
        case 2:
        if(isleapyear(year))    
        {
            return 29;//闰年29天 
            break;
        }
        else
        {
            return 28;
            break;
        }
        
    } 
    
}


int isleapyear(int year)
{
    if((year%4==0)&&(year%100!=0)||(year%400==0))
        return 1;
    else 
        return 0;
}

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值