这里写自定义目录标题

  • 引言:
    • 第一次与第二次大作业
    • 题目集2:7-2 串口字符解析
    • 点线形系列1-计算两点之间的距离
  • 点线形系列2-线的计算
    • 点线形系列3-三角形的计算
    • 总结

引言:

这次的作业是基础的java程序的设计,在有效运用课本上的知识的同时,又别出心裁的涉及到一些需要自学的一些知识,课堂听课与课外自学知识的巧妙结合,既考察了上课知识的吸收率,又给我们一些课外的学习时间。题目集一共是三次大作业形式,主要考察了学者对Java语言的基础使用,且包含一些Java编程常用方法和技巧。

第一次与第二次大作业

总体来说题目难度偏易,适合初学,作为第一次作业可以强化我们对java语言结构和编码的基础。不过这题目也是易中有难,实现题目功能很快,但是有些测试点需要通过却需要调试去调整代码的运行逻辑。

题目集2:7-2 串口字符解析

学校学生学号格式定义如下:
2位年级号+2位学院号+2位班级号+2位序号,如19041103,
编写程序处理用全院学生学号连接起来的长字符串,学院编号为20,包括17、18、19、20四个年级,请从字符串中提取特定两个班级202017班、202061班同学的学号后四位输出,输出编号之间用空格分隔,不换行。
注意:需要排除非法输入。
我的代码如下:

import java.util.*;public class Main{public static void main(String[] args){Scanner input = new Scanner(System.in);String a;a = input.next();if(a.length()<11){System.out.println("null data");return;}if(a.matches("^[1]*$")){System.out.println("null data");return;}int head,i,number=1,sum;boolean flag = false;boolean tag = false;for(head = 0;head<=a.length()-10;head++){if(a.charAt(head)=='0'){System.out.print(number+":");number++;if(a.charAt(head+10)=='0'){flag = false;}else{flag = true;sum = 0;for(i=head+1;i<head+9;i++){if(a.charAt(i)=='1'){sum++;}}if(sum%2==0){if(a.charAt(head+9)=='1'){tag = true;}else{tag = false;}}else{if(a.charAt(head+9)=='0'){tag = true;}else{tag = false;}}}if(flag==true){if(tag==true){for(i=head+1;i<head+9;i++){System.out.print(a.charAt(i));}System.out.print("\n");}else{System.out.println("parity check error");}}else{System.out.println("validate error");}head = head +10;}}}}

我的题目理解:在异步通信模式下,串口可以一次发送58位数据,收发双方之间没有数据发送时线路维持高电平,相当于接收方持续收到数据“1”(称为空闲位)发送方有数据发送时,会在有效数据(58位,具体位数由通信双方提前设置)前加上1位起始位“0”,在有效数据之后加上1位可选的奇偶校验位和1位结束位“1‘这题难度之一就是理解有效数据,在空闲位结束时会发送起始位0 ,之后有八位有效数据,有效数据后接着一位奇偶校验位和结束符1。理解奇偶校验位是本题解题的关键。开始以为奇偶校验位为1是就是奇校验位,为0就为偶校验。但是样例告诉我我的理解错误。在看完全部样例之后,我知道了八位有效数据再加上奇偶校验位一共九位数中出现奇数个1则为奇校验,反之为偶校验。

s获取用户输入的字符串,m用于存储起始位后面的10个数字,n用于计数有多少个有效数据,f用于判断用户输入数据中是否有起始位,all用于奇偶校验,i、j用于控制循环的结束;再用字符串charAt(),substring()等相关函数进行操作,根据对奇偶校验位和结束位的判断给出相应的输出。
心得:空字符串的存储赋初值为"",而不是null;知道了String类里面的charAt(),substring()等方法的用途;对boolean类型变量控制操作更加熟悉;String.charAt()返回的类型为char。

点线形系列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”。

import java.util.Scanner;import java.util.regex.Matcher;import java.util.regex.Pattern;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int count=0;point p1=new point();point p2=new point();String str=in.nextLine();double[]number=new double[100];Pattern pattern = Pattern.compile("-?([1-9]\\d*\\.?\\d*|0\\.\\d*[1-9]\\d*|0?\\.0+|0)");Matcher matcher = pattern.matcher(str);while (matcher.find()){String res = matcher.group();int n=res.length();if (res.length()>0){number[count]=Double.parseDouble(res);count++;}            }if(count>=5) {System.out.println("wrong number of points");}else {p1.x=number[0];p1.y=number[1];p2.x=number[2];p2.y=number[3];double r = p1.getdis(p2);System.out.println(r);}}}class point{double x,y;double getdis(point p) {x=this.x;y=this.y;double distance=Math.sqrt((p.x-x)*(p.x-x)+(p.y-y)*(p.y-y));return distance;}}

正则表达式语法
在其他语言中,\ 表示:我想要在正则表达式中插入一个普通的(字面上的)反斜杠,请不要给它任何特殊的意义。

在 Java 中,\ 表示:我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义。

所以,在其他的语言中(如 Perl),一个反斜杠 \ 就足以具有转义的作用,而在 Java 中正则表达式中则需要有两个反斜杠才能被解析为其他语言中的转义作用。也可以简单的理解在 Java 的正则表达式中,两个 \ 代表其他语言中的一个 \,这也就是为什么表示一位数字的正则表达式是 \d,而表示一个普通的反斜杠是 \。

这张表格可以可以说明一部分用法

字符

说明

\

将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如, n匹配字符 n。\n 匹配换行符。序列 \\ 匹配 \ ,\( 匹配 (。

^

匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与"\n"或"\r"之后的位置匹配。

$

匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与"\n"或"\r"之前的位置匹配。

零次或多次匹配前面的字符或子表达式。例如,zo* 匹配"z"和"zoo"。* 等效于 {0,}。

一次或多次匹配前面的字符或子表达式。例如,"zo+"与"zo"和"zoo"匹配,但与"z"不匹配。+ 等效于 {1,}。

?

零次或一次匹配前面的字符或子表达式。例如,"do(es)?“匹配"do"或"does"中的"do”。? 等效于 {0,1}。

{n}

n 是非负整数。正好匹配 n 次。例如,"o{2}"与"Bob"中的"o"不匹配,但与"food"中的两个"o"匹配。

{n,}

n 是非负整数。至少匹配 n 次。例如,"o{2,}“不匹配"Bob"中的"o”,而匹配"foooood"中的所有 o。"o{1,}“等效于"o+”。"o{0,}“等效于"o*”。

{n,m}

m 和 n 是非负整数,其中 n <= m。匹配至少 n 次,至多 m 次。例如,"o{1,3}"匹配"fooooood"中的头三个 o。‘o{0,1}’ 等效于 ‘o?’。注意:您不能将空格插入逗号和数字之间。

?

当此字符紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,匹配模式是"非贪心的"。"非贪心的"模式匹配搜索到的、尽可能短的字符串,而默认的"贪心的"模式匹配搜索到的、尽可能长的字符串。例如,在字符串"oooo"中,"o+?“只匹配单个"o”,而"o+“匹配所有"o”。

.

匹配除"\r\n"之外的任何单个字符。若要匹配包括"\r\n"在内的任意字符,请使用诸如"[\s\S]"之类的模式。

(pattern)

匹配 pattern 并捕获该匹配的子表达式。可以使用 $0…$9 属性从结果"匹配"集合中检索捕获的匹配。若要匹配括号字符 ( ),请使用"(“或者”)"。

(?:pattern)

匹配 pattern 但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配。这对于用"or"字符 (|) 组合模式部件的情况很有用。例如,'industr(?:y|ies) 是比 ‘industry|industries’ 更经济的表达式。

(?=pattern)

执行正向预测先行搜索的子表达式,该表达式匹配处于匹配 pattern 的字符串的起始点的字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。例如,‘Windows (?=95|98|NT|2000)’ 匹配"Windows 2000"中的"Windows",但不匹配"Windows 3.1"中的"Windows"。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。

(?!pattern)

执行反向预测先行搜索的子表达式,该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。例如,‘Windows (?!95|98|NT|2000)’ 匹配"Windows 3.1"中的 “Windows”,但不匹配"Windows 2000"中的"Windows"。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。

x|y

匹配 x 或 y。例如,‘z|food’ 匹配"z"或"food"。‘(z|f)ood’ 匹配"zood"或"food"。

[xyz]

字符集。匹配包含的任一字符。例如,"[abc]“匹配"plain"中的"a”。

[^xyz]

反向字符集。匹配未包含的任何字符。例如,"[^abc]“匹配"plain"中"p”,“l”,“i”,“n”。

[a-z]

字符范围。匹配指定范围内的任何字符。例如,"[a-z]"匹配"a"到"z"范围内的任何小写字母。

[^a-z]

反向范围字符。匹配不在指定的范围内的任何字符。例如,"[^a-z]"匹配任何不在"a"到"z"范围内的任何字符。

\b

匹配一个字边界,即字与空格间的位置。例如,“er\b"匹配"never"中的"er”,但不匹配"verb"中的"er"。

\B

非字边界匹配。“er\B"匹配"verb"中的"er”,但不匹配"never"中的"er"。

\cx

匹配 x 指示的控制字符。例如,\cM 匹配 Control-M 或回车符。x 的值必须在 A-Z 或 a-z 之间。如果不是这样,则假定 c 就是"c"字符本身。

\d

数字字符匹配。等效于 [0-9]。

\D

非数字字符匹配。等效于 [^0-9]。

\f

换页符匹配。等效于 \x0c 和 \cL。

\n

换行符匹配。等效于 \x0a 和 \cJ。

\r

匹配一个回车符。等效于 \x0d 和 \cM。

\s

匹配任何空白字符,包括空格、制表符、换页符等。与 [ \f\n\r\t\v] 等效。

\S

匹配任何非空白字符。与 [^ \f\n\r\t\v] 等效。

\t

制表符匹配。与 \x09 和 \cI 等效。

\v

垂直制表符匹配。与 \x0b 和 \cK 等效。

\w

匹配任何字类字符,包括下划线。与"[A-Za-z0-9_]"等效。

\W

与任何非单词字符匹配。与"[^A-Za-z0-9_]"等效。

\xn

匹配 n,此处的 n 是一个十六进制转义码。十六进制转义码必须正好是两位数长。例如,“\x41"匹配"A”。“\x041"与”\x04"&"1"等效。允许在正则表达式中使用 ASCII 代码。

\num

匹配 num,此处的 num 是一个正整数。到捕获匹配的反向引用。例如,"(.)\1"匹配两个连续的相同字符。

\n

标识一个八进制转义码或反向引用。如果 \n 前面至少有 n 个捕获子表达式,那么 n 是反向引用。否则,如果 n 是八进制数 (0-7),那么 n 是八进制转义码。

\nm

标识一个八进制转义码或反向引用。如果 \nm 前面至少有 nm 个捕获子表达式,那么 nm 是反向引用。如果 \nm 前面至少有 n 个捕获,则 n 是反向引用,后面跟有字符 m。如果两种前面的情况都不存在,则 \nm 匹配八进制值 nm,其中 n 和 m 是八进制数字 (0-7)。

\nml

当 n 是八进制数 (0-3),m 和 l 是八进制数 (0-7) 时,匹配八进制转义码 nml。

\un

匹配 n,其中 n 是以四位十六进制数表示的 Unicode 字符。例如,\u00A9 匹配版权符号 (©)。
**心得:**str用于存储用户输入的字符串;equal作为判断输入是否合法类,其中format()作为格式判断,quantity()作为输入点数量判断,如果format()返回true则输入正确可直接进行操作,如果format()返回false但quantity()返回true则是输入点的数量不符合要求,如果format()和quantity()都返回false则是输入的格式错误;dispose(当时名字取错了)作为点类,其中extract(String)使用split()分割字符串,s[]用于存储分割后的字符串提取坐标(x,y),compute()计算两点之间距离;Main构造 dispose和equal引用相关方法判断给出相应输出。了解运用了字符串转为数字的方法parseDouble()和分割字符串的方法split();虽然这次类构造的不好,但是初步对类有了一定的了解,也是突破了过程,从而进入到对象;对正则表达式也有了初步的了解。

点线形系列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",

import java.util.*;public class Main {public static void main(String[] args) {double x1,y1,x2,y2;char a,b;int flag = 1;int count = 0;int k = 0;Scanner in = new Scanner(System.in);String str = in.nextLine();int time = (int)(str.charAt(0))-48;if(str.charAt(0) >= '1'&&str.charAt(0) <= '5'&&str.charAt(1) == ':'){for(int i = 2;i<str.length();i++){if(str.charAt(i)==','){count++;}if(str.charAt(i)==' '){k++;}if(str.charAt(i)=='+'||str.charAt(i)=='-'||str.charAt(i)=='.'){if(str.charAt(i+1)>='0'&&str.charAt(i+1)<='9'){continue;}else{flag = 0;break;}}}if(count - k != 1)flag = 0;}else{System.out.println("Wrong Format");}if(flag == 0)System.out.println("Wrong Format");if(flag == 1){switch(time){case 1:qingkuang1(str);break;case 2:qingkuang2(str);break;case 3:qingkuang3(str);break;case 4:qingkuang4(str);break;case 5:qingkuang5(str);break;}}}public static int shuliang(String str){int count = 0;for(int i = 0;i<str.length();i++){if(str.charAt(i) == ',')count ++;}return count;}public static boolean panduan(double x1,double y1,double x2,double y2){if(x1 == x2&&y1 == y2)return false;return true;}public static void qingkuang1(String str){int count = 0;boolean flag = true;count = shuliang(str);if(count != 2)System.out.println("wrong number of points");else{String[] a = new String[4];for(int i = 0;i<4;i++){a[i] = new String();}int cnt = 0;for(int i = 2;i<str.length();i++){if(str.charAt(i)!=' '&&str.charAt(i)!=','){a[cnt] = a[cnt]+str.substring(i,i+1);}else{cnt++;}}int flag1=1;for(int i = 0;i<count*2;i++){if(a[i].charAt(0)=='+'||a[i].charAt(0)=='-'){if(a[i].charAt(1)=='0'&&a[i].charAt(2)!='.'){flag1=0;}}else{if(a[i].length()>=2){if(a[i].charAt(0)=='0'&&a[i].charAt(1)!='.'){flag1=0;}}}if(flag1==0){break;}}if(flag1==0){System.out.println("Wrong Format");}else{double [] arr = new double[count*2];for(int i = 0;i<count*2;i++)arr[i] = Double.parseDouble(a[i]);flag = panduan(arr[0],arr[1],arr[2],arr[3]);if(flag){if(arr[0]-arr[2] == 0)System.out.println("Slope does not exist");else{double k = (arr[1]-arr[3]) / (arr[0]-arr[2]);System.out.println(k);}}elseSystem.out.println("points coincide");}}}public static void qingkuang2(String str){int count = 0;boolean flag = true;double A,B,C;count = shuliang(str);if(count != 3)System.out.println("wrong number of points");else{String[] a = new String[6];for(int i = 0;i<6;i++){a[i] = new String();}int cnt = 0;for(int i = 2;i<str.length();i++){if(str.charAt(i)!=' '&&str.charAt(i)!=','){a[cnt] = a[cnt]+str.substring(i,i+1);}else{cnt++;}}int flag1=1;for(int i = 0;i<count*2;i++){if(a[i].charAt(0)=='+'||a[i].charAt(0)=='-'){if(a[i].charAt(1)=='0'&&a[i].charAt(2)!='.'){flag1=0;}}else{if(a[i].length()>=2){if(a[i].charAt(0)=='0'&&a[i].charAt(1)!='.'){flag1=0;}}}if(flag1==0){break;}}if(flag1==0){System.out.println("Wrong Format");}else{double [] arr = new double[count*2];for(int i = 0;i<count*2;i++)arr[i] = Double.parseDouble(a[i]);flag = panduan(arr[0],arr[1],arr[2],arr[3]);flag = panduan(arr[0],arr[1],arr[4],arr[5]);flag = panduan(arr[2],arr[3],arr[4],arr[5]);if(flag){A = arr[5] - arr[3];B = arr[2] - arr[4];C = arr[4]*arr[3] - arr[5]*arr[2];double distance = (Math.abs(A*arr[0] + B*arr[1] + C)) / (Math.sqrt(A*A + B*B));System.out.println(distance);}elseSystem.out.println("points coincide");}}}public static void qingkuang3(String str){int count = 0;boolean flag = true;boolean answer;count = shuliang(str);if(count != 3)System.out.println("wrong number of points");else{String[] a = new String[6];for(int i = 0;i<6;i++){a[i] = new String();}int cnt = 0;for(int i = 2;i<str.length();i++){if(str.charAt(i)!=' '&&str.charAt(i)!=','){a[cnt] = a[cnt]+str.substring(i,i+1);}else{cnt++;}}int flag1=1;for(int i = 0;i<count*2;i++){if(a[i].charAt(0)=='+'||a[i].charAt(0)=='-'){if(a[i].charAt(1)=='0'&&a[i].charAt(2)!='.'){flag1=0;}}else{if(a[i].length()>=2){if(a[i].charAt(0)=='0'&&a[i].charAt(1)!='.'){flag1=0;}}}if(flag1==0){break;}}if(flag1==0){System.out.println("Wrong Format");}else{double [] arr = new double[count*2];for(int i = 0;i<count*2;i++)arr[i] = Double.parseDouble(a[i]);flag = panduan(arr[0],arr[1],arr[2],arr[3]);flag = panduan(arr[0],arr[1],arr[4],arr[5]);flag = panduan(arr[2],arr[3],arr[4],arr[5]);if(flag){double k1 = (arr[1]-arr[3]) / (arr[0]-arr[2]);double k2 = (arr[1]-arr[5]) / (arr[0]-arr[4]);if(k1 == k2)answer = true;elseanswer = false;System.out.println(answer);}elseSystem.out.println("points coincide");}}}public static void qingkuang4(String str){int count = 0;boolean flag = true;boolean answer;count = shuliang(str);if(count != 4)System.out.println("wrong number of points");else{String[] a = new String[count*2];for(int i = 0;i<count*2;i++){a[i] = new String();}int cnt = 0;for(int i = 2;i<str.length();i++){if(str.charAt(i)!=' '&&str.charAt(i)!=','){a[cnt] = a[cnt]+str.substring(i,i+1);}else{cnt++;}}int flag1=1;for(int i = 0;i<count*2;i++){if(a[i].charAt(0)=='+'||a[i].charAt(0)=='-'){if(a[i].charAt(1)=='0'&&a[i].charAt(2)!='.'){flag1=0;}}else{if(a[i].length()>=2){if(a[i].charAt(0)=='0'&&a[i].charAt(1)!='.'){flag1=0;}}}if(flag1==0){break;}}if(flag1==0){System.out.println("Wrong Format");}else{double [] arr = new double[count*2];for(int i = 0;i<count*2;i++)arr[i] = Double.parseDouble(a[i]);flag = panduan(arr[0],arr[1],arr[2],arr[3]);flag = panduan(arr[0],arr[1],arr[4],arr[5]);flag = panduan(arr[0],arr[1],arr[6],arr[7]);flag = panduan(arr[2],arr[3],arr[4],arr[5]);flag = panduan(arr[2],arr[3],arr[6],arr[7]);flag = panduan(arr[4],arr[5],arr[6],arr[7]);if(flag){double k1 = (arr[1]-arr[3]) / (arr[0]-arr[2]);double k2 = (arr[5]-arr[7]) / (arr[4]-arr[6]);if(k1 == k2)answer = true;elseanswer = false;System.out.println(answer);}elseSystem.out.println("points coincide");}}}public static void qingkuang5(String str){int count = 0;boolean flag = true;boolean answer;double A1,A2,B1,B2,C1,C2;count = shuliang(str);if(count != 4)System.out.println("wrong number of points");else{String[] a = new String[count*2];for(int i = 0;i<count*2;i++){a[i] = new String();}int cnt = 0;for(int i = 2;i<str.length();i++){if(str.charAt(i)!=' '&&str.charAt(i)!=','){a[cnt] = a[cnt]+str.substring(i,i+1);}else{cnt++;}}int flag1=1;for(int i = 0;i<count*2;i++){if(a[i].charAt(0)=='+'||a[i].charAt(0)=='-'){if(a[i].charAt(1)=='0'&&a[i].charAt(2)!='.'){flag1=0;}}else{if(a[i].length()>=2){if(a[i].charAt(0)=='0'&&a[i].charAt(1)!='.'){flag1=0;}}}if(flag1==0){break;}}if(flag1==0){System.out.println("Wrong Format");}else{double [] arr = new double[count*2];for(int i = 0;i<count*2;i++)arr[i] = Double.parseDouble(a[i]);flag = panduan(arr[0],arr[1],arr[2],arr[3]);flag = panduan(arr[0],arr[1],arr[4],arr[5]);flag = panduan(arr[0],arr[1],arr[6],arr[7]);flag = panduan(arr[2],arr[3],arr[4],arr[5]);flag = panduan(arr[2],arr[3],arr[6],arr[7]);flag = panduan(arr[4],arr[5],arr[6],arr[7]);if(flag){double k1 = (arr[1]-arr[3]) / (arr[0]-arr[2]);double k2 = (arr[5]-arr[7]) / (arr[4]-arr[6]);if(k1 == k2)System.out.println("is parallel lines,have no intersection point");else{A1 = arr[3] - arr[1];B1 = arr[0] - arr[2];C1 = arr[2]*arr[1] - arr[0]*arr[3];A2 = arr[7] - arr[5];B2 = arr[4] - arr[6];C2 = arr[6]*arr[5] - arr[4]*arr[7];double x = (B2*C1-B1*C2) / (A2*B1-A1*B2);double y = (A1*C2-A2*C1) / (A2*B1-A1*B2);if((x>arr[0]&&x>arr[2]&&x>arr[4]&&x>arr[6])||(x<arr[0]&&x<arr[2]&&x<arr[4]&&x<arr[6]))answer = false;elseanswer = true;System.out.println(x+","+y+" "+answer);}}elseSystem.out.println("points coincide");}}}
}

点线形系列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坐标之间以英文”,"分隔,点与点之间以一个英文空格分隔。

import java.util.Scanner;public class Main {public static void main(String[] args) {// TODO Auto-generated method stubScanner input = new Scanner(System.in);String s=input.nextLine();String a=s.replace(":",",");String coord[] = a.split(",| ");input.close();if(s.matches("1:([+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?\\s)+[+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?")) {if(coord.length==7) {double x1 = Double.parseDouble(coord[1]);double y1 = Double.parseDouble(coord[2]);double x2 = Double.parseDouble(coord[3]);double y2 = Double.parseDouble(coord[4]);double x3 = Double.parseDouble(coord[5]);double y3 = Double.parseDouble(coord[6]);boolean judge=false,judge1=false,judge2=false;if((x1==x2&&y1==y2)||(x1==x3&&y1==y3)||(x2==x3&&y2==y3)||(x1==x2&&x1==x3))judge=false;else {if(x1==x2||x1==x3||x2==x3)judge=true;else {double slope1=(y1-y2)/(x1-x2);double slope2=(y1-y3)/(x1-x3);if(slope1!=slope2)judge=true;}}if(judge) {double line1=(y1-y2)*(y1-y2)+(x1-x2)*(x1-x2);double line2=(y1-y3)*(y1-y3)+(x1-x3)*(x1-x3);double line3=(y2-y3)*(y2-y3)+(x2-x3)*(x2-x3);if(line1==line2||line1==line3||line2==line3) {judge1=true;if(line1==line2&&line1==line3)judge2=true;}System.out.print(judge1+" "+judge2);}else System.out.print("data error");}else System.out.print("wrong number of points");}else if(s.matches("2:([+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?\\s)+[+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?")) {if(coord.length==7) {double x1 = Double.parseDouble(coord[1]);double y1 = Double.parseDouble(coord[2]);double x2 = Double.parseDouble(coord[3]);double y2 = Double.parseDouble(coord[4]);double x3 = Double.parseDouble(coord[5]);double y3 = Double.parseDouble(coord[6]);boolean judge=false;if((x1==x2&&y1==y2)||(x1==x3&&y1==y3)||(x2==x3&&y2==y3)||(x1==x2&&x1==x3))judge=false;else {if(x1==x2||x1==x3||x2==x3)judge=true;else {double slope1=(y1-y2)/(x1-x2);double slope2=(y1-y3)/(x1-x3);if(slope1!=slope2)judge=true;}}if(judge) {double line1=Math.sqrt((y1-y2)*(y1-y2)+(x1-x2)*(x1-x2));double line2=Math.sqrt((y1-y3)*(y1-y3)+(x1-x3)*(x1-x3));double line3=Math.sqrt((y2-y3)*(y2-y3)+(x2-x3)*(x2-x3));double circumference=line1+line2+line3;double area=(x1*y2+x2*y3+x3*y1-x1*y3-x2*y1-x3*y2)/2;double x0=(x1+x2+x3)/3;double y0=(y1+y2+y3)/3;if(circumference*1e+6%10!=0) {String num1=String.format("%.6f",circumference);System.out.print(num1+" ");}else System.out.print(circumference+" ");if(area*1e+6%10!=0) {String num2=String.format("%.6f",area);System.out.print(num2+" ");}else System.out.print(area+" ");if(x0*1e+6%10!=0) {String num3=String.format("%.6f",x0);System.out.print(num3+" ");}else System.out.print(x0+",");if(y0*1e+6%10!=0) {String num4=String.format("%.6f",y0);System.out.print(num4);}else System.out.print(y0);}else System.out.print("data error");}else System.out.print("wrong number of points");}else if(s.matches("3:([+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?\\s)+[+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?")) {if(coord.length==7) {double x1 = Double.parseDouble(coord[1]);double y1 = Double.parseDouble(coord[2]);double x2 = Double.parseDouble(coord[3]);double y2 = Double.parseDouble(coord[4]);double x3 = Double.parseDouble(coord[5]);double y3 = Double.parseDouble(coord[6]);boolean judge=false,judge1=false,judge2=false,judge3=false;if((x1==x2&&y1==y2)||(x1==x3&&y1==y3)||(x2==x3&&y2==y3)||(x1==x2&&x1==x3))judge=false;else {if(x1==x2||x1==x3||x2==x3)judge=true;else {double slope1=(y1-y2)/(x1-x2);double slope2=(y1-y3)/(x1-x3);if(slope1!=slope2)judge=true;}}if(judge) {double line1=(y1-y2)*(y1-y2)+(x1-x2)*(x1-x2);double line2=(y1-y3)*(y1-y3)+(x1-x3)*(x1-x3);double line3=(y2-y3)*(y2-y3)+(x2-x3)*(x2-x3);if(line1+line2>line3&&line1+line3>line2&&line2+line3>line1)judge1=true;else if(line1+line2==line3||line1+line3==line2&&line2+line3==line1)judge2=true;else judge3=true;System.out.print(judge3+" "+judge2+" "+judge1);}else System.out.print("data error");}else System.out.print("wrong number of points");}else if(s.matches("4:([+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?\\s)+[+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?")) {if(coord.length==11) {double x1 = Double.parseDouble(coord[1]);double y1 = Double.parseDouble(coord[2]);double x2 = Double.parseDouble(coord[3]);double y2 = Double.parseDouble(coord[4]);double x3 = Double.parseDouble(coord[5]);double y3 = Double.parseDouble(coord[6]);double x4 = Double.parseDouble(coord[7]);double y4 = Double.parseDouble(coord[8]);double x5 = Double.parseDouble(coord[9]);double y5 = Double.parseDouble(coord[10]);boolean judge=false;if(x1==x2&&y1==y2)System.out.print("points coincide");else {if((x3==x4&&y3==y4)||(x3==x5&&y3==y5)||(x4==x5&&y4==y5)||(x3==x4&&x3==x5))judge=false;else {if(x3==x4||x3==x5||x4==x5)judge=true;else {double slope1=(y3-y4)/(x3-x4);double slope2=(y3-y5)/(x3-x5);if(slope1!=slope2)judge=true;}}if(judge) {double distance1=((y1-y2)*x3+(x2-x1)*y3+x1*y2-y1*x2)/Math.sqrt((y1-y2)*(y1-y2)+(x1-x2)*(x1-x2));double distance2=((y1-y2)*x4+(x2-x1)*y4+x1*y2-y1*x2)/Math.sqrt((y1-y2)*(y1-y2)+(x1-x2)*(x1-x2));double distance3=((y1-y2)*x5+(x2-x1)*y5+x1*y2-y1*x2)/Math.sqrt((y1-y2)*(y1-y2)+(x1-x2)*(x1-x2));if((distance1>0&&distance2>0&&distance3>0)||(distance1<0&&distance2<0&&distance3<0))System.out.print("0");else if((distance1==0&&distance2*distance3>0)||(distance2==0&&distance1*distance3>0)||(distance3==0&&distance1*distance2>0))System.out.print("1");else if((distance1==0&&distance2==0)||(distance1==0&&distance3==0)||(distance2==0&&distance3==0))System.out.print("The point is on the edge of the triangle");else {System.out.print("2 ");}}else System.out.print("data error");}}else System.out.print("wrong number of points");}else if(s.matches("5:([+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?\\s)+[+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?")) {if(coord.length==9) {double x1 = Double.parseDouble(coord[1]);double y1 = Double.parseDouble(coord[2]);double x2 = Double.parseDouble(coord[3]);double y2 = Double.parseDouble(coord[4]);double x3 = Double.parseDouble(coord[5]);double y3 = Double.parseDouble(coord[6]);double x4 = Double.parseDouble(coord[7]);double y4 = Double.parseDouble(coord[8]);boolean judge=false;if((x2==x3&&y2==y3)||(x2==x4&&y2==y4)||(x3==x4&&y3==y4)||(x2==x3&&x2==x4))judge=false;else {if(x2==x3||x2==x4||x3==x4)judge=true;else {double slope1=(y2-y3)/(x2-x3);double slope2=(y2-y4)/(x2-x4);if(slope1!=slope2)judge=true;}}if(judge) {double distance1=((y2-y3)*x1+(x3-x2)*y1+x2*y3-y2*x3)/Math.sqrt((y2-y3)*(y2-y3)+(x2-x3)*(x2-x3));double distance2=((y2-y4)*x1+(x4-x2)*y1+x2*y4-y2*x4)/Math.sqrt((y2-y4)*(y2-y4)+(x2-x4)*(x2-x4));double distance3=((y3-y4)*x1+(x4-x3)*y1+x3*y4-y3*x4)/Math.sqrt((y3-y4)*(y3-y4)+(x3-x4)*(x3-x4));double area=(x2*y3+x3*y4+x4*y2-x2*y4-x3*y2-x4*y3)/2;double area1=(x1*y2+x2*y3+x3*y1-x1*y3-x2*y1-x3*y2)/2;double area2=(x1*y2+x2*y4+x4*y1-x1*y4-x2*y1-x4*y2)/2;double area3=(x1*y4+x4*y3+x3*y1-x1*y3-x4*y1-x3*y4)/2;if(area==(area1+area2+area3)) {if(distance1==0||distance2==0||distance3==0)System.out.print("on the triangle");else System.out.print("in the triangle");}else System.out.print("outof the triangle");}else System.out.print("data error");}else System.out.print("wrong number of points");}else System.out.print("Wrong Format");}
}

该题目的目的和例子6一样还是实现五个小功能,但较6在实际问题上又难了,我们需要了解射线法的原理(由第一个点往任一方向做一射线,射线与三角形的边的交点(不含点本身)数量如果为1,则在三角形内部。如果交点有两个或0个,则在三角形之外。若点在三角形的某条边上,输出"on the triangle"),要熟悉这个原理,再转化为我们的代码。同样构造类使问题分块解决。

总结

第三次的题目是层层递进的先是点,然后是线,最后是面。在老师的提醒下,运用到了正则表达式判断输入是否符合格式。用split分割字符串,将字符串转为数字;结合数学算法求两点距离;判断点重合;求点线距离;求线的属性;求线与线的关系;求线段与线段的交点;第三题三角形计算,判断是否能构成三角形,是什么三角形等。虽然这次在老师线上指导下改成了面对对象程序设计,但7-1和7-2大体上还是面对过程,只有在第二次指导下才将7-3改为了面对对象。从总体上看,虽然第三次题目量少,但第三次是这三次中最难的一次。学习的东西从基础开始,再从作业中实践复习加深掌握。从课本的知识到csdn上有一定具体描述来寻找想要的java方法。更明白了面向过程范式聚焦于方法的设计,它将数据与方法结合在对象中。在明白许多Java方法要求使用对象作为参数,下一阶段学习任务也包括学会使用ava能将数据类型合并或包装到一个对象中。其实程序设计是用来解决问题的,尤其是算法方面,所以我们要学会去做题,见识大量的题目,培养我们的思维。平时我们也要培养我们解决程序设计错误的能力,要学会去看给出的错误提示,学会总结,这样不仅能够避免也能更加掌握所学。

面对对象程序设计---第一次blog相关推荐

  1. 张云飞 201771010143 《面对对象程序设计(java)》第十七周学习总结

    张云飞 201771010143 <面对对象程序设计(java)>第十七周学习总结 1.实验目的与要求 (1) 掌握线程同步的概念及实现技术: (2) 线程综合编程练习 2.实验内容和步骤 ...

  2. 面对对象程序设计课堂总结(yyx)

    面对对象总结(19.6.1) 上课总思路: 1.使用数据库user表中的用户名和密码进行用户的登录验证: 思路:在客户端输入用户名和密码.在服务器端收到用户名和密码后,在数据库中查询user表. 看看 ...

  3. 面对对象程序设计YYX615

    面对对象总结(19.6.14) 上课总思路: 5.保存聊天信息到数据表message中 保存聊天信息1.创建message表 保存聊天信息2.转发聊天信息,并且保存到message表中 保存聊天信息3 ...

  4. Java面对对象程序设计——面对对象

    重点掌握 1.类是对一类事物描述,是抽象的.概念上的定义:对象是实际存在的该类事物的每个个体,因而也称为实例 2.创建对象的格式是:类名 对象名称 = new 类名 (); 3.方法的声明格式是:[& ...

  5. C++面对对象程序设计(第二版)

    本人是一个学习C++不久的小菜鸟,这些题目都是自己打出来(有些不会的去网上查出来的),如果有哪里写的不对的地方,欢迎各位指正. 第二章课后习题 P-66 第一题 改之前的代码 #include< ...

  6. Java面对对象程序设计:第一章 面对对象

    1.1 类与对象  1.1.1类和对象的概念 ( 如果不想看这些长篇大论,可以直击跳到下面的案例.) 类是抽象的,对象是具体的:类是对象的模板,图纸:对象是类的一个实例,是一个实实在在的个体,一个类可 ...

  7. JAVA 面对对象程序设计 习题7.3

    重新阅读例5.17,并画出除主类外的UML类图.

  8. python释放类对象_Python 基本功: 10. 面对对象-类 Class

    虽然 Python 可以写函数式编程,但是本质上是一门面对对象编程语言 (object-oriented programming language),简称 oop.面对对象编程是把代码包装成一个对象 ...

  9. 关于面对对象和正则表达式的处理

    面对对象是软件开发的方法.面对对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统.交互式界面.应用结构.应用平台.分布式系统.网络管理结构.AD技术.人工智能等领域.面向对象是一种对现实世 ...

最新文章

  1. 泛型java博客园,Java深度历险之Java泛型
  2. matlab中dither 函数,(转)matlab里一些简单的函数
  3. Web开发者需养成的好习惯
  4. 【Groovy】Groovy 脚本调用 ( Groovy 类中调用 Groovy 脚本 | 创建 GroovyShell 对象并执行 Groovy 脚本 | 完整代码示例 )
  5. SQL Server 临时表
  6. UDP千兆以太网FPGA_verilog实现(三、代码前期准备-时序要求)
  7. 【Qt】QWidget类详解(函数篇)
  8. N-甲基-N-亚硝基脲(MNU)与眼睛健康(思考中)
  9. 【转载保存】MySQL时间、字符串、时间戳互相转换
  10. PRD文档编写与规范
  11. VMware虚拟机桥接方式与真实主机共享上网
  12. Mac电脑上线剪映专业版之初体验!
  13. 【转载文章】原 DOS命令学习(从入门到精通)_____附加自己学习笔记
  14. netron工具简单使用
  15. 2022年浙江大学计算机考研复试分数线多少
  16. 分布式缓存之memcached以及LAMP的搭建
  17. 社会化商业的基础架构
  18. android电视 怎么调电视机的信号源,如何设置智能电视、盒子信号源?原来这么简单!具体方法如下...
  19. 智能车浅谈——方向控制篇
  20. JavaScript中逻辑运算符的优先级

热门文章

  1. openshift/origin学习记录(9)——S2I镜像定制(基于Git)
  2. eclipse 是用来写客户端的,MyEclipse 是用来写服务器端的,谐音记忆法,My 买,买服务器这样就好记了。
  3. Java基础知识面试题(2021最新版)
  4. java自定义封装一个方法_Java自定义套件封装教程
  5. 融易投3周年庆——欢乐送豪礼
  6. HTML CSS 布局
  7. 用shell打印正三角形_用shell命令绘制三角形
  8. 加减法、原码一位乘法、Booth算法、恢复余数法、加减交替法符号位及小结
  9. 分享几个好用的WP插件,让你的网站牛逼起来
  10. K均值 - 案例实现(python)