亚麻OA求砸,面经神衣护体!


一亩三分地论坛

 找回密码
 Sign Up 注册获取更多干货
天天打游戏、照样领工资、还办H1B
这份工作你要不要?
把贵司招聘信息放这里
查看: 11496|回复: 192
收起左侧

Berkeley CS 61B Data Structures(in Java) Lab2 讨论帖

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

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

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

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

x
本帖最后由 jaly50 于 2014-5-14 23:39 编辑

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

看完第四课视频Types; conditionals就可以做这次的作业。
   

这课每周的lab在berkeley设置的是由两个人在2小时之内完成的,而15次lab只占总成绩的10%,因此我认为在三分地里出于展现学习进度的目的,用10次作业+3次project已经足够了,lab也全部算上的话太琐碎而没必要。


            经版友建议,咱们以后在地里就只要上传Project和Homework 运行成功+输出正确的图片 保持进度,才能加学分,lab自己私底下做完就好啦!

  作业要求:
      纠正Fraction.java里面的各种错误。     

   
This homework assignment is meant to make sure you can write, compile, and runsimple Java programs.  This is an individual assignment; you may not sharecode with other students. You will need to know how to compile and run Javaprograms, as described in Lab 1.


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

CS61B LAB2

CS61B LAB2




相关链接:      

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

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

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






评分

2

查看全部评分

阿童木 发表于 2016-2-2 10:03:22 | 显示全部楼层
本帖最后由 阿童木 于 2016-2-2 10:13 编辑

自我总结一下lab2里学到的东西(这一遍想把知识点都学扎实,所以我能想到的点都总结在下面,可能会比较啰嗦):
1.写代码时要注意运用Good Software Engineering的思想——Reusing Code!
举个栗子~
  1. public Fraction(int n, int d) {
  2.     if (n < 0) {
  3.       System.out.println("Fatal error:  Negative numerator.");
  4.       System.exit(0);
  5.     }
  6.     if (d < 1) {
  7.       System.out.println("Fatal error:  Nonpositive denominator.");
  8.       System.exit(0);
  9.     }
  10.     numberOfFractions++;
  11.     numerator = n;
  12.     denominator = d;
  13.   }
复制代码
然后其他的构造函数全部调用它,使得程序变得简短,并且如果后续我们发现构造函数有bug,只需要改动一个即可。
  1. public Fraction(int n) {
  2.     this(n, 1);
  3.   }

  4. public Fraction() {
  5.           this(0,1);
  6.   }

  7. public Fraction(Fraction original) {
  8.     this(original.numerator,original.denominator);
  9.   }
复制代码
In your own programs, if you find yourself copying multiple lines of code for reuse, it is usually wise to put the common code into a new shared method.


2.static域“numberOfFractions”用来计数(Fraction对象的个数)
   前面楼层的前辈说的观点我很赞同:
fracs()的改法是把class field里面改成static,method里面return的就不用加this了。
其实虽然题目明确要求不能改signature,但我认为good style是fracs()本身也应该是static method;这样可以保证一个实例都没有时依旧可以返回numberOfFractions.

至于numberOfFractions两种结果6和7:
Fraction sumOfThree = f0.add(sumOfTwo) 这样写可以保证fraction只被call一次 得到6
Fraction sunOfThree = f0.add(f1.add(f2))这样写得到7

3.java中每个类都有隐含的toString()方法,当这个类的对象被转换为字符串时会自动调用如果我们想让一个类以我们希望的方式转化成String类型,就必须重写toString()方法。


4.最大公约数算法——辗转相除
  1. static private int gcd(int x, int y) {
  2.           if(y==0)
  3.                   return x;
  4.           else
  5.                   return gcd(y,x%y);
  6.   }
复制代码
5.分数约分的方法:
先求numerator、denominator的最大公约数(gcd)
约分后的分数分子为numerator/gcd,分母为denominator/gcd。
  1. public String toString() {
  2.     int thisGcd = gcd(numerator, denominator);
  3.     return (numerator / thisGcd + "/" + denominator / thisGcd);
  4.   }
复制代码
回复 支持 15 反对 0

使用道具 举报

enirinth 发表于 2015-5-10 14:53:02 | 显示全部楼层
1. numberOfFractions的问题我个人认为楼上诸君已经讨论的很清楚了:   6的话更makes sense一点; 7是两次add时产生了一个中间结果多加了一次而已。
2. recursion的算法,核心就是
  1. gcd(x,y)=gcd(y,x%y);
复制代码
突然想到小学数学老师讲的辗转相除和这个简直就是一毛一样的算法,细思恐极(都一把年纪来还在整小学的东西...)
3. fracs()的改法是把class field里面改成static,method里面return的就不用加this了。
其实虽然题目明确要求不能改signature,但我认为good style是fracs()本身也应该是static method;这样可以保证一个实例都没有时依旧可以返回numberOfFractions.

333.png


回复 支持 2 反对 0

使用道具 举报

Chiva_W 发表于 2014-12-8 19:40:45 | 显示全部楼层
7个是因为constructor函数在算3个数相加的时候被调用了两次,所以总数多加了一次
lab2.png
回复 支持 2 反对 0

使用道具 举报

蔚蔚酱 发表于 2017-2-2 15:44:07 | 显示全部楼层
个人认为,优化地方,除了reuse外,还有static那里。一开始我只把class fields的numberOfFractions改成static,就可以输出正确结果。但这还不够优化,后面的输出System.out.println("The total number of Fraction objects is " + f3.fracs());这里,要注意到其实fracs这个函数和f3本身是没关系的,属于讲义里的bad style,应该把fracs这个函数改成static的,然后就可以把f3.这个前缀去掉了。
再然后我辗转相除法那里用while写的,也不够优化,像前面的大神说的,直接gcd函数内调用gcd是最好的。
Lab2.PNG
回复 支持 1 反对 0

使用道具 举报

xieyt 发表于 2016-3-31 23:35:29 | 显示全部楼层
lab2慢慢找到感觉了,readme里面对gcd算法有提示呀。。查了下a mod b就是a%b
之前学C的时候也用过辗转相除法,忘得差不多了,现在又捡起来,算有成就感吧><
最大的难点应该是static那里,没想到,还是参考了一下别人的代码。。另外main里面f3.fracs()其实f3可以替换成任一Fraction Object (e.g. f0, f1...)


lab2成功.JPG
回复 支持 1 反对 0

使用道具 举报

Joseph_Liu 发表于 2015-5-23 10:29:24 | 显示全部楼层
本帖最后由 Joseph_Liu 于 2015-5-23 10:54 编辑

Screen Shot 2015-05-23 at 10.14.34 AM.png
顺带一提,虽然定义Fraction类时,变量numerator和denominator都是private类型的,但只要是同类型的object都是可以access这两个private类型的变量的。

private means that only code within the same class can access the private thing. It means private to the class, not private to the object. One dog can see another Dog object's stuff, but a Cat can't see a Dog's private.
回复 支持 1 反对 0

使用道具 举报

小小溪 发表于 2015-1-21 14:43:59 | 显示全部楼层
readme要好好看 有些同学提出的问题在readme已经回答了
回复 支持 1 反对 0

使用道具 举报

 楼主| jaly50 发表于 2014-5-15 09:29:58 | 显示全部楼层
NanMic 发表于 2014-5-15 02:42
我的结果和你一样诶,不知道为什么 numberoffraction 的结果是1

这个variable有标记为static么?

评分

1

查看全部评分

回复 支持 1 反对 0

使用道具 举报

NanMic 发表于 2014-5-15 10:52:25 | 显示全部楼层
jaly50 发表于 2014-5-15 09:29
这个variable有标记为static么?

啊,我终于了解了。不同的object 里面有相同名字的 instance variable。 但是这些instance variable 是各自独立的。 如果一开始定义为 static variable, 那么这些objects 就共享同一个variable。我说的对吗
回复 支持 1 反对 0

使用道具 举报

sqzhang17 发表于 2014-5-13 08:11:15 | 显示全部楼层
LZ的code是不是有点问题~
The total number of Fraction objects is 6~这个是不是应该是6~不是7~f0, f1, f2, f3, sumOfTwo, sumOfThree.
以下是我compile之后的terminal~
07A70977-E66C-47C5-8B8B-2089B3C98EBB.png





评分

1

查看全部评分

回复 支持 反对

使用道具 举报

 楼主| jaly50 发表于 2014-5-13 23:48:59 | 显示全部楼层
sqzhang17 发表于 2014-5-13 08:11
LZ的code是不是有点问题~
The total number of Fraction objects is 6~这个是不是应该是6~不是7~ ...

SumOfThree
我是add了两次 所以就建了两个object
我是这样写的..所以就比你多一个了  Fraction sumOfThree =f0.add(f1).add(f2);  


你是 sumOfThree = sumOfTwo.add(f0)是嘛。。
回复 支持 反对

使用道具 举报

NanMic 发表于 2014-5-14 12:44:30 | 显示全部楼层
请教一下,fracs method 应该怎么写?别的都对了,就这个不知道怎么改 谢谢
回复 支持 反对

使用道具 举报

 楼主| jaly50 发表于 2014-5-14 21:37:20 | 显示全部楼层
NanMic 发表于 2014-5-14 12:44
请教一下,fracs method 应该怎么写?别的都对了,就这个不知道怎么改 谢谢

return this.numberOfFractions;
回复 支持 反对

使用道具 举报

oh_baizhima 发表于 2014-5-14 22:24:29 | 显示全部楼层
哈哈 这个课我之前四月份自己无聊时候做的,那也过来蹭学分一记!
Snip20140514_1.png
回复 支持 反对

使用道具 举报

 楼主| jaly50 发表于 2014-5-14 23:43:29 | 显示全部楼层
oh_baizhima 发表于 2014-5-14 22:24
哈哈 这个课我之前四月份自己无聊时候做的,那也过来蹭学分一记!

一亩三分地设学分的目的是鼓励大家学习,展现学习进度。嗯,而且这课作业多,设的分多....前任版主反对这样的加分方式,我们决定lab不加分了,10次homework+3次project足够督促大家跟上进度了。(在你传图之前已在主贴内说明)
回复 支持 反对

使用道具 举报

NanMic 发表于 2014-5-15 02:41:50 | 显示全部楼层
jaly50 发表于 2014-5-14 21:37
return this.numberOfFractions;

奇怪,我就是这么写的。加了个this。 但是最后结果是1 不知道为什么
回复 支持 反对

使用道具 举报

NanMic 发表于 2014-5-15 02:42:25 | 显示全部楼层
oh_baizhima 发表于 2014-5-14 22:24
哈哈 这个课我之前四月份自己无聊时候做的,那也过来蹭学分一记!

我的结果和你一样诶,不知道为什么 numberoffraction 的结果是1
回复 支持 反对

使用道具 举报

melissami 发表于 2014-5-15 06:25:19 | 显示全部楼层
lab2的运行截图
lab2.jpg


但是我的numOfFractions是8
是不是太大了。。。

不能分享代码,那就贴个片段,是不是我在求sum的时候创建了太多个object?
  1.     Fraction sumOfTwo = f1.add(f2);              // Sum of f1 and f2.
  2.     Fraction sumOfThree = (f0.add(f1)).add(f2);             // Sum of f0, f1, and f2.
复制代码
回复 支持 反对

使用道具 举报

 楼主| jaly50 发表于 2014-5-15 09:30:43 | 显示全部楼层

这边就加了三个。。

我也是这样写的。我是7.


你应该是其他哪里还多加了一个吧
回复 支持 反对

使用道具 举报

sqzhang17 发表于 2014-5-15 13:55:43 | 显示全部楼层
jaly50 发表于 2014-5-13 23:48
SumOfThree
我是add了两次 所以就建了两个object
我是这样写的..所以就比你多一个了  Fraction sumOfTh ...

en ~的确是这样~呵呵~楼主英明~
回复 支持 反对

使用道具 举报

朝仓音梦 发表于 2014-5-21 03:55:28 | 显示全部楼层
本帖最后由 朝仓音梦 于 2014-5-21 03:58 编辑

有人做了Lab1咩?虽然lab好像看起来很麻烦的样子,可是还是想学学怎么用emacs。
我用的是windows,该怎么设置lab1的运行环境?求解答

回复 支持 反对

使用道具 举报

朝仓音梦 发表于 2014-5-25 11:22:28 | 显示全部楼层
本帖最后由 朝仓音梦 于 2014-5-25 11:23 编辑

Lab2的答案
lab2.PNG
回复 支持 反对

使用道具 举报

朝仓音梦 发表于 2014-5-25 11:26:56 | 显示全部楼层
本帖最后由 朝仓音梦 于 2014-5-25 11:29 编辑
sqzhang17 发表于 2014-5-13 08:11
LZ的code是不是有点问题~
The total number of Fraction objects is 6~这个是不是应该是6~不是7~ ...

这个total number of Fraction objects 为什么每个人都不一样,我的是7。我的思路是把numberOfFraction改成static,下面f3.fracs()的f3并未做改动,尽管是bad stytle,但是还是能够正确显示数量的,不知道大家是怎样想的
回复 支持 反对

使用道具 举报

gloria_wwj 发表于 2014-6-11 00:08:34 | 显示全部楼层
字数字数字数
lab2.png
回复 支持 反对

使用道具 举报

漫漫琳游的鱼 发表于 2014-6-15 16:23:17 | 显示全部楼层
求问f3怎么才能等于f2?
回复 支持 反对

使用道具 举报

漫漫琳游的鱼 发表于 2014-6-16 09:10:30 | 显示全部楼层
Yay做出来了~~ QQ截图20140616090854.png
回复 支持 反对

使用道具 举报

本版积分规则

关闭

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

手机版|小黑屋|一亩三分地论坛声明

custom counter

GMT+8, 2017-10-24 04:44

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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