CS61b homework2 打卡

主要考点:String类matches和split方法的运用,正则表达式的运用。

判断闰年,计算天数等算法。代码如下:

import java.io.*;

public class Date {
    private int month;
    private int day;
    private int year;

  public Date(int month, int day, int year) {
      if(!isValidDate(month,day,year))
          System.exit(0);
      this.month=month;
      this.day=day;
      this.year=year;
  }

  public Date(String s) {
      if(s.matches("\\d{1,2}\\/\\d{1,2}\\/\\d{1,4}")){
          String[]o=s.split("/");
          if(isValidDate(Integer.parseInt(o[0]),Integer.parseInt(o[1]),Integer.parseInt(o[2])))
          {
              month=Integer.parseInt(o[0]);
              day=Integer.parseInt(o[1]);
              year=Integer.parseInt(o[2]);
          }else
              System.exit(0);

      }else
          System.exit(0);

  }

  public static boolean isLeapYear(int year) {
    if(year%4==0&&year%100!=0||year%400==0)
        return true;
    else return false;
  }

  public static int daysInMonth(int month, int year) {
      if(month<1||month>12)
          System.exit(0);
    switch(month){
    case 1:return 31;
    case 2:if(isLeapYear(year))return 29;
    else return 28;
    case 4:
    case 6:
    case 9:
    case 11:
        return 30;
    default:return 31;
         }
  }

  public static boolean isValidDate(int month, int day, int year) {
    if(day>daysInMonth(month,year))return false;
    else return true;
  }

  public String toString() {
    return(this.month+"/"+this.day+"/"+this.year);
  }

  public boolean isBefore(Date d) {
    if(this.year<d.year)return true;
    else if(this.year==d.year&&this.month<d.month)return true;
    else if(this.year==d.year&&this.month==d.month&&this.day<d.day)return true;
    else return false;
  }

  public boolean isAfter(Date d) {
    if(isBefore(d))return false;
    else if(this.year==d.year&&this.month==d.month&&this.day==d.day)
        return false;
    else return true;
  }

  public int dayInYear() {
      int total=0;
    for(int i=1;i<month;i++)
        total+=daysInMonth(i,this.year);
    total+=this.day;
    return total;
  }

  public int difference(Date d) {
    if(isAfter(d)){
        int total = 0;
        for(int i=d.year;i<this.year;i++){
            if(isLeapYear(i))total+=366;
            else total+=365;
        }
        int dayDifference=this.dayInYear()-d.dayInYear();
        total+=dayDifference;
        return total;
    }else if(isBefore(d)){
        return -d.difference(this);
    }
    else return 0;
  }

  public static void main(String[] argv) {
    System.out.println("\nTesting constructors.");
    Date d1 = new Date(1, 1, 1);
    System.out.println("Date should be 1/1/1: " + d1);
    d1 = new Date("2/4/2");
    System.out.println("Date should be 2/4/2: " + d1);
    d1 = new Date("2/29/2000");
    System.out.println("Date should be 2/29/2000: " + d1);
    d1 = new Date("2/29/1904");
    System.out.println("Date should be 2/29/1904: " + d1);

    d1 = new Date(12, 31, 1975);
    System.out.println("Date should be 12/31/1975: " + d1);
    Date d2 = new Date("1/1/1976");
    System.out.println("Date should be 1/1/1976: " + d2);
    Date d3 = new Date("1/2/1976");
    System.out.println("Date should be 1/2/1976: " + d3);

    Date d4 = new Date("2/27/1977");
    Date d5 = new Date("8/31/2110");

    System.out.println("\nTesting before and after.");
    System.out.println(d2 + " after " + d1 + " should be true: " +
                       d2.isAfter(d1));
    System.out.println(d3 + " after " + d2 + " should be true: " +
                       d3.isAfter(d2));
    System.out.println(d1 + " after " + d1 + " should be false: " +
                       d1.isAfter(d1));
    System.out.println(d1 + " after " + d2 + " should be false: " +
                       d1.isAfter(d2));
    System.out.println(d2 + " after " + d3 + " should be false: " +
                       d2.isAfter(d3));

    System.out.println(d1 + " before " + d2 + " should be true: " +
                       d1.isBefore(d2));
    System.out.println(d2 + " before " + d3 + " should be true: " +
                       d2.isBefore(d3));
    System.out.println(d1 + " before " + d1 + " should be false: " +
                       d1.isBefore(d1));
    System.out.println(d2 + " before " + d1 + " should be false: " +
                       d2.isBefore(d1));
    System.out.println(d3 + " before " + d2 + " should be false: " +
                       d3.isBefore(d2));

    System.out.println("\nTesting difference.");
    System.out.println(d1 + " - " + d1  + " should be 0: " +
                       d1.difference(d1));
    System.out.println(d2 + " - " + d1  + " should be 1: " +
                       d2.difference(d1));
    System.out.println(d3 + " - " + d1  + " should be 2: " +
                       d3.difference(d1));
    System.out.println(d3 + " - " + d4  + " should be -422: " +
                       d3.difference(d4));
    System.out.println(d5 + " - " + d4  + " should be 48762: " +
                       d5.difference(d4));
  }
}

运行结果:

时间: 2024-12-30 01:06:05

CS61b homework2 打卡的相关文章

CS61b lab4打卡

DnodeList1:构造DoubleList insert及remove的代码: public void insertFront(int i) { if(size==0){ head=new DListNode1(i); tail=head; size=1; } else if(size==1){ head=new DListNode1(i); head.next=tail; tail.prev=head; size=2; } else{ DListNode1 node=new DListNo

iOS开发——项目实战总结&amp;UITableView性能优化与卡顿问题

UITableView性能优化与卡顿问题 1.最常用的就是cell的重用, 注册重用标识符 如果不重用cell时,每当一个cell显示到屏幕上时,就会重新创建一个新的cell 如果有很多数据的时候,就会堆积很多cell.如果重用cell,为cell创建一个ID 每当需要显示cell 的时候,都会先去缓冲池中寻找可循环利用的cell,如果没有再重新创建cell 2.避免cell的重新布局 cell的布局填充等操作 比较耗时,一般创建时就布局好 如可以将cell单独放到一个自定义类,初始化时就布局好

制作SD(8G)卡Linux镜像,使得ZC706开发板可以从SD卡启动进入Linux系统

转自网络,供学习记录使用,红色部分是我实验时,这篇文章和网站稍有出入的地方. 目的:制作SD(8G)卡Linux镜像,使得ZC706开发板可以从SD卡启动进入Linux系统 在http://wiki.analog.com/resources/eval/user-guides/ad-fmcomms2-ebz/quickstart/zynq(姑且把这个链接成为链接1吧)链接中找到 图1 点击绿色字体的链接,下载镜像原始文件.这里有不同时期的版本,本说明中选择 图2 下载的原始文件为:2014_R2-

cocos Creator js 房卡麻将/血战/H5四川麻将源码下载搭建

房卡麻将/血战/H5四川麻将 源码 支持iOS/Android/H5 完整源码 1.基于NODEJS+MYSQL的服务器,成熟的技术方案,高效稳定,且方便Windows开发,Linux平台布署,节约服务器运转成本. 2.采用最新版本的cocos引擎,cocos creator开发,可快速的进行界面调整.且能够快速地发布iOS,Android版本. 3.如需H5版本,只需针对H5平台进行资源优化即可. 4.成熟可靠的房卡式设计,能满足大部分用户使用体验. 5.产品经过大量测试,可以运转稳定. 测试

Cocos2d-x山西推倒胡+扣点房卡麻将下载架设教程

1.数据库还原修改后台数据库jeefwtwo 表:sys_user8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 密码(123456)修改游戏数据库 QPPlatformDB表:DataBaseInfo  SQL的地址端口账号密码表:GameRoomInfo  修改服务器的机器标示 PS,搭建的源码必须完整,本文测试源码来自 Cocos2d-x山西推倒胡+扣点房卡麻将maliwl.com 2.执行脚本每个脚本都要执

【BZOJ4942】[Noi2017]整数 线段树+DFS(卡过)

[BZOJ4942][Noi2017]整数 题目描述去uoj 题解:如果只有加法,那么直接暴力即可...(因为1的数量最多nlogn个) 先考虑加法,比较显然的做法就是将A二进制分解成log位,然后依次更新这log位,如果最高位依然有进位,那么找到最高位后面的第一个0,将中间的所有1变成0,那个0变成1.这个显然要用到线段树,但是复杂度是nlog2n的,肯定过不去. 于是我在考场上yy了一下,这log位是连续的,我们每次都要花费log的时间去修改一个岂不是很浪费?我们可以先在线段树上找到这段区间

穿越300km沙漠:卡萨帝用7星服务做实体经济升级样板

3月31日,家住新疆克拉玛依戈壁沙漠"无人区"公路守护站的刘女士购买了1台卡萨帝洗衣机,在第2天中午,卡萨帝服务工程师就将洗衣机准时送达用户家.穿越300多公里的沙漠公路.冒着零下20多度的严寒,安装师傅的汽车也已经被沙石砸损,刘女士不禁为卡萨帝的七星级服务标准竖起大拇指,而这只是卡萨帝七星级服务的其中一个缩影.其背后,是由卡萨帝完备的服务链条作为支撑的7星级高端服务体系. 七星级服务:基于传统服务的"超级服务" 在过去的很长一段时间里,产业对"服务&qu

Windows2012上如何查光纤卡HBA的WWN

解决办法有: 1.使用MS utility "fcinfo.exe" (Fibre Channel Information Tool (fcinfo))去查看HBA卡的WWN号. fcinfo工具安装到需要查看WWN号的Windows系统上,接下来在开始菜单的"运行"中键入"CMD",进入命令行模式后, 输入fcinfo就可以看到主机HBA的WWN号了. 2.经过搜索, 找到文章Find HBA and WWN Information on Wi

canvas实现移动端和PC端刮刮卡效果

<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"