c语言实现万年历教程

版权声明:欢迎转载请注明转自方辰昱的博客https://blog.csdn.net/viafcccy https://blog.csdn.net/viafcccy/article/details/84570862

先来看效果图

功能就是输入一个年月日 输出当月的日历

基本思路

1.打印一个日历的模板出来

2.判断平年还是闰年

3.设置一个时间的初始点 计算距离这一天的天数

首先打印模板

/***********************************************************************头文件*****************************************************/
#include<stdio.h>
/***********************************************************************函数声明***************************************************/
void muban();
void printstar();
/***********************************************************************自定义函数*************************************************/
void muban()
{
    int i;      
	printf("                             万年历\n");
	printstar();
	char week[7][10]={"星期一","星期二","星期三","星期四","星期五","星期六","星期天"};
	for(i = 0;i<7;i++)
	printf("%10s",week[i]);
}

void printstar()
{
    printf("***********************************************************\n");
}

/***********************************************************************主函数*****************************************************/
int main()
{
  muban();
  return 0;
}

大家可以自己用空格调整字的位置

判断闰年和平年具体看这篇文章https://blog.csdn.net/viafcccy/article/details/83628920

我们只需要知道我们输入的日期的月份距离1900年的01月有多少天即可

因为百度上的万年历也是将19000101作为基准点

所以我们也用这一天

因为日历实际上可以看成这样

也就是紧密相连的 所以我们只需要算出当前月份和190001距离天数与7的余数即可知道这个月剩下的日期是多少

所以来计数

	int qiuhe(int year,int month,int day,int run[],int ping[])
	{
		int i,sum=0;
		for(i=2001;i<year;i++)
		{
			int m;//用来标签是闰年还是平年  m==1,就是闰年
			m=leap(i);//函数的调用,函数的嵌套调用
			if(m==1)
			{
				sum=sum+366;
			}
			else
			{
				sum=sum+365;
			}
		}
		//加月份的天数
		for(i=0;i<month-1;i++)
		{
			if(leap(year)==1)
				sum=sum+run[i];
			else
				sum=sum+ping[i];
		}
		return sum;
	}

实际上是加到你输入月份的前一个月

例如 求20181127

实际上算的是20181031到19000101的天数

然后按日历的规律遍历打印出来

	void shibiePrint(int sum,int year,int month)
	{
		int yushu,temp,i;
		yushu=sum%7;//得到多余的天数,然后在后一个月份用空格表示出来
		for(i=0;i<yushu;i++)
			printf("          ");//输出空格
		temp=7-yushu;
		if(leap(year)==1)
		{
			for(i=1;i<=run[month-1];i++)//打印31天
			{
				printf("%10d",i);
			if(i==temp||(i-temp)%7==0)
				printf("\n");
			}
			printf("\n");
		}
		else
		{
			for(i=1;i<=ping[month-1];i++)//打印30天
			{
				printf("%10d",i);
			if(i==temp||(i-temp)%7==0)
				printf("\n");
			}
			printf("\n");
		}
	}
	int main()
	{
		scanf("%4d%2d%2d",&year,&month,&day);
		he=qiuhe(year,month,day,run,ping);//调用函数求和
		muban();//调用模板函数,输出模板
		shibiePrint(he,year,month);//进行相应的识别,并输出
		printStar();//打印最后一行的星号
		return 0;
	}

最后组合优化后所有的代码如下

/***************************************************************头文件***************************************************/
	#include<stdio.h>
/***************************************************************函数声明*************************************************/
	void printStar();
	void muban();
	int leap(int year);
	int qiuhe(int year,int month,int day,int run[],int ping[]);
	void shibiePrint(int sum,int year,int month);
/***************************************************************全局变量**************************************************/
	int year,month,day,he;
	int run[12]={31,29,31,30,31,30,31,31,30,31,30,31};
	int ping[12]={31,28,31,30,31,30,31,31,30,31,30,31};
/***************************************************************自定义函数*************************************************/
	void printStar()
	{
		printf("*************************************************************************************\n");
	}
	void muban()
	{
		char weekday[7][10]={"星期一","星期二","星期三","星期四","星期五","星期六","星期天"};
		int i;
		printf("                                        万年历                                        \n");
	    printStar();
		for(i=0;i<7;i++)
			printf("%10s",weekday[i]);
		printf("\n");
		
	}
	
	//判断闰年和平年
	int leap(int year)
	{		
      int four , hundred , fourhundred;
      scanf("%d",&year);
      four = year % 4;
      hundred = year % 100;
      fourhundred = year % 400;
      if (four == 0 && hundred == 0 && fourhundred == 0)
         return 1;
      else if (four == 0 && hundred != 0 && fourhundred != 0)
         return 1;
      else return 0;
	}
	
	//这点到基本点的求和
	int qiuhe(int year,int month,int day,int run[],int ping[])
	{
		//19000101 星期一
		int i,sum=0;
		for(i=1900;i<year;i++)
		{
			int m;//用来标签是闰年还是平年  m==1,就是闰年
			m=leap(i);
			if(m==1)
			{
				sum=sum+366;
			}
			else
			{
				sum=sum+365;
			}
		}
		//加月份的天数
		for(i=0;i<month-1;i++)
		{
			if(leap(year)==1)
				sum=sum+run[i];
			else
				sum=sum+ping[i];
		}
		return sum;
	}
	void shibiePrint(int sum,int year,int month)
	{
		int yushu,temp,i;
		yushu=sum%7;//得到多余的天数,然后在后一个月份用空格表示出来
		for(i=0;i<yushu;i++)
			printf("          ");//输出空格
		temp=7-yushu;
		if(leap(year)==1)
		{
			for(i=1;i<=run[month-1];i++)//打印31天
			{
				printf("%10d",i);
			if(i==temp||(i-temp)%7==0)
				printf("\n");
			}
			printf("\n");
		}
		else
		{
			for(i=1;i<=ping[month-1];i++)//打印30天
			{
				printf("%10d",i);
			if(i==temp||(i-temp)%7==0)
				printf("\n");
			}
			printf("\n");
		}
	}
	/**********************************************************主函数***************************************************/
	int main()
	{
		scanf("%4d%2d%2d",&year,&month,&day);
		he=qiuhe(year,month,day,run,ping);//调用函数求和
		muban();//调用模板函数,输出模板
		shibiePrint(he,year,month);//进行相应的识别,并输出
		printStar();//打印最后一行的星号
		return 0;
	}

猜你喜欢

转载自blog.csdn.net/viafcccy/article/details/84570862
今日推荐