一亩三分地论坛

 找回密码
 获取更多干货,去instant注册!

扫码关注一亩三分地公众号
查看: 10929|回复: 388
收起左侧

Berkeley CS 61B Data Structures(in Java) Homework2 加分+讨论帖

  [复制链接] |试试Instant~ |关注本帖
jaly50 发表于 2014-5-11 17:08:37 | 显示全部楼层 |阅读模式

[其他]CS 61B Data Structures(in Java) #2 - 2014-05-13@Berkeley

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?获取更多干货,去instant注册!

x
本帖最后由 jaly50 于 2014-5-11 17:15 编辑

作业入口:http://www.cs.berkeley.edu/~jrs/61b/hw/hw2/


看完Lecture 6: Loops & arrays II 可以完成此作业。


作业要求:将date.java补充完整,使输出正确。(并自己补充isLeapYear的测试数据)


  每次作业完成奖励1学分(=50大米
This is an individual assignment; you may not share code with other
students.

课程不鼓励大家分享代码,所以我们加分的规则是晒运行成功且输出正确的图。如下:

CS 61B hw2

CS 61B hw2






hints: 可参考http://algs4.cs.princeton.edu/12oop/Date.java.html
相关链接:      

       【公开课讨论+加分总贴】:UC Berkeley CS 61B Data Structures(in Java)
       【课程网站】:http://www.cs.berkeley.edu/~jrs/61b/
       【视频网站】:【Youtube】【Youku

        【教材】:Head First Java 【中文版】【英文版

号外:程序中给出的测试数据有限,欢迎大家踊跃上传自己的测试数据!!!



评分

1

查看全部评分

阿童木 发表于 2016-2-4 22:30:33 | 显示全部楼层
本帖最后由 阿童木 于 2016-2-4 22:34 编辑

运行截图
QQ截图20160204200905.png

自我总结一下homework2里学到的东西。但想来想去还是贴出来,方便后面的同学参考~有些乱,希望不要介意1.Date类需要实现的功能:
(1)计算两个Date的时间差——方法:difference(
法1:这个要费脑,这个方法参考了前面的层主的思路,但我自己实现了代码,木有照搬他的。
如果两个年份相同,就用后面日期dayInYear减前面日期的dayInYear;
否则{
tempYear1 = previous.year; tempYear2 = later.year;
当tempYear2 - tempYear1 >1时,
{tempYear1 ++; diffDays += tempYear1的全年天数(用isLeapYear和 ? : )}
diffDays再加上later.dayInYear()加上previous全年的天数减去previous.dayInYear();}

法2:简单粗暴,不需要考虑中间复杂的计算过程和各种可能的情况,只是需要增加一个dayInAll()方法求出从A.D.1/1/1到现在的总天数。difference方法只需return days - d.days。
Added a private field days to store the number of days from Jan. 1, 1. Generate this value whenever a Date instance is created.
This would significant simplify the implemetation of methods isBefore() isAfter() and difference().
isBefore(): return days < d.days;
isAfter(): return days > d.days;
difference(): return days - d.days;

)很明显,当增加了dayInAll()方法后,代码重用度更高了。
(2)比较两个Date的大小——方法:isBefore和isAfter(根据Code Reusing的思想,isAfter里直接调用isBefore一行代码即可)
法1:见上         法2:在isBefore方法里用if-else分类讨论,isAfter里调用d.isBefore(this)即可。

2.关于日期计算的一些知识点
(1)闰年的判断:
  1. if((year%4==0&&year%100!=0)||year%400==0)    return true;
复制代码
(2)String对象的matches方法可以判断字符串与正则表达式是否匹配。
  1. if(s.matches("\\d{1,2}\\/\\d{1,2}\\/\\d{1,4}")){
复制代码
关于正则表达式http://docs.oracle.com/javase/7/docs/api/
(3)String对象的split方法可以按指定符号切割字符串并返回切割后的String数组。
(4)Integer.parseInt()方法将String转化为int
  1. String[] d=s.split("/");
  2.                   month=Integer.parseInt(d[0]);
  3.                   day=Integer.parseInt(d[1]);
  4.                   year=Integer.parseInt(d[2]);
复制代码
(5)System.exit(0);退出程序。
         而return语句是退出方法返回给调用者,只有main中的return语句才能退出整个程序。
————————
【分析】如果让我们自己写Date类的构造呢?以后要学会自己写出这样可以层层调用结构清晰的类。从程序功能入手,依次去想【这个类可以怎样被构造、需要哪些static方法来完成与对象无关的子功能、可否添加一些方法降低算法复杂度、toString()方法是否需要重写等
域:int moth,day,year;
构造函数:两个
  • 一种是由int型直接创建,一种是用String创建
static方法(想一下一个日期类需要哪些与特定(日期)对象无关的方法):
  • 判断日期是否合法——public static boolean isValidDate(int month, int day, int year);
  • 是否是闰年——public static boolean isLeapYear(int year)
  • 每个月有多少天——public static int daysInMonth(int month, int year)
普通方法:
  • 需要重写——public String toString();
  • 计算某一天是当年的第几天——public int dayInYear();
  • 自己添加的辅助方法——public int dayInAll();
  • 实现最终要求的功能——public boolean isBefore(Date d)/isAfer(Date d);和public int difference(Date d);


评分

2

查看全部评分

回复 支持 7 反对 0

使用道具 举报

zj45499 发表于 2015-1-3 20:59:32 | 显示全部楼层
本帖最后由 zj45499 于 2015-1-3 21:02 编辑

Added a private field days to store the number of days from Jan. 1, 1. Generate this value whenever a Date instance is created.
This would significant simplify the implemetation of methods isBefore() isAfter() and difference().
isBefore(): return days < d.days;
isAfter(): return days > d.days;
difference(): return days - d.days;

Screen Shot 2015-01-03 at 8.07.42 PM.png




评分

1

查看全部评分

回复 支持 3 反对 0

使用道具 举报

俘虏你的心 发表于 2015-7-2 17:41:10 | 显示全部楼层
by_lilei 发表于 2015-7-2 02:35
请问你是怎么计算从Jan.1,1到某一日期的总天数的,能说下思路吗,谢谢啦

/* This method calculated all the days from the given date to 1/1/1   *
   * */
  public int dayInAll(){
          
          int dayInAll = 0;
          
          int leapYearAmount = 0;
          
          for (int i = 1 ; i < year ; i++)
          {
                  if ( isLeapYear (i) )
                  {
                          leapYearAmount++;
                  }
          }
          
          dayInAll = ( year - 1 ) * 365 + leapYearAmount + dayInYear();
          
          return dayInAll;
          
  }
回复 支持 2 反对 0

使用道具 举报

j_jessica 发表于 2015-6-24 00:17:36 | 显示全部楼层
后来换了新算法:
如果两个年份相同,就用后面日期dayInYear减前面日期的dayInYear;
否则

tempYear1 = previous.year; tempYear2 = later.year;
当tempYear2 - tempYear1 >1时,
{tempYear1 ++; diffDays += tempYear1的全年天数(用isLeapYear和 ? : )}
diffDays再加上later.dayInYear()加上previous全年的天数减去previous.dayInYear();


这样difference里面时间只和年份差成正比,而调用dayInYear()和月份成正比,所以一共是和两个日期相差的月份成正比。原来nextDay的算法和两个日期相差的天数成正比,现在相当于原来用时的1/30。

新算法编译通过,test case全部通过。已经拿到学分,就不贴结果了,作为作业讨论放上来和大伙共享吧(没有直接贴代码,应该不算违规吧

现在写一个程序要半天,而且会有很多小错误,要修改调试才能通过。不过我相信经过练习会好起来哒~
回复 支持 2 反对 0

使用道具 举报

荷叶 发表于 2016-3-27 10:56:23 | 显示全部楼层
交作业,求加分!!
hw02.png

评分

2

查看全部评分

回复 支持 1 反对 0

使用道具 举报

何打发123 发表于 2015-3-28 16:42:56 | 显示全部楼层
de了我半天的bug啊啊啊!!! 最后发现是switch语句的default语句忘记写了。。。摔!!!!!
总结一下! 1. 不是同一天是!(this.year==d.year && this.month==d.month && this.day==d.da。。。。。开始感叹号都写到了里面。。。。
2.新学到了 String [] date=s.split("/");
以及 String.valueOf(...) 数字转为字符串。http://www.1point3acres.com/bbs/forum.php?mod=attachment&aid=MjY1MTYxfDUyM2NkYzZhMjM0MWFmNzFhYzY3MmViNDQ5MjBkNWNifDE0ODEyNDMzMzE%3D&request=yes&_f=.png

为什么只能上传50KB  每次都要调半天呜呜呜呜T T
QB20150328-1@2x.png
QB20150328-3@2x.png

评分

1

查看全部评分

回复 支持 1 反对 0

使用道具 举报

MosesZhou 发表于 2015-6-26 03:29:47 | 显示全部楼层
本帖最后由 MosesZhou 于 2015-6-26 03:31 编辑

不得不说UC Berkley 教学质量高,作业出得很有水平,把复杂的问题化成一个个小问题要你一步步解决,既使作业难度按梯度上升,又让大家熟悉把复杂问题简化成一个个简单的method,然后通过依次调用这些method解决。

这周作业不难,不过由于代码太长,又是用文本编辑器写的,没用IDE,结果因为一处少了个花括号一处多了个花括号检查了好久。不知道还要不要继续使用文本编辑器写Java代码,如果用Ecilpse写代码除了能帮忙检查括号,还能逐行Debug, 不要太方便…… 听说用文本编辑器写代码锻炼Debug能力,现在有这个必要么?
hw2_result.JPG

评分

2

查看全部评分

回复 支持 1 反对 0

使用道具 举报

小小溪 发表于 2015-1-23 03:01:00 | 显示全部楼层
不知道为什么我的图片就是不能上传 才65kb啊 。。。 不得不分成了三段上传
更多图片 小图 大图
组图打开中,请稍候......

评分

1

查看全部评分

回复 支持 1 反对 0

使用道具 举报

zxlcc 发表于 2014-8-9 10:03:54 | 显示全部楼层
zxlcc 发表于 2014-8-7 21:08
你好,斑竹,这是hw2的截图:

另外,关于isAfter用一句话写出来的话,也可以写成 : return day.isBefor ...

DamienPooh,你好。day.isBefore(this) 表示的是 day 在 this date之前,也就是this date 在day 之后,如果用 this date来调用 isAfter这个方法的话,就不需要加“!”。
回复 支持 1 反对 0

使用道具 举报

superflb 发表于 2014-5-11 20:14:57 | 显示全部楼层
回复 支持 反对

使用道具 举报

chouclee 发表于 2014-5-17 00:33:49 | 显示全部楼层
本帖最后由 chouclee 于 2014-5-17 14:11 编辑

第一次眼花了。。。没看到错误
Screenshot from 2014-05-17 14^^'.png

回复 支持 反对

使用道具 举报

melissami 发表于 2014-5-18 05:53:09 | 显示全部楼层
本帖最后由 melissami 于 2014-5-18 10:01 编辑

这次作业虽然不算难,但是好麻烦啊,要写好多个method和constructor

来贴图啦~~ homework2.PNG

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

 楼主| jaly50 发表于 2014-5-18 08:54:34 | 显示全部楼层
melissami 发表于 2014-5-18 05:53
这次作业虽然不算难,但是好麻烦啊,要写好多个method和constirutor

来贴图啦~~

小伙伴 怎么都没写IsLeapYear的测试数据
回复 支持 反对

使用道具 举报

 楼主| jaly50 发表于 2014-5-18 08:54:57 | 显示全部楼层
chouclee 发表于 2014-5-17 00:33
第一次眼花了。。。没看到错误

小伙伴怎么都没写isLeapYear的测试数据
回复 支持 反对

使用道具 举报

melissami 发表于 2014-5-18 10:09:28 | 显示全部楼层
jaly50 发表于 2014-5-18 08:54
小伙伴 怎么都没写IsLeapYear的测试数据

版主超认真的,每个小伙伴的作业都认真检查,点赞!!


小伙伴 怎么都没写IsLeapYear的测试数据



因为懒
老师没有给test case,自己就不想写了,而且太多method啦
isLeapYear
daysInMonth
isValidDate
dayInYear

这么多method,为了公平起见,都不写了o(^▽^)o
回复 支持 反对

使用道具 举报

chouclee 发表于 2014-5-18 15:01:31 | 显示全部楼层
jaly50 发表于 2014-5-18 08:54
小伙伴怎么都没写isLeapYear的测试数据

因为算difference的时候会调用isLeapYear。。。
回复 支持 反对

使用道具 举报

 楼主| jaly50 发表于 2014-5-18 18:26:01 | 显示全部楼层
chouclee 发表于 2014-5-18 15:01
因为算difference的时候会调用isLeapYear。。。

soga..也是~
回复 支持 反对

使用道具 举报

marshallou 发表于 2014-5-27 08:09:59 | 显示全部楼层
我的homework2,
hw2.png

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

galaxy2 发表于 2014-5-28 04:47:30 | 显示全部楼层
my: hw2
                  
hw2.jpg

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

Supersonics35 发表于 2014-5-28 18:55:56 | 显示全部楼层
Homework 02

                               
登录/注册后可看大图

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

朝仓音梦 发表于 2014-5-30 09:45:08 | 显示全部楼层
本帖最后由 朝仓音梦 于 2014-5-30 09:48 编辑

好吧,大家都把判断日期是否valid然后halt的部分去掉了是咩。。。。。
并求问isAfter()是怎么用一句话就写出来的
hw2.PNG

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

 楼主| jaly50 发表于 2014-5-30 23:03:46 | 显示全部楼层
朝仓音梦 发表于 2014-5-30 09:45
好吧,大家都把判断日期是否valid然后halt的部分去掉了是咩。。。。。
并求问isAfter()是怎么用一句话就 ...

    public boolean isAfter(Date b) {
        return compareTo(b) > 0;
回复 支持 反对

使用道具 举报

gloria_wwj 发表于 2014-6-11 00:09:22 | 显示全部楼层
讨厌的字数限制
Homework2.png

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

windforce 发表于 2014-6-12 04:47:17 | 显示全部楼层
HW2-Date.java
HW2-Date.png

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

漫漫琳游的鱼 发表于 2014-6-16 16:14:24 | 显示全部楼层
求问Difference是不是引用了java library?
回复 支持 反对

使用道具 举报

 楼主| jaly50 发表于 2014-6-17 19:48:50 | 显示全部楼层
漫漫琳游的鱼 发表于 2014-6-16 16:14
求问Difference是不是引用了java library?

没有啊。。都自己算的

你指的是什么Library 具体哪个?
回复 支持 反对

使用道具 举报

漫漫琳游的鱼 发表于 2014-6-18 08:53:28 | 显示全部楼层
jaly50 发表于 2014-6-17 19:48
没有啊。。都自己算的

你指的是什么Library 具体哪个?

那是用getTime然后相减除以(1000*3600*24)吗?这是在网上看到的
回复 支持 反对

使用道具 举报

本版积分规则

请点这里访问我们的新网站:一亩三分地Instant.

Instant搜索更强大,不扣积分,内容组织的更好更整洁!目前仍在beta版本,努力完善中!反馈请点这里

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明 ( 沪ICP备11015994号 )

custom counter

GMT+8, 2016-12-9 08:28

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

快速回复 返回顶部 返回列表