万年历小程序(黑框)

本程序可完成打印年历,月历,以及查询两个日期间相距多少天,以及查询日期是星期几。代码如下:

#include<stdio.h>

//设计界面函数
int UI()
{
	int n;
    printf("------------------------\n");
    printf("-----欢迎使用万年历-----\n"); 
    printf("|      1.查询年历      |\n");
    printf("|      2.查询月历      |\n");
    printf("|   3.查询距今多少天   |\n");
    printf("|        4.退出        |\n");
    printf("------------------------\n");
    printf("请输入您想使用功能的数字: ") ;
    while(1)
    {
	    scanf("%d",&n);
    	if(n==1||n==2||n==3||n==4)
    	{
    		return n;
		}
		else
		{
            printf("输入的数字有误,请重新输入\n");
        }
	}
} 


//判断润平函数 
int Judge(int year)
{
    if(year%400==0||(year%4==0&&year%100!=0))    //闰年 
    return 0;
    else                                        //平年 
    return 1;
}

//功能1函数
void Fac1()
{
	int Run[12]={31,29,31,30,31,30,31,31,30,31,30,31};
    int Leap[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    char *Month[]={"January","February","March","April","May","June","July","August","September","October","November","December"};
    char *Week[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
    int year=0;
    int day=0;
    int flag=0;
    printf("请输入年份:");
	scanf("%d",&year);
	flag=Judge(year);
	int tool=0,weekd=0;
	tool=year-1+(year-1)/4-(year-1)/100+(year-1)/400+1;        //公式计算 
	weekd=tool%7;                                             //计算星期几
	int i=0,j=0;
	for(i=0;i<12;i++)
	{
		printf("\n");
        printf("%s\n",Month[i]);            //打印月份
        printf("===================================================\n");
        for(j=0;j<7;j++)
        {
            printf("%s\t",Week[j]);        //打印星期
        }
        printf("\n");
         for(int k=0;k<weekd;k++)
        {
            printf("   \t");               //打印日期前的空格 
        }
        for(day=1;day<32;day++)
        {
            printf("%d\t",day);
            if((weekd+day)%7==0)
            {
                printf("\n");//每行七个日期
            }
            if(flag==0)//是闰年
            {
                if(i==0 && day==31) break;//控制每月的天数
                else if(i==1 && day==29) break;
                else if(i==2 && day==31) break;
                else if(i==3 && day==30) break;
                else if(i==4 && day==31) break;
                else if(i==5 && day==30) break;
                else if(i==6 && day==31) break;
                else if(i==7 && day==31) break;
                else if(i==8 && day==30) break;
                else if(i==9 && day==31) break;
                else if(i==10 && day==30) break;
                else if(i==11 && day==31) break;
            }
            else//不是闰年
            {
                if(i==0 && day==31) break;
                else if(i==1 && day==28) break;
                else if(i==2 && day==31) break;
                else if(i==3 && day==30) break;
                else if(i==4 && day==31) break;
                else if(i==5 && day==30) break;
                else if(i==6 && day==31) break;
                else if(i==7 && day==31) break;
                else if(i==8 && day==30) break;
                else if(i==9 && day==31) break;
                else if(i==10 && day==30) break;
                else if(i==11 && day==31) break;
            }
        }
        weekd=(weekd+day)%7;//计算下一个月第一天是星期几
        printf("\n");
	} 
	printf("\n");
} 

//功能2函数
void Fac2()
{
	int Run[12]={31,29,31,30,31,30,31,31,30,31,30,31};
    int Leap[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    char *Month[]={"January","February","March","April","May","June","July","August","September","October","November","December"};
    char *Week[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
    int year,month;
    printf("请输入年,月:");
    scanf("%d%d",&year,&month);
    int flag=0;
    flag=Judge(year);
    printf("\n");
    int Mark=0;
    for(int i=0;i<month-1;i++)
    {
        if(flag==0)//是闰年
        {
            Mark+=Run[i];
        }
        else//不是闰年
        {
           	Mark+=Leap[i];
        }
    }
    int N=0;
    N=year-1+(year-1)/4-(year-1)/100+(year-1)/400+Mark+1; 
    int weekd=0;
    weekd=N%7;
    printf("%s\n",Month[month-1]);//输出月份
    printf("===================================================\n");
    for(int j=0;j<7;j++)
    {
        printf("%s\t",Week[j]);//输出星期
    }
    printf("\n");
    for(int k=0;k<weekd;k++)
    {
        printf("   \t");//输出日期
    }
    for(int day=1;day<32;day++)
    {
        printf("%d\t",day);
        if((weekd+day)%7==0)
        {
            printf("\n");//每行七个日期
        }
        if(flag==0)//是闰年
        {
            if(month==1 && day==31) break;
            else if(month==2 && day==29) break;
            else if(month==3 && day==31) break;
            else if(month==4 && day==30) break;
            else if(month==5 && day==31) break;
            else if(month==6 && day==30) break;
            else if(month==7 && day==31) break;
            else if(month==8 && day==31) break;
            else if(month==9 && day==30) break;
            else if(month==10 && day==31) break;
            else if(month==11 && day==30) break;
            else if(month==12 && day==31) break;
        }
        else//不是闰年
        {
            if(month==1 && day==31) break;
            else if(month==2 && day==28) break;
            else if(month==3 && day==31) break;
            else if(month==4 && day==30) break;
            else if(month==5 && day==31) break;
            else if(month==6 && day==30) break;
            else if(month==7 && day==31) break;
            else if(month==8 && day==31) break;
            else if(month==9 && day==30) break;
            else if(month==10 && day==31) break;
            else if(month==11 && day==30) break;
            else if(month==12 && day==31) break;
        }
    }
    printf("\n\n");
} 

struct date
{
	int yr;
	int mon;
	int day;
};

typedef struct date Date;

void Fac3()		//两天之间差多少天
{
	int Run[12]={31,29,31,30,31,30,31,31,30,31,30,31};
    int Leap[12]={31,28,31,30,31,30,31,31,30,31,30,31};
	Date one,two;
	Date str,end;
	printf("请输入现今日期:(年 月 日)\n");
	scanf("%d %d %d",&one.yr,&one.mon,&one.day);
	printf("请输入查询日期:(年 月 日)\n");
	scanf("%d %d %d",&two.yr,&two.mon,&two.day);
	if((one.yr<two.yr)||((one.yr==two.yr)&&(one.mon<two.mon))||(((one.yr==two.yr)&&(one.mon==two.mon)&&(one.day<two.day))))  //保证日子小的年份放在str,大的放在end 
	{
		str=one;     //str存的小的 
		end=two;     //end存的大的·	 
	}
	else
	{
		str=two;
		end=one;
	}
	int n=0;		//计数
	int u=0;
	if(str.yr<end.yr)                          //如果str年小 
	{
		for(int im=1;im<=str.mon;++im)           
		{
			if(im==str.mon)
				u+=str.day;
			else
			{
				if(Judge(str.yr))
					u+=Run[im-1];
				else u+=Leap[im-1];
			}
		}
		for(int yr=str.yr;yr<=end.yr;++yr)
		{
			int judge=Judge(yr);	//判断闰年
			if(yr==end.yr)
			{
				for(int mon=1;mon<=end.mon;++mon)
				{
					if(mon==end.mon)
					{
						n+=end.day;         
					}
					else
					{
						if(judge)
						{
							n+=Run[mon-1];
						}
						else n+=Leap[mon-1];
					}
				}
			}
			else
			{
				int ny=judge?365:364;
				n+=ny;
			}
		}
		n=n-u+1;
	}
	else if(str.mon<end.mon)
	{
		int judge=Judge(str.yr);	//判断闰年
		for(int mon=str.mon;mon<=end.mon;++mon)
		{
			if(mon==end.mon)
			{
				n+=end.day;
			}
			else
			{
				if(judge)
				{
					n+=Run[mon-1];
				}
				else n+=Leap[mon-1];
			}
		}
		n=n-str.day;
	}
	else
	{
		n=end.day-str.day;
	}
	int D=0,W=0;
	int judge=Judge(two.yr);
	if(judge==0)
	{
		for(int imonth=1;imonth<two.mon;imonth++)
		D+=Run[imonth-1];
		D+=two.day;
	}
	else
	{
		for(int imonth=1;imonth<two.mon;imonth++)
		D+=Leap[imonth-1];
		D+=two.day;
	}
	W = two.yr-1+ (two.yr-1)/4- (two.yr-1)/100 + (two.yr-1)/400 + D; 
	W%=7;
	if(W==0)
	W=7;
	printf("距今 %d 天,是星期%d\n",n,W);
}


void Fac4()
{	
	printf("欢迎再次使用!\n");
}

//进入功能函数
void Go(int n)
{
	if(n==1)
	   Fac1();
	if(n==2)
	   Fac2();
	if(n==3)
	   Fac3();
	if(n==4)
	   Fac4();
} 

int main()
{
	int n=0;
	while(n!=4)
	{
		n=UI();
	    Go(n);
	}
	return 0;
}

根据日期计算星期几的公式:
W = [Y-1] + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + D

Y是年份数,D是这一天在这一年中的累积天数,也就是这一天在这一年中是第几天。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值