·前言:三次题目集的提交已经结束了,在此对三次题目集的知识点、题量、难度进行总结,并发表自己的看法。
(1)第一次大作业是基于Java的基本程序设计、选择结构的嵌套、多重循环的使用、一维以及多维数组的创建及使用和方法的传参的基本语法训练,题量大,难度小,有利于初学者对Java基本语法:输入、输出、if语句、for循环等的了解和掌握。
(2)第二次大作业题量少,但相较于第一次作业,难度上有一定的提高,需要我们在掌握基本语法后去学习新的知识点:不同基本类型之间的转换、对字符串内容的提取和拆分等一系列问题、考虑整体的逻辑结构、对大问题的拆分以及对算法的考虑。
(3)第三次大作业相较于第二次作业在难度上又有了很大的提高,不仅考察对程序语法的使用,对方法的熟练使用,对判断的多重嵌套,还考察了对问题的解决能力。其难度大幅提高的主要原因在于如何用代码来解决数学问题,需要一定的数学基础。考察整体和部分之间的联系,如何将一个大问题拆分成多个小问题并逐步解决。

从提交答案通过率来看,3000多次的提交,仅48次的成功。我认为难的原因在于四点:第一是每道题的题量信息大,每道母体会派生五个子题;第二是当代码量大时,个别细节会容易忽略,难以把控;第三是考虑问题不够全面,有很多的格式错误,导致通过率较低;第四是解决问题的算法不够精确,导致只有一部分会通过测试点。这也反应了自己对所学知识的不够全面,以及对解决数学问题所用方法的错误。
·各题目集题目 设计与分析 采坑心得 改进建议
(1)题目集1:7-9 二进制数值提取
设计与分析
1 import java.util.Scanner; 2 public class Main{ 3 public static void main(String[] args){ 4 Scanner input=new Scanner(System.in); 5 String str=input.nextLine(); //输入字符串 6 char[] data=str.toCharArray(); //将字符串转换为数组 7 boolean flag=false; 8 for(int i=0;i<data.length;i++) 9 { 10 if(data[i]=='-'&&data[i+1]=='1') 11 { 12 flag=true; 13 break; 14 } 15 } 16 if(flag==true) 17 { 18 for(int i=0;i<data.length;i++) 19 { 20 if(data[i]=='-'&&data[i+1]=='1') 21 { 22 break; 23 } 24 else { 25 if(data[i]=='0'||data[i]=='1') 26 System.out.print(data[i]); 27 } 28 29 } 30 } 31 else System.out.print("Wrong Format"); 32 } 33 }
分析:这道题简单,之考查简单的Java程序设计。
采坑心得
Scanner input=new Scanner(System.in);
String str=input.nextLine(); //输入一个字符串
char[] data=str.toCharArray();
以这部分为例,在C++中字符串可以直接str[0]使用,而Java中字符串与数组当成两个事物,需要先将字符串str用toCharArray转换为字符数组,再用字符数组来对字符串中的内容进行修改;而C中没有String类,不能用String str;来创建String类型的字符串,这是C与Java和C++的一个区别。
改进建议
(2)题目集2:7-2 串口字符解析
设计与分析
1 import java.util.Scanner; 2 public class Main{ 3 public static void main(String[] args){ 4 Scanner input=new Scanner(System.in); 5 String a; 6 int count1=0,count2=0,count3=1,count4=0,i,j=0; 7 a=input.nextLine(); 8 char []str=new char[11]; 9 char []arr=a.toCharArray(); 10 if(a.length()>=11) { 11 for(int k=0;k<a.length();k++) { 12 if(arr[k]=='1') count1++; 13 } 14 if(count1==a.length()) 15 System.out.print("null data"); 16 else 17 for(i=0;i<a.length();i++) { 18 if(arr[i]=='0') { 19 count2=0; 20 j=0; 21 for(;i<a.length();i++) { 22 count2++; 23 str[j++]=arr[i]; 24 if(count2==11) { 25 System.out.print(count3+":"); 26 count3++; 27 if(str[10]=='1') { 28 count4=0; 29 for(int k=1;k<9;k++) { 30 if(str[k]=='1') { 31 count4++; 32 } 33 } 34 35 if((count4%2==0&&str[9]=='1')||(count4%2!=0&&str[9]=='0')) { 36 for(int q=1;q<9;q++) { 37 System.out.print(str[q]); 38 } 39 System.out.println(); 40 } 41 else System.out.println("parity check error"); 42 } 43 else System.out.println("validate error"); 44 break; 45 } 46 } 47 // System.out.println(); 48 } 49 } 50 } 51 else System.out.print("null data"); 52 } 53 }
分析:这道题的难点在于题目的叙述,用到的算法是基本方法,只要把题目读懂了就可以做出来。
采坑心得
最大的坑是题目内容,刚开始看题目时很懵,不知道要干什么,题本身不是很难,但不好理解。题目:RS232是串口常用的通信协议,在异步通信模式下,串口可以一次发送5~8位数据,收发双方之间没有数据发送时线路维持高电平,相当于接收方持续收到数据“1”(称为空闲位),发送方有数据发送时,会在有效数据(5~8位,具体位数由通信双方提前设置)前加上1位起始位“0”,在有效数据之后加上1位可选的奇偶校验位和1位结束位“1”。请编写程序,模拟串口接收处理程序,注:假定有效数据是8位,奇偶校验位采用奇校验。读完不知道干什么,通过反复与样例对照就能理解。
改进建议
采用了太多的if判断和for循环导致代码冗长,可读性差;可以使用方法对其进行调用来减少重用代码。
(3)题目集3:7-1 点线形系列1-计算两点之间的距离
设计与分析
1 import java.util.Scanner; 2 public class Main{ 3 public static void main(String[] args){ 4 Scanner input=new Scanner(System.in); 5 double []str=new double[4]; 6 String place; 7 place=input.nextLine(); 8 String[] list=place.split("[, ]"); 9 if(list.length>4){ //判断是否输入数据超长 10 System.out.print("wrong number of points"); 11 } 12 else if(list.length<4){ 13 System.out.print("Wrong Format"); 14 } 15 else{ 16 int temp1=0,temp2=0; 17 char []arr1=place.toCharArray(); 18 for(int i=0;i<arr1.length;i++){ 19 if(arr1[i]==',') temp1++; 20 if(arr1[i]==' ') temp2++; 21 } 22 if(temp1!=2&&temp2!=1) System.out.print("Wrong Format"); 23 else{ 24 int ji=0; 25 boolean flag=true; 26 for(int i=0;i<4;i++){ //判断非法数据 27 char []arr=list[i].toCharArray(); //将字符串转换为数组 28 ji=0; 29 for(int j=0;j<arr.length;j++){ 30 if(arr[j]=='-'||arr[j]=='+'){ 31 ji++; 32 } 33 if(arr[j]<'0'||arr[j]>'9'){ 34 if(arr[j]!='-'&&arr[j]!='+'){ 35 if(arr[j]!='.'){ 36 ji=4; 37 } 38 } 39 } 40 for(int k=0;k<arr.length;k++){ 41 if(arr[k]=='.'){ 42 if(k-1<0) ji=4; 43 else if(arr[k-1]=='+'||arr[k-1]=='-') 44 ji=4; 45 if(k+1<arr.length){ 46 if(arr[k+1]>='0'&&arr[k+1]<='9'){} 47 else ji=4; 48 } 49 else ji=4; 50 } 51 if(arr[k]=='+'||arr[k]=='-'){ 52 if(k-1>=0) ji=4; 53 } 54 } 55 int temp=arr.length; 56 for(int k=0;k<temp;k++){ 57 if(arr[k]=='.'){ 58 temp=k; 59 break; 60 } 61 } 62 for(int k=0;k<temp;k++){ 63 if(arr[k]=='0'){ 64 if(k-1<0){ 65 if(k+1<temp) ji=4; 66 } 67 else if(arr[k-1]>='1'&&arr[k-1]<='9'||arr[k-1]=='-'||arr[k-1]=='+'){} 68 else ji=4; 69 } 70 } 71 if(ji>=2){ 72 flag=false; 73 break; 74 } 75 } 76 if(flag==false) break; 77 } 78 79 if(flag==false) System.out.print("Wrong Format"); 80 else{ //计算两点距离 81 for(int i=0;i<4;i++){ // 转换为double型数字 82 str[i]=Double.parseDouble(list[i]); 83 } 84 double result=Math.sqrt((str[0]-str[2])*(str[0]-str[2])+(str[1]-str[3])*(str[1]-str[3])); 85 System.out.print(result); 86 } 87 } 88 89 90 } 91 } 92 }
分析:难点在与格式的判断,因为当出现9+、5.、00.4等数据时需要显示错误提示,所以需要很多的判断条件进行筛选。
采坑心得

刚开始拆分字符串时是通过字符判断的,出错率也高,通过查找发现了可以通过指定字符分割成多个字符串,还可以指定多个字符进行分割,节省了很多的代码。
改进建议
减少if判断,将重复的操作放在一起。
(4)题目集3:7-2 点线形系列2-线的计算
设计与分析
1 import java.util.Scanner; 2 public class Main{ 3 public static void main(String[] args){ 4 Scanner input=new Scanner(System.in); 5 String fist=input.nextLine(); 6 char[]arr0=fist.toCharArray();//将初始字符串转为数组 7 boolean isgo=true;//判断前两位 8 if(arr0[0]>='1'&&arr0[0]<='5'){ //判断第一个是否满足选项 9 if(arr0[1]!=':'){ 10 System.out.print("Wrong Format"); 11 isgo=false; 12 } 13 } 14 else { 15 System.out.print("Wrong Format"); 16 isgo=false; 17 } 18 if(isgo){//判断选项后面的数据 19 int select=arr0[0]-'0';//选项 20 String fistString=""; //将冒号后的数据放到字符串中 21 for(int i=2;i<arr0.length;i++){ 22 fistString=fistString+arr0[i]; 23 } 24 switch(select){ 25 case 1: 26 if(fistMethod(fistString)){//判断是否是合法数据 27 if(secondMethod(fistString)){ 28 method1(fistString);//调用方法1 29 } 30 } 31 break; 32 case 2: 33 if(fistMethod(fistString)){//判断是否是合法数据 34 if(secondMethod(fistString)){ 35 method2(fistString);//调用方法1 36 } 37 } 38 break; 39 case 3: 40 if(fistMethod(fistString)){//判断是否是合法数据 41 if(secondMethod(fistString)){ 42 method3(fistString);//调用方法1 43 } 44 } 45 break; 46 case 4: 47 if(fistMethod(fistString)){//判断是否是合法数据 48 if(secondMethod(fistString)){ 49 method4(fistString);//调用方法1 50 } 51 } 52 break; 53 case 5: 54 if(fistMethod(fistString)){//判断是否是合法数据 55 if(secondMethod(fistString)){ 56 method5(fistString);//调用方法1 57 } 58 } 59 break; 60 } 61 } 62 } 63 static boolean fistMethod(String fistString){ 64 char[]arr1=fistString.toCharArray();//将冒号后的转化为字符 65 boolean flag=true; 66 for(int i=0;i<arr1.length;i++){ 67 //判断是否有其他非法字符'||arr1[i]= 68 if((arr1[i]>='0'&&arr1[i]<='9')||arr1[i]=='+'||arr1[i]=='-'||arr1[i]==','||arr1[i]==' '||arr1[i]=='.'){ 69 } 70 else{ 71 System.out.print("Wrong Format"); 72 return false; 73 } 74 } 75 //判断,号 76 String[] list2=fistString.split(" "); 77 int judgedouhao=0; 78 for(int i=0;i<list2.length;i++){ 79 char[]arr3=list2[i].toCharArray(); 80 judgedouhao=0; 81 for(int j=0;j<arr3.length;j++){ 82 if(arr3[j]==',') judgedouhao++; 83 if(judgedouhao>=2){ 84 System.out.print("Wrong Format"); 85 return false; 86 } 87 } 88 } 89 //以空格进行分隔 90 String[] list=fistString.split("[, ]"); 91 int readd=0; 92 for(int i=0;i<list.length;i++){ 93 char[]arr2=list[i].toCharArray(); 94 int dian=0; 95 readd=0; 96 //判断重复加号 97 for(int j=0;j<arr2.length;j++){ 98 if(arr2[j]=='+'||arr2[j]=='-'){ 99 readd++; 100 } 101 //判断. 102 if(arr2[j]=='.'){ 103 dian++; 104 } 105 } 106 //判断其他情况 107 for(int k=0;k<arr2.length;k++){ 108 if(arr2[k]=='.'){ 109 if(k-1<0) readd=4; 110 else if(arr2[k-1]=='+'||arr2[k-1]=='-') 111 readd=4; 112 if(k+1<arr2.length){ 113 if(arr2[k+1]>='0'&&arr2[k+1]<='9'){} 114 else readd=4; 115 } 116 else readd=4; 117 } 118 if(arr2[k]=='+'||arr2[k]=='-'){ 119 if(k-1>=0) readd=4; 120 } 121 } 122 int temp=arr2.length; 123 for(int k=0;k<temp;k++){ 124 if(arr2[k]=='.'){ 125 temp=k; 126 break; 127 } 128 } 129 for(int k=0;k<temp;k++){ 130 if(arr2[k]=='0'){ 131 if(k-1<0){ 132 if(k+1<temp) readd=4; 133 } 134 else if(arr2[k-1]>='1'&&arr2[k-1]<='9'||arr2[k-1]=='-'||arr2[k-1]=='+'){} 135 else readd=4; 136 } 137 } 138 if(readd>=2||dian>=2){ 139 System.out.print("Wrong Format"); 140 return false; 141 } 142 } 143 return flag; 144 } 145 static boolean secondMethod(String fistString){ 146 String[] list1=fistString.split("[, ]"); 147 double []str=new double[4]; 148 for(int i=0;i<list1.length;i++) 149 str[i]=Double.parseDouble(list1[i]); 150 if(str[0]==str[2]&&str[1]==str[3]){ 151 System.out.print("points coincide"); 152 return false; 153 } 154 else return true; 155 } 156 static void method1(String fistString){ 157 double []str=new double[4]; 158 String[] list1=fistString.split("[, ]"); 159 for(int i=0;i<list1.length;i++) 160 str[i]=Double.parseDouble(list1[i]); 161 if(str[0]==str[2]) { 162 System.out.print("Slope does not exist"); 163 } 164 else { 165 double a=(str[3]-str[1])/(str[2]-str[0]); 166 a=(double)Math.round(a*1000000)/1000000; 167 System.out.print(a); 168 } 169 170 } 171 static void method2(String fistString){ 172 boolean flag1=true,flag2=true; 173 double []str=new double[6]; 174 String[] list1=fistString.split("[, ]"); 175 for(int i=0;i<list1.length;i++) 176 str[i]=Double.parseDouble(list1[i]); 177 } 178 static void method3(String fistString){ 179 boolean flag1=true,flag2=true,flag3=true; 180 double []str=new double[6]; 181 String[] list1=fistString.split("[, ]"); 182 for(int i=0;i<list1.length;i++) 183 str[i]=Double.parseDouble(list1[i]); 184 } 185 static void method4(String fistString){ 186 boolean flag1=true,flag2=true; 187 double []str=new double[10]; 188 String[] list1=fistString.split("[, ]"); 189 for(int i=0;i<list1.length;i++) 190 str[i]=Double.parseDouble(list1[i]); 191 } 192 static void method5(String fistString){ 193 double []str=new double[8]; 194 String[] list1=fistString.split("[, ]"); 195 for(int i=0;i<list1.length;i++) 196 str[i]=Double.parseDouble(list1[i]); 197 } 198 199 }
分析:难点在于如何用代码来判断线与线之间的关系,如:判断是否相交,是否平行,是否垂直,是否共面等一系列数学问题。
采坑心得
选项4:输入四个点坐标,判断前两个点所构成的直线与后两点构成的直线是否平行,输出true或者false.时需要先判断这四个点是否重合,在判断四个点所构成的直线是否平行。
改进建议
可以将多个if语句放到一个for循环来进行判断;采用多个方法对每个选项进行解题。
(5)题目集3:7-3 点线形系列3-三角形的计算
设计与分析
1 import java.util.Scanner; 2 public class Main{ 3 public static void main(String[] args){ 4 Scanner input=new Scanner(System.in); 5 String fist=input.nextLine(); 6 char[]arr0=fist.toCharArray();//将初始字符串转为数组 7 boolean isgo=true;//判断前两位 8 if(arr0[0]>='1'&&arr0[0]<='5'){ //判断第一个是否满足选项 9 if(arr0[1]!=':'){ 10 System.out.print("Wrong Format"); 11 isgo=false; 12 } 13 } 14 else { 15 System.out.print("Wrong Format"); 16 isgo=false; 17 } 18 if(isgo){//判断选项后面的数据 19 int select=arr0[0]-'0';//选项 20 String fistString=""; //将冒号后的数据放到字符串中 21 for(int i=2;i<arr0.length;i++){ 22 fistString=fistString+arr0[i]; 23 } 24 switch(select){ 25 case 1: 26 if(fistMethod(fistString)){//判断是否是合法数据 27 if(secondMethod(fistString,3)){ 28 method1(fistString);//调用方法1 29 } 30 } 31 break; 32 case 2: 33 if(fistMethod(fistString)){//判断是否是合法数据 34 if(secondMethod(fistString,3)){ 35 method2(fistString);//调用方法1 36 } 37 } 38 break; 39 case 3: 40 if(fistMethod(fistString)){//判断是否是合法数据 41 if(secondMethod(fistString,3)){ 42 method3(fistString);//调用方法1 43 } 44 } 45 break; 46 case 4: 47 if(fistMethod(fistString)){//判断是否是合法数据 48 if(secondMethod(fistString,3)){ 49 method4(fistString);//调用方法1 50 } 51 } 52 break; 53 case 5: 54 if(fistMethod(fistString)){//判断是否是合法数据 55 if(secondMethod(fistString,4)){ 56 method5(fistString);//调用方法1 57 } 58 } 59 break; 60 } 61 } 62 } 63 static boolean fistMethod(String fistString){ 64 char[]arr1=fistString.toCharArray();//将冒号后的转化为字符 65 boolean flag=true; 66 for(int i=0;i<arr1.length;i++){ 67 //判断是否有其他非法字符'||arr1[i]= 68 if((arr1[i]>='0'&&arr1[i]<='9')||arr1[i]=='+'||arr1[i]=='-'||arr1[i]==','||arr1[i]==' '||arr1[i]=='.'){ 69 } 70 else{ 71 System.out.print("Wrong Format"); 72 return false; 73 } 74 } 75 //判断,号 76 String[] list2=fistString.split(" "); 77 int judgedouhao=0; 78 for(int i=0;i<list2.length;i++){ 79 char[]arr3=list2[i].toCharArray(); 80 judgedouhao=0; 81 for(int j=0;j<arr3.length;j++){ 82 if(arr3[j]==',') judgedouhao++; 83 if(judgedouhao>=2){ 84 System.out.print("Wrong Format"); 85 return false; 86 } 87 } 88 } 89 //以空格进行分隔 90 String[] list=fistString.split("[, ]"); 91 int readd=0; 92 for(int i=0;i<list.length;i++){ 93 char[]arr2=list[i].toCharArray(); 94 int dian=0; 95 readd=0; 96 //判断重复加号 97 for(int j=0;j<arr2.length;j++){ 98 if(arr2[j]=='+'||arr2[j]=='-'){ 99 readd++; 100 } 101 //判断. 102 if(arr2[j]=='.'){ 103 dian++; 104 } 105 } 106 //判断其他情况 107 for(int k=0;k<arr2.length;k++){ 108 if(arr2[k]=='.'){ 109 if(k-1<0) readd=4; 110 else if(arr2[k-1]=='+'||arr2[k-1]=='-') 111 readd=4; 112 if(k+1<arr2.length){ 113 if(arr2[k+1]>='0'&&arr2[k+1]<='9'){} 114 else readd=4; 115 } 116 else readd=4; 117 } 118 if(arr2[k]=='+'||arr2[k]=='-'){ 119 if(k-1>=0) readd=4; 120 } 121 } 122 int temp=arr2.length; 123 for(int k=0;k<temp;k++){ 124 if(arr2[k]=='.'){ 125 temp=k; 126 break; 127 } 128 } 129 for(int k=0;k<temp;k++){ 130 if(arr2[k]=='0'){ 131 if(k-1<0){ 132 if(k+1<temp) readd=4; 133 } 134 else if(arr2[k-1]>='1'&&arr2[k-1]<='9'||arr2[k-1]=='-'||arr2[k-1]=='+'){} 135 else readd=4; 136 } 137 } 138 if(readd>=2||dian>=2){ 139 System.out.print("Wrong Format"); 140 return false; 141 } 142 } 143 return flag; 144 } 145 static boolean secondMethod(String fistString,int judge){ 146 String[] list1=fistString.split(" "); 147 if(list1.length!=judge){ 148 System.out.print("wrong number of points"); 149 return false; 150 } 151 else return true; 152 } 153 static void method1(String fistString){ 154 boolean flag1=true,flag2=true; 155 double []str=new double[6]; 156 String[] list1=fistString.split("[, ]"); 157 for(int i=0;i<list1.length;i++) 158 str[i]=Double.parseDouble(list1[i]);//转换为数字,求三角形 159 double a1=Math.sqrt((str[0]-str[2])*(str[0]-str[2])+(str[1]-str[3])*(str[1]-str[3])); 160 double a2=Math.sqrt((str[0]-str[4])*(str[0]-str[4])+(str[1]-str[5])*(str[1]-str[5])); 161 double a3=Math.sqrt((str[2]-str[4])*(str[2]-str[4])+(str[3]-str[5])*(str[3]-str[5])); 162 if((a1+a2>a3&&a1+a3>a2&&a2+a3>a1)||(a1-a2<a3&&a1-a3<a2&&a2-a3<a1)) { 163 if((a1==a2)||(a1==a3)||(a3==a2)) {//判断等腰三角形 164 flag1=true; 165 } 166 else flag1=false; 167 if((a1==a2&&a1==a3)){//判断等边三角形 168 flag2=true; 169 } 170 else flag2=false; 171 System.out.print(flag1+" "+flag2); 172 } 173 else System.out.print("data error"); 174 } 175 static void method2(String fistString){ 176 boolean flag1=true,flag2=true; 177 double []str=new double[6]; 178 String[] list1=fistString.split("[, ]"); 179 for(int i=0;i<list1.length;i++) 180 str[i]=Double.parseDouble(list1[i]);//转换为数字,求三角形 181 double a1=Math.sqrt((str[0]-str[2])*(str[0]-str[2])+(str[1]-str[3])*(str[1]-str[3])); 182 double a2=Math.sqrt((str[0]-str[4])*(str[0]-str[4])+(str[1]-str[5])*(str[1]-str[5])); 183 double a3=Math.sqrt((str[2]-str[4])*(str[2]-str[4])+(str[3]-str[5])*(str[3]-str[5])); 184 if((a1+a2>a3&&a1+a3>a2&&a2+a3>a1)||(a1-a2<a3&&a1-a3<a2&&a2-a3<a1)) { 185 double zhouchang=a1+a2+a3;//求周长 186 zhouchang=(double)Math.round(zhouchang*1000000)/1000000; 187 double s=(a1+a2+a3)/2;//求面积 188 double area=Math.sqrt(s*(s-a1)*(s-a2)*(s-a3)); 189 area=(double)Math.round(area*1000000)/1000000; 190 double x=(str[0]+str[2]+str[4])/3; 191 x=(double)Math.round(x*1000000)/1000000; 192 double y=(str[1]+str[3]+str[5])/3; 193 y=(double)Math.round(y*1000000)/1000000; 194 System.out.print(zhouchang+" "+area+" "+x+","+y); 195 } 196 else System.out.print("data error"); 197 } 198 static void method3(String fistString){ 199 boolean flag1=true,flag2=true,flag3=true; 200 double []str=new double[6]; 201 String[] list1=fistString.split("[, ]"); 202 for(int i=0;i<list1.length;i++) 203 str[i]=Double.parseDouble(list1[i]);//转换为数字,求三角形 204 double a=Math.sqrt((str[0]-str[2])*(str[0]-str[2])+(str[1]-str[3])*(str[1]-str[3])); 205 double b=Math.sqrt((str[0]-str[4])*(str[0]-str[4])+(str[1]-str[5])*(str[1]-str[5])); 206 double c=Math.sqrt((str[2]-str[4])*(str[2]-str[4])+(str[3]-str[5])*(str[3]-str[5])); 207 if((a+b>c&&a+c>b&&b+c>a)||(a-b<c&&a-c<b&&b-c<a)) { 208 double jiaoa=((b*b+c*c-a*a)/(2*b*c)); 209 double jiaob=((a*a+c*c-b*b)/(2*a*c)); 210 double jiaoc=((b*b+a*a-c*c)/(2*b*a)); 211 if(jiaoa<0||jiaob<0||jiaoc<0) {//判断钝角 212 flag1=true; 213 } 214 else flag1=false; 215 if(jiaoa==0||jiaob==0||jiaoc==0) {//判断直角 216 flag2=true; 217 } 218 else flag2=false; 219 if(jiaoa>0&&jiaob>0&&jiaoc>0) {//判断锐角 220 flag3=true; 221 } 222 else flag3=false; 223 System.out.print(flag1+" "+flag2+" "+flag3); 224 } 225 else System.out.print("data error"); 226 } 227 static void method4(String fistString){ 228 boolean flag1=true,flag2=true; 229 double []str=new double[10]; 230 String[] list1=fistString.split("[, ]"); 231 for(int i=0;i<list1.length;i++) 232 str[i]=Double.parseDouble(list1[i]);//转换为数字,求三角形 233 double a1=Math.sqrt((str[0]-str[2])*(str[0]-str[2])+(str[1]-str[3])*(str[1]-str[3])); 234 double a2=Math.sqrt((str[0]-str[4])*(str[0]-str[4])+(str[1]-str[5])*(str[1]-str[5])); 235 double a3=Math.sqrt((str[2]-str[4])*(str[2]-str[4])+(str[3]-str[5])*(str[3]-str[5])); 236 if((a1+a2>a3&&a1+a3>a2&&a2+a3>a1)||(a1-a2<a3&&a1-a3<a2&&a2-a3<a1)) { 237 if((a1==a2)||(a1==a3)||(a3==a2)) {//判断等腰三角形 238 flag1=true; 239 } 240 else flag1=false; 241 if((a1==a2&&a1==a3)){//判断等边三角形 242 flag2=true; 243 } 244 else flag2=false; 245 System.out.print(flag1+" "+flag2); 246 } 247 else System.out.print("data error"); 248 } 249 static void method5(String fistString){ 250 double []str=new double[8]; 251 String[] list1=fistString.split("[, ]"); 252 for(int i=0;i<list1.length;i++) 253 str[i]=Double.parseDouble(list1[i]);//转换为数字,求三角形 254 double a1=Math.sqrt((str[2]-str[4])*(str[2]-str[4])+(str[3]-str[5])*(str[3]-str[5])); 255 double a2=Math.sqrt((str[2]-str[6])*(str[2]-str[6])+(str[3]-str[7])*(str[3]-str[7])); 256 double a3=Math.sqrt((str[6]-str[4])*(str[6]-str[4])+(str[7]-str[5])*(str[7]-str[5])); 257 if((a1+a2>a3&&a1+a3>a2&&a2+a3>a1)||(a1-a2<a3&&a1-a3<a2&&a2-a3<a1)) { 258 double a=Math.sqrt((str[0]-str[2])*(str[0]-str[2])+(str[1]-str[3])*(str[1]-str[3])); 259 double b=Math.sqrt((str[0]-str[6])*(str[0]-str[6])+(str[1]-str[7])*(str[1]-str[7])); 260 double c=Math.sqrt((str[0]-str[4])*(str[0]-str[4])+(str[1]-str[5])*(str[1]-str[5])); 261 double jiaoa=((a*a+c*c-a1*a1)/(2*a*c)); 262 double jiaob=((a*a+b*b-a2*a2)/(2*a*b)); 263 double jiaoc=((b*b+c*c-a3*a3)/(2*b*c)); 264 if((str[1]-str[3]==(str[5]-str[3])/((str[4]-str[2])*(str[0]-str[2])))||(str[1]-str[5]==(str[7]-str[5])/((str[6]-str[4])*(str[0]-str[4])))||(str[1]-str[3]==(str[7]-str[3])/((str[6]-str[2])*(str[0]-str[2])))) { 265 System.out.print("on the triangle"); 266 } 267 else if(jiaoa<0||jiaob<0||jiaoc<0) { 268 System.out.print("in the triangle"); 269 } 270 else System.out.print("outof the triangle"); 271 } 272 else System.out.print("data error"); 273 } 274 275 276 }
分析:难点在于如何用代码来编写计算三点组成的角度以及点与三角形的位置关系,以及三角形被一条直线分割后的面积,代码实现不同于数学解题,数学可以有坐标,但在代码中很难实现坐标。
采坑心得
选项5:输入四个点坐标,输出第一个是否在后三个点所构成的三角形的内部(输出in the triangle/outof triangle)。必须使用射线法,原理:由第一个点往任一方向做一射线,射线与三角形的边的交点(不含点本身)数量如果为1,则在三角形内部。如果交点有两个或0个,则在三角形之外。若点在三角形的某条边上,输出"on the triangle" 中需要使用射线法,很难用代码进行编写,导致选项5没写出来。
改进建议
代码存在很多问题:(1)复杂度偏高。(2)部分格式错误。(3)部分答案错误。
需要用正确的数学公式进行解题,使用其他方法降低复杂度。
总结:
在这段学习中。通过上课和课下看书使我对Java的一无所知到如今的基本掌握,从不知道什么是类到如何创建对象,以及类之间的继承关系。我知道还有好多是没有学的,有好多是没学懂的,有好多看似记得但一用起来就错误的,通过此次做题我知道了不足,知道了所学与所用之间的差距。从基本的使用到网上查找所需要的方法,这一步步走来,我清楚的感受到了我自己在进步;从类设计一写就错到无误写出,说明了自己在进步。Java与C不同,Java在基础的编写外还添加了类与对象,使程序的功能更加的强大。作为刚步入Java的初学者,发现还有好多东西需要去掌握:
1.字符串的一系列使用方法,String类的使用,以及字符串与数组之间的转换。
2.静态变量、常量和方法以及可见性修饰符的使用;经常会出现调用类型错误。
3.不会使用简单方法,经常把一个简单问题写的复杂化,导致代码冗长,产生很多的细节错误,不利于对代码进行解读。
4.常与C进行混用,导致出现语法错误,记不住Java中给定的方法,编写时效率低下。
感谢OOP课程老师的指导与作业的监督,希望老师可以再发一些这样的题,使我们能在困难中提升自己编程能力,提升自己对问题的解决能力。
浙公网安备 33010602011771号