查看: 92965| 回复: 575
跳转到指定楼层
上一主题 下一主题
收起左侧

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

 
全局:
公开课
学校名称: Berkeley
Unit号: 2
开课时间: 2014-05-13
课程全名: CS 61B Data Structures(in Java)
平台: 其他

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

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

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.

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






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学分 +1 收起 理由
sanguine + 1 好效率啊!!!

查看全部评分


上一篇:[Stanford]Cryptography Week #6 作业讨论帖
下一篇:[Coursera] Think Again: How to Reason and Argue (Week 7,8,9)
推荐
阿童木 2016-2-4 22:30:33 | 只看该作者
全局:
本帖最后由 阿童木 于 2016-2-4 22:34 编辑

运行截图


自我总结一下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);


评分

参与人数 7大米 +65 学分 +1 收起 理由
beijixin + 3 感谢分享!
mrhfw + 3 感谢!学到好多
zhang123587 + 3 感谢分享!
破烂CC + 3 好赞好赞~
蔚蔚酱 + 3 感谢分享!

查看全部评分

回复

使用道具 举报

推荐
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;






评分

参与人数 1学分 +1 收起 理由
jaly50 + 1

查看全部评分

回复

使用道具 举报

全局:
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;
          
  }
回复

使用道具 举报

🔗
superflb 2014-5-11 20:14:57 | 只看该作者
全局:
回复

使用道具 举报

🔗
chouclee 2014-5-17 00:33:49 | 只看该作者
全局:
本帖最后由 chouclee 于 2014-5-17 14:11 编辑

第一次眼花了。。。没看到错误


点评

少年,最后一个输出错了。48762。再检查一下代码吧。  发表于 2014-5-17 09:25
回复

使用道具 举报

🔗
melissami 2014-5-18 05:53:09 | 只看该作者
全局:
本帖最后由 melissami 于 2014-5-18 10:01 编辑

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

来贴图啦~~


评分

参与人数 1学分 +1 收起 理由
jaly50 + 1 英文单词写错了..:D

查看全部评分

回复

使用道具 举报

🔗
 楼主| 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 (172.21 KB, 下载次数: 17)

hw2.png

评分

参与人数 1学分 +1 收起 理由
jaly50 + 1

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

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