对近期题目集的分析总结
前言:对这次题目集阐述一下自己的看法,这几次的题目集主要考察我们近期对java知识点的学习情况,题目量虽然不多,但是难度从难到易;最令我印象深刻的是每一道题目的测试点多了许多,几乎一分一个测试点,第一个题目集不难,题目相当基础,考察了我们一些简单的知识点,用上个学期学的c语言可以解决绝大部分问题,题目集二和题目集三难度提升飞快,对java知识点的掌握尤为重要;掌握的不好就难以写出来,尤其是题目集三,需要熟练的掌握对java类的运用;还要结合相应的数学方法;如射线法求三角形交点等
设计与分析:题目集一;题目一 巴比伦法求平方根近似值
巴比伦法求n的近似值可以用以下公式:
nextGuess = (lastGuess+n/lastGuess)/2
程序初始运行时lastGuess可赋予一个最初的猜测值。当由公式求得的nextGuess和lastGuess相差较大时,把nextGuess的值赋给lastGuess,继续以上过程,直至nextGuess和lastGuess几乎相同,此时lastGuess或者nextGuess就是平方根的近似值。
本题要求:nextGuess和lastGuess的差值小于0.00001时认为两者几乎相同
输入格式:
1、两个浮点数,以空格分隔,第一个是n,第二个是lastGuess最初的猜测值。例如:2 1。
2、若输入的两个数中包含负数或者lastGuess初始输入为0,认定为非法输入
输出格式:
1、输出n的平方根近似值:lastGuess。例如:1.4142157
2、非法输入时输出:"Wrong Format"
源码:


踩坑心得:本题目输出1.4142157为小数点后七位,用double型测试点过不了,我之前用double型并且用format函数保留七位小数答案虽然是一样的但是测试点还是过不了,同学告诉我要用float型,用过之后才知道float型自动精确到小数点后七位。
题目二判断三角形类型
输入三角形三条边,判断该三角形为什么类型的三角形。
输入格式:
在一行中输入三角形的三条边的值(实型数),可以用一个或多个空格或回车分隔,其中三条边的取值范围均为[1,200]。
输出格式:
(1)如果输入数据非法,则输出“Wrong Format”;
(2)如果输入数据合法,但三条边不能构成三角形,则输出“Not a triangle”;
(3)如果输入数据合法且能够成等边三角形,则输出“Equilateral triangle”;
(3)如果输入数据合法且能够成等腰直角三角形,则输出“Isosceles right-angled triangle”;
(5)如果输入数据合法且能够成等腰三角形,则输出“Isosceles triangle”;
(6)如果输入数据合法且能够成直角三角形,则输出“Right-angled triangle”;
(7)如果输入数据合法且能够成一般三角形,则输出“General triangle”。
源码


运行测试

分析 本题源码通过if else if对输入的三角形三条边进行逐步判断来实现题目要求,代码清晰可行。
踩坑心得:本体通过三边的长度来判断三角形的类型,极为重要的是里面要对误差进行判断,如果比较长度时没有比较误差,编译通过但是测试点过不了,题目拿不到多少分,误差为0.000001。
题目集二
题目一
串口字符解析
RS232是串口常用的通信协议,在异步通信模式下,串口可以一次发送5~8位数据,收发双方之间没有数据发送时线路维持高电平,相当于接收方持续收到数据“1”(称为空闲位),发送方有数据发送时,会在有效数据(5~8位,具体位数由通信双方提前设置)前加上1位起始位“0”,在有效数据之后加上1位可选的奇偶校验位和1位结束位“1”。请编写程序,模拟串口接收处理程序,注:假定有效数据是8位,奇偶校验位采用奇校验。
输入格式:
由0、1组成的二进制数据流。例如:11110111010111111001001101111111011111111101111
输出格式:
过滤掉空闲、起始、结束以及奇偶校验位之后的数据,数据之前加上序号和英文冒号。
如有多个数据,每个数据单独一行显示。
若数据不足11位或者输入数据全1没有起始位,则输出"null data",
若某个数据的结束符不为1,则输出“validate error”。
若某个数据奇偶校验错误,则输出“parity check error”。
若数据结束符和奇偶校验均不合格,输出“validate error”。
如:11011或11111111111111111。
例如:
1:11101011
2:01001101
3:validate error
源码


代码分析
先进行输入数据合法检测,检测长度是否少于11,用函数panduanzero对函数进行检验输入数据中是否含有0,有的话输出null data,函数当中对输入数组进行遍历检测当中是否含有0,然后找到0,截取0后八位,截取后八位中都是1,输出parity check error,用charAt函数检测数据,用substring函数截取字符串,通过if else if逐步判断分别进行结尾和奇偶效验然后输出。
踩坑心得:本题目有许多测试点用于校验输入是否合法,要编写代码过滤掉非法字符,输出几行不同数据1,2,通过count++实现。
改进建议 可以通过编写多个函数让代码更加容易读懂,更加简洁明了,if判断过于繁琐有待改进,能变成的更加简洁。
题目集三
题目一
点线形系列1-计算两点之间的距离
输入连个点的坐标,计算两点之间的距离
输入格式:
4个double类型的实数,两个点的x,y坐标,依次是x1、y1、x2、y2,两个点的坐标之间以空格分隔,每个点的x,y坐标以英文“,”分隔。例如:0,0 1,1或0.1,-0.3 +3.5,15.6。
若输入格式非法,输出"Wrong Format"。
若输入格式合法但坐标点的数量超过两个,输出“wrong number of points”。
输出格式:
计算所得的两点之间的距离。例如:1.4142135623730951
源代码




代码分析先通过if对输入数据进行合法性校验输入格式有误直接跳出,通过split方法对输入数据进行处理去除数据当中的空格和逗号再用二维数组储存分隔后的数据,初始化数组nums来储存输入数据当中提取出来的每个点横纵坐标的数值,通过try catch结构运行代码,通过parseDouble方法将输入的字符串当中的数据提取转换成double型数据方便之后对数据进行运算,try后大括号当中运行出错会直接跳到catch后面,parseDouble提取失败则表示输入非法直接输出"Wrong Format",运用math方法对数据进行计算最后输出两点间距离。实现题目要求。
踩坑心得:输入格式校验的测试点难以通过之前一直是八分,后来发现输入00也是一个非法数据,在代码当中加入if判断输入数据当中是否含有00的情况,输入,-也算非法输入,

加以改进
改进建议:通过parseDouble录入数据,每个数据都完整写出来了显得有些繁琐时间复杂度高,不太好看。可以通过for循环来解决i++实现逐步录入数据
题目二 点线形系列2-线的计算
用户输入一组选项和数据,进行与直线有关的计算。选项包括:
1:输入两点坐标,计算斜率,若线条垂直于X轴,输出"Slope does not exist"。
2:输入三个点坐标,输出第一个点与另外两点连线的垂直距离。
3:输入三个点坐标,判断三个点是否在一条线上,输出true或者false。
4:输入四个点坐标,判断前两个点所构成的直线与后两点构成的直线是否平行,输出true或者false.
5:输入四个点坐标,计算输出前两个点所构成的直线与后两点构成的直线的交点坐标,x、y坐标之间以英文分隔",",并输出交叉点是否在两条线段之内(不含四个端点)的判断结果(true/false),判断结果与坐标之间以一个英文空格分隔。若两条线平行,没有交叉点,则输出"is parallel lines,have no intersection point"。
输入格式:
基本格式:选项+":"+坐标x+","+坐标y+" "+坐标x+","+坐标y。
例如:1:0,0 1,1
如果不符合基本格式,输出"Wrong Format"。
如果符合基本格式,但输入点的数量不符合要求,输出"wrong number of points"。
不论哪个选项,如果格式、点数量都符合要求,但构成任一条线的两个点坐标重合,输出"points coincide",
输出格式:
见题目描述。
源代码

代码实现 charAt读取输入数据的第一个字符保存在choice中在通过switch case判断实现不同计算的选择,通过各点的数据计算斜率,如果x相等则与x轴垂直斜率无穷。
运用海伦公式求出面积,之后再算出点到直线的垂直距离,三个点当中前两个点构成的直线的斜率和后两个点构成的直线的斜率进行比较,如果相等则说明三个点在一条直线上,之后输出,输入四个点,比较两条直线的斜率来判断两条直线是否平行。
踩坑心得 输入格式校验占大量的测试点,应该编写代码对输入数据进行仔细校验,应该判断多种可能的错误情况。
改进意见:测试点没有完全通过。要求五应该更加完善。
题目三 点线形系列3-三角形的计算
用户输入一组选项和数据,进行与三角形有关的计算。选项包括:
1:输入三个点坐标,判断是否是等腰三角形、等边三角形,判断结果输出true/false,两个结果之间以一个英文空格符分隔。
2:输入三个点坐标,输出周长、面积、重心坐标,三个参数之间以一个英文空格分隔,坐标之间以英文","分隔。
3:输入三个点坐标,输出是钝角、直角还是锐角三角形,依次输出三个判断结果(true/false),以一个英文空格分隔,
4:输入五个点坐标,输出前两个点所在的直线与三个点所构成的三角形相交的交点数量,如果交点有两个,则按面积大小依次输出三角形被直线分割成两部分的面积。若直线与三角形一条线重合,输出"The point is on the edge of the triangle"
5:输入四个点坐标,输出第一个是否在后三个点所构成的三角形的内部(输出in the triangle/outof triangle)。
必须使用射线法,原理:由第一个点往任一方向做一射线,射线与三角形的边的交点(不含点本身)数量如果为1,则在三角形内部。如果交点有两个或0个,则在三角形之外。若点在三角形的某条边上,输出"on the triangle"
输入格式:
基本格式:选项+":"+坐标x+","+坐标y+" "+坐标x+","+坐标y。点的x、y坐标之间以英文","分隔,点与点之间以一个英文空格分隔。
输出格式:
基本输出格式见每种选项的描述。
异常情况输出:
如果不符合基本格式,输出"Wrong Format"。
如果符合基本格式,但输入点的数量不符合要求,输出"wrong number of points"。
如果输入的三个点无法构成三角形,输出"data error"。
注意:输出的数据若小数点后超过6位,只保留小数点后6位,多余部分采用四舍五入规则进到最低位。小数点后若不足6位,按原始位数显示,不必补齐。例如:1/3的结果按格式输出为 0.333333,1.0按格式输出为1.0
选项4中所输入线的两个点坐标重合,输出"points coincide"
源代码

代码分析: 通过switch case结构实现功能分部,通过三个点的坐标求出三角形三边的长度再通过if比较三边长度判断是否是等腰三角形、等边三角形。编写代码实现数学公式运算求出三角形周长、面积、重心坐标 运用split方法对输入字符串进行处理,去除字符串当中的空格冒号逗号。比较三边长度的平方来判断是钝角、直角还是锐角三角形。
踩坑心得 应当时刻注意错误输入情况。
改进建议;测试点没有全部通过 代码还需要完善
总结
通过这几次的练习,学会了java对多类的运用。学会了很多方便的方法,编程能力得到提高。一些题目要求无法完成,能力不足。日后应该花更多的时间学习java,提高自己对代码的编写和理解能力。
老师上课引用许多例子帮助学生理解课程,对学生上课作用很大,课程活跃新颖,质量相当不错。

浙公网安备 33010602011771号