这两周学了Java方法相关内容,攒了不少练习题和实验作业,整理成博客记录一下,也方便以后复习的时候回看~
一、动手动脑小练习
-
自定义随机数生成器
之前一直用Math.random()或者Random类生成随机数,这次老师要求用指定算法写一个:Modulus是2³¹-1,Multiplier是16807,C=0,公式是Xₙ₊₁=(aXₙ+c)mod m。核心就是循环套公式,不过得注意用long类型存中间值,不然容易溢出,最后再转成int。我写了个方法生成1000个随机数,跑了下没问题,也算搞懂了随机数背后的简单算法逻辑。 -
方法重载原来这么常见
看老师给的MethodOverload代码才发现,同一个方法名能写两次——一个传int算整数平方,一个传double算小数平方。原来这就是方法重载,关键是参数列表得不一样(类型、个数或者顺序),返回值不算数。后来特意去看了System.out.println(),果然有一堆重载方法,能接收不同类型的参数,瞬间明白为啥打印啥都能用它了。 -
阶乘计算踩了“溢出”的坑
用递归写n!的时候,算到13结果就成负数了,一开始还以为是递归逻辑错了。查了才知道int类型有范围,超过2147483647就会溢出,变成负数。换成long能算到20,但21又不行了。最后用了BigInteger类,不管多大的n都能算,就是得用.multiply()这种方法做乘法,不能直接用*,也算解锁了新类的用法。 -
浮点数比较别直接用!
之前直接用ij比较两个浮点数,结果0.0001和0.00010000000000000001居然返回true,当时懵了。后来才知道浮点数存的是近似值,double精度范围内这两个数是一样的。正确的做法是比较它们差的绝对值,比如小于1e-10就认为相等,这个细节以后肯定能用到,记下来免得再踩坑。
二、课后实验:小学四则运算程序
阶段1:快速生成30道题
要求二十分钟内写个能生成30道小学四则运算题的程序。我用Random类生成1-100的数字,随机选+、-、*、/四种运算符。减法的时候注意交换两个数,避免出现负数;除法让被除数是除数的倍数,确保能整除。循环30次输出题目,没花多久就搞定了,主要是把规则理清楚就行。
阶段2:升级成答题系统
这个比阶段1复杂点,要满足三个要求:题目不重复、实时答题判分、倒计时。我用HashSet存生成的题目,避免重复;乘法控制两个数在31以内,防止结果是四位数。用Scanner接收答案,和正确结果对比,统计对的和错的。还开了个线程做10分钟倒计时,超时没答完的题直接算错。最后能显示正确率,测试了几次流程都没问题,就是倒计时线程一开始没处理好标志位,调了一会儿才弄对。
三、小结
这次学习最大的感受就是,光看理论没用,动手写代码才会发现各种小问题——比如整数溢出、浮点数比较的坑。另外整理代码也很重要,把这些小例子存起来,以后遇到类似需求说不定能直接参考。继续加油,希望下次学新内容能少踩点坑~