素材巴巴 > 程序开发 >

根据年月输出该月的日历

程序开发 2023-09-17 13:02:33

题目

        写一个程序,根据年份和月份,输出这个月的日历,

准备

        平年的2月份是28天,闰年的二月份是29天。

        日历是有周的概念的,几号得与周几对应上(比如23年4月1号是周六)。

思路

        首先根据用户输入的年月确定这个月有多少天,其次需要确定这个月的1号对应周几。

实现

        C/C++代码如下:

#include // 数组用来存每个月包含的天数,这里存的是平年的天数
 // 数组以0开头,月份以1开头,不想再去考虑数组与月份的对应关系,索性弃掉数组位置为0的那块空间吧 
 const int DAY_OF_MONTH[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};// 从1900年算起吧,格林威治时间,那年的1月1日恰好是周一,当然这个数可以改成1,代表公元1年 
 const int START_YEAR = 1900; 
 // 符合规范的话代码内最好不出现字面量,当然学习中的话无所谓,这里我将开始月份定义成常量了 
 const int START_MONTH = 1; // 该函数根据年月,返回该月包含的天数 
 int getDaysOfCurrentMonth(int year, int month){// 判断月份是否为2并且年份是否为闰年,是的话返回29,方法结束 if((month == 2) && ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0))){return 29;}// 不是的话会执行到该处,直接返回月份数组中的天数。 return DAY_OF_MONTH[month];
 }//  该函数根据年月,返回这个月的前一天排到了周几 
 int getWeekOfBefore(int year, int month){int days = 0;// 先按年份累加天数 for(int y = START_YEAR; y < year; y++){if((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)){days += 366;} else {days += 365;}} // 再按月份累加天数for(int m = START_MONTH; m < month; m++){days += getDaysOfCurrentMonth(year, m);}// 总天数与7取余返回的是最后一天占一周中的周几return days % 7;
 }// 主函数用于测试,重点是上面的两个函数 
 // 该函数内写的可能有点复杂,但主要就是用来输出显示的
 int main(){while(1){int year, month, day;printf("请输入年:");scanf("%d", &year); // 输入函数 printf("请输入月:");scanf("%d", &month); // 输入函数 int daysOfCurrentMonth = getDaysOfCurrentMonth(year, month); // 获取该月有多少天 int weekOfBefore = getWeekOfBefore(year, month); // 获取该月的前一天排在了周几 printf("  Mon  Tue  Wed  Thu  Fri  Sat  Sun");printf("n-----------------------------------n");int formatVar = 0; // 用来控制换行,每7个单位换一次行 for(int space = 1; space <= weekOfBefore; space++){printf("     "); // 用五个空格占位 formatVar++;}for(int day = 1; day <= daysOfCurrentMonth; day++){printf("%5d", day);formatVar++;if(formatVar % 7 == 0 && day != daysOfCurrentMonth){printf("n");}}printf("n-----------------------------------nn");}
 }

         Java代码如下:

public class Test02 {// 数组用来存每个月包含的天数,这里存的是平年的天数// 数组以0开头,月份以1开头,不想再去考虑数组与月份的对应关系,索性弃掉数组位置为0的那块空间吧static final int[] DAY_OF_MONTH = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};// 从1900年算起吧,格林威治时间,那年的1月1日恰好是周一,当然这个数可以改成1,代表公元1年static final int START_YEAR = 1900;// 符合规范的话代码内最好不出现字面量,当然学习中的话无所谓,这里我将开始月份定义成常量了static final int START_MONTH = 1;// 该方法根据年月,返回该月包含的天数static int getDaysOfCurrentMonth(int year, int month){// 判断月份是否为2并且年份是否为闰年,是的话返回29,方法结束if((month == 2) && ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0))){return 29;}// 不是的话会执行到该处,直接返回月份数组中的天数。return DAY_OF_MONTH[month];}//  该方法根据年月,返回这个月的前一天排到了周几static int getWeekOfBefore(int year, int month){int days = 0;// 先按年份累加天数for(int y = START_YEAR; y < year; y++){if((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)){days += 366;} else {days += 365;}}// 再按月份累加天数for(int m = START_MONTH; m < month; m++){days += getDaysOfCurrentMonth(year, m);}// 总天数与7取余返回的是最后一天占一周中的周几return days % 7;}// 主方法用于测试,重点是上面的两个函数// 该方法内写的可能有点复杂,但主要就是用来输出显示的public static void main(String[] args) {Scanner scanner = new Scanner(System.in);while(true){int year, month, day;System.out.print("请输入年:");year = scanner.nextInt();System.out.print("请输入月:");month = scanner.nextInt();int daysOfCurrentMonth = getDaysOfCurrentMonth(year, month); // 获取该月有多少天int weekOfBefore = getWeekOfBefore(year, month); // 获取该月的前一天排在了周几System.out.print("  Mon  Tue  Wed  Thu  Fri  Sat  Sun");System.out.print("n-----------------------------------n");int formatVar = 0; // 用来控制换行,每7个单位换一次行for(int space = 1; space <= weekOfBefore; space++){System.out.print("     "); // 用五个空格占位formatVar++;}for(int d = 1; d <= daysOfCurrentMonth; d++){System.out.printf("%5d", d);formatVar++;if(formatVar % 7 == 0 && d != daysOfCurrentMonth){System.out.print("n");}}System.out.print("n-----------------------------------nn");}}}

结果

        

 总结

        无。


标签:

素材巴巴 Copyright © 2013-2021 http://www.sucaibaba.com/. Some Rights Reserved. 备案号:备案中。