这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 高校专区 » 岭南EE码农港 » C语言课程设计作业--多功能实用万年历

共1条 1/1 1 跳转至

C语言课程设计作业--多功能实用万年历

菜鸟
2014-11-19 22:18:42     打赏
#include<stdio.h>
/*自定义函数说明*/
void screen();           /*系统主界面*/
void whatisit();         /*查询某年某月某日是星期几*/
void leapyear();         /*查询某年是否闰年*/
void printyearday();     /*打印某年的全年日历*/
int IsLeapYear(int);     /*判断某年是否为闰年*/
int whatisita(int,int);  /*计算今天是星期几*/
int everymonth(int,int); /*查询每月最大天数*/
void printmonth(int,int);/*打印某年某月日历*/
void printmonthday();    /*打印某年的某月最大天数*/
void printyearmonthday(); /*查询某年某月日历*/
/*定义一个判断星期几的指针数组*/
char *week[] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
int main()
{
   system("color 2F"); /*设置背景颜色为浅绿色*/
   printf("制作人ID:2013914215.\n\n"); /*个人信息,姓名、学号*/
   screen();  /*万年历的入口*/
   getch();
}

/*万年历查询主界面(含部分功能)*/
void screen()
{
	int n;
	while (1)
	{
		/*万年历的功能*/
		printf("    万年历查询程序:\n");
		printf("1:查询某年某月某日是星期几\n");
		printf("2:查询某年是否是闰年
");
		printf("3:打印某年的全年日历
");
		printf("4:打印某年某月的日历
");
		printf("5:查询某年某月的最大天数
");
		printf("6:退出
");
		printf("请输入要查询的选项: ");
		scanf("%d",&n);
		switch (n)
		{ 
			/*实现相应功能的函数*/
		    case 1:whatisit();break;
			case 2:leapyear();break;
			case 3:printyearday();break;
			case 4:printyearmonthday();break;
			case 5:printmonthday();break;
			case 6:return;
			default:printf("你输入错误,请按要求输入!!!
");break;
		}/*end of switch (n)*/

	}/*end of while (1)*/
}/*end of void screen ()*/

/*查询某年某月某日是星期几*/
void whatisit()
{
	int y, m, d, s, k=1, sum, n, i;
	char yn;

	/*定义一个数组,计算每月的天数*/
	int a[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
	while (k)
	{
		printf("请依次输入年,月,日:");
		scanf("%d,%d,%d",&y,&m,&d);  /*输入要查询的年、月、日*/
		s = 0;

		for (i = 1; i < m; i++)
		{
			s = s + a[i];
		}

		s = s + d;

		if (IsLeapYear(y) && m > 2)
		{
			s = s + 1;
		}

		sum = s;
		n = (y-1 + (y-1)/4-(y-1)/100 + (y-1)/400 + sum) % 7;
		printf("%d 年 %d 月 %d 号是:  %s.\n",y,m,d,week[n]);
		printf("是否要继续查询(Y/N)?");
		scanf("%c",&yn);
		getchar();

		if (yn == 'y' || yn == 'Y')
		{
			k = 1;
		}
		
		else 
		{
			k = 0;
		}/*end of if (yn == 'y' || yn == 'Y')*/
	}/*end of while (k)*/
}/*end of void whatisit()*/

/*判断某年是否是闰年*/
int IsLeapYear(int year)
{
	return(year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);  /*返回一个整型值0或1*/
}  /*end of int IsLeapYear(int year)*/

/*查询某年是否是闰年*/
void leapyear()
{
	int y, k = 1; 
	char yn;
	while (k)
	{
		printf("请输入要查询的年份: ");
		scanf("%d",&y);

		if (IsLeapYear(y))  /*y是判断标志*/
		{
			printf("%d 年是闰年!
",y);
		}

		else
		{
			printf("%d 年不是闰年!\n",y);
		}

		printf("是否继续查询(Y/N)?");
        scanf("%c",&yn); getch();

		if (yn == 'y' || yn == 'Y')   /*是否继续查询入口*/
		{
			k = 1;   /*k是是否继续查询的标志*/
		}

		else
		{
			k = 0;
		} /*end of if (yn == 'y' || yn == 'Y')*/
	} /*end of while (k)*/
} /*end of void leapyear()*/

/*计算当天是星期几*/
int whatisita(int y,int m) /*whatisita 是有参函数,返回值是整型,y表示年,m表示月*/
{
    int n, i;
	int a[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, s = 0;
	
	for (i = 1;i < m;i++)   /*计算总天数*/
	{
		s = s + a[i];
	}

	if (IsLeapYear(y) && m > 2)  /*判断是否闰年,如果是闰年就总天数加1天*/
	{
		s = s + 1;
	}

	n = (y-1+(y-1)/4-(y-1)/100+(y-1)/400+s+1)%7;
	return n; /*返回值是n*/
}/*end of int whatisita(int y,int m)*/

/*打印某年的全年日历*/
void printyearday()
{
	int y, value, sum, i, j, k = 1;
	char yn;
	while (k)
	{
		printf("请输入查询的日历的年份: ");
		scanf("%d",&y);

		for (i = 1; i <= 12; i++)
		{
			printf("                              %d年%d月
\n",y,i);
            value = whatisita(y, i);
			sum = everymonth(y, i);
			printmonth(value, sum);
			printf("\n\n");
		}

		printf("是否继续查询(Y/N)?");
		scanf("%c",&yn);  getchar();

		if (yn == 'Y' || yn == 'y')
		{
			k = 1;
		}
		else
		{
			k = 0;
		}
	} /*end of while (k)*/
} /*end of void printyearday()*/

/*查询某月最大天数*/
int everymonth(int year, int month)  /*everymonth是有参函数,year是年份,month是月份,返回值是整型*/
{
	int s;
	static int a[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
	s =a [month];

	if (IsLeapYear(year) && month == 2)
	{
		s = s + 1;
	}

	return s;  /*s是返回值*/
} /*end of int everymonth(int year, int month)*/

/*打印某年的某月最大天数函数*/
void printmonthday()
{
	int y, m, value, k = 1; 
	char yn;
	while (k)
	{
		printf("请输入查询的年份,月份: ");
		scanf("%d,%d",&y,&m);
		value = everymonth(y,m);
		printf("%d年%d月的最大天数为%d.\n",y,m,value);
		printf("是否继续查询(Y/N)?");
		scanf("%c",&yn); getchar();

		if (yn == 'y' || yn == 'Y')
		{
			k = 1;
		}
        else
		{
			k = 0;
		}
	} /*end of while (k)*/
} /*end of void printmonthday()*/

/*打印月历*/
void printmonth(int value,int sum) /*printmonth是有参函数,value和sum是参数,无返回值*/
{
	int n, i = 0, j;
	char *x[7] = {"Sunday", "Monday", "Tuesday", "Wenesday", "Thursday", "Friday", "Saturday"};
	
	for (j = 0; j < 7; j++)
	{
		printf("%-10s",x[j]);
	}

	printf("\n");

	while (i < value)
	{
		printf("          ");
		i++;
	}

	for (n = 1; n < 7-value; n++)
	{
		printf("%-10d",n);
	}

	while (n <= sum)
	{
		if ((n + value - 1) % 7 == 0)
		{
			printf("\n");
		}
		if (n/10 > 0)
		{
			printf("%-10d",n);
		}
		else
		{
			printf("%-10d",n);
		}

		n++;
	}/*end of 	while (n <= sum)*/
} /*end of void printmonth(int value,int sum)*/

/*查询某年某月日历*/
void printyearmonthday()
{
	int y, m, value, sum, k = 1;
	char yn;
	while (k)
	{
		printf("请输入要查询日历的年份,月份:  ");
		scanf("%d,%d",&y,&m);
		printf("                       %d年%d月的日历\n",y,m);
		value = whatisita(y,m);  /*whatisit 函数返回一个值,返回值是本月的第一天是星期几*/
		sum = everymonth(y,m);   /*everymonth 函数返回一个值,返回值是本月的最大天数*/
		printmonth(value,sum);
		printf("\n");
		printf("是否继续查询(Y/N)?");
		scanf("%c",&yn); getchar();
		if (yn == 'y' || yn == 'Y')
		{
			k = 1;
		}
        else
		{
			k = 0;
		}
	}/*end of 	while (k)*/
} /*end of void printyearmonthday()*/

 






总结:要理解这个万年历的代码才可以改进,得到功能更加齐全的万年历,个人改进的地方还是比较少的,融入了个人的一些想法,例如,我不喜欢黑白的显示屏,我把显示屏的背景色调为了浅绿色,我增加了万年历的一个功能,就是可以查询某一年的某月的日历,书本上的日历的显示并不标准,星期几与日期不一致,造成查看日历的人不容易看懂日历,对此,我也进行了改编,我把星期几与日期一一对应,这样子可以让查询日历的人更容易看懂,也更加符合实际情况,在改编程序的过程中也遇到很多问题,不断调试,不断完善,最终实现了自己的想法,希望老师多多指点,谢谢!

 





关键词: 多功能     实用     万年历    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]