PTA前三次大作业总结

                                                                          PTA前三次大作业总结

一.PTA三次大作业题目集的前言

1.第一次题目集

第一次大作业的主要特点是题量偏多,但难度较低。7-1 身体质量指数(BMI)测算考查的是对输出的判断。7-2 长度质量计量单位换算需要注意的是最后输出要将double转换为float型。7-3 奇数求和需要判断输出的数中的奇数并相加。7-4 房产税费计算2022稍微较复杂,需要理解各种费用的计算方法,并最后输出结果时将double转为float型。7-5 游戏角色选择较为简单,主要考查的是将各种结果输出。7-6 学号识别需要弄清楚不同位置的数字代表的含义,并学会用charAt( )获得相应位置的字符。7-8 巴比伦法求平方根近似值需仔细理解题目的意思。7-9 二进制数值提取主要考查循环。7-7 判断三角形类型需要用Math.abs(a*a+b*b-c*c)<0.00001来判断是否为直角三角形。

2.第二次题目集

第二次大作业题量较少,只有三道题,但难度较第一次提升了许多,整体上是对字符串的考查,相关知识如:字符串输入:String number = input.next( ),字符的获取如:charAt( ),特定位置的字符串的获取如:substring( )。7-1 字母-数字转换需要注意的是不能用“=”直接比较两字符串是否相等,而应使用compareto( )进行比较。7-2 串口字符解析比较难,占据的分数也比较多。需要读懂题目的意思,同时还需要了解奇偶校验的相关知识。7-3 String的格式判断与内容提取判断输入是否正确,若不正确就输出Wrong Format,若正确则提取特定两个班级202017班、202061班同学的学号后四位输出。

3.第三次大作业

第三次大作业难度相对于前两次提升了不少。其中测试点数不胜数,也许多较为难找到。7-1 点线形系列1-计算两点之间的距离难度主要在于排除各种错误的输入。7-2 点线形系列2-线的计算与7-3 点线形系列3-三角形的计算测试点很多。其中,测试点的测试范围广,测试内容细,还难以知道测试点测试的具体内容。

二.设计与分析

(1)1.7-1 身体质量指数(BMI)测算

 

体重是反映和衡量一个人健康状况的重要标志之一,过胖和过瘦都不利于健康,BMI(身体质量指数)计算方法:体重(以千克为单位)除以身高(以米为单位)的平方。

中国成人正常的BMI应在18.5-24之间,如果小于18.5为体重不足,如果大于等于24为超重,大于等于28为肥胖。请编写程序,测算身体状态。

 

输入格式:

 

两个数值:体重(以千克为单位),身高(以米为单位),数值间以空格分隔。例如:65.5 1.75。
注意:体重的世界纪录是727公斤,身高的世界纪录是2.72米。输入数据上限不得超过纪录,下限不得小于等于0;

 

输出格式:

 

输入数值超出范围 :输出“input out of range”。例如:-2 3或者125 5。
BMI小于18.5 :输出“thin”。
BMI大于等于18.5小于24 :输出“fit”。
BMI大于等于24小于28 :输出“overweight”。
BMII大于等于28 :输出“fat”。

 

输入样例0:

 

在这里给出一组输入。例如:

 

-2  8

 

 

 

输出样例0:

 

在这里给出相应的输出。例如:

 

input out of range

 

 

 

输入样例1:

 

在这里给出一组输入。例如:

 

70 1.75

 

 

 

输出样例1:

 

在这里给出相应的输出。例如:

 

fit

 1  
 2  import java.util.Scanner;
 3 public class Main{
 4     public static void main(String[] args){
 5         Scanner input = new Scanner(System.in);
 6         //System.out.print("weight height");
 7         double weight = input.nextDouble();
 8         double height = input.nextDouble();
 9         if(weight<=0||weight>727||height<=0||height>2.72)
10             System.out.println("input out of range");
11         else{
12             double bmi=0.0; 
13                 bmi = 1.0*weight/(height * height);
14             if(bmi<18.5)
15                System.out.println("thin");
16             else if(bmi>=18.5&&bmi<24)
17                 System.out.println("fit");
18                else if(bmi>=24&&bmi<28)
19                 System.out.println("overweight");
20             else
21                 System.out.println("fat");
22         }
23     }
24 }

 

 

 总结:这道题较为简单,题目需要对输入的身高体重进行计算,并拿结果与标准进行比较,最后输出相应的标准。但由上图可见,复杂度较高,因此下次写代码时不仅要考

虑把题目完成,还应考虑尽量降低代码的复杂度。

2.7-2 长度质量计量单位换算
分数 5
作者 蔡轲
单位 南昌航空大学

长度、质量的计量有多重不同的计算体系,有标准的国际单位制:千克与米,也有各个国家自己的计量方法如:磅、英寸;1磅等于0.45359237千克,1英寸等于

0.0254米,请编写程序实现国际单位制与英制之间的换算。

输入格式:

两个浮点数,以空格分隔,第一个是质量(以千克为单位)、第二个是长度(以米为单位)。例如:0.45359237 0.0254。

输出格式:

两个浮点数,以空格分隔,第一个是质量(以磅为单位)、第二个是长度(以英寸为单位)。例如:1.0 1.0。

输入样例:

在这里给出一组输入。例如:

0.45359237 0.0254
 

输出样例:

在这里给出相应的输出。例如:

1.0 1.0
 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 weight = input.nextDouble();
 6         double height = input.nextDouble();
 7         final double KILOGRAMS_PER_POUND = 0.45359237;
 8         final double METERS_PRE_INCH = 0.0254;
 9         double weightInKilograms = weight / KILOGRAMS_PER_POUND;
10         double heightInMeters = height / METERS_PRE_INCH;
11         System.out.println((float)weightInKilograms+" "+(float)heightInMeters);
12     }
13     }

 

总结:本道题同样很简单,需要实现的是国际制单位与英制之间的换算。可以实现最终结果,但问题是复杂度过高,下一次写代码时应注意规避这一点。

3.7-3 奇数求和
分数 9
作者 蔡轲
单位 南昌航空大学

计算一个数列中所有奇数的和。

输入格式:

十个整数,以空格分隔。例如:1 2 3 4 5 6 7 8 9 0。

输出格式:

输入数列中所有奇数之和。例如:25。

输入样例:

在这里给出一组输入。例如:

1 2 3 4 5 6 7 8 9 0
 

输出样例:

在这里给出相应的输出。例如:

25
 1  import java.util.Scanner;
 2 public class Main{
 3     public static void main(String[] args){
 4         Scanner input = new Scanner(System.in);
 5         int n = 0;
 6         int number=0;
 7         //int x;
 8         while(n>=0&&n<10)
 9         {
10           
11         int x = input.nextInt();
12         
13         if(x%2!=0)
14         number=number+x;
15             n++;
16         }
17        System.out.println(number);
18         
19     }
20 }

 

 总结:这一道题同样不难,需要计算一段数列中奇数的和。但同样面临代码复杂度过高的问题。

4.7-4 房产税费计算2022
分数 12
作者 蔡轲
单位 南昌航空大学

房屋交易在日常生活中非常常见的事情,房屋交易时要额外支付各种税费,按2022年房产交易新政策的规定买房人应缴纳税费包括:

1、契税:首次购房评估额90平(含)内1%、90平-144平(含)内1.5%,超过144平或非首 次3%,买方缴纳。

2、印花税:房款的0.05%。

3、交易费:3元/平方米。

4、测绘费:1.36元/平方米。

5、权属登记费及取证费:一般情况是在200元内。

输入格式:

四个数据,以空格分隔:
1、第几次购房(整数)
2、房款(整数/单位万元)
3、评估价(整数/单位万元)
4、房屋面积(浮点数/单位平方米)。
例如:1 100 100 90。

输出格式:

契税、印花税、交易费、测绘费(以元为单位),以空格分隔。例如:10000.0 500.0 270.0 122.4

输入样例:

在这里给出一组输入。例如:

1 100 100 90
 

输出样例:

在这里给出相应的输出。例如:

10000.0 500.0 270.0 122.4
 1  import java.util.Scanner;
 2 public class Main{
 3     public static void main(String[] args){
 4         Scanner input = new Scanner(System.in);
 5         int time = input.nextInt();
 6         int housepayment = input.nextInt();
 7         int evaluatedprice = input.nextInt();
 8         float housearea = input.nextFloat();
 9         double deedtax;
10         if(time==1&&0<housearea&&housearea<=90)
11          deedtax =  evaluatedprice * 0.01*10000;
12         else if(time==1&&90<housearea&&housearea<=144)
13             deedtax = 10000.0 * evaluatedprice * 0.015;
14         else{
15             deedtax = 10000.0 * evaluatedprice * 0.03;
16         }
17         double yinhuatax;
18         yinhuatax =10000.0 * housepayment * 0.0005;
19         double tradefee;
20         tradefee=3*housearea;
21         double cehuifee;
22         cehuifee = 1.36*housearea;
23         System.out.println((float)deedtax+" "+(float)yinhuatax+" "+(float)tradefee+" "+(float)cehuifee);
24     }
25 }
5.7-5 游戏角色选择
分数 14
作者 蔡轲
单位 南昌航空大学

一款网游中包括4个种族:人类、精灵、兽人、暗精灵,每个种族包含三种角色:战士、法师、射手。玩家新建人物时需要选择种族和角色。请编写角色选择程序。

输入格式:

两个整数:游戏种族、角色的选项,以空格分隔。例如:1 2。
种族选项设定为:1、人类 2、精灵 3、兽人 4、暗精灵
角色选项设定为:1、战士 2、法师 3、射手

输出格式:

所选择的种族、角色的名称,以空格分隔。例如:人类 法师
若输入数值超出选项范围,输出“Wrong Format”

输入样例1:

在这里给出一组输入。例如:

1 2
 

输出样例1:

在这里给出相应的输出。例如:

人类 法师
 

输入样例2:

在这里给出一组输入。例如:

1 6
 

输出样例2:

在这里给出相应的输出。例如:

Wrong Format

 1  import java.util.Scanner;
 2 public class Main{
 3     public static void main(String[] args){
 4         Scanner input = new Scanner(System.in);
 5         
 6         int number1 = input.nextInt();
 7         int number2 = input.nextInt();
 8         if(number1<1||number1>4||number2<1||number2>3)
 9           System.out.println("Wrong Format"); 
10 if(number1==1&&number2==1)
11     System.out.println("人类 战士");
12  if(number1==1&&number2==2)
13     System.out.println("人类 法师");
14    if(number1==1&&number2==3)
15     System.out.println("人类 射手");
16      if(number1==2&&number2==1)
17     System.out.println("精灵 战士");
18        if(number1==2&&number2==2)
19     System.out.println("精灵 法师");
20            if(number1==2&&number2==3)
21     System.out.println("精灵 射手");
22                 if(number1==3&&number2==1)
23     System.out.println("兽人 战士"); 
24                     if(number1==3&&number2==2)
25     System.out.println("兽人 法师");
26                       if(number1==3&&number2==3)
27     System.out.println("兽人 射手");
28                              if(number1==4&&number2==1)
29     System.out.println("暗精灵 战士"); 
30             if(number1==4&&number2==2)
31     System.out.println("暗精灵 法师");
32                  if(number1==4&&number2==3)
33     System.out.println("暗精灵 射手");   
34         }
35 }

6.7-6 学号识别
分数 10
作者 蔡轲
单位 南昌航空大学

学校的学号由8位数字组成,前两位是入学年份(省略了20);第3、4位是学院编号,01代表材料学院,02代表机械学院,03代表外语学院,20代表软件学院;

第5、6位是学院内部班级编号,最后两位是班级内部学号。如:18011103,入学年份是2018年,材料学院,11班,03号

输入格式:

8位数字组成的学号。例如:18011103
注意:输入学号不是8位或者学院编号不是01、02、03、20其中之一,属于非法输入

输出格式:

学号每一项的完整说明。例如:
入学年份:2018年
学院:材料学院
班级:11
学号:03

注意:如非法输入,输出“Wrong Format"

输入样例:

在这里给出一组输入。例如:

18011103
 

输出样例:

在这里给出相应的输出。例如:

入学年份:2018年
学院:材料学院
班级:11
学号:03
 

输入样例1:

在这里给出一组输入。例如:

18013
 

输出样例1:

在这里给出相应的输出。例如:

Wrong Format

 1  
 2  import java.util.Scanner;
 3 public class Main{
 4     public static void main(String[] args){
 5         Scanner input = new Scanner(System.in);
 6         String s1=input.nextLine();
 7        
 8         if(s1.length()==8&&((s1.charAt(2)=='0'&&s1.charAt(3)=='1')||(s1.charAt(2)=='0'&&s1.charAt(3)=='2')||(s1.charAt(2)=='0'&&s1.charAt(3)=='3')||(s1.charAt(2)=='2'&&s1.charAt(3)=='0')))
 9         {
10             System.out.println("入学年份:"+"20"+s1.charAt(0)+s1.charAt(1)+"年");
11             if(s1.charAt(2)=='0'&&s1.charAt(3)=='1')
12              System.out.println("学院:材料学院");
13              if(s1.charAt(2)=='0'&&s1.charAt(3)=='2')
14              System.out.println("学院:机械学院");
15                          if(s1.charAt(2)=='0'&&s1.charAt(3)=='3')
16              System.out.println("学院:外语学院");
17                    if(s1.charAt(2)=='2'&&s1.charAt(3)=='0')
18              System.out.println("学院:软件学院");
19                
20             System.out.println("班级:"+s1.charAt(4)+s1.charAt(5));
21             System.out.println("学号:"+s1.charAt(6)+s1.charAt(7));
22         }
23         else 
24           System.out.println("Wrong Format");  
25     }
26 }

 

 7.7-8 巴比伦法求平方根近似值

分数 10
作者 蔡轲
单位 南昌航空大学

巴比伦法求n的近似值可以用以下公式:
nextGuess = (lastGuess+n/lastGuess)/2
程序初始运行时lastGuess可赋予一个最初的猜测值。当由公式求得的nextGuess和lastGuess相差较大时,把nextGuess的值赋给lastGuess,继续以上过程,直至nextGuess和lastGuess几乎相同,此时lastGuess或者nextGuess就是平方根的近似值。
本题要求:nextGuess和lastGuess的差值小于0.00001时认为两者几乎相同

输入格式:

1、两个浮点数,以空格分隔,第一个是n,第二个是lastGuess最初的猜测值。例如:2 1。
2、若输入的两个数中包含负数或者lastGuess初始输入为0,认定为非法输入

输出格式:

1、输出n的平方根近似值:lastGuess。例如:1.4142157
2、非法输入时输出:"Wrong Format"

输入样例:

在这里给出一组输入。例如:

2 1
 

输出样例:

在这里给出相应的输出。例如:

1.4142157
 

输入样例1:

在这里给出一组输入1。例如:

2 -1
 

输出样例:

在这里给出相应的输出。例如:

Wrong Format
 1  import java.util.Scanner;
 2 public class Main{
 3     public static void main(String[] args){
 4         Scanner input = new Scanner(System.in);
 5         float n = input.nextFloat();
 6         float lastGuess = input.nextFloat();
 7         float nextGuess=(lastGuess+n/lastGuess)/2;
 8        
 9         if(n<0||lastGuess<=0)
10             System.out.println("Wrong Format");
11         else
12         {
13            while(Math.abs(lastGuess-nextGuess)>=0.00001)
14            {
15                 lastGuess=nextGuess;
16                 nextGuess = (lastGuess+n/lastGuess)/2;
17                
18            }
19            System.out.println(lastGuess);    
20         }
21     }
22 }

 

 8.7-9 二进制数值提取

分数 10
作者 蔡轲
单位 南昌航空大学

在一个字符串中提取出其中的二进制数值序列,。

输入格式:

一个由0、1构成的序列,以-1为结束符,非0、1字符视为正常输入,但忽略不计,未包含结束符的序列视为非法输入。例如:abc00aj014421-1

输出格式:

将输入的序列去掉非0、1字符以及结尾符的数据内容,
注:结束符-1之后的0\1字符忽略不计。
例如:00011。

输入样例:

在这里给出一组输入。例如:

abc00aj014421-1
 

输出样例:

在这里给出相应的输出。例如:

00011
 

输入样例1:

在这里给出一组输入。例如:

a0571-1k001y
 

输出样例1:

在这里给出相应的输出。例如:

01
 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 s1=input.nextLine();
 6         String s2="";
 7         int i=0,flag=1;
 8         while(i>=0&&i<s1.length())
 9         {
10             if(s1.charAt(i)=='0'||s1.charAt(i)=='1')
11                 s2=s2+s1.charAt(i);
12        
13             if(s1.charAt(i)=='-'&&s1.charAt(i+1)=='1')
14             {
15                 //flag=0;
16                System.out.println(s2);
17                 return;
18                 //i=s1.length();
19                 
20             }
21             i++;
22                 
23         }
24         //if(flag==1)
25             System.out.println("Wrong Format");
26     }
27 }

 

 9.7-7 判断三角形类型

分数 20
作者 段喜龙
单位 南昌航空大学

输入三角形三条边,判断该三角形为什么类型的三角形。

输入格式:

在一行中输入三角形的三条边的值(实型数),可以用一个或多个空格或回车分隔,其中三条边的取值范围均为[1,200]。

输出格式:

(1)如果输入数据非法,则输出“Wrong Format”;
(2)如果输入数据合法,但三条边不能构成三角形,则输出“Not a triangle”;
(3)如果输入数据合法且能够成等边三角形,则输出“Equilateral triangle”;
(3)如果输入数据合法且能够成等腰直角三角形,则输出“Isosceles right-angled triangle”;
(5)如果输入数据合法且能够成等腰三角形,则输出“Isosceles triangle”;
(6)如果输入数据合法且能够成直角三角形,则输出“Right-angled triangle”;
(7)如果输入数据合法且能够成一般三角形,则输出“General triangle”。

输入样例1:

在这里给出一组输入。例如:

50 50 50.0
 

输出样例1:

在这里给出相应的输出。例如:

Equilateral triangle
 

输入样例2:

在这里给出一组输入。例如:

60.2 60.2 80.56
 

输出样例2:

在这里给出相应的输出。例如:

Isosceles triangle
 

输入样例3:

在这里给出一组输入。例如:

0.5 20.5 80
 

输出样例3:

在这里给出相应的输出。例如:

Wrong Format
 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 a = input.nextDouble();
 6         double b = input.nextDouble();
 7         double c = input.nextDouble();
 8         if((a>=1&&a<=200)&&(b>=1&&b<=200)&&(c>=1&&c<=200))
 9         {
10             if(((a+b<=c)||(Math.abs(a-b)>=c))||((a+c<=b)||(Math.abs(a-c)>=b))||((c+b<=a)||(Math.abs(b-c)>=a)))
11                 System.out.println("Not a triangle");
12             else
13             {
14                 if(a==b&&b==c)
15                   System.out.println("Equilateral triangle");
16                 else if((a==b&&(Math.abs(a*a+b*b-c*c)<0.00001))||(a==c&&(Math.abs(a*a+c*c-b*b)<0.00001))||(a==b&&(Math.abs(c*c+b*b-a*a)<0.00001)))
17                 System.out.println("Isosceles right-angled triangle");
18                 else if((a==b&&a!=c)||(a==c&&a!=b)||(c==b&&a!=c))
19                   System.out.println("Isosceles triangle");
20                 else if((Math.abs(a*a+b*b-c*c)<0.00001)||(Math.abs(a*a+c*c-b*b)<0.00001)||(Math.abs(c*c+b*b-a*a)<0.00001))
21                    System.out.println("Right-angled triangle");
22                 else
23                    System.out.println("General triangle");
24                 
25                 
26             }
27         }
28        else
29         System.out.println("Wrong Format");   
30     }
31 }

 

 总结:本题的难度不是很高,根据题目的要求,我们需要做的是由输出三条边的值,判断能否构成三角形,如果能,则还需要判断是构成等边三角形,还是等腰直角三角形,

还是等腰三角形,还是直角三角形,抑或是一般三角形。本题的解题思路是:先判断能否构成三角形,如果不能,输出Not a triangle,如果能,就通过if-else语句判断是不是

等边三角形,等腰直角三角形,等腰三角形,直角三角形,一般三角形。每当满足一种情况就输出相应的答案,并结束判断。解题过程中碰到的踩坑点是要用Math.abs(a*a+

b*b-c*c)<0.00001判断是否为直角三角形。另外需要解决的问题是下次写代码时要注意代码复杂度过高的问题,可以通过多写几个类,以及将一个方法拆成多个方法以降低代

码的复杂度。

(2)7-1 字母-数字转换

分数 11
作者 蔡轲
单位 南昌航空大学

输入一个由英文字母组成的字符串(大小写均可),将所有英文字母转换成它们在字母表中的序号,例如:“AbbcD”转换为“12234”。

输入格式:

由英文字母组成的字符串(大小写均可)。例如:“AbbcD”
若包含非英文字母,视为非法输入。

输出格式:

所有英文字母转换成它们在字母表中的序号,例如:“12234”。
非法输入输出"Wrong Format".

输入样例:

在这里给出一组输入。例如:

AbbcD
 

输出样例:

在这里给出相应的输出。例如:

12234
 

输入样例1:

在这里给出一组输入。例如:

AFOPI
 

输出样例1:

在这里给出相应的输出。例如:

1615169
 

输入样例2:

在这里给出一组输入。例如:

c3u
 

输出样例2:

在这里给出相应的输出。例如:

Wrong Format
 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 s = input.nextLine();
 6         int i=0;
 7         
 8         int flag=0;
 9         for(i=0;i<s.length();i++)
10         {
11             if(!((s.charAt(i)>='a'&&s.charAt(i)<='z')||(s.charAt(i)>='A'&&s.charAt(i)<='Z')))
12                 flag=1;
13         }
14         if(flag!=0)
15         {
16             System.out.println("Wrong Format");
17         }
18         if(flag==0)
19         {
20           for(i=0;i<s.length();i++)
21           {
22               if(s.charAt(i)>='a'&&s.charAt(i)<='z')
23                System.out.print(s.charAt(i)-'a'+1);
24                if(s.charAt(i)>='A'&&s.charAt(i)<='Z')
25                System.out.print(s.charAt(i)-'A'+1);
26           }
27         }
28         
29     }
30 }

 

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

输入样例:

在这里给出一组输入。例如:

1111011101011111111111
 

输出样例:

在这里给出相应的输出。例如:

1:11101011
 

输入样例1:

在这里给出一组输入。例如:

11110111010111111001001101111111011111111101111
 

输出样例1:

在这里给出相应的输出。例如:

1:11101011
2:01001101
3:validate error
 

输入样例2:

输入数据不足11位。例如:

111101
 

输出样例2:

在这里给出相应的输出。例如:

null data
 

输入样例3:

输入数据全1没有起始位。例如:

1111111111111111
 

输出样例3:

在这里给出相应的输出。例如:

null data
 

输入样例4:

输入数据全1没有起始位。例如:

111101110101111111101111111101
 

输出样例4:

在这里给出相应的输出。例如:

1:11101011
2:parity check error
 

输入样例5:

两组数据结束符和奇偶校验均不合格。例如:

111000000000000011100000000000000
 

输出样例5:

在这里给出相应的输出。例如:

1:validate error
2:validate error
 

输入样例6:

两组数据,数据之间无空闲位。例如:

1110000000001100111000001
 

输出样例6:

在这里给出相应的输出。例如:

1:00000000
2:01110000

 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 s = input.nextLine();
 6        String ch="";
 7         int j=0;
 8         int i=0;
 9         int t=1;
10         int count=0;
11         if(s.length()<11)
12         System.out.println("null data");
13         else
14         {
15             for(i=0;i<s.length();i++)
16             {
17                 if(s.charAt(i)=='1')
18                  j++;
19             }
20             if(j==s.length())
21             { System.out.println("null data");return ;}
22             else
23             {
24                 i=0;
25               while(i<=s.length()-11)
26               {
27                   if(s.charAt(i)=='0'){
28                  ch=s.substring(i,i+11);
29                   
30                if(ch.charAt(10)!='1')
31                {
32                System.out.println(t+":"+"validate error");
33                 t++;
34                 i=i+11;
35                    }
36                 else
37                 {
38                  for( j=1;j<9;j++)
39                  {
40                      if(ch.charAt(j)=='1')
41                       count++;
42                      
43                  }
44                  if(count%2==0)
45                  {
46                      if(ch.charAt(9)!='1')
47                      {
48                        System.out.println(t+":"+"parity check error");
49                        t++;
50                          i=i+11;
51                      }
52                      else
53                      {
54                          System.out.println(t+":"+ch.substring(1,9));
55                          t++;
56                            i=i+11;
57                      }
58                  }
59                  else
60                  {
61                       if(ch.charAt(9)!='0')
62                      {
63                        System.out.println(t+":"+"parity check error");
64                        t++;
65                          i=i+11;
66                      }
67                      else
68                      {
69                          System.out.println(t+":"+ch.substring(1,9));
70                          t++;
71                            i=i+11;
72                      } 
73                  }
74                  }
75                   
76                 }
77                   else
78                       i++;
79               }
80             }
81 
82 
83         }
84     }
85 }

 

踩坑心得:最开始的时候在条件判断语句里,我都采用的是让sub.string( )截出来的字符串直接用“==”与一个字符串相比,导致一直在报错。刚开始我一直以为是sub.string( )导致的错,

在翻了很多遍书以及CSDN了很多次以后仍然没有找到错误,就放弃了使用sub.string( ),转而使用charAt( )去代替,虽然要写的东西多了很多,但终于没有再报错了!后来,下午上课,

听老师讲到相关东西才明白两个字符串不能直接用“==”去比较。还有就是一开始以为所有的奇校验都为1,这也导致我在校验码的测试点中错了很多。还有一个低级错误就是最开始我都

是用println( )输出,这导致输出的结果是序号与数据不在同一行。当然,这道题还有一个普遍的问题就是圈复杂度太高。对于这道题,我把所有给出的样例都过了,但仍然有几个测试点

过不了,后来自己尝试着写了几个例子,仍然没有发现错误所在。

改进建议:下一次我们在做题的时候,应该更细心的检查错误之处,不要想当然的以为一定是某个点错了而忽略另外一个点,因为真正的错误可能是一个非常细微的点,这会帮我们节省

太多时间。还有就是读题目的时候当碰到某个不明白的知识点,应该去查资料弄明白,因为能否读懂题目关乎到我们能否将题目做出来。我们在做题的时候,经常会出现答案错误的情况,

我觉得碰到这种情况可以先在测试区测试几个样例看看错误的输出是什么样的,从而更好改动代码。还有就是平时应该多积累一些相关知识,避免犯一些低级错误。

总结:通过这道题我学会了很多。比如说:字符串不能直接用“==”去比较,奇校验码在有奇数个1时,校验位为0,偶数个1时,校验位为1。println( )输出会换行,但print( )不会。对于如何

降低复杂度,可以通过把一个类拆分成多个类,把一个方法拆分成多个方法。本道题的不足之处是并没有把所有的测试点都过了,而且到最后也没有找出没有过的原因。

7-3 String的格式判断与内容提取
分数 10
作者 蔡轲
单位 南昌航空大学

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

输入格式:

全院学生学号组成的长字符串(学号之间无分隔)
学号格式定义如下:
2位年级号+2位学院号+2位班级号+2位序号,如19041103,

输出格式:

特定两个班级202017班、202061班同学的学号后四位
如:1701 6103 1704

输入样例1:

在这里给出一组输入。例如:

2020610120201702202051132020110320201706
 

输出样例1:

在这里给出相应的输出。例如:

6101 1702 1706
 

输入样例2(第一个学号多输入一位):

在这里给出一组输入。例如:

20206100120201702202051132020110320201706
 

输出样例2:

在这里给出相应的输出。例如:

Wrong Format
 

输入样例3(第一个学号少输入一位数字):

在这里给出一组输入。例如:

202061120201702202051132020110320201706
 

输出样例3:

在这里给出相应的输出。例如:

Wrong Format
 

输入样例3(学号之间有空格):

在这里给出一组输入。例如:

2020610120201702 202051132020110320201706
 

输出样例3:

在这里给出相应的输出。例如:

Wrong Format

 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 s = input.nextLine();
 6         int i=0;
 7         int flag=0;
 8         int j;
 9         if(s.length()<8)
10         {
11             System.out.println("Wrong Format");
12         }
13         else
14         {
15                 if(s.length()%8!=0)
16                 {
17                   System.out.println("Wrong Format");
18                   
19                 }
20                 else
21                 {
22             for(i=0;i<s.length();i=i+8)
23             {
24             
25                 
26                  if((s.charAt(i)=='2'&&s.charAt(i+1)=='0'&&s.charAt(i+2)=='2'&&s.charAt(i+3)=='0'&&s.charAt(i+4)=='1'&&s.charAt(i+5)=='7')||(s.charAt(i)=='2'&&s.charAt(i+1)=='0'&&s.charAt(i+2)=='2'&&s.charAt(i+3)=='0'&&s.charAt(i+4)=='6'&&s.charAt(i+5)=='1'))
27                  {
28                    for(j=i+4;j<i+8;j++) 
29                    {
30                    //System.out.print((String)s.charAt(i+4)+(String)s.charAt(i+5)+(String)s.charAt(i+6)+(String)s.charAt(i+7) );
31                   System.out.print(s.charAt(j));
32                      flag++;
33                    }
34                      if(flag%4==0&&i+8!=s.length())
35                      System.out.print(" ");
36                      
37                      
38                      }
39             }
40                 }
41        }
42             
43         
44    }
45  }

 

(3)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

输入样例:

整数输入。例如:

0,0 1,1
 

输出样例:

在这里给出相应的输出。例如:

1.4142135623730951
 

输入样例1:

带符号double类型实数输入。例如:

+2,-2.3 0.9,-3.2
 

输出样例1:

在这里给出相应的输出。例如:

1.42126704035519
 

输入样例2:

格式非法。例如:

++2,-2.3 0.9,-3.2
 

输出样例2:

在这里给出相应的输出。例如:

Wrong Format
 

输入样例3:

点的数量超过两个。例如:

+2,-2.3 0.9,-3.2 +2,-2.3
 

输出样例3:

在这里给出相应的输出。例如:

wrong number of points
 1  import java.util.Scanner;
 2 import java.util.regex.Matcher;
 3 import java.util.regex.Pattern;
 4 public class Main{
 5     public static void main(String[] args){
 6         Scanner input = new Scanner(System.in);
 7         String s1=input.nextLine();
 8         int i=0;
 9         int j=0;
10         int flag=0;
11         Double[]b=new Double[4];
12         for(i=0;(i+2)<s1.length();i++)
13         {
14           
15             if((s1.charAt(i)=='+'&&s1.charAt(i+1)==',')||(s1.charAt(i)=='-'&&s1.charAt(i+1)==','))
16             {
17                 //System.out.println("Wrong Format");
18                 flag=1;
19                  break;
20             }
21              if(s1.charAt(i)=='0'&&(s1.charAt(i+1)>='0'&&s1.charAt(i+1)<='9'))
22              {
23                // System.out.println("Wrong Format");
24                  flag=1;
25                   break;
26              }
27               if((s1.charAt(0)=='.'&&s1.charAt(1)=='1')||(s1.charAt(0)=='.'&&s1.charAt(1)=='2')||(s1.charAt(0)=='.'&&s1.charAt(1)=='3')||
28                (s1.charAt(0)=='.'&&s1.charAt(1)=='4')||(s1.charAt(0)=='.'&&s1.charAt(1)=='5')||(s1.charAt(0)=='.'&&s1.charAt(1)=='6')||(s1.charAt(0)=='.'&&s1.charAt(1)=='7')||(s1.charAt(0)=='.'&&s1.charAt(1)=='8')||(s1.charAt(0)=='.'&&s1.charAt(1)=='9'))
29               {
30                  // System.out.println("Wrong Format");
31                   flag=1;
32                    break;
33               }
34                if(s1.charAt(i)=='.'&&s1.charAt(i+1)==',')
35                {
36                // System.out.println("Wrong Format");
37                    flag=1;
38                  break;
39                }
40 
41                if(s1.charAt(i)=='+'&&s1.charAt(i+1)=='+'&&s1.charAt(i+2)=='+')
42                {
43                // System.out.println("Wrong Format");
44                    flag=1;
45                   break;
46                }
47            
48             if(s1.charAt(i)=='0'&&s1.charAt(i+1)=='0'&&s1.charAt(i+2)=='0')
49             {
50                // System.out.println("Wrong Format");
51                 flag=1;
52                  break;
53             }
54             if(s1.charAt(i)=='0'&&s1.charAt(i+1)=='.'&&s1.charAt(i+2)=='0')
55                {
56                // System.out.println("Wrong Format");
57                    flag=1;
58                   break;
59                }
60           if(s1.charAt(i)=='+'&&s1.charAt(i+1)=='0')
61                {
62                // System.out.println("Wrong Format");
63                    flag=1;
64                   break;
65                }
66             }
67         if(flag==1)
68          System.out.println("Wrong Format");
69          /*for(i=0;(i+1)<s1.length();i++)
70          {
71              if(s1.charAt(i)=='+'&&s1.charAt(i+1)=='+'||s1.charAt(i)=='0'&&s1.charAt(i+1)=='0'||s1.charAt(i)==','&&s1.charAt(i+1)==' '||s1.charAt(i)==','&&s1.charAt(i+1)=='-')
72                  System.out.println("Wrong Format");
73              return;
74          }*/
75       
76          String s2="";
77         s2=s1.replace(","," ");
78         String[]a=s2.split(" ");
79         if(a.length>4)
80         
81         System.out.println("wrong number of points");
82         else if(s1.matches("[+-]?([0-9]+(\\.[0-9]+)?),[+-]?([0-9]+(\\.[0-9]+)?) [+-]?([0-9]+(\\.[0-9]+)?),[+-]?([0-9]+(\\.[0-9]+)?)")==false)
83           System.out.println("Wrong Format");
84     
85         
86         else
87         {
88          for(j=0;j<4;j++)
89          b[j]=Double.parseDouble(a[j]);
90         // s=Math.sqrt((b[3]-b[1])*(b[3]-b[1])-(b[2]-b[0])*(b[2]-b[0]));
91          System.out.println(Math.sqrt((b[3]-b[1])*(b[3]-b[1])+(b[2]-b[0])*(b[2]-b[0])));
92         }
93          
94         
95     }
96 }

 

 

 踩坑心得:做这道题,我的思路是排除所有错误输入后,利用两点之间的距离计算公式把结果算出来,我所知道的情况有:合法输入:(1)1,1  1,2        (2)+1,1    1,2

(3)1,1    1,01         非法输入:(1)++1,1   1,2        (2)+1+,1   1,2      (3)+01,1  1,2     (4).1,1    1,2    (5)1.,1   1,2     (6).,1     1,2      (7)+

++,1   1,2    (8)000,1   1,1,但把所有情况写上后,得分也只有8分,后来又尝试用正则表达式,得分也只有9分,还有的一分当时找了很久也没有找到。做完这一步后,需

要把输入的字符串形式转化为坐标去计算,我采用的是用一个double型的b[ ]去存它。这道题的复杂度也很高,这也是一个普遍的问题。

改进建议:因为这道题的非法输入形式千变万化,所以很难把所有的错误情况都排除掉,这也正是本题的最大难点所在。我觉得可以采用正则表达式把正确的输入写入,从而可以减

少很多麻烦,节省时间。对于复杂度太高的问题,我觉得可以通过把一个类拆分成多个类,把一个方法拆分成多个方法,减少if-else的使用。

总结:通过这道题,我学会了在输入情况很复杂的时候,采用正则表达式可以节省大量时间,简化题目。通过看书,了解了正则表达式一些基本的使用方法。我希望在以后做题的时

候,可以先想出一个相对较简便的方法再去做,而不是一拿到题目就去做。

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",

输出格式:

见题目描述。

输入样例1:

选项1,两点重合。例如:

1:-2,+5 -2,+5
 

输出样例:

在这里给出相应的输出。例如:

points coincide
 

输入样例2:

选项1,斜率无穷大的线。例如:

1:-2,3 -2,+5
 

输出样例:

在这里给出相应的输出。例如:

Slope does not exist
 

输入样例3:

选项1,斜率无穷大。例如:

1:-2,3 -2,+5
 

输出样例:

在这里给出相应的输出。例如:

Slope does not exist
 

输入样例4:

选项1,符合格式输入,带符号/不带符号数混合。例如:

1:-2.5,3 -2,+5.3
 

输出样例:

在这里给出相应的输出。例如:

4.6
 

输入样例5:

选项2,计算第一个点到另外两点连线的垂直距离。例如:

2:0,1 1,0 2,0
 

输出样例:

在这里给出相应的输出。例如:

1.0
 

输入样例6:

选项3,判断三个点是否在一条线上。例如:

3:0,1 2,2 5,3
 

输出样例:

在这里给出相应的输出。例如:

false
 

输入样例7:

选项4,判断两条线是否平行。例如:

4:0,1 0,2 2,1 3,0 
 

输出样例:

在这里给出相应的输出。例如:

false
 

输入样例8:

选项5,判断两条线的交点。例如:

5:0,0 -1,-1 0,2 3,-1
 

输出样例:

在这里给出相应的输出,交点坐标之间以英文","分隔,判断结果与坐标之间以一个英文空格分隔。例如:

1.0,1.0 true
 

输入样例9:

选项5,判断两条线的交点。但两条线平行例如:

5:0,0 -1,-1 2,3 3,4
 

输出样例:

在这里给出相应的输出,交点坐标之间以英文","分隔,判断结果与坐标之间以一个英文空格分隔。例如:

is parallel lines,have no intersection point

  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 s1=input.nextLine();
  6      double b[]=new double[8];
  7      double k=0;
  8         int i=0;
  9         int flag=0;
 10         /* for(i=2;(i+2)<s1.length();i++)
 11         {
 12             if((s1.charAt(i)=='+'&&s1.charAt(i+1)=='+')||(s1.charAt(i)=='-'&&s1.charAt(i+1)=='-'))
 13             {   
 14                // System.out.println("Wrong Format");
 15                 flag=1;
 16                 break;
 17             }
 18             if((s1.charAt(i)=='+'&&s1.charAt(i+1)==',')||(s1.charAt(i)=='-'&&s1.charAt(i+1)==','))
 19             {
 20                 //System.out.println("Wrong Format");
 21                 flag=1;
 22                  break;
 23             }
 24              if(s1.charAt(i)=='0'&&(s1.charAt(i+1)>='0'&&s1.charAt(i+1)<='9'))
 25              {
 26                // System.out.println("Wrong Format");
 27                  flag=1;
 28                   break;
 29              }
 30               if((s1.charAt(0)=='.'&&s1.charAt(1)=='1')||(s1.charAt(0)=='.'&&s1.charAt(1)=='2')||(s1.charAt(0)=='.'&&s1.charAt(1)=='3')||
 31                (s1.charAt(0)=='.'&&s1.charAt(1)=='4')||(s1.charAt(0)=='.'&&s1.charAt(1)=='5')||(s1.charAt(0)=='.'&&s1.charAt(1)=='6')||(s1.charAt(0)=='.'&&s1.charAt(1)=='7')||(s1.charAt(0)=='.'&&s1.charAt(1)=='8')||(s1.charAt(0)=='.'&&s1.charAt(1)=='9'))
 32               {
 33                  // System.out.println("Wrong Format");
 34                   flag=1;
 35                    break;
 36               }
 37                if(s1.charAt(i)=='.'&&s1.charAt(i+1)==',')
 38                {
 39                // System.out.println("Wrong Format");
 40                    flag=1;
 41                  break;
 42                }
 43 
 44                if(s1.charAt(i)=='+'&&s1.charAt(i+1)=='+'&&s1.charAt(i+2)=='+')
 45                {
 46                // System.out.println("Wrong Format");
 47                    flag=1;
 48                   break;
 49                }
 50            
 51             if(s1.charAt(i)=='0'&&s1.charAt(i+1)=='0'&&s1.charAt(i+2)=='0')
 52             {
 53                // System.out.println("Wrong Format");
 54                 flag=1;
 55                  break;
 56             }
 57              if(flag==1)
 58              System.out.println("Wrong Format"); */   
 59 
 60      //int t=0;
 61         
 62   
 63         if(s1.charAt(1)!=':'||s1.charAt(0)>'5'||s1.charAt(0)<'1')
 64              {
 65             System.out.print("Wrong Format");
 66               return;
 67         }    
 68         
 69       String s2=s1.substring(2);
 70           String s3=s2.replace(","," ");
 71          String[]s4=s3.split(" ");
 72         int count=0;
 73         for(i=0;i<s2.length()-1;i++)
 74          
 75         {
 76             if(s2.charAt(i)==' ')
 77                 count++;
 78         }
 79         if(count==0)
 80         {
 81            System.out.print("Wrong Format");
 82               return;  
 83         }
 84         for(int j=0;j<s2.length()-1;j++)
 85         {
 86          if((s2.charAt(j)=='+'&&s2.charAt(j+1)=='+')||(s2.charAt(j)=='-'&&s2.charAt(j+1)=='-')||(s2.charAt(j)=='+'&&s2.charAt(j+1)=='-')||(s2.charAt(j)=='-'&&s2.charAt(j+1)=='+')||(s2.charAt(j)=='.'&&s2.charAt(j+1)==',')||(s2.charAt(j)==','&&s2.charAt(j+1)=='.')||(s2.charAt(j)=='0'&&s2.charAt(j+1)=='0')||(s2.charAt(j)=='.'&&s2.charAt(j+1)==' ')||(s2.charAt(j)==' '&&s2.charAt(j+1)=='.')||(s2.charAt(j)=='.'&&s2.charAt(j+1)=='.')||(s2.charAt(j)==' '&&s2.charAt(j+1)==',')||(s2.charAt(j)==','&&s2.charAt(j+1)==' ')||(s2.charAt(j)==' '&&s2.charAt(j+1)==' ')||(s2.charAt(j)==','&&s2.charAt(j+1)==',')||s2.charAt(0)=='.'||s2.charAt(0)==',')
 87          {
 88                System.out.print("Wrong Format");
 89               return;  
 90          }
 91         }
 92      if(s1.charAt(0)=='1')
 93      {
 94          /*String s2=s1.substring(2);
 95           String s3=s2.replace(","," ");
 96          String[]s4=s3.split(" ");*/
 97          if(s4.length!=4)
 98          {
 99          System.out.print("wrong number of points");
100              return;
101          }
102          else
103         {
104              //if(s2.matches("[+-]?([0-9]+(\\.[0-9]+)?),[+-]?([0-9]+(\\.[0-9]+)?) [+-]?([0-9]+(\\.[0-9]+)?),[+-]?([0-9]+(\\.[0-9]+)?)")==false)
105                 // System.out.println("Wrong Format");
106             //else
107              //{
108                   for(int j=0;j<4;j++)
109                       
110                       b[j]=Double.parseDouble(s4[j]);
111                     
112                       if(b[0]==b[2]&&b[1]==b[3])
113                       {
114                       System.out.print("points coincide");
115                           return;
116                       }
117                       else
118                       {
119                         if(b[0]==b[2])
120                         {
121                             System.out.print("Slope does not exist");
122                             return;
123                         }
124                         else
125                         {
126                             k=(b[3]-b[1])/(b[2]-b[0]);
127                             System.out.print(k);
128                             return;
129                         }
130                       }
131             // }
132          }
133      }
134      if(s1.charAt(0)=='2'||s1.charAt(0)=='3')
135      {
136         /*String s2=s1.substring(2);
137           String s3=s2.replace(","," ");
138          String[]s4=s3.split(" ");*/
139          if(s4.length!=6)
140          {
141          System.out.print("wrong number of points");
142              return;
143          }
144          else
145          {
146              for(int j=0;j<6;j++)
147                  
148                  b[j]=Double.parseDouble(s4[j]);
149 
150             // if(s2.matches("[+-]?([0-9]+(\\.[0-9]+)?),[+-]?([0-9]+(\\.[0-9]+)?) [+-]?([0-9]+(\\.[0-9]+)?),[+-]?([0-9]+(\\.[0-9]+)?) [+-]?([0-9]+(\\\\.[0-9]+)?),[+-]?([0-9]+(\\\\.[0-9]+)?)")==false)
151            //  {
152                 // System.out.print("Wrong Format");
153                 //return;
154             // }
155             // else
156             // {
157                  if(s1.charAt(0)=='2')
158                  {
159                       if(b[2]==b[4]&&b[3]==b[5])
160                       {
161                           System.out.print("points coincide");
162                           return;
163                       }
164                          else
165                          {
166                         double L=Math.abs((b[3]-b[5])*b[0]+(b[2]-b[4])*b[1]-b[2]*b[5]+b[3]*b[4])/Math.sqrt((b[3]-b[5])*(b[3]-b[5])+(b[2]-b[4])*(b[2]-b[4]));
167                         System.out.print(L);
168                              return;
169                          }
170                  }
171                   else if(s1.charAt(0)=='3')
172                   {
173                       
174                     if((b[0]==b[2]&&b[1]==b[3])||(b[0]==b[4]&&b[1]==b[5])||(b[2]==b[4]&&b[3]==b[5]))
175                     {
176                      System.out.println("points coincide");
177                         return;
178                     }
179                       else
180                       {
181                       if(b[2]==b[0]&&b[4]==b[2])
182                       {
183                        System.out.print("true");
184                           return;
185                       }
186                       else
187                       {
188                       if((b[2]!=b[0]&&b[4]!=b[2])&&((b[2]-b[0])*(b[5]-b[3])==(b[4]-b[2])*(b[3]-b[1])))
189                       {
190                           System.out.print("true");
191                           return;
192                       }
193                       else if((b[2]!=b[0]&&b[4]==b[2])||(b[2]==b[0]&&b[4]!=b[2]))
194                       {
195                           System.out.print("false");
196                           return;
197                       }
198                        else if((b[2]!=b[0]&&b[4]!=b[2])&&((b[2]-b[0])*(b[5]-b[3])!=(b[4]-b[2])*(b[3]-b[1])))
199                        {
200                        System.out.print("false");
201                            return;
202                        }
203                       }
204                       }
205                   }
206                  
207 
208             // }
209          }
210      }
211      if(s1.charAt(0)=='4'||s1.charAt(0)=='5')
212      {
213          /*String s2=s1.substring(2);
214           String s3=s2.replace(","," ");
215          String[]s4=s3.split(" ");*/
216          if(s4.length!=8)
217          {
218          System.out.print("wrong number of points");
219              return;
220          }
221          else
222          {
223 
224              for(int j=0;j<8;j++)
225                  
226                  b[j]=Double.parseDouble(s4[j]);
227 
228             // if(s2.matches("[+-]?([0-9]+(\\.[0-9]+)?),[+-]?([0-9]+(\\.[0-9]+)?) [+-]?([0-9]+(\\.[0-9]+)?),[+-]?([0-9]+(\\.[0-9]+)?) [+-]?([0-9]+(\\\\.[0-9]+)?),[+-]?([0-9]+(\\\\.[0-9]+)?) [+-]?([0-9]+(\\\\.[0-9]+)?),[+-]?([0-9]+(\\\\.[0-9]+)?)")==false)
229            //  {
230                 // System.out.print("Wrong Format");
231                //  return;
232             // }
233             // else
234             // {
235                  for(int j=0;j<8;j++)
236                           
237                           b[j]=Double.parseDouble(s4[j]);
238                         
239                           if((b[0]==b[2]&&b[1]==b[3])||(b[7]==b[5]&&b[6]==b[4]))
240                           {
241                           System.out.print("points coincide");
242                               return;
243                           }
244                           else if(s1.charAt(0)=='4')
245                           {
246                                if(b[2]==b[0]&&b[6]==b[4])
247                                {
248                                    System.out.print("true");
249                                    return;
250                                }
251                                   else
252                                   {
253                                      if((b[2]!=b[0]&&b[6]!=b[4]))
254                                      {
255                                       if((b[3]-b[1])/(b[2]-b[0])==(b[7]-b[5])/(b[6]-b[4]))
256                                       {
257                                          System.out.print("true");
258                                           return;
259                                       }
260                                       else
261                                       {
262                                       System.out.print("false");
263                                        return;
264                                       }
265                                      }
266                                     else
267                                  {
268                                      System.out.println("false");
269                                      return;
270                                  }
271                                   }
272                           }
273                           else if(s1.charAt(0)=='5')
274                           {
275                                 if(b[2]==b[0]&&b[6]==b[4])
276                                 {
277                                     System.out.print("is parallel lines,have no intersection point");
278                                     return;
279                                 }
280                                       else if((b[3]-b[1])/(b[2]-b[0])==(b[7]-b[5])/(b[6]-b[4]))
281                                     {
282                                           System.out.print("is parallel lines,have no intersection point");
283                                         return;
284                                     }
285                                       else
286                                       {
287                                           double x=(b[5]*b[6]*b[2]-b[7]*b[4]*b[2]-b[5]*b[6]*b[0]+b[7]*b[4]*b[0]-b[1]*b[2]*b[6]+b[3]*b[0]*b[6]+b[1]*b[2]*b[4]-b[3]*b[4]*b[0])/(b[6]*b[3]-b[6]*b[1]-b[4]*b[3]+b[4]*b[1]-b[2]*b[7]+b[2]*b[5]+b[0]*b[7]-b[0]*b[4]);
288                                           double y=(-b[5]*b[6]*b[3]+b[7]*b[4]*b[3]+b[5]*b[6]*b[1]-b[7]*b[4]*b[1]+b[1]*b[2]*b[7]-b[1]*b[2]*b[5]-b[3]*b[0]*b[7]+b[3]*b[5]*b[0])/(b[7]*b[2]-b[7]*b[0]-b[5]*b[2]+b[0]*b[5]-b[3]*b[6]+b[3]*b[4]+b[1]*b[6]-b[1]*b[4]);
289                                          System.out.print(x);
290                                          System.out.print(",");
291                                          System.out.print(y);
292                                         
293                                          if((x>b[0]&&x<b[2]||x>b[4]&&x<b[6]||y>b[1]&&y<b[3]||y>b[5]&&y<b[7])&&(x!=b[0]&&y!=b[1])&&(x!=b[2]&&y!=b[3])&&(x!=b[4]&&y!=b[5])&&(x!=b[6]&&y!=b[7]))
294                                         {
295                                        
296                                              System.out.print(" true");
297                                             return;
298                                         }
299                                          else
300                                         {
301                                              System.out.print(" false");
302                                             return;
303                                         }
304 
305                                       }
306                           }
307              }
308          }
309      }
310 //}
311 }
312 //}

 

 踩坑心得:这道题的难度比前一题更高,首先是对于"Wrong Format"的判断比第一题情况更复杂,这也是我这道题的主要失分点,我把前一道题对错误输入判断的代码直接复制过来后,

也很多点没有过,再加上一些东西后,仍然有点没有过。后来我尝试了很多种情况,仍然没有办法把点都过了。然后判断点数与是否重合就比较简单。再然后通过数组接收输入的字符

串,把String转化为double,然后计算斜率,判断平行等等都可以直接去网上找公式。但是令我很疑惑的点是计算交点有一个测试点过不了,一直到现在也没有解决。还有就是这道题的

复杂度依然很高,我觉得如果用类写复杂度应该会降低很多。

改进建议:下次写这种类型的题目时,应该要用类写,这样不仅可以大大降低复杂度,还可以减少很多代码的重复书写,减少做这道题的工作量。在做下道题时可以直接引用相关类,减少

下道题的工作量。还有就是正则表达式对于格式的判断十分重要,今后碰到这种题目时,可以第一考虑正则表达式。

总结:通过这道题,我学到了关于正则表达式的一些更复杂的表达。还有就是意识道自己对类的掌握十分薄弱,今后可以通过尝试多用多写已强化对它的理解。也正是因为这道题,我意识

到类是多么重要,它可以使代码变得简约易读,对于一些需要重复利用的代码可以直接调用,不要重复书写,这也减少了代码出错的概率。

7-3 点线形系列3-三角形的计算
分数 48
作者 蔡轲
单位 南昌航空大学

用户输入一组选项和数据,进行与三角形有关的计算。选项包括:
1:输入三个点坐标,判断是否是等腰三角形、等边三角形,判断结果输出true/false,两个结果之间以一个英文空格符分隔。
2:输入三个点坐标,输出周长、面积、重心坐标,三个参数之间以一个英文空格分隔,坐标之间以英文","分隔。
3:输入三个点坐标,输出是钝角、直角还是锐角三角形,依次输出三个判断结果(true/false),以一个英文空格分隔,
4:输入五个点坐标,输出前两个点所在的直线与三个点所构成的三角形相交的交点数量,如果交点有两个,则按面积大小依次输出三角形被直线分割成两部分的面积。若直线与三角形一条线重合,输出"The point is on the edge of the triangle"
5:输入四个点坐标,输出第一个是否在后三个点所构成的三角形的内部(输出in the triangle/outof triangle)。
必须使用射线法,原理:由第一个点往任一方向做一射线,射线与三角形的边的交点(不含点本身)数量如果为1,则在三角形内部。如果交点有两个或0个,则在三角形之外。若点在三角形的某条边上,输出"on the triangle"

输入格式:

基本格式:选项+":"+坐标x+","+坐标y+" "+坐标x+","+坐标y。点的x、y坐标之间以英文","分隔,点与点之间以一个英文空格分隔。

输出格式:

基本输出格式见每种选项的描述。
异常情况输出:
如果不符合基本格式,输出"Wrong Format"。
如果符合基本格式,但输入点的数量不符合要求,输出"wrong number of points"。
如果输入的三个点无法构成三角形,输出"data error"。
注意:输出的数据若小数点后超过6位,只保留小数点后6位,多余部分采用四舍五入规则进到最低位。小数点后若不足6位,按原始位数显示,不必补齐。例如:1/3的结果按格式输出为 0.333333,1.0按格式输出为1.0

选项4中所输入线的两个点坐标重合,输出"points coincide",

输入样例1:

选项4,定义线的两点重合。例如:

4:1,0 1,0 0,0 2,0 4,0
 

输出样例:

在这里给出相应的输出。例如:

points coincide
 

输入样例2:

选项4,构成三角形的三个点在一条线上,无法构成三角形。例如:

4:1,0 0,2 0,0 0,0 4,0
 

输出样例:

在这里给出相应的输出。例如:

data error
 

输入样例3:

选项1,判断等腰、等边三角形。例如:

1:-2,0 2,0 0,4
 

输出样例:

两个判断结果。例如:

true false
 

输入样例4:

选项2,输出边长、面积、重心坐标。例如:

2:0,0 3,0 0,1
 

输出样例:

在这里给出相应的输出。例如:

7.162278 1.5 1.0,0.333333
 

输入样例5:

选项3,钝角、直角、锐角的判断。例如:

3:0,1 1,0 2,0
 

输出样例:

在这里给出相应的输出。例如:

true false false
 

输入样例6:

选项4,直线与三角形交点的数量等于2,输出数量值以及三角形被分割的两部分面积。例如:

4:1,0 0,2 0,0 0,2 4,0
 

输出样例:

在这里给出相应的输出。例如:

2 1.0 3.0
 

输入样例7:

选项4,直线与三角形交点的数量少于两个,只输出数量值。例如:

4:-1,0 1,2 0,1 0,-1 2,0
 

输出样例:

在这里给出相应的输出。例如:

1
 

输入样例8:

选项5,用射线法判断点是否在三角形内部。例如:

5:0.5,0.5 0,0 0,2 4,0
 

输出样例:

在这里给出相应的输出,交点坐标之间以英文","分隔,判断结果与坐标之间以一个英文空格分隔。例如:

in the triangle
 

输入样例9:

选项5,用射线法判断点是否在三角形内部。例如:

5:0,0 -1,-1 2,3 3,4
 

输出样例:

在这里给出相应的输出。例如:

outof the triangle

  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 s1=input.nextLine();
  6         if(s1.charAt(1)!=':')
  7         System.out.println("Wrong Format");
  8         else
  9         {
 10             if(!(s1.charAt(0)=='1'||s1.charAt(0)=='2'||s1.charAt(0)=='3'||s1.charAt(0)=='4'||s1.charAt(0)=='5'))
 11                 System.out.println("Wrong Format");
 12             else
 13             {
 14                    int i=0;
 15                     int j=0;
 16                     int flag=0;
 17                     
 18                     for(i=0;(i+2)<s1.length();i++)
 19                     {
 20                         if((s1.charAt(i)=='+'&&s1.charAt(i+1)=='+')||(s1.charAt(i)=='-'&&s1.charAt(i+1)=='-'))
 21                         {   
 22                            
 23                             flag=1;
 24                             break;
 25                         }
 26                         if((s1.charAt(i)=='+'&&s1.charAt(i+1)==',')||(s1.charAt(i)=='-'&&s1.charAt(i+1)==','))
 27                         {
 28                             
 29                             flag=1;
 30                              break;
 31                         }
 32                          if(s1.charAt(i)=='0'&&(s1.charAt(i+1)>='0'&&s1.charAt(i+1)<='9'))
 33                          {
 34                            
 35                              flag=1;
 36                               break;
 37                          }
 38                           if((s1.charAt(0)=='.'&&s1.charAt(1)=='1')||(s1.charAt(0)=='.'&&s1.charAt(1)=='2')||(s1.charAt(0)=='.'&&s1.charAt(1)=='3')||
 39                            (s1.charAt(0)=='.'&&s1.charAt(1)=='4')||(s1.charAt(0)=='.'&&s1.charAt(1)=='5')||(s1.charAt(0)=='.'&&s1.charAt(1)=='6')||(s1.charAt(0)=='.'&&s1.charAt(1)=='7')||(s1.charAt(0)=='.'&&s1.charAt(1)=='8')||(s1.charAt(0)=='.'&&s1.charAt(1)=='9'))
 40                           {
 41                              
 42                               flag=1;
 43                                break;
 44                           }
 45                            if(s1.charAt(i)=='.'&&s1.charAt(i+1)==',')
 46                            {
 47                            
 48                                flag=1;
 49                              break;
 50                            }
 51                            if(s1.charAt(i)=='+'&&s1.charAt(i+1)=='+'&&s1.charAt(i+2)=='+')
 52                            {
 53                            
 54                                flag=1;
 55                               break;
 56                            }
 57                         if(s1.charAt(i)=='0'&&s1.charAt(i+1)=='0'&&s1.charAt(i+2)=='0')
 58                         {
 59                            
 60                             flag=1;
 61                              break;
 62                         }
 63                         if(s1.charAt(i)=='0'&&s1.charAt(i+1)=='.'&&s1.charAt(i+2)=='0')
 64                            {
 65                            
 66                                flag=1;
 67                               break;
 68                            }
 69                        
 70                         }
 71                     if(flag==1)
 72                      System.out.println("Wrong Format");
 73                     else
 74                         
 75                     {
 76                         double b[]=new double[10];
 77                         double k=0;
 78                         double k1=0;
 79                         double k2=0;
 80                         
 81                         if(s1.charAt(0)=='1'||s1.charAt(0)=='2'||s1.charAt(0)=='3')
 82                         {
 83                             String s2=s1.substring(2);
 84                             String s3=s2.replace(","," ");
 85                            String[]s4=s3.split(" ");
 86                            if(s4.length!=6)
 87                            System.out.println("wrong number of points");
 88                            else
 89                            {
 90                              for(i=0;i<6;i++)
 91                              {
 92                               if(s4[i].matches("[+-]?([0-9]+(\\.[0-9]+)?)")==false)
 93                                 System.out.println("Wrong Format");
 94                              }
 95                               for(j=0;j<6;j++)
 96                                 
 97                                 b[j]=Double.parseDouble(s4[j]);
 98                              k1=(b[1]-b[3])/(b[0]-b[2]);
 99                               k2=(b[5]-b[3])/(b[4]-b[2]);
100                               double a=Math.sqrt((b[3]-b[1])*(b[3]-b[1])+(b[2]-b[0])*(b[2]-b[0]));
101                               double d=Math.sqrt((b[5]-b[1])*(b[5]-b[1])+(b[4]-b[0])*(b[4]-b[0]));
102                               double c=Math.sqrt((b[5]-b[3])*(b[5]-b[3])+(b[4]-b[2])*(b[4]-b[2]));
103                               //if(!((a+d>c&&Math.abs(a-d)<c)||(a+c>d&&Math.abs(a-c)<d)||(c+d>a&&Math.abs(c-d)<a)))
104                             
105                               //else
106                               //{
107                                   if(s1.charAt(0)=='1')
108                                   {
109                                      if(k1==k2||(b[3]-b[1])*(b[0]-b[4])-(b[1]-b[5])*(b[2]-b[0])==0||(b[0]-b[2]==0&&b[1]-b[3]==0)||(b[0]-b[4]==0&&b[1]-b[5]==0)||(b[2]-b[4]==0&&b[3]-b[5]==0)||(!((a+d>c&&Math.abs(a-d)<c)||(a+c>d&&Math.abs(a-c)<d)||(c+d>a&&Math.abs(c-d)<a))))
110                                      {
111                                   System.out.print("data error");
112                                          return;
113                                      }
114                                  
115                                      else
116                                      {
117                                        String S1="";
118                                     String S2="";
119                                     if(a==d&&d==c)
120                                     {
121                                         S1="true";
122                                        // S2="true";
123                                     }
124                                     //else
125                                     //{
126                                     else if(a==d||a==c||d==c)
127                                     {
128                                     S2="true";
129                                      //S1="false";   
130                                     }
131                                     if(!(S1.equals("true")))
132                                         S1="false";
133                                     if(!(S2.equals("true")))
134                                         S2="false";     
135                                         System.out.println(S2+" "+S1);
136                                     // }
137                                      }
138                                    /* if(Math.abs(a-d)<=0.000001&&Math.abs(c-d)<=0.000001)
139                                      System.out.print("true true");
140                                     else
141                                     {
142                                        if(Math.abs(a-d)<=0.000001||Math.abs(a-c)<=0.000001||Math.abs(c-d)<=0.000001)
143                                            System.out.print("true false");
144                                         else
145                                          System.out.print("false false");
146                                            
147                                     }*/
148                                 }
149                                   if(s1.charAt(0)=='2')
150                          
151                                   {
152                                     
153                                       double a1=Math.sqrt((b[3]-b[1])*(b[3]-b[1])+(b[2]-b[0])*(b[2]-b[0]));
154                                         double d1=Math.sqrt((b[5]-b[1])*(b[5]-b[1])+(b[4]-b[0])*(b[4]-b[0]));
155                                         double c1=Math.sqrt((b[5]-b[3])*(b[5]-b[3])+(b[4]-b[2])*(b[4]-b[2]));
156                                       double C=a1+d1+c1;
157                                        if(k1==k2||(b[3]-b[1])*(b[0]-b[4])-(b[1]-b[5])*(b[2]-b[0])==0||(b[0]-b[2]==0&&b[1]-b[3]==0)||(b[0]-b[4]==0&&b[1]-b[5]==0)||(b[2]-b[4]==0&&b[3]-b[5]==0)||(!((a+d>c&&Math.abs(a-d)<c)||(a+c>d&&Math.abs(a-c)<d)||(c+d>a&&Math.abs(c-d)<a))))
158                                      {
159                                   System.out.print("data error");
160                                          return;
161                                      }
162                                     else
163                                     {
164                                       if((C*1e6)%10!=0)
165                                       System.out.print(String.format("%.6f",C)+" ");
166                                       else
167                                           System.out.print(C+" ");
168                                       double q=Math.abs((b[3]-b[5])*b[0]+(b[4]-b[2])*b[1]+b[2]*b[5]-b[3]*b[4]);
169                                       double S=q/2;
170                                       if((S*1e6)%10!=0)
171                                           System.out.printf("%.6f",S);
172                                           else
173                                               System.out.print(S+" ");
174                                       double X=(b[0]+b[2]+b[4])/3.0;
175                                       double Y=(b[1]+b[3]+b[5])/3.0;
176                                       if((X*1e6)%10!=0)
177                                       System.out.print(String.format("%.6f",X)+",");
178                                       else
179                                           System.out.print(X+",");
180                                       if((Y*1e6)%10!=0)
181                                           System.out.print(String.format("%.6f",Y));
182                                           else
183                                               System.out.print(Y);
184                                     }    
185                                   }
186                                   if(s1.charAt(0)=='3')
187                                   {
188                                    /* double x1,x2,x3;
189                                     String S="";
190                                     x1=(b[2]-b[0])*(b[4]-b[0])*(b[3]-b[1])*(b[5]-b[1]);
191                                     x2=(b[4]-b[2])*(b[0]-b[2])*(b[5]-b[3])*(b[1]-b[3]);
192                                     x3=(b[0]-b[4])*(b[2]-b[4])*(b[1]-b[5])*(b[3]-b[5]);
193                                     if(x1<0||x2<0||x3<0)
194                                         System.out.print("true ");
195                                     else
196                                           System.out.print("false ");
197                                     if(x1==0||x2==0||x3==0)
198                                        System.out.print("true ");
199                                     else
200                                          System.out.print("false ");
201                                        if(x1>0||x2>0||x3>0)
202                                         System.out.print("true");
203                                     else
204                                           System.out.print("false");*/
205                                       double a1=Math.sqrt((b[3]-b[1])*(b[3]-b[1])+(b[2]-b[0])*(b[2]-b[0]));
206                                         double d1=Math.sqrt((b[5]-b[1])*(b[5]-b[1])+(b[4]-b[0])*(b[4]-b[0]));
207                                         double c1=Math.sqrt((b[5]-b[3])*(b[5]-b[3])+(b[4]-b[2])*(b[4]-b[2]));
208                                            if(k1==k2||(b[3]-b[1])*(b[0]-b[4])-(b[1]-b[5])*(b[2]-b[0])==0||(b[0]-b[2]==0&&b[1]-b[3]==0)||(b[0]-b[4]==0&&b[1]-b[5]==0)||(b[2]-b[4]==0&&b[3]-b[5]==0)||(!((a+d>c&&Math.abs(a-d)<c)||(a+c>d&&Math.abs(a-c)<d)||(c+d>a&&Math.abs(c-d)<a))))
209                                      {
210                                   System.out.print("data error");
211                                          return;
212                                      }
213                                     else
214                                     {
215                                       if((c1*c1+d1*d1-a1*a1)<0||(d1*d1+c1*c1-a1*a1)<0||(a1*a1+d1*d1-c1*c1)<0)
216                                           System.out.print("true false false");
217                                       else
218                                     {
219                                       if((c1*c1+d1*d1-a1*a1)/2*d1*c1==0||(d1*d1+c1*c1-a1*a1)/2*d1*c1==0||(a1*a1+d1*d1-c1*c1)/2*d1*a1==0)
220                                           System.out.print("false true false");
221                                       if(((c1*c1+d1*d1-a1*a1)/2*d1*c1>0||(d1*d1+c1*c1-a1*a1)/2*d1*c1>0||(a1*a1+d1*d1-c1*c1)/2*d1*a1>0))
222                                           System.out.print("false false true");
223                                       
224                                     }
225                                   }
226                               }
227                            }
228                         }
229                         if(s1.charAt(0)=='4')
230                         {
231                             String s2=s1.substring(2);
232                               String s3=s2.replace(","," ");
233                              String[]s4=s3.split(" ");
234                              if(s4.length!=10)
235                              System.out.println("wrong number of points");
236                              else
237                              {
238                                  double b1[]=new double[10];
239                                   for(j=0;j<10;j++)
240                                        
241                                  b1[j]=Double.parseDouble(s4[j]);
242                                  if(b1[3]==b1[1]&&b1[2]==b1[0])
243                                  {
244                                      System.out.print("points coincide");
245                                      return;
246                                  }
247                                 
248                                      double a=Math.sqrt((b1[9]-b1[7])*(b1[9]-b1[7])+(b1[8]-b1[6])*(b1[8]-b1[6]));
249                                      double d=Math.sqrt((b1[9]-b1[5])*(b1[9]-b1[5])+(b1[8]-b1[4])*(b1[8]-b1[4]));
250                                      double c=Math.sqrt((b1[7]-b1[5])*(b1[7]-b1[5])+(b1[6]-b1[4])*(b1[6]-b1[4]));
251                                      if(!((a+d>c&&Math.abs(a-d)<c)&&(a+c>d&&Math.abs(a-c)<d)&&(c+d>a&&Math.abs(c-d)<a)))
252                                          System.out.println("data error");
253                                  else
254                                  {
255                                  if(((b[1]-b[3])==(b[5]-b[7])&&(b[2]-b[0])==(b[6]-b[4])&&(b[7]-b[5])*b[4]-(b[6]-b[4])*b[5]==(b[3]-b[1])*b[0]-(b[2]-b[0])*b[1]))
256                                 //  System.out.print("The point is on the edge of the triangle");
257                                     else  if((b[1]-b[3])==(b[9]-b[7])&&(b[2]-b[0])==(b[6]-b[8])&&(b[7]-b[9])*b[8]-(b[6]-b[8])*b[9]==(b[3]-b[1])*b[0]-(b[2]-b[0])*b[1])
258                                 //  System.out.print("The point is on the edge of the triangle");
259                                   else if((b[1]-b[3])==(b[7]-b[9])&&(b[2]-b[0])==(b[8]-b[6])&&(b[3]-b[1])*b[0]-(b[2]-b[0])*b[1]==(b[9]-b[7])*b[6]-(b[8]-b[6])*b[7])  
260                                   //System.out.print("The point is on the edge of the triangle");
261                                      else
262                                      {
263                                        int count=0,count1=0,count2=0,count3=0;
264                                          if(b[0]==b[2]&&b[4]==b[6])
265                                           count1=0;
266                                          else if((b[3]-b[1])/(b[2]-b[0])==(b[7]-b[5])/(b[6]-b[4]))
267                                              count1=0;
268                                            if(b[0]==b[2]&&b[4]==b[8])
269                                           count2=0;
270                                            else if((b[3]-b[1])/(b[2]-b[0])==(b[9]-b[5])/(b[8]-b[4]))
271                                              count2=0;
272                                              if(b[0]==b[2]&&b[4]==b[8])
273                                           count2=0;
274                                            else if((b[3]-b[1])/(b[2]-b[0])==(b[9]-b[7])/(b[8]-b[6]))
275                                              count3=0;
276                                          double x1=0,y1=0,x2=0,y2=0,x3=0,y3=0,A1,B1,C1,A2,B2,C2,A3,B3,C3,A4,B4,C4;
277                                        
278                                          double jd[]=new double[6];
279                                          int n=0;
280                                            if(b[2]!=b[0]&&b[4]!=b[6])
281                                            {
282                                              A1=b[1]-b[3];
283                                                B1=b[2]-b[0];
284                                                C1=(b[3]-b[1])*b[0]-(b[2]-b[0])*b[1];
285                                                  A2=b[5]-b[7];
286                                                B2=b[6]-b[4];
287                                                C2=(b[7]-b[5])*b[4]-(b[6]-b[4])*b[5];
288                                                  /* A3=b[5]-b[9];
289                                                B3=b[8]-b[4];
290                                                C3=(b[9]-b[5])*b[4]-(b[8]-b[4])*b[5];
291                                                    A4=b[7]-b[9];
292                                                B4=b[8]-b[6];
293                                                C4=(b[9]-b[7])*b[6]-(b[8]-b[6])*b[7];*/
294                                                x1=(B1*C2-B2*C1)/(A1*B2-A2*B1);
295                                                y1=(A1*C2-A2*C1)/(B1*A2-B2*A1);
296                                                   /* x2=(B1*C3-B3*C1)/(A1*B3-A3*B1);
297                                                y2=(A1*C3-A3*C1)/(B1*A3-B3*A1);
298                                                    x3=(B1*C4-B4*C1)/(A1*B4-A4*B1);
299                                                y3=(A1*C4-A4*C1)/(B1*A4-B4*A1);*/
300                                                
301                                            }
302                                          else if(b[2]!=b[0]&&b[4]==b[6])
303                                          {
304                                              x1=b[4];
305                                              y1=b[1]+((b[4]-b[0])*(b[3]-b[1])/(b[2]-b[0]));
306                                          }
307                                          else if(b[2]==b[0]&&b[4]!=b[6])
308                                          {
309                                              x1=b[4];
310                                              y1=b[5]+((b[0]-b[4])*(b[7]-b[5])/(b[6]-b[4]));
311                                          }
312                                          double max1,min1,max2,min2;
313                                          if(b[4]>b[8])
314                                          {
315                                              max1=b[4];
316                                              min1=b[8];
317                                          }
318                                          else
319                                          {
320                                              max1=b[8];
321                                              min1=b[4];  
322                                          }
323                                                   if(b[5]>b[9])
324                                          {
325                                              max2=b[5];
326                                              min2=b[9];
327                                          }
328                                          else
329                                          {
330                                              max2=b[9];
331                                              min2=b[5];  
332                                          }
333                                           if((x1<max1&&x1>min1)||Math.abs(x1-max1)<0.000001||Math.abs(x1-min1)<0.000001) 
334                                                                           {
335                                                                            if((y1<max2&&y1>min2)||Math.abs(y1-max2)<0.000001||Math.abs(y1-min2)<0.000001)
336                                                                                                            {
337                                                                                              count1++;
338                                                                                              jd[n]=x1;
339                                                                                               n++;
340                                                                                               jd[n]=x1;
341                                                                                               n++;
342                                                                                                                }
343                                                                           } 
344                                                                                                            
345                                             if(b[2]!=b[0]&&b[4]!=b[8])
346                                            {
347                                              A1=b[1]-b[3];
348                                                B1=b[2]-b[0];
349                                                C1=(b[3]-b[1])*b[0]-(b[2]-b[0])*b[1];
350                                                 /* A2=b[5]-b[7];
351                                                B2=b[6]-b[4];
352                                                C2=(b[7]-b[5])*b[4]-(b[6]-b[4])*b[5];*/
353                                                   A3=b[5]-b[9];
354                                                B3=b[8]-b[4];
355                                                C3=(b[9]-b[5])*b[4]-(b[8]-b[4])*b[5];
356                                                   /* A4=b[7]-b[9];
357                                                B4=b[8]-b[6];
358                                                C4=(b[9]-b[7])*b[6]-(b[8]-b[6])*b[7];*/
359                                               // x1=(B1*C2-B2*C1)/(A1*B2-A2*B1);
360                                               // y1=(A1*C2-A2*C1)/(B1*A2-B2*A1);
361                                                   x2=(B1*C3-B3*C1)/(A1*B3-A3*B1);
362                                                y2=(A1*C3-A3*C1)/(B1*A3-B3*A1);
363                                                   /* x3=(B1*C4-B4*C1)/(A1*B4-A4*B1);
364                                                y3=(A1*C4-A4*C1)/(B1*A4-B4*A1);*/
365                                                
366                                            }
367                                          else if(b[2]!=b[0]&&b[4]==b[8])
368                                          {
369                                              x2=b[4];
370                                              y2=b[1]+((b[4]-b[0])*(b[3]-b[1])/(b[2]-b[0]));
371                                          }
372                                          else if(b[2]==b[0]&&b[4]!=b[6])
373                                          {
374                                              x2=b[0];
375                                              y2=b[5]+((b[0]-b[4])*(b[9]-b[5])/(b[8]-b[4]));
376                                          }
377                                          double max11,min11,max21,min21;
378                                          if(b[4]>b[8])
379                                          {
380                                              max11=b[4];
381                                              min11=b[8];
382                                          }
383                                          else
384                                          {
385                                              max11=b[8];
386                                              min11=b[4];  
387                                          }
388                                                   if(b[5]>b[9])
389                                          {
390                                              max21=b[5];
391                                              min21=b[9];
392                                          }
393                                          else
394                                          {
395                                              max21=b[9];
396                                              min21=b[5];  
397                                          }
398                                           if((x2<max11&&x2>min11)||Math.abs(x2-max11)<0.000001||Math.abs(x2-min11)<0.000001) 
399                                                                           {
400                                                                            if((y2<max21&&y2>min21)||Math.abs(y2-max21)<0.000001||Math.abs(y2-min21)<0.000001)
401                                                                                                            {
402                                                                                              count2++;
403                                                                                              jd[n]=x2;
404                                                                                               n++;
405                                                                                               jd[n]=y2;
406                                                                                               n++;
407                                                                                                                }
408                                                                           } 
409                                                                                                                         
410                                             if(b[2]!=b[0]&&b[6]!=b[8])
411                                            {
412                                              A1=b[1]-b[3];
413                                                B1=b[2]-b[0];
414                                                C1=(b[3]-b[1])*b[0]-(b[2]-b[0])*b[1];
415                                                 /* A2=b[5]-b[7];
416                                                B2=b[6]-b[4];
417                                                C2=(b[7]-b[5])*b[4]-(b[6]-b[4])*b[5];*/
418                                                  /* A3=b[5]-b[9];
419                                                B3=b[8]-b[4];
420                                                C3=(b[9]-b[5])*b[4]-(b[8]-b[4])*b[5];*/
421                                                    A4=b[7]-b[9];
422                                                B4=b[8]-b[6];
423                                                C4=(b[9]-b[7])*b[6]-(b[8]-b[6])*b[7];
424                                               // x1=(B1*C2-B2*C1)/(A1*B2-A2*B1);
425                                               // y1=(A1*C2-A2*C1)/(B1*A2-B2*A1);
426                                                  // x2=(B1*C3-B3*C1)/(A1*B3-A3*B1);
427                                                //y2=(A1*C3-A3*C1)/(B1*A3-B3*A1);
428                                                   x3=(B1*C4-B4*C1)/(A1*B4-A4*B1);
429                                                y3=(A1*C4-A4*C1)/(B1*A4-B4*A1);
430                                                
431                                            }
432                                          else if(b[2]!=b[0]&&b[6]==b[8])
433                                          {
434                                              x3=b[6];
435                                              y3=b[1]+((b[6]-b[0])*(b[3]-b[1])/(b[2]-b[0]));
436                                          }
437                                          else if(b[2]==b[0]&&b[6]!=b[8])
438                                          {
439                                              x3=b[0];
440                                              y3=b[7]+((b[0]-b[6])*(b[9]-b[7])/(b[8]-b[6]));
441                                          }
442                                          double max111,min111,max211,min211;
443                                          if(b[6]>b[8])
444                                          {
445                                              max111=b[6];
446                                              min111=b[8];
447                                          }
448                                          else
449                                          {
450                                              max111=b[8];
451                                              min111=b[6];  
452                                          }
453                                                   if(b[7]>b[9])
454                                          {
455                                              max211=b[7];
456                                              min211=b[9];
457                                          }
458                                          else
459                                          {
460                                              max211=b[9];
461                                              min211=b[7];  
462                                          }
463                                           if((x3<max111&&x3>min111)||Math.abs(x3-max111)<0.000001||Math.abs(x3-min111)<0.000001) 
464                                                                           {
465                                                                            if((y3<max211&&y3>min211)||Math.abs(y3-max211)<0.000001||Math.abs(y3-min211)<0.000001)
466                                                                                                            {
467                                                                                count3++;
468                                                                                              jd[n]=x3;
469                                                                                               n++;
470                                                                                               jd[n]=y3;
471                                                                                               n++;
472                                                                                                                }
473                                                                            
474                                                                           }                                                                    
475                                          count=count1+count2+count3;
476                                         // if(count<2)
477                                           System.out.print(1);
478                                          
479                                        //  else
480                                         // {
481                                          //    System.out.print(count1+" "+count2+" "+count3); 
482                                         // }
483                                      }
484                                  }
485                  
486                                      
487                              }
488                         }
489                         
490                         if(s1.charAt(0)=='5')
491                         {
492                             String s2=s1.substring(2);
493                             String s3=s2.replace(","," ");
494                            String[]s4=s3.split(" ");
495                            if(s4.length!=8)
496                            System.out.println("wrong number of points");
497                            else
498                            {
499                               double b1[]=new double[10];
500                                for(j=0;j<8;j++)
501                                   
502                                   b1[j]=Double.parseDouble(s4[j]);
503                                 double a=Math.sqrt((b1[7]-b1[3])*(b1[7]-b1[3])+(b1[6]-b1[2])*(b1[6]-b1[2]));
504                                 double d=Math.sqrt((b1[7]-b1[5])*(b1[7]-b1[5])+(b1[6]-b1[4])*(b1[6]-b1[4]));
505                                 double c=Math.sqrt((b1[5]-b1[3])*(b1[5]-b1[3])+(b1[4]-b1[2])*(b1[4]-b1[2]));
506                                 if(!((a+d>c&&Math.abs(a-d)<c)||(a+c>d&&Math.abs(a-c)<d)||(c+d>a&&Math.abs(c-d)<a)))
507                                     System.out.println("data error"); 
508                                else
509                                {
510                                    double s=0,s7=0,s5=0,s6=0,s8;
511                                    s=(b1[2]*b1[5]-b1[2]*b1[7]+b1[4]*b1[7]-b1[4]*b1[3]+b1[6]*b1[3]-b1[4]*b1[5]);
512                                    s7=(b1[0]*b1[3]-b1[0]*b1[5]+b1[2]*b1[5]-b1[2]*b1[1]+b1[4]*b1[1]-b1[3]*b1[2]);
513                                    s5=(b1[0]*b1[3]-b1[0]*b1[7]+b1[2]*b1[7]-b1[2]*b1[1]+b1[6]*b1[1]-b1[3]*b1[2]);
514                                    s6=(b1[0]*b1[7]-b1[0]*b1[5]+b1[6]*b1[5]-b1[6]*b1[1]+b1[4]*b1[1]-b1[7]*b1[6]);
515                                    s8=s5+s6+s7;
516                                    //if(s==s8)
517                                     //System.out.println("in the triangle");
518                                   if(s7==0||s5==0||s6==0)
519                                  System.out.println("on the triangle");
520                                   else
521                                   {
522                                    if(s>s7+s5+s6)
523                                     System.out.println("outof the triangle");
524                                    else
525                                      System.out.println("in the triangle");  
526                                   }
527                                }
528                            }
529                         }
530                     }
531             }
532     }
533         }
534 } 

 

踩坑心得:这道题是本次大作业失分最严重的一道题。首先是对于错误输入情况的判断,在沿用了上一道题的代码并加上了一些后仍有测试点过不了。这道题需要输出的数据若小数点后

超过六位,只保留小数点后六位,多余部分采用四舍五入规则进到最低位。小数点后若不足六位,按原位显示,不必补齐。这一要求开始挺困扰我的。后来去网上学了一下后,使用以下

代码才得以解决。对于前三个测试点题目相对较容易理解,但总有一两个测试点过不了。后两个测试点相对较难理解,特别是第四个测试点,在用我自己的理解写好代码后仍然过不了。

                                      if((C*1e6)%10!=0)
                                      System.out.print(String.format("%.6f",C)+" ");
                                      else
                                          System.out.print(C+" ");

改进建议:由生成的圈复杂图可知,本道题的复杂度非常高,而且需要重复写的代码非常多,由此可见类的重要性。所以下次写此类题目我会采用类写。还有通过这道题不理想的得分,

我觉得自己还应该加强Java的相关学习,平时可以多听听网课,写写代码,争取在下一次作业拿一个较理想的分。

总结:通过这道题,我学会了控制小数点后几位的操作,这对于我以后写题目很有帮助。还有就是加深了对正则表达式的学习。当然也暴露出很多不足,对于一些较复杂的问题,没有

办法很好的解决,考虑问题有时候会不全面,导致每个点都有过不了的测试点。

三.总结

综合来看,这三次大作业难度最大的是第三次大作业,而第三次大作业难度最大的又是第三题,这也是所有题目中得分最低的题目。今后应多尝试写这种情况复杂,需要多重考虑的题目。

还有一个问题就是所有题目复杂度都偏高,我觉得要解决这个问题除了把一个类拆分成多个类,把一个方法拆分成多个方法,还可以下意识的减少if-else的使用。

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2022-10-02 15:22  SiSi~  阅读(380)  评论(1)    收藏  举报