C语言课设万年历

这篇具有很好参考价值的文章主要介绍了C语言课设万年历。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 功能:

1.该程序可以输出某年的全部月份,也可以输出某月的全天日历。

2.输入年月日输出距今天还有多少天,星期几,是否是公历节日。

注:分代码应以.h的形式分开才保证正常运行。

程序设计思路:

        总天数的算法:首先用if语句判断定义年到输入年之间每一年是否为闰年,若是,该年的总天数为366则2月输出为29天,若不是,为365天,2月输出为28天。再判断系统当前月份是大月还是小月,若为大月,则输出31天;若为小月,则输出30天。利用一个函数计算出每月的第几天是星期几。根据所判断的大月、小月,通过控制符setw控制输出流格式(设置字段宽度),把该日期以前的位置用空格补上,并从该日起依次输出天数直到月底,该月中的天数加上该月一日为星期几的数字再除以7得0换行,即可完整的输出该月的日历。获取系统时间,计算当天农历日期并显示。在C++中,考虑到C语言到C++语言过渡的连续性,对结构体进行了扩展,C++的结构体可以包含函数。C++中一般使用cocout和cin时的默认格式。C++提供了在输入输出流中使用的控制符。需要注意的是:如果使用了控制符,在程序单的开头要加iostream头文件。

功能需求分析:

(1)能够显示该年的日历。假定输入的年份在1940-2040之间

(2)能够显示某月的日历。

(3)能够显示距今天还有多少天,星期几,是否是公历节日。

设计程序运行界面,具有显示各种功能的面板模块,并对各功能按钮就行时间监听;程序需要能够显示1940年到2040年的日历。要求系统能够从界面上的操作获取公历日期,计算其所对应的星期和相应的节点并显示到界面上;程序要求显示输入某年某月日历,包括公历、时间所对应的星期。要求可以自己设置一个时间点,在这一时间点做出相应的响应。对时间的更新,日历显示要求关联系统时间,能在进入程序时显示与系统时间对应的日历;程序界面的美观设计和人性化结构,要求具有良好的人机交互,容易理解界面内容,易操作;就现在的水平来说,功能1、2是可以实现,功能3有待研究,可能遇到的问题是按钮对时间的监听处理可能难度较大,还有就是在农历转公历中可能比较难获取相应的公历变化日期。

各模板函数说明:

1.0菜单显示模块程序:

void menu()
{
	system("cls");//clears 作用是让屏幕清干净
	printf("					 -----------------------------------\n");
	printf("					 |---------------------------------|\n");
	printf("					 |----------欢迎来到万年历---------|\n");
	printf("					 |---------------------------------|\n");
	printf("					 |----------1.查看某年日历---------|\n");
	printf("					 |         |              |        |\n");
	printf("					 |----------2.查看某月日历---------|\n");
	printf("					 |         |              |        |\n");
	printf("					 |----------3.查看某天日历---------|\n");
	printf("					 |         |              |        |\n");
	printf("					 |----------4.    退出    ---------|\n");
	printf("					 |---------------------------------|\n");
	printf("					 -----------------------------------\n");
	printf("请输入你的选择:");
	int m;
	scanf_s("%d", &m);
	while (!(m >= 1 && m <= 4))
	{
		printf("请重新输入正确的数字:");
		scanf_s("%d", &m);
	}
	int z;
	switch (m)
	{
	case 1: years();  menu();  break;
	case 2: mouth(); menu();  break;
	case 3: day();   menu();  break;
	case 4:
		system("cls");//clears 作用是让屏幕清干净
		printf("						-----------------\n");
		printf("						|是否确认退出???|\n");
		printf("						-----------------\n");
		printf("\n");
		printf("				    ---------------------------------------\n");
		printf("				    |*1确认退出        *其余数字取消退出!|\n");
		printf("				    ---------------------------------------\n");
		scanf_s("%d", &z);
		if (z == 1)
			exit(0);
		else
			menu();
	}
}

1.1查询某年日历:

#pragma once
#pragma once

int Month[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };

//内部逻辑的实现
//判断是否是闰年
int isleapyear(int year);
//判断给定年份的第一天的距1940年1月1日的总天数
int sumofday(int year, int month);

//设置日历外观样式
//打印日历上边框
void  printBorder_up(int year);
//打印日历下边框
void printBorder_down(int year);
//打印日历内容,分为六块,每块又由表头、衔接、表尾组成
void printBody(int year);
//打印日历表头
void printTitle(int month1, int month2);
//打印日历内容
void printDate(int month1, int month2, int year);
//衔接部分
void part(int year, int month, int* day);
int years()
{
	system("cls");//clears 作用是让屏幕清干净
	printf("|----------------------------------------------|\n");
	printf("|----------当前功能为查看某年日历--------------|\n");
	printf("|----------------------------------------------|\n");
	printf("   请你输入一个你想知道的年份 xxxx:");
	int year;
	scanf_s("%d", &year);
	while (year < 1940 || year>2040)
	{
		printf("  请输入年份[1940--2040]:");
		scanf_s("%d", &year);
	}
	printBorder_up(year);
	printBody(year);
	printBorder_down(year);
	printf("						                    \n");
	printf("						                    \n");
	printf("|----------------------------------------------|\n");
	printf("|--------------按任意键回到主菜单--------------|\n");
	printf("|----------------------------------------------|\n");
	system("pause");
	return 0;
}

//判断闰年
int isleapyear(int year) {
	if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0) {
		return 1;
	}
	else {
		return 0;
	}
}
//判断给定年份的第一天的距1940年1月1日的总天数
//用以判断指定年份对应的每月的第一天是星期几
int sumofday(int year, int month) {
	int sum = 0;
	int i = 1940;
	for (i = 1940; i < year; i++)
	{
		if (isleapyear(i)) {
			sum += 366;
		}
		else {
			sum += 365;
		}
	}
	if (isleapyear(i)) {
		Month[2] = 29;
	}
	for (int i = 0; i < month; i++) {
		sum += Month[i];
	}
	return sum;
}
//打印日历上边框
void printBorder_up(int year) {
	printf("|=====================The Calendar of Year %d====================|\n", year);
}
//打印日历下边框
void printBorder_down(int year) {
	printf("|==================================================================|\n");
}
//打印日历内容,分为六块表,每块表又由表头、表内容组成
void printBody(int year) {
	for (int i = 0; i < 6; i++) {
		//打印表头
		printTitle(i + 1, i + 7);
		//打印表内容
		printDate(i + 1, i + 7, year);
	}
}
//表头,两列组成
void printTitle(int month1, int month2) {
	printf(": %2d  SUN MON TUE WED THU FRI SAT  %2d  SUN MON TUE WED THU FRI SAT :\n", month1, month2);
}
//表内容的排版,part函数显示日期,分为五个部分;边框-日期-边框-日期-边框
void printDate(int month1, int month2, int year) {
	//每次循环调用不同的函数,需要记录天数,传地址,防止丢失
	int day1 = 1, day2 = 1;
	//打印天数,最多6行,31天
	for (int i = 0; i < 6; i++) {
		//显示边框
		printf(":     ");
		//显示日期
		part(year, month1, &day1);
		//显示中间边框
		printf("     ");
		//显示日期
		part(year, month2, &day2);
		//显示边框
		printf(" :\n");
	}
}
//显示日期
void part(int year, int month, int* day) {
	if (isleapyear(year)) {
		Month[2] = 29;
	}
	//第一天需要输入到对应的位置上
	if (*day == 1) {
		//判断给定年份的第一天的距1940年1月1日的总天数
		int sum = sumofday(year, month);
		//设置总天数对应星期几,星期一对应第2天
		int step = (sum + 1) % 7;
		for (int i = 0; i < 7; i++) {
			//非对应的地方输出空格
			if (step != 0) {
				step--;
				printf("    ");
			}
			//输出第一天的所在位置
			else {
				printf("%3d ", *day);
				(*day)++;
			}
		}
	}
	//之后直接累加天数即可
	else {
		for (int i = 0; i < 7; i++) {
			if (*day <= Month[month]) {
				printf("%3d ", *day);
				(*day)++;
			}
			//超过当月天数的不输出
			else {
				printf("    ");
			}
		}
	}
}

1.2查询某月日历:

#pragma once
#pragma once
void mouth()
{
	int y, m, days, i, xq, ts, sum;
	system("cls");//clears 作用是让屏幕清干净
	printf("|----------------------------------------------|\n");
	printf("|----------当前功能为查看某月日历--------------|\n");
	printf("|----------------------------------------------|\n");
	printf("请你输入年份:");
	scanf_s("%d", &y);
	while (y < 1940 || y>2040)
	{
		printf("请重新输入正确的年份:");
		scanf_s("%d", &y);
	}
	printf("请你输入月份 :");
	scanf_s("%d", &m);
	while (m < 0 || m>12)
	{
		printf("请重新输入正确的月份:");
		scanf_s("%d", &m);
	}
	days = 0;//计算从1900-1-1到输入的年月日之间一共有多少天,初始值为0
	//1 1900年到y-1之间的整年天数
	days = days + (y - 1 - 1900 + 1) * 365;
	for (i = 1900; i <= y - 1; i++)
	{
		if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
			days++;
	}
	//2 计算y年中1月到m-1月之间的整月天数
	for (i = 1; i <= m - 1; i++)
	{
		switch (i)
		{
		case 1:case 3:case 5:case 7:case 8:case 10:
			days = days + 31; break;
		case 4:	case 6:	case 9:case 11:
			days = days + 30; break;
		case 2:
			days = days + 28; break;
		}
	}
	if ((y % 4 == 0 && y % 100 != 0 || y % 400 == 0) && m >= 3)
		days++;
	//3 加上y年m月的当月天数 1
	days = days + 1;
	xq = days % 7;
	//		星期一	星期二	星期三	……			星期日
	//xq		1		2		3		4	5	6		0
	//计算y年m月的天数 ts
	switch (m)
	{
	case 1:case 3:case 5:case 7:case 8:case 10: case 12:
		ts = 31; break;
	case 4:	case 6:	case 9:case 11:
		ts = 30; break;
	case 2:
		ts = 28; break;
	}
	if ((y % 4 == 0 && y % 100 != 0 || y % 400 == 0) && m == 2)
		ts = 29;
	for (i = 1; i <= 7; i++)
		printf("----");
	printf("\n");
	printf("           %d月\n", m);
	for (i = 1; i <= 7; i++)
		printf("----");
	printf("\n");
	//输出
	printf("SUN MON TUE WED THD FRI SAT\n");
	//输出1日之间可能的空格 4个空格为一组,xq组空格
	for (i = 1; i <= xq; i++)
		printf("    ");
	sum = xq;
	for (i = 1; i <= ts; i++)
	{
		sum++;
		printf("%2d  ", i);
		if (sum % 7 == 0)
			printf("\n");
	}
	printf("\n");
	printf("						                    \n");
	printf("						                    \n");
	printf("|----------------------------------------------|\n");
	printf("|--------------按任意键回到主菜单--------------|\n");
	printf("|----------------------------------------------|\n");
	system("pause");
}

1.3查询某天日历:

void day()
{
	int y1, y2, m1, m2, d1, d2, days1, days2, i, daysum, xingqi, a, b, F = 0;
	system("cls");//clears 作用是让屏幕清干净

	printf("|----------------------------------------------|\n");
	printf("|------前功能为查看某天日期及是否为节假日------|\n");
	printf("|----------------------------------------------|\n");

	printf("请你输入年份:");
	scanf_s("%d", &y1);
	while (y1 < 1940 || y1>2040)
	{
		printf("请重新输入正确的年份:");
		scanf_s("%d", &y1);
	}
	printf("请你输入月份 :");
	scanf_s("%d", &m1);
	while (m1 < 0 || m1>12)
	{
		printf("请重新输入正确的月份:");
		scanf_s("%d", &m1);
	}
	printf("请你输入日期 :");
	scanf_s("%d", &d1);
	while (d1 < 1 || d1>31)
	{
		printf("请重新输入正确的日期:");
		scanf_s("%d", &d1);
	}
	while (1)
	{
		if ((y1 < 1940 || y1>2040))
		{
			printf("提示:年份请输入1940年-2040年!\n ");
			printf("请重新输入正确的年份:");
			scanf_s("%d", &y1);
			continue;
		}
		else if (m1 < 1 || m1>12)
		{
			printf("提示:月份请输入1-12月!\n ");
			printf("请重新输入正确的月份:");
			scanf_s("%d", &m1);
			continue;
		}
		else if ((m1 == 1 || m1 == 3 || m1 == 5 || m1 == 7 || m1 == 8 || m1 == 10 || m1 == 12) && (d1 < 1 || d1>31))
		{
			printf("提示:大月最多有31天!\n ");
			printf("请你按xxxx/xx/xx的格式重新输入正确的年月日: ");
			scanf_s("%d/%d/%d", &y1, &m1, &d1);
			continue;
		}
		else if ((y1 < 1940 || y1>2040) || (m1 == 3 || m1 == 6 || m1 == 9 || m1 == 11) && (d1 < 1 || d1>30))
		{
			printf("提示:大月最多有31天!\n ");
			printf("请重新输入正确的日期:");
			scanf_s("%d", &d1);
			continue;
		}
		else if ((y1 < 1940 || y1>2040) || (y1 % 4 == 0 && y1 % 100 != 0 || y1 % 400 == 0) && m1 == 2 && d1 > 29)
		{
			printf("提示:闰年的2月份最多只有29天!\n ");
			printf("请重新输入正确的日期:");
			scanf_s("%d", &d1);
			continue;
		}
		else if ((y1 < 1940 || y1>2040) || !(y1 % 4 == 0 && y1 % 100 != 0 || y1 % 400 == 0) && m1 == 2 && d1 > 28)
		{
			printf("提示:平年的2月份最多只有28天!\n ");
			printf("请重新输入正确的日期:");
			scanf_s("%d", &d1);
			continue;
		}
		break;
	}
	a = m1, b = d1;
	{
		time_t timep;
		struct tm t;
		time(&timep);                                //获取系统日期和时间
		localtime_s(&t, &timep);
		y2 = 1900 + t.tm_year;//获取当前年份,从1900开始,所以要加1900
		m2 = 1 + t.tm_mon; //获取当前月份,范围是0-11,所以要加1
		d2 = t.tm_mday;//获取当前月份日数,范围是1-31
	}//获取系统日期
	days1 = 0;//计算从1-1-1到输入的年月日之间一共有多少天,初始值为0
	//1 1年到y-1之间的整年天数
	days1 = days1 + (y1 - 1) * 365;
	for (i = 1; i <= y1 - 1; i++)
		if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
			days1++;
	//2 计算y1年中1月到m1-1月之间的整月天数
	for (i = 1; i <= m1 - 1; i++)
		switch (i)
		{
		case 1:case 3:case 5:case 7:case 8:case 10:
			days1 = days1 + 31; break;
		case 4:	case 6:	case 9:case 11:
			days1 = days1 + 30; break;
		case 2:
			days1 = days1 + 28; break;
		}
	if ((y1 % 4 == 0 && y1 % 100 != 0 || y1 % 400 == 0) && m1 >= 3)
		days1++;
	//3 加上y1年m1月的当月天数 d1
	days1 = days1 + d1;
	//--------------------------------------------------------------------------------
	days2 = 0;//计算从1-1-1到当前的年月日之间一共有多少天,初始值为0
			  //1 1年到y-1之间的整年天数
	days2 = days2 + (y2 - 1) * 365;
	for (i = 1; i <= y2 - 1; i++)
		if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
			days2++;
	//2 计算y2年中1月到m2-1月之间的整月天数
	for (i = 1; i <= m2 - 1; i++)
		switch (i)
		{
		case 1:case 3:case 5:case 7:case 8:case 10:
			days2 = days2 + 31; break;
		case 4:	case 6:	case 9:case 11:
			days2 = days2 + 30; break;
		case 2:
			days2 = days2 + 28; break;
		}

	if ((y2 % 4 == 0 && y2 % 100 != 0 || y2 % 400 == 0) && m2 >= 3)
		days2++;
	//3 加上y2年m2月的当月天数 d2
	days2 = days2 + d2;
	daysum = abs(days2 - days1);
	printf("%d年%d月%d日距今天有%d天,", y1, m1, d1, daysum);
	int days;
	days = 0;//计算从1900-1-1到输入的年月日之间一共有多少天,初始值为0
	//1 1900年到y-1之间的整年天数
	days = days + (y1 - 1 - 1900 + 1) * 365;
	for (i = 1900; i <= y1 - 1; i++)
	{
		if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
			days++;
	}
	//2 计算y年中1月到m-1月之间的整月天数
	for (i = 1; i <= m1 - 1; i++)
	{
		switch (i)
		{
		case 1:case 3:case 5:case 7:case 8:case 10:
			days = days + 31; break;
		case 4:	case 6:	case 9:case 11:
			days = days + 30; break;
		case 2:
			days = days + 28; break;
		}
	}
	if ((y1 % 4 == 0 && y1 % 100 != 0 || y1 % 400 == 0) && m1 >= 3)
		days++;
	//3 加上y年m月的当月天数 1
	days = days + d1;
	xingqi = days % 7;
	switch (xingqi)
	{
	case 0:printf("星期天,"); break;
	case 1:printf("星期一,"); break;
	case 2:printf("星期二,"); break;
	case 3:printf("星期三,"); break;
	case 4:printf("星期四,"); break;
	case 5:printf("星期五,"); break;
	case 6:printf("星期六,"); break;
	}
	if (a == 1 && b == 1)
	{
		printf("元旦节\n");
		F = 1;
	}
	if (a == 5 && b == 4)
	{
		printf("青年节\n");
		F = 1;
	}
	if (a == 3 && b == 8)
	{
		printf("妇女节\n");
		F = 1;
	}
	if (a == 9 && b == 10)
	{
		printf("教师节\n");
		F = 1;
	}
	if (a == 5 && b == 1)
	{
		printf("劳动节\n");
		F = 1;
	}
	if (a == 6 && b == 1)
	{
		printf("儿童节\n");
		F = 1;
	}
	if (a == 7 && b == 1)
	{
		printf("建党节\n");
		F = 1;
	}
	if (a == 3 && b == 12)
	{
		printf("植树节\n");
		F = 1;
	}
	if (a == 8 && b == 1)
	{
		printf("建军节\n");
		F = 1;
	}
	if (a == 10 && b == 1)
	{
		printf("国庆节\n");
		F = 1;
	}
	if (F == 0)
		printf("不是节假日\n");
	printf("						                    \n");
	printf("						                    \n");
	printf("|----------------------------------------------|\n");
	printf("|--------------按任意键回到主菜单--------------|\n");
	printf("|----------------------------------------------|\n");
	system("pause");
}

系统运行结果:

1.0主菜单:

C语言课设万年历

 1.1输出某年的日历:

C语言课设万年历

 1.2输出某月的日历:

C语言课设万年历

 1.3输入年月日输出距今天还有多少天,星期几,是否是公历节日:

C语言课设万年历文章来源地址https://www.toymoban.com/news/detail-502535.html

到了这里,关于C语言课设万年历的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于AT89S52单片机的多功能电子万年历

    基于AT89S52单片机的多功能电子万年历的硬件结构和软硬件设计方法。本设计由数据显示模块、温度采集模块、时间处理模块和调整设置模块四个模块组成。系统以AT89S52单片机为控制器,以串行时钟日历芯片DS1302记录日历和时间,它可以对年、月、日、时、分、秒进行计时,

    2024年02月03日
    浏览(78)
  • 基于AT89C52单片机的多功能万年历设计

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87853675 源码获取 目 录 摘 要 1 1 方案论证 2 1.1 单片机芯片的选择方案和论证 2 1.2 显示模块选择方案和论证 2 1.3 时钟芯片的选择方案和论证 3 1.4 电路设计最终方案决定 3 2 系统的硬件设计与实现

    2024年02月07日
    浏览(44)
  • 基于单片机的电子万年历设计与制作系统(设计报告+开题中期报告+仿真文件+程序)

    摘要:本文设计实现了一种基于单片机的电子万年历设计与制作系统。该系统通过单片机的控制,实现了日期、时间和节假日等信息的显示,同时提供了闹钟、定时器和温度显示等功能。实验结果表明,该系统具有较好的稳定性和实用性,能够满足人们对万年历功能的需求。

    2024年02月04日
    浏览(46)
  • STM32制作万年历

        STM32万年历制作指南 一、概述 STM32是一种常用的微控制器,具有强大的处理能力和低功耗特性,非常适合用于制作各种电子设备。本文将介绍如何使用STM32制作一款简易的万年历,帮助您轻松查看日期、时间和农历等信息。 二、所需材料 1. STM32微控制器(建议使用STM32F

    2024年02月03日
    浏览(39)
  • 6-6 万年历显示函数

    题主为武理的学生 网上没有对应答案 仅以学习用途上传 设计一个万年历,当用户输入年份和月份时,显示这个月的日历表。程序重点是这个月的第一天是星期几和这个月有几天,有了这两个值,只需通过排列,就可以显示这个日历。程序要求用户输入的年份是从1900年开始,

    2024年01月18日
    浏览(40)
  • 基于FPGA的电子万年历设计

    quartusii12.1 系统的整个结构框图:  然后,设置控制输入有5个脚,分析功能如下所示: i_Function_Controller=0 ;显示年月日 i_sel:选择需要调整的某位数字。 i_set:计数器,调整需要调整的位置的数字。 具体调整的时候,首先选择i_sel,按键按一下,需要调整的位置会移动一次,

    2024年02月03日
    浏览(86)
  • 单片机万年历实现(报告+源码)

    摘要         近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此特别适合于与控制有关的系统,越来越广泛地应用于自动控制,消费电子

    2024年02月07日
    浏览(45)
  • PTA6-6 万年历显示函数

    设计一个万年历,当用户输入年份和月份时,显示这个月的日历表。程序重点是这个月的第一天是星期几和这个月有几天,有了这两个值,只需通过排列,就可以显示这个日历。程序要求用户输入的年份是从1900年开始,已知1900年1月1日是星期一。 日历中每个具体的日期占5个

    2024年01月16日
    浏览(40)
  • 基于51单片机的万年历设计

    目  录 前言....................................................................... 1 1 绪论..................................................................... 3 1.1 课题研究的背景..................................................... 3 1.2课题的研究目的与意义................................................ 3 1.3课题解决的主要内

    2024年02月02日
    浏览(46)
  • 【单片机】STM32单片机,RTC实时时钟,STM32F103C8T6,程序,万年历,数字时钟

    我以STM32F103C8T6为例,但STM32F103的RTC是通用的,STM32F103C8T6有一个原理图: https://qq742971636.blog.csdn.net/article/details/131288390 用纽扣电池给VBAT供电(要共地),即可实现掉电后依旧走时的能力。 主要特性(来源于STM32中文参考手册V10.pdf): 记得加标准库文件: 串口接收:

    2024年02月11日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包