1、设计2目的
选用C语言或Java语言作为编程工具。于C语言而言,领会结构化的程序设计思想,深入掌握选择控制结构、循环控制结构的应用,掌握函数的调用。于Java而言,通过查阅API,深入了解swing的相关概念及容器的使用,了解GUI中的布局管理器,掌握GUI中的事件处理机制,实现可以交互的万年历设计。
2、设计2正文
2.1 实验内容
运用C语言或Java语言编程实现一款简单万年历。要求输出的界面尽可能整齐、美观,符合万年历显示规范。具体功能如下:
- 输入年月日,计算相应日期是星期几。
- 输入年月,输出相应月份的日历。
- 输入年份,输出该年所有日历。
- 具有退出功能。
2.2 实验分析
本设计采用C语言进行编写。
根据设计要求将程序分为四个模块,分别是计算星期几、打印月历、打印年历和退出功能,并且因为年份分为闰年和平年,因此还设计了一个函数用来判断闰年和平年。

2.3 实验结果与测试



代码展示:
#include <stdio.h>
int days_of_month[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
// 计算某一天是星期几
int dayOfWeek(int year, int month, int day) {
if(year>=1900&&year<=2024&&month>=1&&month<=12&&day>=1&&day<=days_of_month[month]){ //判断日期是否合法
if (month == 1 || month == 2) {
month += 12;
year--;
}
int c = year / 100;
year %= 100;
int week = year + year / 4 + c / 4 - 2 * c + 26 * (month + 1) / 10 + day - 1;
week = (week % 7 + 7) % 7;
return week;
}
else{
printf("日期错误,请重新输入\n");
return 0; //函数有返回值
}
}
// 输出某年某月的日历
void printMonth(int year, int month) {
if(year>=1900&&year<=2024&&month>=1&&month<=12){ //判断日期是否合法
if ((year%4==0&&year%100!=0)||year%400==0) //判断是否为闰年
{
days_of_month[2] = 29;
}
int week = dayOfWeek(year, month, 1);//一号是星期几
printf(" %d年%d月\n", year, month);
printf(" 日 一 二 三 四 五 六\n");
for (int i = 0; i < week; i++)
{
printf(" ");//一号前面都是空格
}
for (int i = 1; i <= days_of_month[month]; i++)//月份天数
{
printf("%3d ", i);
if ((i + week) % 7 == 0)
{
printf("\n");
}
}
printf("\n");
}
else
printf("日期错误,请重新输入\n");
}
// 输出某年的日历
void printYear(int year) {
if(year>=1900&&year<=2024){ //判断日期是否合法
for (int i = 1; i <= 12; i ++)
{
printf("\n");
printMonth(year, i );
}
}
else
printf("日期错误,请重新输入\n");
}
int main() {
int year, month, day, week;
while (1) {
printf("1. 输入年月日,计算星期几\n");
printf("2. 输入年月,输出月份日历\n");
printf("3. 输入年份,输出该年所有日历\n");
printf("4. 退出\n");
int x;
scanf("%d", &x);
if (x==1)
{
printf("请输入年月日,用空格分隔:");
scanf("%d%d%d", &year, &month, &day);
week = dayOfWeek(year, month, day);
switch (week)
{
case 0:
printf("%d年%d月%d日是星期日\n",year,month,day);
break;
case 1:
printf("%d年%d月%d日是星期一\n",year,month,day);
break;
case 2:
printf("%d年%d月%d日是星期二\n",year,month,day);
break;
case 3:
printf("%d年%d月%d日是星期三\n",year,month,day);
break;
case 4:
printf("%d年%d月%d日是星期四\n",year,month,day);
break;
case 5:
printf("%d年%d月%d日是星期五\n",year,month,day);
break;
case 6:
printf("%d年%d月%d日是星期六\n",year,month,day);
break;
}
}
else if (x==2)
{
printf("请输入年月,用空格分隔:");
scanf("%d %d", &year, &month);
printMonth(year, month);
}
else if (x==3)
{
printf("请输入年份:");
scanf("%d", &year);
printYear(year);
}
else if (x==4)
{
printf("谢谢使用!");
break;
}
else
{
printf("请输入正确的数字\n");
}
printf("\n");
}
return 0;
}
初版代码:
#include <stdio.h>
// 计算某一天是星期几
int dayOfWeek(int year, int month, int day) {
if (month == 1 || month == 2) {
month += 12;
year--;
}
int c = year / 100;
year %= 100;
int week = year + year / 4 + c / 4 - 2 * c + 26 * (month + 1) / 10 + day - 1;
week = (week % 7 + 7) % 7;
return week;
}
// 判断是否为闰年
int isLeap(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);//是则返回true
}
// 输出某年某月的日历
void printMonth(int year, int month) {
int days_of_month[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
if (isLeap(year)) {
days_of_month[2] = 29;
}
int week = dayOfWeek(year, month, 1);
printf(" %d年%d月\n", year, month);
printf("Sun Mon Tue Wed Thu Fri Sat\n");
for (int i = 0; i < week; i++) {
printf(" ");
}
for (int i = 1; i <= days_of_month[month]; i++) {
printf("%3d ", i);
if ((i + week) % 7 == 0) {
printf("\n");
}
}
printf("\n");
}
// 输出某年的日历
void printYear(int year) {
for (int i = 1; i <= 12; i ++) {
printf("\n");
printMonth(year, i );//调用月份
}
}
int main() {
int year, month, day, week;
while (1) {
printf("请选择功能:\n");
printf("1. 输入年月日,计算星期几\n");
printf("2. 输入年月,输出月份日历\n");
printf("3. 输入年份,输出该年所有日历\n");
printf("4. 退出\n");
int choice;
scanf("%d", &choice);
if (choice == 1) {
printf("请输入年月日,用空格分隔:");
scanf("%d%d%d", &year, &month, &day);
week = dayOfWeek(year, month, day);
printf("%d年%d月%d日是%s\n", year, month, day,
week == 0 ? "星期日" : week == 1 ? "星期一" : week == 2 ? "星期二" :
week == 3 ? "星期三" : week == 4 ? "星期四" : week == 5 ? "星期五" : "星期六");
} else if (choice == 2) {
printf("请输入年月,用空格分隔:");
scanf("%d%d", &year, &month);
printMonth(year, month);
} else if (choice == 3) {
printf("请输入年份:");
scanf("%d", &year);
printYear(year);
} else if (choice == 4) {
break;
} else {
printf("输入无效,请重试\n");
}
}
return 0;
}