Java博客作业(一)
一、前言
1.知识点总结
<1>第一次大作业
题型总结:BMI测算、单位转换、奇数求和、房产税费计算、角色选择、学号识别、提取二进制数值、三角判断
涉及知识点:Scanner类的使用、if else语句的使用及嵌套、for循环的使用及嵌套、强制类型转换、条件判断、字符串的提取、字符串和整型的转化、Math类的使用、一维数组的使用、变量声明、类的封装、输出语句的使用
<2>第二次大作业
题型总结:字母与数字的转换、串口字符解析、String的格式判断与内容提取
涉及知识点:Scanner类的使用、if else语句的使用及嵌套、字符串的提取、字符串和整型的转化、Math类的使用、一维数组的使用、类的封装、获取字符串长度、类的概念与调用、输出语句的使用
<3>第三次大作业
题型总结:两点距离计算、线相关计算、三角形相关计算
涉及知识点:Scanner类的使用、if else语句的使用及嵌套、条件判断、正则表达式的学习和使用、字符串的比较、字符串的提取、字符串和整型的转化、Math类的使用、一维数组的使用、类的封装、获取字符串长度、输出语句的使用、强制数据类型转换、类的声明与使用、三角类型判断算法、方法的调用与数据返回
2.题量
<1>第一次大作业:较多
<2>第二次大作业:适中
<3>第三次大作业:适中
3.难度评估
<1>第一次大作业:简单
<2>第二次大作业:7-1简单、7-2偏难、7-3适中
<3>第三次大作业:困难
二、设计与分析
1.算法设计以及思路
<1>第二次作业第二题
7-2 串口字符解析 (40 分)
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位或者输入数据全1没有起始位,则输出”null data”,
若数据的结束符不为1,则输出“validate error”。
若数据奇偶校验错误,则输出“parity check error”。
若数据结束符和奇偶校验均不合格,输出“validate error”。
源码(具体代码分析写在注释里):
点击白框查看
import java.util.Scanner; public class Main { public static void main(String []args) { Fn code=new Fn();// 每个串口都看作一个对象,但本题只判断一个,所以这里只new一次 code.judge_type(); } } class Fn{ Scanner s =new Scanner(System.in); String com = s.next();//获取串口 int length = com.length();//计算字符串长度 String a = new String(); int tem = length; void judge_type() { if(length<11||all1())//如果小于11,不满足一个串口的基本位数,或者全是1,找不到起始位0,都输出空串口 System.out.print("null data"); else { int odd = 0; int id=0; int j=0; boolean judge =true; for(int i=0;i<length;i++) { if(com.charAt(i)=='0') //找到起始位 { if(length-i<10) judge= false; boolean end = false;//clear start for( j=1;j<=8;j++)//起始位后八位数进行分析 { if(com.charAt(i+j)=='1')//记奇数的个数 odd++; if(com.charAt(i+10)=='1')//判断结束位 end = true; a+=com.charAt(i+j); } if(com.charAt(i+9)=='1')//判断奇偶位 odd++; i+=10; id++; System.out.print(id+":"); if(odd%2==0) { if(!end)//如果没有结束位且为偶数个1 System.out.println("validate error"); else System.out.println("parity check error"); } else { if(!end) System.out.println("validate error"); else { if(judge) { System.out.println(a); a=""; } } } odd=0;//clear } } } } boolean all1() {//判断是否都为1 int i=0; boolean z =true; for(;i<tem;i++) if(com.charAt(i)=='0') z=false; return z; } }
View Code
<2>第三次作业第一题
7-1 点线形系列1-计算两点之间的距离 (10 分)
输入两个点的坐标,计算两点之间的距离
输入格式:
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
类图:
大概思路:
Point函数是对字符串数据的转换,legal函用来判断输入数据是否合法,这里学习了正则表达式,表达式写的比较简单,这题的算法也比较简单,
若输入格式非法,输出”Wrong Format”。若输入格式合法但坐标点的数量超过两个,输出“wrong number of points”。
源码(具体代码分析写在注释里):
点击白框查看
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner s = new Scanner(System.in); String str = s.nextLine(); String[] dj = str.split(" "); boolean a =false; for(int i=0;i<str.length();i++){ if(str.charAt(i)==' ')//防止输入无空格的连续数字,基本格式错误 a=true; } if(a==false){ System.out.print("Wrong Format"); } String[] point1 = dj[0].split(",");//提取两个点 String[] point2 = dj[1].split(",");//提取x,y坐标 P z = new P(); if(point1.length==2&&point2.length==2){//考虑点重合的情况 if (z.legal(point1[0]) && z.legal(point1[1]) && z.legal(point2[0]) && z.legal(point2[1])){//每个坐标都进行合法判断 double x1 = z. Point(point1[0]); double y1 = z. Point(point1[1]); double x2 = z. Point(point2[0]); double y2 = z. Point(point2[1]); if(dj.length==2) System.out.print(Math.sqrt(Math.pow(x2 - x1, 2.0) + Math.pow(y2 - y1, 2.0))); if(dj.length>2)//前两个点的输入合法,但输入多个坐标时 System.out.print("wrong number of points"); } else System.out.print("Wrong Format"); } else System.out.print("Wrong Format"); } } class P { double Point(String r) {//这个地方开始想复杂了,后面其实可以强制转换成数字的,符号也可以 double tran = 0; int len = r.length(); if (r.charAt(0) == '+') { r = r.substring(1, len); tran = Double.parseDouble(r); } if (r.charAt(0) == '-') { r = r.substring(0, len); tran = Double.parseDouble(r); } if(Character.isDigit(r.charAt(0))) { r = r.substring(0); tran = Double.parseDouble(r); } return tran; } boolean legal(String x) { String w = "[+-]?(\\d+)(\\.\\d+)?$";//判断输入 for(int i=1;i<x.length();i++){ if(x.charAt(0)=='0'&&x.length()>1&&x.charAt(1)!='.') return false; } if(x.matches(w))//匹配 return true; else return false; } }
View Code
<3>第三次作业第二题
7-2 点线形系列2-线的计算 (42 分)
用户输入一组选项和数据,进行与直线有关的计算。选项包括:
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”,
输出格式:
见题目描述。
类图:
大概思路:
通过legal函用来判断输入数据是否合法,把选项看作一个类,具体写法和第一题差不多,但写到这时候发现用一个函数把字符串转换成数字类型太麻烦,直接强制转换,正负号也可以保留下来。
这道题复杂的是算法
计算斜率:k=(y2-y1)/(x2-x1);
计算一点到另外两点构成的直线的距离:需要先算直线方程,再求点到该直线的距离 :
判断三点是否在一线,即判断三点中任意两点组成的线段的斜率是否相等,这个比较简单,用(y1-y2)*(x-x2) == (x1-x2)*(y-y2)判断即可
判断两条线是否平行,即判断斜率是否存在且相等,比较两条线k=(y2-y1)/(x2-x1);
判断两线关系,如果不平行,则计算交点位置,并判断交点是否在线上。交点公式参考文章:两点确定一条直线,已知四个点确定的两条直线,求这两条直线的交点_risemypassion的博客-CSDN博客
源码(具体代码分析写在注释里):
点击白框查看
import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner s = new Scanner(System.in); String str = s.nextLine(); P z = new P(); boolean a =false; for(int i=0;i<str.length();i++) if(str.charAt(i)==' ') a=true; if(str.charAt(1)!=':'||a==false)//基本格式的判断 System.out.print("Wrong Format"); else { if (str.charAt(0) == '1') z.One(str.substring(2)); if (str.charAt(0) == '2') z.Two(str.substring(2)); if (str.charAt(0) == '3') z.Three(str.substring(2)); if (str.charAt(0) == '4') z.Four(str.substring(2)); if (str.charAt(0) == '5') z.Five(str.substring(2)); } } } class P { boolean legal(String x) { String w = "[+-]?(\\d+)(\\.\\d+)?$"; for (int i = 1; i < x.length(); i++) { if (x.charAt(0) == '0' && x.length() > 1 && x.charAt(1) != '.') return false; } if (x.matches(w)) return true; else return false; } void One(String x) { String[] dj = x.split(" "); String[] point1 = dj[0].split(","); String[] point2 = dj[1].split(","); if (!dj[0].equals(dj[1])) {//防止点重合 if (point1.length == 2 && point2.length == 2) {//判断有x,y的值 if (legal(point1[0]) && legal(point1[1]) && legal(point2[0]) && legal(point2[1])) {//判断输入数据合法 double x1 = Double.parseDouble(point1[0]); double y1 = Double.parseDouble(point1[1]); double x2 = Double.parseDouble(point2[0]); double y2 = Double.parseDouble(point2[1]); if (dj.length == 2) if (x1 == x2) System.out.print("Slope does not exist"); else System.out.print((y2 - y1) / (x2 - x1));//一切正确,输出斜率 if (dj.length > 2) System.out.print("wrong number of points"); } else System.out.print("Wrong Format"); } else System.out.print("Wrong Format"); } else System.out.print("points coincide"); } void Two(String x) { String[] dj = x.split(" "); String[] point1 = dj[0].split(","); String[] point2 = dj[1].split(","); if (dj.length < 3)//防止点数量不够,导致不存在后面的元素 System.out.print("wrong number of points"); String[] point3 = dj[2].split(","); if (!dj[1].equals(dj[2])) { if (point1.length == 2 && point2.length == 2 && point3.length == 2) { if (legal(point1[0]) && legal(point1[1]) && legal(point2[0]) && legal(point2[1]) && legal(point3[0]) && legal(point3[1])) { double x0 = Double.parseDouble(point1[0]);//将输入的子字符串转换成数据 double y0 = Double.parseDouble(point1[1]); double x1 = Double.parseDouble(point2[0]); double y1 = Double.parseDouble(point2[1]); double x2 = Double.parseDouble(point3[0]); double y2 = Double.parseDouble(point3[1]); if (dj.length == 3) System.out.print(Math.abs((y2 - y1) * (x0 - x1) - (x2 - x1) * (y0 - y1))//点到直线的公式 / Math.sqrt(Math.pow((y1 - y2), 2) + Math.pow((x1 - x2), 2))); if (dj.length > 3) System.out.print("wrong number of points"); } else System.out.print("Wrong Format"); } else System.out.print("Wrong Format"); } else System.out.print("points coincide"); } void Three(String x) { String[] dj = x.split(" "); String[] point1 = dj[0].split(","); if (dj.length < 3) System.out.print("wrong number of points"); String[] point2 = dj[1].split(","); String[] point3 = dj[2].split(","); if (!dj[1].equals(dj[2])&& !dj[0].equals(dj[2])&& !dj[0].equals(dj[1])) { if (point1.length == 2 && point2.length == 2 && point3.length == 2) { if (legal(point1[0]) && legal(point1[1]) && legal(point2[0]) && legal(point2[1]) && legal(point3[0]) && legal(point3[1])) { double x0 = Double.parseDouble(point1[0]); double y0 = Double.parseDouble(point1[1]); double x1 = Double.parseDouble(point2[0]); double y1 = Double.parseDouble(point2[1]); double x2 = Double.parseDouble(point3[0]); double y2 = Double.parseDouble(point3[1]); if (dj.length == 3 &&((y2- y1) / (x0 - x1) == (y0 - y1) / (x2 - x1)||(y0- y1) / (x2 - x1) == (y2 - y1) / (x0 - x1)))//判断三点是否一线 System.out.print("true"); if ((y2- y1) / (x0 - x1) != (y0 - y1) / (x2 - x1)||(y0- y1) / (x2 - x1) != (y2 - y1) / (x0 - x1)) System.out.print("false"); if (dj.length > 3) System.out.print("wrong number of points"); } else System.out.print("Wrong Format"); } else System.out.print("Wrong Format"); } else System.out.print("points coincide"); } void Four(String x) { String[] dj = x.split(" "); String[] point1 = dj[0].split(","); String[] point2 = dj[1].split(","); if (dj.length < 4) System.out.print("wrong number of points"); String[] point3 = dj[2].split(","); String[] point4 = dj[3].split(","); if (!dj[0].equals(dj[1]) && !dj[2].equals(dj[3])) { if (point1.length == 2 && point2.length == 2 && point3.length == 2 && point4.length == 2) { if (legal(point1[0]) && legal(point1[1]) && legal(point2[0]) && legal(point2[1]) && legal(point3[0]) && legal(point3[1]) && legal(point4[0]) && legal(point4[1])) { double x0 = Double.parseDouble(point1[0]); double y0 = Double.parseDouble(point1[1]); double x1 = Double.parseDouble(point2[0]); double y1 = Double.parseDouble(point2[1]); double x2 = Double.parseDouble(point3[0]); double y2 = Double.parseDouble(point3[1]); double x3 = Double.parseDouble(point4[0]); double y3 = Double.parseDouble(point4[1]); if (dj.length == 4 && (y3 - y2) / (x3 - x2) == (y1 - y0) / (x1 - x0)) System.out.print("true"); if ((y3 - y2) / (x3 - x2) != (y1 - y0) / (x1 - x0)) System.out.print("false"); if (dj.length > 4)//点数量的判断 System.out.print("wrong number of points"); } else System.out.print("Wrong Format"); } else System.out.print("Wrong Format"); } else System.out.print("points coincide"); } void Five(String x) { String[] dj = x.split(" "); String[] point1 = dj[0].split(","); String[] point2 = dj[1].split(","); if (dj.length < 4) System.out.print("wrong number of points"); String[] point3 = dj[2].split(","); String[] point4 = dj[3].split(","); if (!dj[0].equals(dj[1]) && !dj[2].equals(dj[3])) { if (point1.length == 2 && point2.length == 2 && point3.length == 2 && point4.length == 2) { if (legal(point1[0]) && legal(point1[1]) && legal(point2[0]) && legal(point2[1]) && legal(point3[0]) && legal(point3[1]) && legal(point4[0]) && legal(point4[1])) { double x0 = Double.parseDouble(point1[0]); double y0 = Double.parseDouble(point1[1]); double x1 = Double.parseDouble(point2[0]); double y1 = Double.parseDouble(point2[1]); double x2 = Double.parseDouble(point3[0]); double y2 = Double.parseDouble(point3[1]); double x3 = Double.parseDouble(point4[0]); double y3 = Double.parseDouble(point4[1]); if ((y3 - y2) / (x3 - x2) == (y1 - y0) / (x1 - x0))//线平行的情况 System.out.print("is parallel lines,have no intersection point"); else { double yz = ((y0 - y1) * (y3 - y2) * x0 + (y3 - y2) * (x1 - x0) * y0//xz,yz为交点坐标 + (y1 - y0) * (y3 - y2) * x2 + (x2 - x3) * (y1 - y0) * y2) / ((x1 - x0) * (y3 - y2) + (y0 - y1) * (x3 - x2)); double xz = x2 + (x3 - x2) * (yz - y2) / (y3 - y2); if (dj.length == 4) { System.out.print(xz + "," + yz + " "); if ((y1 - y0) / (xz - x0) == (yz - y0) / (x1 - x0), || (y3 - y2) / (xz - x2) == (yz - y2) / (x3 - x2)) System.out.print("true"); else System.out.print("false"); } if (dj.length > 4) System.out.print("wrong number of points"); } } else System.out.print("Wrong Format"); } else System.out.print("Wrong Format"); } else System.out.print("points coincide"); } }
View Code
<4>第三次作业第三题
输入格式:
基本格式:选项+”:”+坐标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”,
类图
大概思路:
数据输入的判断同前两题一样,但难度相对上一题进一步升级,要对面的问题进行判断,有一定难度的提升
源码(具体代码分析写在注释里):
点击白框查看
import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner s = new Scanner(System.in); String str = s.nextLine(); P z = new P(); boolean a =false; for(int i=0;i<str.length();i++) if(str.charAt(i)==' ') a=true; if(str.charAt(1)!=':'||a==false) System.out.print("Wrong Format"); else { if (str.charAt(0) == '1') z.One(str.substring(2)); if (str.charAt(0) == '2') z.Two(str.substring(2)); if (str.charAt(0) == '3') z.Three(str.substring(2)); if (str.charAt(0) == '4') z.Four(str.substring(2)); if (str.charAt(0) == '5') z.Five(str.substring(2)); } } } class P { boolean legal(String x) { String w = "[+-]?(\\d+)(\\.\\d+)?$"; for (int i = 1; i < x.length(); i++) { if (x.charAt(0) == '0' && x.length() > 1 && x.charAt(1) != '.') return false; } if (x.matches(w)) return true; else return false; } String tran(double x) { String str_d = String.valueOf(x); str_d = str_d.substring(str_d.indexOf(".") + 1); int len = str_d.length(); len = len > 6 ? 6 : len; String out = String.format("%." + len + "f", x); return out; } void One(String x) { String[] dj = x.split(" "); String[] point1 = dj[0].split(","); if (dj.length < 3) System.out.print("wrong number of points"); String[] point2 = dj[1].split(","); String[] point3 = dj[2].split(","); if (point1.length == 2 && point2.length == 2 && point3.length == 2) { if (legal(point1[0]) && legal(point1[1]) && legal(point2[0]) && legal(point2[1]) && legal(point3[0]) && legal(point3[1])) { double x0 = Double.parseDouble(point1[0]); double y0 = Double.parseDouble(point1[1]); double x1 = Double.parseDouble(point2[0]); double y1 = Double.parseDouble(point2[1]); double x2 = Double.parseDouble(point3[0]); double y2 = Double.parseDouble(point3[1]); double a = Math.sqrt(Math.pow(y1 - y0, 2) + Math.pow(x1 - x0, 2)); double b = Math.sqrt(Math.pow(y2 - y0, 2) + Math.pow(x2 - x0, 2)); double c = Math.sqrt(Math.pow(y2 - y1, 2) + Math.pow(x2 - x1, 2)); if (dj.length == 3 && a + b > c && a + c > b && b + c > a) { if (a == b || b == c || a == c) System.out.print("true "); else System.out.print("false "); if (a == b && b == c) System.out.print("true "); else System.out.print("false"); } else System.out.print("data error"); if (dj.length > 3) System.out.print("wrong number of points"); } else System.out.print("Wrong Format"); } else System.out.print("Wrong Format"); } void Two(String x) { String[] dj = x.split(" "); String[] point1 = dj[0].split(","); if (dj.length < 3) System.out.print("wrong number of points"); String[] point2 = dj[1].split(","); String[] point3 = dj[2].split(","); if (point1.length == 2 && point2.length == 2 && point3.length == 2) { if (legal(point1[0]) && legal(point1[1]) && legal(point2[0]) && legal(point2[1]) && legal(point3[0]) && legal(point3[1])) { double x0 = Double.parseDouble(point1[0]); double y0 = Double.parseDouble(point1[1]); double x1 = Double.parseDouble(point2[0]); double y1 = Double.parseDouble(point2[1]); double x2 = Double.parseDouble(point3[0]); double y2 = Double.parseDouble(point3[1]); double a = Math.sqrt(Math.pow(y1 - y0, 2) + Math.pow(x1 - x0, 2)); double b = Math.sqrt(Math.pow(y2 - y0, 2) + Math.pow(x2 - x0, 2)); double c = Math.sqrt(Math.pow(y2 - y1, 2) + Math.pow(x2 - x1, 2)); if (dj.length == 3 && a + b > c && a + c > b && b + c > a) { System.out.print(tran(a + b + c) + " " + tran(0.5 * c * Math.abs((y2 - y1) * (x0 - x1) - (x2 - x1) * (y0 - y1)) / Math.sqrt(Math.pow((y1 - y2), 2) + Math.pow((x1 - x2), 2))) + " " + tran((x0 + x1 + x2) / 3) + "," + tran((y0 + y1 + y2) / 3)); } else System.out.print("data error"); if (dj.length > 3) System.out.print("wrong number of points"); } else System.out.print("Wrong Format"); } else System.out.print("Wrong Format"); } void Three(String x) { String[] dj = x.split(" "); String[] point1 = dj[0].split(","); if (dj.length < 3) System.out.print("wrong number of points"); String[] point2 = dj[1].split(","); String[] point3 = dj[2].split(","); if (point1.length == 2 && point2.length == 2 && point3.length == 2) { if (legal(point1[0]) && legal(point1[1]) && legal(point2[0]) && legal(point2[1]) && legal(point3[0]) && legal(point3[1])) { double x0 = Double.parseDouble(point1[0]); double y0 = Double.parseDouble(point1[1]); double x1 = Double.parseDouble(point2[0]); double y1 = Double.parseDouble(point2[1]); double x2 = Double.parseDouble(point3[0]); double y2 = Double.parseDouble(point3[1]); double a = Math.sqrt(Math.pow(y1 - y0, 2) + Math.pow(x1 - x0, 2)); double b = Math.sqrt(Math.pow(y2 - y0, 2) + Math.pow(x2 - x0, 2)); double c = Math.sqrt(Math.pow(y2 - y1, 2) + Math.pow(x2 - x1, 2)); if (dj.length == 3 && a + b > c && a + c > b && b + c > a) { if (a*a + b*b < c*c||c*c+ b*b< a*a|| a*a +c*c < b*b) System.out.print("true false false"); if (a*a + b*b ==c*c||c*c+ b*b==a*a|| a*a +c*c==b*b)//点14 System.out.print("false true false"); if (a*a + b*b >c*c&&c*c+ b*b> a*a&& a*a +c*c > b*b) System.out.print("false false true"); } else System.out.print("data error"); if (dj.length > 3) System.out.print("wrong number of points"); } else System.out.print("Wrong Format"); } else System.out.print("Wrong Format"); } void Four(String x) { String[] dj = x.split(" "); String[] point1 = dj[0].split(","); if (dj.length < 5) System.out.print("wrong number of points"); String[] point2 = dj[1].split(","); String[] point3 = dj[2].split(","); String[] point4 = dj[3].split(","); String[] point5 = dj[4].split(","); if (!dj[1].equals(dj[0])) { if (point1.length == 2 && point2.length == 2 && point3.length == 2) { if (legal(point1[0]) && legal(point1[1]) && legal(point2[0]) && legal(point2[1]) && legal(point3[0]) && legal(point3[1]) && legal(point4[0]) && legal(point4[1]) && legal(point5[0]) && legal(point5[1])) { double x0 = Double.parseDouble(point1[0]); double y0 = Double.parseDouble(point1[1]); double x1 = Double.parseDouble(point2[0]); double y1 = Double.parseDouble(point2[1]); double x2 = Double.parseDouble(point3[0]); double y2 = Double.parseDouble(point3[1]); double x3 = Double.parseDouble(point4[0]); double y3 = Double.parseDouble(point4[1]); double x4 = Double.parseDouble(point5[0]); double y4 = Double.parseDouble(point5[1]); double a = Math.sqrt(Math.pow(y2 - y4, 2) + Math.pow(x2 - x4, 2)); double b = Math.sqrt(Math.pow(y3 - y2, 2) + Math.pow(x3 - x2, 2)); double c = Math.sqrt(Math.pow(y4 - y3, 2) + Math.pow(x4 - x3, 2)); if (dj.length == 5 && a + b > c && a + c > b && b + c > a) { } else System.out.print("data error"); if (dj.length > 5) System.out.print("wrong number of points"); } else System.out.print("Wrong Format"); } else System.out.print("Wrong Format"); } else System.out.print("points coincide"); } void Five(String x){} }
View Cod
三、踩坑心得
1、第一次大作业
<1>了解了数据类型转换,有自动类型转换和强制类型转换,容量小的可以往容量大的转换(隐式),但容量大的往容量小的转换则需要强制转换(显式)
float k =(float) (kg / 0.45359237); float m =(float)(meter / 0.0254);
<2>当把任何基本类型和字符串值进行连接运算时,基本类型会被自动转成字符串类型,连接字符串,第二题要求找到奇数并输出,这样操作非常简单
String sum="";
if(a%2!=0) sum+=a;
<3>字符串相关函数非常好用,如分割字符串substring(),length()
<4>有时计算机计算会出现一小点误差,我们避免用’==’而用Math.abs(nextGuess – lastGuess)< 0.00001或许会得到想要的答案
2、第二次大作业
<1>Character类里的isDigit和isLetter很好用,可以帮助判断字符,charAt()可以对字符串里的每位进行判断操作,非常方便
<2>获取输入时,要注意nextLine()方法返回的是Enter键之前的所有字符,它可以得到带空格的字符串的。而next()会自动消去有效字符前的空格,只返回输入的字符,不能得到带空格的字符串
<3>s.close()是一个好习惯。
3、第三次大作业
<1>正则表达式的使用仍处于初级阶段,还需要认真学习
<2>判断方法和第一二题差不多,只需稍加修改就可以应用到新的题目中,缩短了编程的时间,减少了重复思考与代码重写
四、改进建议
1.第三次作业里的第二三题,代码的修改再次运用,虽然减少了重复思考的时间,但代码过长,后面要多进行实践练习
2.圈复杂度过高,if嵌套太多次,应该可以通过一个计算方法,找出相应数字的特性,通过计算得出一个数字再进行判断,后续要学习培养更好的书写习惯
3.第三次作业的第三题的第五项,仍然没找到合适的算法,希望后续学习可以将其补上
五、总结
1.这三次作业难度逐渐递增,帮助我们很快的从原先C语言的面相过程跳转为现在JAVA的面相对象,初步的了解了面相对象的思考方式。但是对于每个对象究竟应该有什么属性,以及属性的公共或私有形式、每个对象具体方法的考量都不完善,后续应该加强思考如何使设计的对象有更强的可塑性,可以更方便快捷的在下次使用时完成修改。
2.在对于JAVA庞大的类库以及相关功能还需要进一步的了解与学习,提高工作效率,方便后续功能更好更快捷的实现。
3.作业与实验现下的难度与题量都很适合练习,可以很好地复习老师讲授的知识点,除去第三次作业7-3的某点算法上遇到了困难,其他都能有想法,写得出来代码。再有,就是希望能看下pta高分的同学的代码,来学习一下别人的优点