Java程序题目2:日历打印

题目描述:
设计一个日历类,定义一个构造法,输入年月后能够构造一个日历对象并打印对象显示以下效果:
那么,我们来分析一下这个程序应该怎么编写:

有输入模块(用于记录输入的年月)
有一个构造的模板类(即日历)
要有对于不同年月的日期的计算(即该月第一天是星期几)
打印输出

接下来,把对应的模块一步一步来实现。

Step1:输入模块的实现
在Java中,我们可以有以下几种方式来实现对数据的输入(目前仅考虑键盘输入,不考虑I/O流):Scanner、System、命令行、JOptionPane,我们在问题中也只是输入表示年月的数字,所以使用Scanner就可以满足要求。
 

import java.util.Scanner;

        Scanner reader = new Scanner(System.in);
        System.out.print("年: ");
        int year = reader.nextInt();

        System.out.print("月: ");
        int month = reader.nextInt();

在这里,我们载入了Scanner,创建了一个reader对象,用它来实现对于年月的输入。

那么问题来了:我们都知道年与月都是整数,且year和month也定义为了int类。如果用户输入了非整数内容又该怎么办?
 

所以我们应该也添加一个能够处理异常输出的模块来应对。在这里,笔者使用了InputMismatchException来实现对异常输入的监控以及返回:
 

package edu.java.homework.chapter;

import java.util.InputMismatchException;
import java.util.Scanner;

public class Calender {
    public static final String ANSI_RESET = "\u001B[0m";
    public static final String ANSI_RED = "\u001B[31m";
    public void work1() {
        try{
            Scanner reader = new Scanner(System.in);
            System.out.print("年: ");
            int year = reader.nextInt();

            System.out.print("月: ");
            int month = reader.nextInt();

        } catch (InputMismatchException e) {
            System.out.println(ANSI_RED + "Warning! \nError type: Input error\nPlease enter the correct operation code!" + ANSI_RESET);
            work1();
    }
}
}

到此,我们就已经完成了输入模块的编写,第一步顺利完成。

Step2:有一个构造的模板类(即日历)

分析:对于一个日历类,它应该有:年、月的属性,以及获取该月天数、该月第一天星期几、打印输出的方法。

那么,开始构造:

            Calendar calendar = Calendar.getInstance();
            calendar.set(year, month - 1, 1);

            int daysInMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);

            int firstDayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);

事实上,在Java当中本身就存在一个日历类Calendar,它继承于DateFromat类,所以构造时有许多内容都是现成的,我们只需要调用即可:

import java.util.Calendar;

Step3:要有对于不同年月的日期的计算(即该月第一天是星期几)

同上一步所说,我们只需要调用系统里面拥有的函数即可(详情请见第二步后两行函数)

Step4:打印输出

到此,我们以及完成了基本任务,接下来就是完成日历的输出与显示
 

            System.out.println("\n");
            System.out.println("------------"+ year + "年" + month + "月" + "------------");

            System.out.println("\nSun Mon Tue Wed Thu Fri Sat");

            for (int i = 1; i < firstDayOfWeek; i++) {
                System.out.print("    ");
            }

            for (int day = 1; day <= daysInMonth; day++) {
                System.out.printf("%3d ", day);
                if ((firstDayOfWeek + day - 1) % 7 == 0) {
                    System.out.println();
                }
            }

一个日历类的制作就完成了。以下为完整代码:
 

package edu.java.homework.chapter;

import java.util.Calendar;
import java.util.InputMismatchException;
import java.util.Scanner;

public class Calender {
    public static final String ANSI_RESET = "\u001B[0m";
    public static final String ANSI_RED = "\u001B[31m";
    public void work1() {
        try{
            Scanner reader = new Scanner(System.in);
            System.out.print("年: ");
            int year = reader.nextInt();

            System.out.print("月: ");
            int month = reader.nextInt();

            Calendar calendar = Calendar.getInstance();
            calendar.set(year, month - 1, 1);

            int daysInMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);

            int firstDayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
            System.out.println("\n");
            System.out.println("------------"+ year + "年" + month + "月" + "------------");

            System.out.println("\nSun Mon Tue Wed Thu Fri Sat");

            for (int i = 1; i < firstDayOfWeek; i++) {
                System.out.print("    ");
            }

            for (int day = 1; day <= daysInMonth; day++) {
                System.out.printf("%3d ", day);
                if ((firstDayOfWeek + day - 1) % 7 == 0) {
                    System.out.println();
                }
            }
        } catch (InputMismatchException e) {
            System.out.println(ANSI_RED + "Warning! \nError type: Input error\nPlease enter the correct operation code!" + ANSI_RESET);
            work1();
    }
}
}

在此声明:本专栏所有程序都基于完整的管理系统,想要直接照搬复制的请阅读第一篇文章建立管理方式。Java程序题目1:作业管理系统

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白苏文

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值