目录
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月
经过测试没有发现问题,简易版的日历就写好了。发现错误的小伙伴可以私信我及时改正!