C语言实现日历

目录

1.准备阶段

cal.h:

2.分析 

3.功能简介

4.菜单和逻辑

text.c

5.cal.c

蔡勒公式函数

查询天的函数

查询月份的函数

6.效果检测


1.准备阶段

text.c: 测试游戏的逻辑。

cal.c:游戏相关函数的实现。

cal.h:游戏相关的函数声明,头文件包含,符号声明。

cal.h:

#pragma once
//头文件的包含
#include <stdio.h>
#include <stdlib.h>
//函数的声明
void my_day();//查询某天信息
void my_month();//查询某月信息

2.分析 

 1.怎样计算某一个日子是星期几:

可以了解下“蔡勒公式 ”,蔡勒公式,是一个计算星期的公式,随便给一个日期,就能用这个公式推算出是星期几。


w:星期; w对7取模得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六

c:c = year / 100; 

y:年,y = year - c * 100

m:月(m大于等于3,小于等于14,在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算,输出的时候做些处理即可)

d:日


公式:w = y + [y / 4] + [c / 4] - 2c + [26(m + 1) / 10] + d - 1;


注意:1,2月要当成上一年的13,14月计算;计算出的w<0时,循环+=7,刚刚>0时在取余才是正确答案。

3.功能简介

1.查询某一天,输入年.月.日,输出这个日期是星期几。

2.查询某一月,输入年.月,输出这个月一共有多少天,和整月的信息。

 

4.菜单和逻辑

简单的日历菜单界面,不同的选择执行不同的效果。

text.c

void menu()
{
	printf("*************************\n");
	printf("******** 1.查询 **********\n");
	printf("******** 0.退出 **********\n");
	printf("*************************\n");

}
void menu2()
{
	printf("--------- CALENDAR -----\n");
	printf("******** 1.查询天 *******\n");
	printf("******** 2.查询整月 *****\n");
	printf("******** 0.返回  *******\n");
	printf("------------------------\n");
}

int main()
{
	int change = 0;
	int change2 = 0;
	do
	{
		
		menu();
		printf("请选择:");
		scanf("%d",&change);
		switch (change)
		{
		case 1:
			do
			{
				menu2();
				printf("请选择");
				scanf("%d",&change2);	
				system("cls");
				switch (change2)
				{
					
				case 1:
					/*printf("查询天\n");*/
					my_day();
					break;
				case 2:
					//printf("查询月\n");
					my_month();
					break;
					
				case 0:
					printf("返回\n");
					break;
				default:
					printf("请重新输入:\n");
				}
				
			} while (change2);
			
			break;
		case 0:
			printf("退出!\n");
			break;
		default:
			printf("请重新输入!\n");
		}
		system("cls");
	}while(change);
	return 0;
}

效果:

5.cal.c

头文件:#include "cal.h"

蔡勒公式函数

参数:年 月 日

返回值:w(0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六)

注意:当月份为1、2月时,要进行判断,改按照13、14月进行计算,输出的时候在调整回来。

int judge(int year, int month, int n)
{
	//菜勒公式判断今天是星期几
	if (month == 1 || month == 2)
	{
		year -= 1;
		month += 12;
	}
	int c = year / 100;
	int y = year - c * 100;
	int d = n;
	int m = month;
	//w = y + [y / 4] + [c / 4] - 2c + [26(m + 1) / 10] + d - 1
	int w = (y + y / 4 + c / 4 + -2 * c + 26 * (m + 1) / 10 + d - 1);
	while (w < 0)
	{
		w += 7;
	}
	w %= 7;
	if (month > 12)
	{
		year += 1;
		month -= 12;
	}
	if (0 == w)
	{
		w = 7;
	}
	return w;
}

查询天的函数

主要是借助judge()函数进行计算,根据返回的w的值判断这个日期是星期几。

void my_day()
{
	int year = 0;
	int month = 0;
	int day = 0;
	//输入年月日
	printf("--------- CALENDAR ---------\n");
	printf("请输日期:年.月.日:>");
	while (scanf("%d %d %d", &year, &month, &day) != EOF)
	{
		int w = judge(year, month, day);
		if (7 == w)
		{
			printf("%d年%d月%d日是:星期(日)\n", year, month, day);
		}
		else
		{
			printf("%d年%d月%d日是:星期(%d)\n", year, month, day, w);
		}
		printf("*********祝您生活愉快!********\n");
	}
}

查询月份的函数

1.判断平年、闰年,4年一润并且百年不润,每400年再润一次。闰年的2月29天,平年的2月28天。

2.整月的信息打印,调用judge()函数,计算每个月份的1号是星期几,根据计算决定1号的起始位置,在根据这个月份有多少天在屏幕上打印。

//判断月
void my_month()
{
	//输入年月
	int year = 0;
	int month = 0;
	int  ord_year_month[13] = { 0, 31,28,31,30,31,30,31,31,30,31,30,31 };
	int leap_year_month[13] = { 0, 31,29,31,30,31,30,31,31,30,31,30,31 };
	int* p_ord = ord_year_month; 
	int* p_leap = leap_year_month;
	int tmp = 0;
	printf("-------------------------------------\n");
	printf("请输入你要查询的:年.月:>\n");
	while ((scanf("%d %d", &year, &month)) != EOF)
	{
		//闰年
		if ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0))
		{
			printf("%d年%d月一共有%d天\n", year, month, *(p_leap + month));
			tmp = *(p_leap + month);
		}
		//平年
		else
		{
			printf("%d年%d月一共有%d天:\n", year, month, *(p_ord + month));
			tmp = *(p_ord + month);

		}
		//判断这个月的1号
		int one = judge(year, month, 1);
		//printf("%d\n",one);
		printf("------------ 小张日历--------------\n");
		
		//输出这个月的信息
		//创建数组
		int arr[5][7] = { 0 };
		printf("  一  二  三  四  五  六  日  \n");
			int i = 0;
			int j = 0;
			int tmp2 = 0;
			for (i = 0; i < 1; i++)
			{
				for (j = 0; j < 7; j++)
				{
					int a = 0;
					int b = 1;
					while (a < 7)
					{
						if (a < one - 1)
						{
							arr[0][a] = '    ';
							
						}
						if (a >= one-1)
						{
							arr[0][a] = b++;	
						}
						a++;
					}
					tmp2 = b;
					}
			}
			//打印月份的第一行
			for (i = 0; i < 1; i++)
			{
				for (j = 0; j < 7; j++)
				{
					if (arr[i][j] == '    ')
					{
						printf(" %2c ",arr[i][j]);
					}
					else
					{
						printf(" %2d ",arr[i][j]);
					}
				}
					
			}
			printf("\n");
			for (i = 0; i < 5; i++)
			{
				for (j = 0; j < 7; j ++)
				{
					if (tmp2 <= tmp)
					{
						arr[i][j] = tmp2++;
						
					}
				}
			}
			//打印月份的后5行
			for (i = 0; i < 5; i++)
			{
				for (j = 0; j < 7; j++)
				{
					if (arr[i][j] != 0)
					{
						printf(" %2d ",arr[i][j]);
					}
				}
				printf("\n");
			}
			printf("------------ 小张日历--------------\n");

	}

}

6.效果检测

检测天

查询:1999年2月4日、2001年10月3日

检测月份

查询:2008年2月、1997年7月

 

经过测试没有发现问题,简易版的日历就写好了。发现错误的小伙伴可以私信我及时改正!

  • 16
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值