每日练习(4-5)

一、给出年月日,计算该日是星期几

在年份中,分为闰年和平年(闰年比一般年份多1天),到第x-1年共经过多少个闰年,[m]表示对m取整,如[2.85]=2;

到第x-1年如果不考虑百年份,那么经过了[x-1/4]个闰年,

但是这个数值包含了既是整百年份又不能被400整除的年份,因此用[x-1/4]-[x-1/100],

但是这个值又少了被400整除的年份,我们加上是整百年份又能被的年份,[x-1/4]-[x-1/100]+[x-1/400],这个值就是到第x-1年年末共有多少个闰年。

有一个闰年就比一个一般年份多一天,有多少个闰年就比多少个一般年份多 多少天,有[x-1/4]-[x-1/100]+[x-1/400]个闰年,就比[x-1/4]-[x-1/100]+[x-1/400]个一般年份这么多天。

那么到第x年的第a天,一共经过了(x-1)*365+[x-1/4]-[x-1/100]+[x-1/400]天年

到第x年的第x月的第a天,一共经过了(x-1)*365+[x-1/4]-[x-1/100]+[x-1/400]+a天

因为(x-1)*365÷7与(x-1)÷7同余,所以用x-1+[x-1/4]-[x-1/100]+[x-1/400]+a  除以7所得余数即为星期几

根据历法原理,有下面公式,代入即可求得某年某月某日是星期几

S=x-1+[\tfrac{x-1}{4}]-[\tfrac{x-1}{100}]+[\tfrac{x-1}{400}]+C

此处x是公元的年数,C是从这年的元旦算到这天为止(包括这一天在内)的日数,[\tfrac{x-1}{4}]表示为\tfrac{x-1}{4}的整数部分,即三个分数式只取整数部分,余数略去。求出S,再用7除,如果恰能除尽,这一天必为星期日;若余数是1,这一天是星期一。余数是2,则为星期二;依此类推。程序中,在计算c之前,还要判断该年份是否是闰年,这样决定2月是28天还是29天。

//给定年月日,计算该日是星期几
#include<stdio.h>
main(){
	int a,b,c,d,s,z;
	printf("  请输入年月日 yyyy,mm,dd:\n");
	scanf("	  %d,%d,%d",&a,&b,&c);
	if((a%4==0&&a%100!=0) ||(a%400==0))//判断是否为闰年
	{
		if(b==1) d=c;
		if(b==2) d=c+31;
		if(b==3) d=c+60;
		if(b==4) d=c+91;
		if(b==5) d=c+121;
		if(b==6) d=c+152;
		if(b==7) d=c+182;
		if(b==8) d=c+213;
		if(b==9) d=c+244;
		if(b==10) d=c+274;
		if(b==1) d=c+305;
		if(b==12) d=c+335;
	} 
	else {
		if(b==1)d=c;
		if(b==2) d=c+31;
		if(b==3) d=c+59;
		if(b==4) d=c+90;
		if(b==5) d=c+120;
		if(b==6) d=c+151;
		if(b==7) d=c+181;
		if(b==8) d=c+212;
		if(b==9) d=c+243;
		if(b==10) d=c+273;
		if(b==1) d=c+304;
		if(b==12) d=c+334;
	}
	s=a-1+(a-1)/4-(a-1)/100+(a+1)/400+d;
	z=s%7;//除7判断是星期几 
	if(z==0) printf(" 这一天为星期天。\n"); 
	if(z==2) printf(" 这一天为星期二。\n");
	if(z==3) printf(" 这一天为星期三。\n");
	if(z==4) printf(" 这一天为星期四。\n");
	if(z==5) printf(" 这一天为星期五。\n");
	if(z==6) printf(" 这一天为星期六。\n");
	} 

二、编制万年历

 

#include<stdio.h> 
long int f(int year,int month)
{
	if(month<3) return year-1;
	else
	return year;
}
long int g(int month)
{
	if(month<3) return month+13;
	else
	return month+1;
}
long int n(int year,int month,int day)
{
	return 1461L*f(year,month)/4+153L*g(month)/5+day;
}
int w(int year,int month,int day)
{
	return (int)((n(year,month,day)%7-621049L%7+7)%7);
}
int date[12][6][7];
int day_tb1[][12]={
					{31,28,31,30,31,30,31,31,30,31,30,31},
				    {31,29,31,30,31,30,31,31,30,31,30,31}
				  };
	void main(){
		int sw,leap,i,j,k,wd,day;
		int year;
		char title[]="SUM MON TUE WED THU RI SAT";
		printf("请输入年份(yyyy:)");
		scanf("%d",&year);
		sw=w(year,1,1);
		leap=year%4==0&&year%100||year%400==0;
		for(i=1;i<12;i++)
			for(j=0;j<6;j++)
			for(k=0;k<7;k++) 
				date[i][j][k]=0;
		for(i=0;i<12;i++)
			for(wd=0,day=1;day<=day_tb1[leap][i];day++){
			date[i][wd][sw]=day;
			sw=++sw%7;
			if(sw==0) wd++;
			} 
		printf("\n|============================ %d年日历========================================|\n|",year);
		for(i=0;i<6;i++)
		{
			for(wd=0,k=0;k<7;k++)
			wd+=date[i][5][k]+date[i+6][5][k];
			wd=wd?6:5;	
			printf("%2d   %s   %2d   %s |\n|",i+1,title,i+7,title);
			for(j=0;j<wd;j++)
			{
				printf("      ");
				for(k=0;k<7;k++)
				if(date[i][j][k])
				printf(" %4d",date[i][j][k]);
				else printf("   ");
				printf("   ");
				for(k=0;k<7;k++)
				if(date[i+6][j][k])
				printf(" %4d",date[i+6][j][k]);
				else printf("    ");
				printf(" |\n|");
			}
		}
		puts("======================================================================================|");
	}

上面这个空格位置老搞不好。

#include<stdio.h>
//万年历
//定义星期 
#define Mon   1
#define Tues  2
#define Wed   3
#define Thur  4
#define Fri   5
#define Sat   6
#define Sun   0
//定义月份 
#define January_days   31
#define February_days   28
#define March_days    31
#define April_days    30
#define May_days     31
#define June_days     30
#define July_days     31
#define August_days    31
#define September_days  30
#define October_days   31
#define November_days   30
#define December_days   31
 //定义每月天数
#define first1month January_days
#define first2month January_days+February_days
#define first3month January_days+February_days+March_days
#define first4month January_days+February_days+March_days+April_days
#define first5month January_days+February_days+March_days+April_days+May_days
#define first6month January_days+February_days+March_days+April_days+May_days+June_days
#define first7month January_days+February_days+March_days+April_days+May_days+June_days \
             +July_days
#define first8month January_days+February_days+March_days+April_days+May_days+June_days \
             +July_days+August_days
#define first9month January_days+February_days+March_days+April_days+May_days+June_days \
             +July_days+August_days+September_days
#define first10month January_days+February_days+March_days+April_days+May_days+June_days \
             +July_days+August_days+September_days+October_days
#define first11month January_days+February_days+March_days+April_days+May_days+June_days \
             +July_days+August_days+September_days+October_days+November_days
 
int known_weekday = Tues;
int known_year = 1901;//从1901年开始
int konwn_month = 1;
int known_day = 1;
 
int day_count(int month)
{   
    switch(month)
    {
        case 1: return 0;break;
        case 2: return first1month;break;
        case 3: return first2month;break;
        case 4: return first3month;break;
        case 5: return first4month;break;
        case 6: return first5month;break;
        case 7: return first6month;break;
        case 8: return first7month;break;
        case 9: return first8month;break;
        case 10: return first9month;break;
        case 11: return first10month;break;
        case 12: return first11month;break;
    }
}
 
 
/*char * month_name(int month)
{
    switch(month)
    {
        case 1:
            return "January";
            break;
        case 2:
            return "February";
            break;
        case 3:
            return "March";
            break;
        case 4:
            return "April";
            break;
        case 5:
            return "May";
            break;
        case 6:
            return "June";
            break;
        case 7:
            return "July";
            break;
        case 8:
            return "August";
            break;
        case 9:
            return "September";
            break;
        case 10:
            return "October";
            break;
        case 11:
            return "November";
            break;
        case 12:
            return "December";
            break;
        default:
            break;
    }
}*/
 
char * month_name(int month)
{
    switch(month)
    {
        case 1:
            return "一月";
            break;
        case 2:
            return "二月";
            break;
        case 3:
            return "三月";
            break;
        case 4:
            return "四月";
            break;
        case 5:
            return "五月";
            break;
        case 6:
            return "六月";
            break;
        case 7:
            return "七月";
            break;
        case 8:
            return "八月";
            break;
        case 9:
            return "九月";
            break;
        case 10:
            return "十月";
            break;
        case 11:
            return "十一月";
            break;
        case 12:
            return "十二月";
            break;
        default:
            break;
    }
}
 
/*按格式打印某年某月名称*/
void first_line_print(int month, int year)
{
    //printf("%20s %d \n",month_name(month),year);
    printf("%8d年 %s \n",year, month_name(month));
}
 
/*按格式打印星期名称*/
void week_print()
{
    //printf("%-6s%-6s%-6s%-6s%-6s%-6s%-6s\n","Sun.", "Mon.", "Tues.", "Wed.", "Thur.", "Fri.", "Sat.");
    printf("%-3s%-3s%-3s%-3s%-3s%-3s%-3s\n","日", "一", "二", "三", "四", "五", "六");
}
 
/*计算该年该月份与已知日子之间的距离天数*/
int date_distance_count(int month, int year)
{
    int leap_year_count = 0;
    int i;
    int distance;
 
    if (year > known_year)
    {
        for (i=known_year; i<year; i++)
        {
            if(((i%4 == 0) && (i%100 != 0) ) || (i%400 == 0))
            {
                leap_year_count++;      
            }
        }
 
        if (month > 2)
        {
            if(((year%4 == 0) && (year%100 != 0) ) || (year%400 == 0))
            {
                leap_year_count++;      
            }
        }
    }
    else
    if (year == known_year)
    {
        if (month > 2)
        {
            leap_year_count = 1;
        }
    }
     
 
    distance = (year - known_year)*365 + leap_year_count + day_count(month);
 
    return distance;    
}
 
/*确定该月份第一天是星期几*/
int makesure_firstday_weekday(int month, int year)
{
    int date_distance = 0;
    int weekday;
 
    date_distance = date_distance_count(month, year);
    weekday = (known_weekday + date_distance)%7;
 
    return weekday; 
}
 
/*依次打印出该月份的日子*/
void print_in_turn(int month, int firstday, int year)
{
    int i = 1;
    int weekday;
 
    switch(firstday)
    {
        case Sun:
            break;
        case Mon:
            printf("%-3s","");
            break;
        case Tues:
            printf("%-6s","");
            break;
        case Wed:
            printf("%-9s","");
            break;
        case Thur:
            printf("%-12s","");
            break;
        case Fri:
            printf("%-15s","");
            break;
        case Sat:
            printf("%-18s","");
            break;
    }
 
    switch(month)
    {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
        {
            for(i=0; i<31; i++)
            {
                weekday = (firstday + i)%7;
                printf("%-3d",i+1);
                 
                if(weekday == Sat)
                {
                    printf("\n");
                }                   
            }
            break;
        }
        case 2:
        {
            if(((year%4 == 0) && (year%100 != 0) ) || (year%400 == 0)) /*闰年*/
            {
                for(i=0; i<29; i++)
                {
                    weekday = (firstday + i)%7;
                    printf("%-3d",i+1);
                     
                    if(weekday == Sat)
                    {
                        printf("\n");
                    }                   
                }
                break;
            }
            else /*平年*/
            {
                for(i=0; i<28; i++)
                {
                    weekday = (firstday + i)%7;
                    printf("%-3d",i+1);
                     
                    if(weekday == Sat)
                    {
                        printf("\n");
                    }                   
                }
                break;
            }
         
        }
        case 4:
        case 6:
        case 9:
        case 11:
        {
            for(i=0; i<30; i++)
            {
                weekday = (firstday + i)%7;/*计算该天是星期几*/
                printf("%-3d",i+1);
                 
                if(weekday == Sat)
                {
                    printf("\n");/*如果是星期六,则换行*/
                }                   
            }
            break;
        }           
    }
}
 //
void date_print(int month, int year)
{
    int firstday;
 
    firstday = makesure_firstday_weekday(month, year);
    print_in_turn(month, firstday, year);
    printf("\n");
}
 
void main_month(int month, int year)
{
    first_line_print(month, year);
    week_print();
    date_print(month, year);
    printf("\n\n");
}
 
void main_calendar(int year)
{
    int i;
    for(i=1; i<=12; i++)
    {
        main_month(i, year);
    }
}
 
int main()
{
    int year;
 
    printf("请输入年份:year = ");
    scanf("%d",&year);
    printf("\n");
 
    while(year < 1902)
    {
        printf("请输入大于1901的年份\n");
 
        printf("请输入年份:year = ");
        scanf("%d",&year);
        printf("\n");
    }
     
    main_calendar(year);
     
    scanf(" ");
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值