·前言:三次题目集的提交已经结束了,在此对三次题目集的知识点、题量、难度进行总结,并发表自己的看法。

(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课程老师的指导与作业的监督,希望老师可以再发一些这样的题,使我们能在困难中提升自己编程能力,提升自己对问题的解决能力。

posted on 2022-04-10 01:20  霍家少爷  阅读(75)  评论(0)    收藏  举报