要编写一个简明的万年历程序(C语言),我们需要考虑几个关键点:
![图片[1]_C语言实现简易万年历:包含闰年判断和月份显示_知途无界](https://zhituwujie.com/wp-content/uploads/2024/07/d2b5ca33bd20240703125007.png)
- 闰年的判断:公历年份是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月,则天数加1if (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是假设的,实际中需要通过更复杂的逻辑来正确计算// 这里仅为了展示基本框架#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是假设的,实际中需要通过更复杂的逻辑来正确计算 // 这里仅为了展示基本框架#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
暂无评论内容