c语言万年历 要求:模仿现实生活中的万年历。功能核心是判断闰年和根据给定日期计算对应星期,并按照合适的方式输出日历。 基本功能: 1.日历显示功能。根据系统日期进行初始化,如果没有任何输入则会显示系统所在月份的月历,并突出显示当前日期。此外,显示界面有用户提示指南说明部分。 2.日历查询、闰年判断功能。输入日期进行查询后将显示日期所在月份的月历,并突出显示当前日期。此外还将显示查询日期所在年份是否是闰年。 3.支持键盘操作。可通过键盘调整年、月、日,并显示调整过后的日期。还可通过键盘操作复位到系统所在日期等。 4.参数查询功能,即对输入的日期进行合法性检查。如果年份、月份或者天数不合法,查询将会被拒绝并显示提示信息。 拓展功能: 对多个日期进行输入,计算日期的间隔天数 打印对象当前数据的y年m月的月历
时间: 2024-02-16 21:05:34 浏览: 77
以下是一个简单的 C 语言万年历程序,实现了基本功能和拓展功能:
```
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 判断是否是闰年
int isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
}
// 获取某年某月的天数
int getDaysOfMonth(int year, int month) {
if (month == 2) {
return isLeapYear(year) ? 29 : 28;
} else if (month == 4 || month == 6 || month == 9 || month == 11) {
return 30;
} else {
return 31;
}
}
// 获取某年某月第一天是星期几
int getFirstDayOfWeek(int year, int month) {
struct tm time = {0};
time.tm_year = year - 1900;
time.tm_mon = month - 1;
time.tm_mday = 1;
mktime(&time);
return time.tm_wday;
}
// 输出日历
void printCalendar(int year, int month, int day) {
printf("%d年%d月\n", year, month);
printf("日 一 二 三 四 五 六\n");
int firstDayOfWeek = getFirstDayOfWeek(year, month);
int daysOfMonth = getDaysOfMonth(year, month);
int i, j, d = 1;
for (i = 0; i < 6; i++) {
for (j = 0; j < 7; j++) {
if (i == 0 && j < firstDayOfWeek) {
printf(" ");
} else if (d > daysOfMonth) {
break;
} else {
if (d == day) {
printf("\033[7m%2d\033[0m ", d);
} else {
printf("%2d ", d);
}
d++;
}
}
printf("\n");
if (d > daysOfMonth) {
break;
}
}
printf("\n");
}
int main() {
time_t now = time(NULL);
struct tm *tm = localtime(&now);
int year = tm->tm_year + 1900;
int month = tm->tm_mon + 1;
int day = tm->tm_mday;
int choice = 0;
while (1) {
printf("==========万年历==========\n");
printf("1. 日历显示\n");
printf("2. 日历查询、闰年判断\n");
printf("3. 支持键盘操作\n");
printf("4. 参数查询\n");
printf("5. 计算日期间隔天数\n");
printf("6. 打印月历\n");
printf("0. 退出\n");
printf("==========================\n");
printf("请选择功能:");
scanf("%d", &choice);
switch (choice) {
case 0:
exit(0);
case 1:
printCalendar(year, month, day);
break;
case 2: {
int y, m, d;
printf("请输入日期(yyyy mm dd):");
scanf("%d %d %d", &y, &m, &d);
if (y < 1 || m < 1 || m > 12 || d < 1 || d > getDaysOfMonth(y, m)) {
printf("输入日期不合法!\n");
break;
}
year = y;
month = m;
day = d;
printCalendar(year, month, day);
if (isLeapYear(year)) {
printf("%d年是闰年\n", year);
} else {
printf("%d年不是闰年\n", year);
}
break;
}
case 3: {
int offset;
printf("请输入偏移天数(负数表示向前):");
scanf("%d", &offset);
day += offset;
while (day < 1) {
month--;
if (month < 1) {
month += 12;
year--;
}
day += getDaysOfMonth(year, month);
}
while (day > getDaysOfMonth(year, month)) {
day -= getDaysOfMonth(year, month);
month++;
if (month > 12) {
month -= 12;
year++;
}
}
printCalendar(year, month, day);
break;
}
case 4: {
int y, m, d;
printf("请输入日期(yyyy mm dd):");
scanf("%d %d %d", &y, &m, &d);
if (y < 1) {
printf("年份不合法!\n");
} else if (m < 1 || m > 12) {
printf("月份不合法!\n");
} else if (d < 1 || d > getDaysOfMonth(y, m)) {
printf("天数不合法!\n");
} else {
printf("输入日期合法!\n");
}
break;
}
case 5: {
int y1, m1, d1, y2, m2, d2;
printf("请输入起始日期(yyyy mm dd):");
scanf("%d %d %d", &y1, &m1, &d1);
printf("请输入结束日期(yyyy mm dd):");
scanf("%d %d %d", &y2, &m2, &d2);
time_t t1 = mktime(&(struct tm){.tm_year = y1 - 1900, .tm_mon = m1 - 1, .tm_mday = d1});
time_t t2 = mktime(&(struct tm){.tm_year = y2 - 1900, .tm_mon = m2 - 1, .tm_mday = d2});
double seconds = difftime(t2, t1);
int days = (int) (seconds / (24 * 3600));
printf("日期间隔为%d天\n", days);
break;
}
case 6: {
int y, m;
printf("请输入年份和月份(yyyy mm):");
scanf("%d %d", &y, &m);
printCalendar(y, m, 0);
break;
}
default:
printf("输入有误,请重新输入!\n");
break;
}
}
return 0;
}
```
注意:这只是一个简单的实现,还有很多细节需要考虑,比如输入的年份和月份是否合法,输出的格式是否美观等等。
阅读全文