美文网首页算法第四版习题讲解
算法练习(24):日期类设计(1.2.11-1.2.12)

算法练习(24):日期类设计(1.2.11-1.2.12)

作者: kyson老师 | 来源:发表于2017-09-27 12:38 被阅读190次

本系列博客习题来自《算法(第四版)》,算是本人的读书笔记,如果有人在读这本书的,欢迎大家多多交流。为了方便讨论,本人新建了一个微信群(算法交流),想要加入的,请添加我的微信号:zhujinhui207407 谢谢。另外,本人的个人博客 http://www.kyson.cn 也在不停的更新中,欢迎一起讨论

算法(第4版)

知识点

  • 日期类的设计
  • 异常处理
  • 蔡勒公式

题目

1.2.11 根据Date的API实现一个SmartDate类型,在日期非法时抛出一个异常。


1.2.11 Develop an implementation SmartDate of our Date API that raises an excep- tion if the date is not legal.

答案

分析

本人所有简书的算法文章详细分析已经移入小专栏:算法四习题详解,欢迎大家订阅

public class SmartDate {
    
    @SuppressWarnings("unused")
    private final int year;
    @SuppressWarnings("unused")
    private final int month;
    @SuppressWarnings("unused")
    private final int day;
    
    public SmartDate(int year,int month,int day) throws Exception {
        if (year < 0 || month < 0 || day < 0) {
            Exception exception = new Exception("年月日要大于0");
            throw exception;
        }
        if (month > 12) {
            Exception exception = new Exception("年份要小于等于12");
            throw exception;
        }
        
        switch (month) {
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
        case 1:{
            if (day > 31) {
                Exception exception = new Exception(month + "月小于31号");
                throw exception;
            }
        }
            break;
        case 2:{
            if (day > 29) {
                Exception exception = new Exception(month + "月小于31号");
                throw exception;
            }
            
            int leapYear = year % 4;
            if (leapYear != 0) {
                if (day > 28) {
                    Exception exception = new Exception(month + "月小于29号");
                    throw exception;
                }
            }
            
        }
            break;
        case 4:
        case 6:
        case 9:
        case 11:{
            if (day > 30) {
                Exception exception = new Exception(month + "月小于30号");
                throw exception;
            }
        }
            break;
            

        default:
            break;
        }
        

        
        this.day    = day;
        this.year   = year;
        this.month  = month;
    }
    

    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        SmartDate date = new SmartDate(2007, 1, 50);
    }

}

代码索引

SmartDate1.java

视频讲解

点此观看分析视频

题目

1.2.12 为SmartDate添加一个方法dayOfTheWeek(),为日期中每周的日返回Monday、Tuesday、Wednesday、Thursday……假定是21世纪


1.2.12 Add a method dayOfTheWeek() to SmartDate that returns a String value Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, or Sunday, giving the ap- propriate day of the week for the date. You may assume that the date is in the 21st century.

答案

public class SmartDate2 {

    @SuppressWarnings("unused")
    private final int year;
    @SuppressWarnings("unused")
    private final int month;
    @SuppressWarnings("unused")
    private final int day;
    
    private static final int YEARFIRSTTWO = 20;
    private static final int DAYPERWEEK = 7;

    public SmartDate2(int year, int month, int day) throws Exception {
        if (year < 0 || month < 0 || day < 0) {
            Exception exception = new Exception("年月日要大于0");
            throw exception;
        }
        if (month > 12) {
            Exception exception = new Exception("年份要小于等于12");
            throw exception;
        }

        switch (month) {
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
        case 1: {
            if (day > 31) {
                Exception exception = new Exception(month + "月小于31号");
                throw exception;
            }
        }
            break;
        case 2: {
            if (day > 29) {
                Exception exception = new Exception(month + "月小于31号");
                throw exception;
            }

            int leapYear = year % 4;
            if (leapYear != 0) {
                if (day > 28) {
                    Exception exception = new Exception(month + "月小于29号");
                    throw exception;
                }
            }

        }
            break;
        case 4:
        case 6:
        case 9:
        case 11: {
            if (day > 30) {
                Exception exception = new Exception(month + "月小于30号");
                throw exception;
            }
        }
            break;

        default:
            break;
        }

        this.day = day;
        this.year = year;
        this.month = month;
    }
    
    public String dayOfTheWeek(){
        String resultWeek = "";
        int tempMonth = this.month;
        int tempYear = this.year;
        int tempDay = this.day;
        if (this.month == 1 || this.month == 2) {
            tempMonth += 12;
            tempYear --;
        }
        
        int y = tempYear - YEARFIRSTTWO * 100;
        int floor1 = (int) Math.floor(y/4);
        int floor2 = (int) (YEARFIRSTTWO / 4);
        int floor3 = (int) Math.floor(26 * (tempMonth+1)/10);
        
        int w = y + floor1 + floor2 -2 * YEARFIRSTTWO + floor3 + tempDay - 1;
        int key = w % DAYPERWEEK;
        
        if (key <0) {
            key = key + 7;
        }
        
        
        switch (key) {
        case 0:
            resultWeek = "星期日";
            break;
        case 1:
            resultWeek = "星期一";
            break;
        case 2:
            resultWeek = "星期二";
            break;
        case 3:
            resultWeek = "星期三";
            break;
        case 4:
            resultWeek = "星期四";
            break;
        case 5:
            resultWeek = "星期五";
            break;
        case 6:
            resultWeek = "星期六";
            break;

        default:
            break;
        }
        
        return resultWeek;
    }
    
    public String toString(){
        
        return ""+ month + "/" + day + "/" + year;
    }

    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        SmartDate2 date = new SmartDate2(2012, 2, 28);
        String week = date.dayOfTheWeek();
        System.out.println( date + " is :" + week);
    }

}

代码索引

SmartDate2.java

视频讲解

点此观看分析视频

注意

这里的SmartDate1,SmartDate2,实现还不够完善,会在下一篇文章
算法练习(25):Transaction(1.2.13-1.2.14)中进行更改。

广告

我的首款个人开发的APP壁纸宝贝上线了,欢迎大家下载。

本人所有简书的算法文章已经移入小专栏:算法四习题详解,欢迎大家订阅

相关文章

  • 算法练习(24):日期类设计(1.2.11-1.2.12)

    本系列博客习题来自《算法(第四版)》,算是本人的读书笔记,如果有人在读这本书的,欢迎大家多多交流。为了方便讨论,本...

  • JavaSE之日期数值相关类

    Date类(java.util.date) SimpleDateFormat日期转换类 练习题 Math类

  • 递归算法设计

    递归是程序设计中一个很重要的课题。用递归技术设计的算法简单明了。递归算法的设计与分析是算法设计与分析的一大类。 首...

  • 免费区块链技术公开课 | 智能合约设计中的常用算法

    智能合约设计中的常用算法,周日2月24日 20:00

  • 算法练习(25):Transaction类设计(1.2.13-1

    本系列博客习题来自《算法(第四版)》,算是本人的读书笔记,如果有人在读这本书的,欢迎大家多多交流。为了方便讨论,本...

  • 第八章 类(I)

    1.日期类【问题描述】设计一个日期类(Date),用来实现日期的操作。包括一个空构造函数,三个成员函数,其余所需自...

  • JavaScript设计模式——策略模式

    策略模式是JavaScript设计模式中行为型的设计模式;定义: 定义一系列算法,并将这些算法各自封装成策略类(方...

  • C++——类和对象的基本概念与用法

    结构化程序设计:程序=数据结构+算法 面向对象的程序设计:程序=类+类+…… 从事物的性质进行抽象,抽象出一个类,...

  • 练习笔记

    练习200个基本数据机构及算法问题 解答思路: 分析问题的解决方案; 设计解决问题的方法及结构; 设计使用的算法及...

  • Strategy 策略模式

    设计原则学习笔记 设计模式学习笔记 作用 将算法封装起来,使对象可以在不同情况,使用不同算法。 类图 Java实...

网友评论

  • Jaren_lei:private static final int YEARFIRSTTWO = 20; 这个是干啥用的,写点注释,要不看不懂了
    Jaren_lei:@算法之路 看视频太耗费时间,我在上班也不方便看
    kyson老师:@Jaren_lei 不过你不会看视频嘛G Master?
    kyson老师:@Jaren_lei 好的 果然G大师

本文标题:算法练习(24):日期类设计(1.2.11-1.2.12)

本文链接:https://www.haomeiwen.com/subject/myquextx.html