1. 程式人生 > >c語言實現萬年曆教程

c語言實現萬年曆教程

先來看效果圖

功能就是輸入一個年月日 輸出當月的日曆

基本思路

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;
	}