第一次作业报告

 

一.前言

  1. 知识点:

(1)第一次题目集:BMI(身体质量指数)的计算。单位换算。元素筛取用于求和。对不同输入的计算。非法输入判断。

(2)第二次题目集:对字符串的截取,转换,分析。对非法输入字符串的判断。将特殊的字符串进行基本类型的转换。

(3)第三次题目集:对字符串的截取,转换,分析。对非法输入字符串的判断。计算线的相关性质,和三角形的相关性质。

  1. 题量和难度:

第一次题目的思维难度较低,但在细节方面要求更高。题量也更多。第二次和第三次作业题目的思维难度较高,同样注重细节。但是题量相对较少。这三次的题目都是综合类型的题目,一个题目往往会涉及到很多方面的知识点。比如在第三次作业中,不仅要求我们对字符串的截取,选择,分析要求很高。同时对于我们在线的性质与三角形的性质也要有一定的了解。这使我们要查阅相关的资料来简化相关的计算和思维难度。在第二次的作业中,则重点在于对字符串的相关应用。在第一次的作业这要求我们查阅相关计算的公式。由此来看,三次作业层层递进,逐步深入。

二.设计与分析:

  1. 题目集2(7—2)

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”。

 

(1)源代码:

 

View Code

 

 

(2)输入与输出的实例

A.输入:1111011101011111111111

输出:1:11101011

B.输入:1111011101011111100100110111111101111111110111

输出:1:11101011

2:01001101

3:validate error

(3)思路与分析

  1. 进行循环,将每个字符与“1”进行比较。如果全为“1”则非法输入。否则下一步。
  2. 找寻第一个“0”的位置。如果没有为非法输入。否则,以此为开始点,对后面的字符串截取,并判断以后的字符串是否符合规定。符合则输出,否则非法输入。
  3. 以此循环,到最后的一次循环,为了防止越界访问,将进行特殊化处理。
  4. 调试,检查出现的错误。

(4)解释与心得

本题主要考察对字符串的截取,判断相等,对字符串越界问题的处理。本题的主要难点在于对非法输入的判断以及对特殊字符串的判断。

  1. 题目集3(7—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

 

(1)源代码

View Code

 

 

 

(2)输入与输出实例

A.输入:0,0 1,1

输出:1.414213562373095

B.输入:+2,-2.3 0.9,-3.2

输出:1.42126704035519

  1. 输入:+2,-2.3 0.9,-3.2 +2,-2.3

输出:wrong number of points

(3)思路与分析

A.将输入的数字用字符串储存,期间用空格隔开。

B.用spilt将字符串用空格,分为几个小的字符串。判断小的字符串的个数,如果不为2的话。就为非法输入。否则用parseInt将字符串转化为相对应的数字。

C.用得到的数字进行两点之间线段距离的计算。

D.用一个相同类型的变量进行存储。最后将该结果输出。

(4)解释与心得

首先,考虑到需要对输入的数据的数量进行检测,将输入的一串数字变为一个字符串,用spilt将“ ”为分界线将大的字符串分为小的字符串。来判断输入数字的个数,以此来判断是否为非法输入。再次之后,用parseInt将字符串类型转换为整型,用于计算两点之间的距离。然后输出。巧妙运用了字符串解决了,判断输入数字个数的问题。

  1. 题目集3(7—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",

(1)源代码

 

View Code

 

 

 

(2)输入与输出实例

A.输入:1:-2,+5 -2,+5

输出:points coincide

B.输入:1:-2,3 -2,+5

输出:Slope does not exist

C.输入:1:-2,3 -2,+5

输出:Slope does not exist

D.输入:1:-2.5,3 -2,+5.3

输出:4.6

E.输入:2:0,1 1,0 2,0

输出:1.0

F.输入:3:0,1 2,2 5,3

输出:false

  1. 输入:4:0,1 0,2 2,1 3,0

输出:false

  1. 输入:5:0,0 -1,-1 0,2 3,-1

输出:1.0 1.0 true

(3)思路与分析

  1. 用字符串接受输入的数字。
  2. 用spilt先讲“:”为分割点,将字符串分为两个小字符串。
  3. 用“ ”为断点,将输入的点分为几个更小的字符串,这个更小的字符串储存的是输入的点的坐标,用字符串数组,将这个更小的字符串分为几个以数字相存储的字符串。
  4. 用parseDouble将每个数字字符串分为数字。
  5. 将分好的数字用数组储存。
  6. 将最开始的分好的字符串中的第一个字符串用parseDouble变为double类型,用switch case 分为多个不同的选择。一个选择为用k=(y1-y2)/(x1-x2),或者当y1=y2时,k=0,或者当x1=x2时,输出Slope does not exist,当两个点相同时输出points coincide。另一个选择为用k=(y1-y2)/(x1-x2),分别求两条线的斜率,同时要满足(y1-y2)/(x1-x2)=(y2-y3)/(x2-x3)。另一个选择是用斜截式求线的方程,然后用d=(A*x0+b*y0+C)/Math.sqrt(Math.pow(A,2)+Math.pow(B,2));。另一个选择是用k=(y1-y2)/(x1-x2)计算两条线的斜率并且用(y1-y2)/(x1-x2)!=(y1-y3)/(x1-x3)。得知两线平行。最后一个选项为算两条线的交点double a1=y2-y1;

 double b1=-(x2-x1);

 double c1=x1*y2-x2*y1;

 double a2=y4-y3;

 double b2=-(x4-x3);

 double c2 = x3*y4-x4*y3;

 double d=a1*b2-a2*b1;

 double x5=(b2*c1-b1*c2)/d;

 double y5=(a1*c2+a2*c1)/d;

的两条线的交点,然后用x在两端之间就能证明在线段之间。

(4)解释与心得

采用多次分割,最后将一个字符串分为我需要的各个数据,并将各个数据按照相应的公式,进行问题的求解,在寻找,相应的问题求解公式时,如果自己原本的公式过于复杂,应查找相应的更为简便的公式进行求解。同时,在有多个选项的情况下,用switch case语句会简便很多。在已经将题目的情况大致包含之后,再将每个非法输入进行查找。

  1. 题目集3(7—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",

(1)源代码

 

View Code

 

 

(2)输入与输出

A.输入:4:1,0 1,0 0,0 2,0 4,0

输出:points coincide

B.输入:4:1,0 0,2 0,0 0,0 4,0

输出:data error

C.输入:1:-2,0 2,0 0,4

输出:true false

D.输入:2:0,0 3,0 0,1

输出:7.162278 1.5 1.0,0.333333

E.输入:3:0,1 1,0 2,0

输出:true false false

G.输入:4:1,0 0,2 0,0 0,2 4,0

输出:1

H.输入:5:0.5,0.5 0,0 0,2 4,0

输出:in the triangle

I.输入:5:0,0 -1,-1 2,3 3,4

输出:out of the triangle

(3)思路与分析

  1. 用字符串接受输入的数字。
  2. 用spilt先讲“:”为分割点,将字符串分为两个小字符串。
  3. 用“ ”为断点,将输入的点分为几个更小的字符串,这个更小的字符串储存的是输入的点的坐标,用字符串数组,将这个更小的字符串分为几个以数字相存储的字符串。
  4. 用parseDouble将每个数字字符串分为数字。
  5. 将分好的数字用数组储存。
  6. 将最开始的分好的字符串中的第一个字符串用parseDouble变为double类型,用switch case 分为多个不同的选择。
  7. 第一个选择:用d=Math.sqrt(Math.pow(x1-x2)+Math.pow(y1-y2));得出两点的

离,依次算三个点各种之间的距离判断三角形的类型。第二个选择:还是用d=Math.sqrt(Math.pow(x1-x2)+Math.pow(y1-y2)),求出三边的长度,最后得出周长,用k=(y1-y2)/(x1-x2),y=kx+b。算出斜截式方程然后将用(x3,y3)。用d=(A*x3+B*y3+C)/(Math.sqrt(Math.pow(A,2)+Math.pow(b,2))),得出高,然后得出面积。最后用重心坐标公式x4=(x1+x2+x3)/3,y4=(y+y2+y3)/3;,第三个选择:设立三个double类型的变量,分别表示三个边的距离,由小到大,用(Math.pow(d1,2)+Math.pow(d2,2)与Math.pow(d3,2))

大于0则为锐角,小于0则为钝角,等于0则为直角。第四个选择:用斜截式求出三边的方程,然后,将同样用斜截式,求出一条线的方程,用同样的方法求出这条线与三边的交点,然后用

View Code

 

 

 

判断是在具体的位置,然后在判断具体的位置后,其有面积的前提是其已经有两个交点,如果一个交点与一个定点重合,则算出对面一条线的交点,然后得出两个面积,如果都为一般的点,则分别求出两个点,然后用定点求出到这条线的距离,最后将面积求完之后,用整个三角形的面积求出剩余三角形的面积。第五点:用叉乘法用一个点,如static void A5(double 

View Code

 

 

判断改点的具体位置。

(4)解释与心得

在和以上同样的操作得到具体的数据后,首先求出三边的长度,然后,进行相关计算。尤其在判断一个线与三角形交点的个数,与面积的分割和各自的面积时,尤其复杂,但是一定要仔细,理清好条件之间的联系,保证不出现逻辑上的问题。

三.踩坑心得:

  1. 一定对循环最后是否会越界进行深入的研究,一定要与自增的距离结合起来研究。

在第二次作业的第二体中,我在写循环自动截取符合条件的字符串时,不断出现越界的情况,我刚开始并没有结合自增的距离大小,只是片面增大缩小其截的长度,迟迟没有解决。我在分析,发现,是我的自增变量设置过大,导致在有限情况下,导致最终的会超出数组的边界,导致越界,但是唯有仅仅改变自增的距离,但是我发现仍然不能改变这种错误,于是我在最后的一次循环里进行特殊的讨论,才解决了有关越界的问题,我得出结论,在每次循环的最后一次一定要特殊讨论,及时是与以往几次相同的情况。

如以下的代码:

View Code

 

 

    2.适当结合对象,即使题目中没有明说用对象会很大的简洁自己的代码。

在算线和三角形时,我每种情况,代码的重复率很高,导致代码冗杂,看起来很累赘。我觉得将线和三角形当做对象来看待,对其中的各种操作以方法的形式写进里面最终会使我的代码变得十分简洁,明了。

 

    3.在发现自己的方法过于复杂,一定要寻早更简便的方法,千万不要一碰到底。

在我求线的交点,以及相遇三角形的有关交点,判断交点是否在线段里面,等等问题,我都用第一时间的方法,进行求解,但是,这种方法十分复杂,我进行最后未经修改的时候,需要花较长的时间来理解自己的代码。

四.改进建议

  1. 在有循环的时候,将最后的一次循环当做一次单独的语句,然后进行讨论。
  2. 在求一个相对复杂的数学问题,一定要寻早最简便的算法,然后结合对应的注释,增加理解代码的速度。
  3. 在题目中有一个对象的相应的代码的重复率很高时,记得将其看做一个对象然后进行写代码。

五.总结

经过本阶段三次作业的练习,自己的收货有如下几个方面。

 

  1. 对于字符串的相关操作更加熟练。
  2. 对于已经碰到过的相关的诸如与线和三角形相关的问题,我已经掌握一大部分。
  3. 对于一些复杂的代码,进行合理的缩短和加上相应的注释,增加可读性。
  4. 在写一次循环之前,用笔先验算一遍最开始和最后的情况,一般最后的情况会更加特殊一点。对最后一种进行特殊讨论。

 

posted @ 2022-04-09 21:05  SystemOutPrint  阅读(72)  评论(0)    收藏  举报