万年历

    @noneface  02 Apr 2015


学c语言也有个小半年了,想想c语言到底能干什么。。。

于是用c语言,花了两天时间,间断的把一个万年历的小程序给码完了。

首先得声明几个函数:

int the_first_day_of_year (int Year);
int the_first_day_of_month (int input_month,int Month[13]);
void output(int a,int input_month,int Month[13]);      

主函数main()如下;需要考虑到闰年情况,四年一闰,百年不闰,四百年再闰:

int main (void)
	{
		char yn;
		do
		{
			int year,month,year_days,month_days,year_month_day;
			 // year 输入年 month 输入月 year_days 数入年第一天为星期几 month_days 输入月第一天为星期几
			int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; 
			// 每月天数
			printf("Please input the year and month (like: 2015 3) : \n");
			scanf("%d %d",&year,&month);
			if((year%4==0 && year%100!=0)||year%400==0)
				months[2]=29;
			year_days=the_first_day_of_year (year);
			month_days=the_first_day_of_month (month,months);
			year_month_day=(year_days+month_days)%7;
			output(year_month_day,month,months);
			yn=getchar();
			printf("Do you want to continue?: (Y/N)\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"); // 重复输入
			scanf("%c",&yn);
		}while(yn=='Y'||yn=='y');
			printf("bye!\n");
	return 0;
	}

在main()函数里面利用了do while循环语句来实现重复输入。

接下来是各个函数模块

int the_first_day_of_year(int input_year) 
	// 计算输入年份的第一天是礼拜几
	{
		int moddays=1;
		int mod_days=0;
		int i_year;
		 // 公元1年1月1日 星期一  0 星期日;1 星期一;2 星期二;3 星期三;4 星期四; 5 星期五; 6 星期六;
		for(i_year=1;i_year < input_year;i_year++)
			{
				if( ( i_year%4==0 && i_year%100!=0 ) || i_year%400==0 )
					mod_days=366%7;
				else
					mod_days=365%7;
			moddays=moddays+mod_days;
			}
		moddays=moddays%7;
		return moddays;
	}

从公元1年1月1日,开始算起。一直算到输入年。

然后是算月份:

int the_first_day_of_month (int input_month,int Month[13] ) 
	// 计算输入月份的第一天是礼拜几
	{
		int month_day=0;
		int i;
		for( i=0;i<input_month;i++)
		{
 
			month_day=month_day+Month[i];
		}
		month_day=month_day%7;
		return month_day;
	}

通过计算从输入年的一月一直到输入月有多少天。把它用7整除。得出的结果备用。

根据main()函数里的一条语句:

	year_month_day=(year_days+month_days)%7;

将计算出输入年的第一天是礼拜几+上1月到输入月的天数被7整除的结果,得到一个天数。因为可以理解为7天是一个循环。然后把这个结果对7取余。就是输入月第一天为礼拜几。

最后就是输出函数。

	void output(int a,int input_month,int Month[13]) 
		// 输出日历表
		{
			int j,k,num=1;
			printf("\n*****************************************************\n");
			printf("\n*****************************************************\n");
			printf("Sun\tMon\tTues\tWed\tThur\tFri\tSat\t\n");
			for(j=0;j<a;j++)
			{
				printf("\t");
				if (num%7==0)
					printf("\n");
				num++;
			}
			for(k=1;k < =Month[input_month];k++)
			{
				printf("%d\t",k);
				if (num%7==0)
					printf("\n");
				num++;
 			}
			if (num%7==0)
			printf("\n");
			printf("\n*****************************************************\n");
			printf("\n***************************************************** \n"); 
		}

在这个函数中:

int the_first_day_of_year(int input_year);

我们已经定义了

0 星期日;1 星期一;2 星期二;3 星期三;4 星期四; 5 星期五; 6 星期六;

所以把sunday放在第一个。

又因为每7天就需要一次换行。所以每次输出后都要进行判断。是否当前输出后的数字能否被7整除,是的话\n,否的话不执行。


Follow your heart  |   nonefacesay@gmail.com