C语言实现简易万年历:包含闰年判断和月份显示

要编写一个简明的万年历程序(C语言),我们需要考虑几个关键点:

图片[1]_C语言实现简易万年历:包含闰年判断和月份显示_知途无界
  1. 闰年的判断:公历年份是4的倍数的,一般是闰年;但公历年份是整百年份的,必须是400的倍数才是闰年。
  2. 每月天数的确定:非闰年2月有28天,闰年2月有29天;其他月份的天数是固定的。
  3. 用户输入:通常需要用户输入年份和月份来查看该月的日历。

下面是一个简单的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是假设的,实际中需要通过更复杂的逻辑来正确计算
// 这里仅为了展示基本框架
#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
喜欢就点个赞,支持一下吧!
点赞64 分享
To the path of timber, iron and steel will never regret bright spray of molten steel was abandoned.
为了走上成材的道路,钢铁决不惋惜璀璨的钢花被遗弃
评论 抢沙发
头像
欢迎您留下评论!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容