要编写一个简明的万年历程序(C语言),我们需要考虑几个关键点:
- 闰年的判断:公历年份是4的倍数的,一般是闰年;但公历年份是整百年份的,必须是400的倍数才是闰年。
- 每月天数的确定:非闰年2月有28天,闰年2月有29天;其他月份的天数是固定的。
- 用户输入:通常需要用户输入年份和月份来查看该月的日历。
下面是一个简单的C语言实现示例:
#include <stdio.h>
// 函数声明
int isLeapYear(int year);
void printMonth(int year, int month);
int main() {
int year, month;
printf("请输入年份和月份(例如:2023 3):");
scanf("%d %d", &year, &month);
// 检查月份是否有效
if(month < 1 || month > 12) {
printf("月份输入错误!\n");
return 1;
}
printMonth(year, month);
return 0;
}
// 判断是否为闰年
int isLeapYear(int year) {
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
return 1; // 是闰年
} else {
return 0; // 不是闰年
}
}
// 打印指定年份和月份的日历
void printMonth(int year, int month) {
const int daysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int firstDayOfWeek = 1; // 假设每月的第一天是星期一,这里需要修正
int dayOfWeek, day = 1;
int days = daysInMonth[month - 1];
// 如果是闰年且是2月,则天数加1
if (month == 2 && isLeapYear(year)) {
days++;
}
// 计算第一天是星期几(这里需要更复杂的逻辑来正确计算)
// 这里简单假设为星期一,实际中可能需要查找或计算
// 打印表头
printf(" %d年%d月\n", year, month);
printf("日 一 二 三 四 五 六\n");
// 打印空格直到第一天的星期位置
for (dayOfWeek = 0; dayOfWeek < firstDayOfWeek; dayOfWeek++) {
printf(" ");
}
// 打印日历
while (day <= days) {
printf("%2d ", day);
day++;
dayOfWeek++;
if (dayOfWeek > 6) {
dayOfWeek = 0; // 重置为星期一
printf("\n");
}
}
// 如果最后一天不是星期六,则打印剩余的天数以保持格式
if (dayOfWeek != 0) {
for (; dayOfWeek <= 6; dayOfWeek++) {
printf(" ");
}
printf("\n");
}
}
// 注意:上述程序中的firstDayOfWeek是假设的,实际中需要通过更复杂的逻辑来正确计算
// 这里仅为了展示基本框架
注意:上述程序中的firstDayOfWeek
(每月第一天是星期几)是硬编码为1(星期一)的,实际中这个值需要通过某种方式(如使用Zeller’s Congruence等算法)来计算得到。此外,这个程序假定用户总是输入合法的年份和月份。
你可以根据这个基础框架继续完善,比如添加错误处理、优化用户界面等。
© 版权声明
文中内容均来源于公开资料,受限于信息的时效性和复杂性,可能存在误差或遗漏。我们已尽力确保内容的准确性,但对于因信息变更或错误导致的任何后果,本站不承担任何责任。如需引用本文内容,请注明出处并尊重原作者的版权。
THE END
暂无评论内容