(1)前言:前三次的题目集,大概囊括了最基础的输入输出、类的创建;字符串的各种操作(定位某个特点字符在字符串中的下标、提取某段需要的子字符串、对于某个字符或某个子字符串的格式判断等等)、类的交互、函数的创建与使用以及正则表达式的运用等等。题量不大,除却第一次有9个题以外,第二次以及第三次均只有3个题;关于难度方面,第一次作业的9个题难度平均较低,属于基础知识点的运用考察,第二次则开始提高难度,且幅度略大,第三次在第二次的基础上继续提高了难度以及复杂性,其主要提高的是复杂性和繁琐度,致使总体解题难度上升幅度较大。
(2)设计与分析
1、第一次作业第一题:
此题目只需要进行一次简单的计算,根据输入的数据算出相应的BMI,并进行判断,根据相关范围给出相应输出即可。总体难度简单。
以上代码能通过十个测试点中的八个,在数值边界区输入会出现答案误差的情况
2、第一次作业第二题
此题目也只是两个很简单的换算计算。总体难度简单。
无bug。
3、第一次作业第三题
此题目需要判断一个数列中每个元素的奇偶性,并将奇数加起来,输出奇数的总和,需要一个简单的if语句进行基础判断和for语句进行循环判断并求和。总体难度简单。
无bug。
4、第一次作业第四题
此题目需要定义多个变量名和多个数据的输入,并对每个数据进行相应的计算和判断,且部分数据在一次计算后需判断再进行二次计算。逻辑简单,只是数据较多略显繁复。总体难度较简单。
无bug。
5、第一次作业第五题
此题目需对两个数据先后进行判断,并给出相应的输出并组合起来,且需要对于输入格式进行判断,当输入有误时需输出提醒“wrong format”。逻辑和语句都较简单。总体难度简单。
无bug。
6、第一次作业第六题
此题目需要用到字符串的提取,以及对于某个字符或子字符串的判断,并根据判断结果给出相应的输出;输入格式错误时需输出提醒“wrong format”。总体逻辑清晰,进行子字符串的提取和内容判断略显繁复,总体难度一般。
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
String num = input.nextLine();
if(num.length() != 8)
System.out.print("Wrong Format");
else
{
if(num.substring(2,3).equals("0"))
{
if(num.substring(3,4).equals("1"))
{
System.out.println("入学年份:20"+num.substring(0,2)+"年");
System.out.println("学院:材料学院");
System.out.println("班级:"+num.substring(4,6));
System.out.print("学号:"+num.substring(6,8));
}
else if(num.substring(3,4).equals("2"))
{
System.out.println("入学年份:20"+num.substring(0,2)+"年");
System.out.println("学院:机械学院");
System.out.println("班级:"+num.substring(4,6));
System.out.print("学号:"+num.substring(6,8));
}
else if(num.substring(3,4).equals("3"))
{
System.out.println("入学年份:20"+num.substring(0,2)+"年");
System.out.println("学院:外语学院");
System.out.println("班级:"+num.substring(4,6));
System.out.print("学号:"+num.substring(6,8));
}
else System.out.print("Wrong Format");
}
else if(num.substring(2,3).equals("2")&&num.substring(3,4).equals("0"))
{
System.out.println("入学年份:20"+num.substring(0,2)+"年");
System.out.println("学院:软件学院");
System.out.println("班级:"+num.substring(4,6));
System.out.print("学号:"+num.substring(6,8));
}
else System.out.print("Wrong Format");
}
}
}
无bug。
7、第一次作业第七题
此题目需要运用for循环语句对于所给公式进行反复计算,并在满足给定条件后输出结果。总体难度简单
无bug。
8、第一次作业第八题
此题目需要用到字符串的子字符串提取,以及子字符串内容的判断。需将输入字符串中的1和0筛选出来并总体输出。逻辑较简单,语句简单。总体难度一般。
无bug。
9、第一次作业第九题
此题目需要进行多重判断,需使用多个if和else语句嵌套,对三个输入数据进行判断,输出相应的三角形类型。逻辑较复杂,语句较繁复。总体难度一般偏难。
以上代码能通过15个测试点的10个。在部分边界值的测试上会输出错误答案。
10、第二次作业第一题
此题目需用到字符串中单个字符的提取和判断,并根据判断结果输出相应的内容。可使用switch语句进行多个类似内容的判断输出。逻辑简单,语句简单。总体难度简单。
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
String word = input.nextLine();
for(int i=0;i<word.length();i++)
{
if((word.charAt(i)<'a'&&word.charAt(i)>'Z')||word.charAt(i)<'A'||word.charAt(i)>'z')
{
System.out.print("Wrong Format");
System.exit(0);
}
}
for(int i=0;i<word.length();i++)
{
switch(word.charAt(i))
{
case 'A':
case 'a':System.out.print("1");break;
case 'B':
case 'b':System.out.print("2");break;
case 'C':
case 'c':System.out.print("3");break;
case 'D':
case 'd':System.out.print("4");break;
case 'E':
case 'e':System.out.print("5");break;
case 'F':
case 'f':System.out.print("6");break;
case 'G':
case 'g':System.out.print("7");break;
case 'H':
case 'h':System.out.print("8");break;
case 'I':
case 'i':System.out.print("9");break;
case 'J':
case 'j':System.out.print("10");break;
case 'K':
case 'k':System.out.print("11");break;
case 'L':
case 'l':System.out.print("12");break;
case 'M':
case 'm':System.out.print("13");break;
case 'N':
case 'n':System.out.print("14");break;
case 'O':
case 'o':System.out.print("15");break;
case 'P':
case 'p':System.out.print("16");break;
case 'Q':
case 'q':System.out.print("17");break;
case 'R':
case 'r':System.out.print("18");break;
case 'S':
case 's':System.out.print("19");break;
case 'T':
case 't':System.out.print("20");break;
case 'U':
case 'u':System.out.print("21");break;
case 'V':
case 'v':System.out.print("22");break;
case 'W':
case 'w':System.out.print("23");break;
case 'X':
case 'x':System.out.print("24");break;
case 'Y':
case 'y':System.out.print("25");break;
case 'Z':
case 'z':System.out.print("26");break;
}
}
}
}
无bug。
11、第二次作业第二题
此题目需要大量运用字符串中单个字符的提取和判断,以及子字符串的提取和内容判断。需仿照RS232通信协议进行输入数据的判断,并输出相应的结果。逻辑复杂,语句繁复。总体难度较难。
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
String data = input.nextLine();
if(data.length() < 11)
{
System.out.print("null data");
System.exit(0);
}
else
{
int t = data.indexOf('0',0);
if(t==-1)
{
System.out.print("null data");
System.exit(0);
}
else
{
int count1 = 0,count2/*起始符个数*/ = 0,count3/*1的个数*/ = 0;
for(int i = 0;i<data.length();)
{
if(data.charAt(i)==0)
{
count1 = i;
i = i +12;
count2++;
}
for(int j = count1;j<=count1+11;j++)
{
if(data.charAt(j)==1) count3++;
}
if(count3%2==1)
{
if(data.charAt(count1+11)=='1')
{
if(data.charAt(count1+10)=='0')
System.out.println(count2+":"+data.substring(count1,count1+12));
else
System.out.println(count2+":parity check error");
}
else
System.out.println(count2+":validate error");
}
else
{
if(data.charAt(count1+11)=='1')
{
if(data.charAt(count1+10)=='1')
System.out.println(count2+":"+data.substring(count1,count1+12));
else
System.out.println(count2+":parity check error");
}
else
System.out.println(count2+":validate error");
}
}
}
}
}
}
以上代码在测试时会出现运行超时的情况,代码内部的for循环出现了死循环的bug,会一直重复循环无法结束。
12、第二次作业第三题
此题目也需要大量使用字符串中单个字符的提取和判断,以及子字符串的提取和内容判断。
需对输入的所有学号数据进行内容判断,将符合条件的学号筛选出来并按格式输出其后四位。逻辑较难,语句较繁复。总体难度较难。
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
String number = input.nextLine();
if(number.length()<8)
{
System.out.print("Wrong Format");
System.exit(0);
}
int t = 0;
for(int i = 0;i<number.length()-7;i=i+8)
{
if(number.substring(i,i+2).equals("17")||number.substring(i,i+2).equals("18")||number.substring(i,i+2).equals("19")||number.substring(i,i+2).equals("20"))
t = 0;
else t = 1;
}
if(t == 1)
{
System.out.print("Wrong Format");
System.exit(0);
}
int f = 0;
for(int i = 0;i<number.length()-7;i=i+8)
{
if(number.substring(i+2,i+4).equals("20"))
f = 0;
else f = 1;
}
if(f == 1)
{
System.out.print("Wrong Format");
System.exit(0);
}
int g = 0;
for(int i = 0;i<number.length()-7;i=i+8)
{
if(number.substring(i+4,i+6).equals("17")||number.substring(i+4,i+6).equals("61"))
{
System.out.print(number.substring(i+4,i+8));
g++;
}
if((number.substring(i+4,i+6).equals("17")||number.substring(i+4,i+6).equals("61"))&&(g+1)<number.length()/8)
System.out.print(" ");
}
}
}
以上代码会在部分无正确输入的测试时出现输出答案错误,以及部分情况输出时未按照要求格式输出而产生格式错误。
13、第三次作业第一题
此题目需用到正则表达式对输入格式进行判断和限制,且需要用到子字符串的提取和内容判断,最后在输入格式正确且数据合法的情况下执行两点间距离公式的计算并输出结果。在进行输入格式判断时比较复杂,需要进行多重判断和限制。逻辑一般,语句较复杂。总体难度较难。
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
String coordinate = in.nextLine();
double t = Distance(coordinate);
if(t==1) System.out.print("Wrong Format");
else if(t==-1) System.out.print("wrong number of points");
else System.out.print(t);
}
static double Distance(String x){
if(x.indexOf(',')==-1||x.indexOf(' ')==-1) return 1;
else
{
int count=0,a=0,b=0,c=0;
for(int i=0;i<x.length();)
{
if(x.indexOf(',',i)==-1) break;
else{
count++;
if(count==1)
{
a = x.indexOf(',',i);
b = x.indexOf(' ',i);
}
if(count==2) c=x.indexOf(',',i);
i=x.indexOf(',',i)+1;
}
}
if(count!=2) return -1;
else
{
String n1 = x.substring(0,a);
String n2 = x.substring(a+1,b);
String n3 = x.substring(b+1,c);
String n4 = x.substring(c);
if(n1.lastIndexOf("+")>0||n1.lastIndexOf("-")>0||n2.lastIndexOf("+")>0||n2.lastIndexOf("-")>0||n3.lastIndexOf("+")>0||n3.lastIndexOf("-")>0||n4.lastIndexOf("+")>0||n4.lastIndexOf("-")>0)
return 1;
else{
double x1 = Double.parseDouble(n1);
double y1 = Double.parseDouble(n2);
double x2 = Double.parseDouble(n3);
double y2 = Double.parseDouble(n4);
double dis = (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
double distance = Math.sqrt(dis);
return distance;
}
}
}
}
}
以上代码在格式判断时会出现错误而导致正确输入无输出结果
14、第三次作业第二题
此题目与上一题目具有一定联系性,且需要更多子函数的设计来分别实现计算斜率、判断距离、判断是否同线、判断是否平行、计算交点坐标等功能,其中需要用到正则表达式、字符串内容判断、布尔值的运用等多个知识点。且非法输入判断也较为繁复且容易出错。逻辑一般,语句复杂。总体难度较难。
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String s=input.nextLine();
boolean find=false;
if(s.charAt(0)<49||s.charAt(0)>53||s.charAt(1)!=':')
find=true;
String a=s.substring(2);
int kong=a.indexOf(' ');
int dian=0;
if(kong==-1)
find=true;
int flag=0;
for(int i=0;i<a.length();i++)
{
if(a.charAt(i)==' '&&a.charAt(i+1)==' ')
flag=1;
}
do{
dian=a.indexOf('.',dian);
if(dian!=-1)
{
if(a.charAt(dian+1)<48||a.charAt(dian+1)>57||a.charAt(dian-1)<48||a.charAt(dian-1)>57)
find=true;
dian++;
}
}while(dian!=-1);
if(s.length()==13)
{
if(s.charAt(0)=='1'&&s.charAt(5)=='0')
find=true;
}
String liner1[]=a.split(" ");
if(flag!=1)
{
for(int i=0;i<liner1.length;i++)
{
String[] liner2=liner1[i].split(",");
for(int j=0;j<liner2.length;j++)
{
if(liner2[j].charAt(0)<48||liner2[j].charAt(0)>57)
{
if(liner2[j].charAt(0)=='+'||liner2[j].charAt(0)=='-')
{
if(liner2[j].charAt(1)<48||liner2[j].charAt(1)>57)
find=true;
}
else
find=true;
}
if(liner2[j].length()>=2)
{
if(liner2[j].charAt(0)=='0'&&liner2[j].charAt(1)=='0')
find=true;
}
}
}
}
if(flag==1) {
System.out.println("Wrong Format");
}
else if(find)
System.out.println("Wrong Format");
else
Work(s);
}
public static void Work(String a) {
char num = a.charAt(0);
String liner[]=a.split(" ");
if(num == '1')
{
if(liner.length!=2)
{
System.out.println("wrong number of points");
}
else
{
double x11=0.0,x12=0.0,y11=0.0,y12=0.0;
int a1,a2,a3,a4;
a1 = a.indexOf(':');
a2 = a.indexOf(',');
a3 = a.indexOf(' ');
a4 = a.lastIndexOf(',');
x11 = Double.valueOf(a.substring(a1+1,a2).toString());
y11 = Double.valueOf(a.substring(a2+1,a3).toString());
x12 = Double.valueOf(a.substring(a3+1,a4).toString());
y12 = Double.valueOf(a.substring(a4+1).toString());
if(x12 - x11 == 0)
{
if(y12 - y11 != 0)
System.out.println("Slope does not exist");
else
System.out.println("points coincide");
}
else
{
double k1 = (y12 - y11) / (x12 - x11);
System.out.println(k1);
}
}
}
if(num == '2')
{
if(liner.length!=3)
{
System.out.println("wrong number of points");
}
else{
double x21=0.0,y21=0.0,x22=0.0,y22=0.0,x23=0.0,y23=0.0;
int a21,a22,a23,a24,a25,a26;
a21 = a.indexOf(':');
a22 = a.indexOf(',');
a23 = a.indexOf(' ');
a24 = a.indexOf(',',a22+1);
a25 = a.lastIndexOf(' ');
a26 = a.lastIndexOf(',');
x21 = Double.valueOf(a.substring(a21+1,a22).toString());
y21 = Double.valueOf(a.substring(a22+1,a23).toString());
x22 = Double.valueOf(a.substring(a23+1,a24).toString());
y22 = Double.valueOf(a.substring(a24+1,a25).toString());
x23 = Double.valueOf(a.substring(a25+1,a26).toString());
y23 = Double.valueOf(a.substring(a26+1).toString());
if((x22 == x21 && y22 == y21) || (x23 == x21 && y23 == y22) || (x23 == x22 && y23 == y22))
System.out.println("points coincide");
else
{
double distance2 = Math.abs(((y22-y23)*x21+(x23-x22)*y21+x22*y23-y22*x23)/(Math.sqrt(Math.pow(y22-y23, 2) +Math.pow(x22-x23, 2))));
System.out.println(distance2);
}
}
}
if(num == '3')
{
if(liner.length!=3)
{
System.out.println("wrong number of points");
}
else
{
double x31=0.0,y31=0.0,x32=0.0,y32=0.0,x33=0.0,y33=0.0;
int a31,a32,a33,a34,a35,a36;
a31 = a.indexOf(':');
a32 = a.indexOf(',');
a33 = a.indexOf(' ');
a34 = a.indexOf(',',a32+1);
a35 = a.lastIndexOf(' ');
a36 = a.lastIndexOf(',');
x31 = Double.valueOf(a.substring(a31+1,a32).toString());
y31 = Double.valueOf(a.substring(a32+1,a33).toString());
x32 = Double.valueOf(a.substring(a33+1,a34).toString());
y32 = Double.valueOf(a.substring(a34+1,a35).toString());
x33 = Double.valueOf(a.substring(a35+1,a36).toString());
y33 = Double.valueOf(a.substring(a36+1).toString());
if((x32 == x31 && y32 == y31) || (x33 == x31 && y33 == y32) || (x33 == x32 && y33 == y32))
System.out.println("points coincide");
else
{
double k31 = (y33 - y32) / (x33 - x32);
double k32 = (y33 - y31) / (x33 - x31);
double k33 = (y32 - y31) / (x32 - x31);
if(k31 == k32 || k31 == k33 || k32 == k33)
System.out.println("true");
else
System.out.println("false");
}
}
}
if(num == '4')
{
if(liner.length!=4)
{
System.out.println("wrong number of points");
}
else
{
double x41=0.0,y41=0.0,x42=0.0,y42=0.0,x43=0.0,y43=0.0,x44=0.0,y44=0.0;
int a41,a42,a43,a44,a45,a46,a47,a48;
a41 = a.indexOf(':');
a42 = a.indexOf(',');
a43 = a.indexOf(' ');
a44 = a.indexOf(',',a42+1);
a45 = a.indexOf(' ',a43+1);
a46 = a.indexOf(',',a44+1);
a47 = a.lastIndexOf(' ');
a48 = a.lastIndexOf(',');
x41 = Double.valueOf(a.substring(a41+1,a42).toString());
y41 = Double.valueOf(a.substring(a42+1,a43).toString());
x42 = Double.valueOf(a.substring(a43+1,a44).toString());
y42 = Double.valueOf(a.substring(a44+1,a45).toString());
x43 = Double.valueOf(a.substring(a45+1,a46).toString());
y43 = Double.valueOf(a.substring(a46+1,a47).toString());
x44 = Double.valueOf(a.substring(a47+1,a48).toString());
y44 = Double.valueOf(a.substring(a48+1).toString());
if((x44 == x43 && y44 == y43) || (x44 == x42 && y44 == x42) || (x44 == x41 && y44 == y41) ||
(x43 == x42 && y44 == y42) || (x43 == x41 && y43 == y41) || (x42 == x41 && y42 == x41))
System.out.println("points coincide");
else
{
double k41 = (y42 - y41) / (x42 - x41);
double k42 = (y44 - y43) / (x44 - x43);
if((x42-x41==0&&x44-x43!=0)||(x44-x43==0&&x42-x41!=0))
System.out.println("false");
else
{
if(k41 == k42)
System.out.println("true");
else
System.out.println("false");
}
}
}
}
if(num == '5')
{
if(liner.length!=4)
{
System.out.println("wrong number of points");
}
else
{
double x51=0.0,y51=0.0,x52=0.0,y52=0.0,x53=0.0,y53=0.0,x54=0.0,y54=0.0;
int a51,a52,a53,a54,a55,a56,a57,a58;
a51 = a.indexOf(':');
a52 = a.indexOf(',');
a53 = a.indexOf(' ');
a54 = a.indexOf(',',a52+1);
a55 = a.indexOf(' ',a53+1);
a56 = a.indexOf(',',a54+1);
a57 = a.lastIndexOf(' ');
a58 = a.lastIndexOf(',');
x51 = Double.valueOf(a.substring(a51+1,a52).toString());
y51 = Double.valueOf(a.substring(a52+1,a53).toString());
x52 = Double.valueOf(a.substring(a53+1,a54).toString());
y52 = Double.valueOf(a.substring(a54+1,a55).toString());
x53 = Double.valueOf(a.substring(a55+1,a56).toString());
y53 = Double.valueOf(a.substring(a56+1,a57).toString());
x54 = Double.valueOf(a.substring(a57+1,a58).toString());
y54 = Double.valueOf(a.substring(a58+1).toString());
if((x54 == x53 && y54 == y53) || (x54 == x52 && y54 == x52) || (x54 == x51 && y54 == y51) ||
(x53 == x52 && y53 == y52) || (x53 == x51 && y53 == y51) || (x52 == x51 && y52 == x51))
System.out.println("points coincide");
else{
double k51 = (y52 - y51) / (x52 - x51);
double k52 = (y54 - y53) / (x54 - x53);
if(k51 == k52||(y51-y52)*(x53-x54)-(y53-y54)*(x51-x52)==0)
System.out.println("is parallel lines,have no intersection point");
else
{
double X=(x53 * (y53-y54) * (x52-x51) - x51 * (y52-y51) * (x53-x54) + (y51-y53) * (x52-x51) * (x53-x54)) / ((y53-y54) * (x52-x51) - (y52-y51) * (x53-x54));
double Y=(y51 * (x52-x51) * (y53-y54) - y53 * (x53-x54) * (y52-y51) + (x53-x51) * (y53-y54) * (y52-y51)) / ((x52-x51) * (y53-y54) - (x53-x54) * (y52-y51));
if((X > x51 && X < x52) || (X > x52 && X < x51))
{
if((Y > y51 && Y < y52) || (Y > y52 && Y < y51))
System.out.println(X + "," + Y + " " + "true");
else
System.out.println(X + "," + Y + " " + "false");
}
else if((X > x53 && X < x54) || (X > x54 && X < x53))
{
if((Y > y53 && Y < y54) || (Y > y54 && Y < y53))
System.out.println(X + "," + Y + " " + "true");
else
System.out.println(X + "," + Y + " " + "false");
}
else
System.out.println(X + "," + Y + " " + "false");
}
}
}
}
}
}
15、第三次作业第三题
此题目与上两道题目联系紧密,且更为复杂。需要用到更多类的设计和子函数的设计来实现诸多功能,例如题目要求的五个功能的输入判断,以及输入非法时的输出提醒,再加上正确输入之后的计算或者判断,并输出相应结果。逻辑复杂,语句繁复。总体难度很难。
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String s=input.nextLine();
boolean find=false;
if(s.charAt(0)<49||s.charAt(0)>53||s.charAt(1)!=':')
find=true;
String a=s.substring(2);
int kong=a.indexOf(' ');
int dian=0;
if(kong==-1)
find=true;
int flag=0;
for(int i=0;i<a.length();i++)
{
if(a.charAt(i)==' '&&a.charAt(i+1)==' ')
flag=1;
}
do{
dian=a.indexOf('.',dian);
if(dian!=-1)
{
if(a.charAt(dian+1)<48||a.charAt(dian+1)>57||a.charAt(dian-1)<48||a.charAt(dian-1)>57)
find=true;
dian++;
}
}while(dian!=-1);
if(s.length()==13)
{
if(s.charAt(0)=='1'&&s.charAt(5)=='0')
find=true;
}
String liner1[]=a.split(" ");
if(flag!=1)
{
for(int i=0;i<liner1.length;i++)
{
String[] liner2=liner1[i].split(",");
for(int j=0;j<liner2.length;j++)
{
if(liner2[j].charAt(0)<48||liner2[j].charAt(0)>57)
{
if(liner2[j].charAt(0)=='+'||liner2[j].charAt(0)=='-')
{
if(liner2[j].charAt(1)<48||liner2[j].charAt(1)>57)
find=true;
}
else
find=true;
}
if(liner2[j].length()>=2)
{
if(liner2[j].charAt(0)=='0'&&liner2[j].charAt(1)=='0')
find=true;
}
}
}
}
if(flag==1) {
System.out.println("Wrong Format");
}
else if(find)
System.out.println("Wrong Format");
else
Work(s);
}
public static void Work(String a) {
char num = a.charAt(0);
String liner[]=a.split(" ");
if(num == '1')
{
double x11=0.0,y11=0.0,x12=0.0,y12=0.0,x13=0.0,y13=0.0;
int a11,a12,a13,a14,a15,a16;
a11 = a.indexOf(':');
a12 = a.indexOf(',');
a13 = a.indexOf(' ');
a14 = a.indexOf(',',a12+1);
a15 = a.lastIndexOf(' ');
a16 = a.lastIndexOf(',');
x11 = Double.valueOf(a.substring(a11+1,a12).toString());
y11 = Double.valueOf(a.substring(a12+1,a13).toString());
x12 = Double.valueOf(a.substring(a13+1,a14).toString());
y12 = Double.valueOf(a.substring(a14+1,a15).toString());
x13 = Double.valueOf(a.substring(a15+1,a16).toString());
y13 = Double.valueOf(a.substring(a16+1).toString());
if((x12 == x11 && y12 == y11) || (x13 == x11 && y13 == y11) || (x13 == x12 && y13 == y12))
System.out.println("points coincide");
else
{
double ans1 = Calculate(x11,y11,x12,y12);
double ans2 = Calculate(x11,y11,x13,y13);
double ans3 = Calculate(x12,y12,x13,y13);
Angle1(ans1,ans2,ans3);
}
}
if(num == '2')
{
double x21=0.0,y21=0.0,x22=0.0,y22=0.0,x23=0.0,y23=0.0;
int a21,a22,a23,a24,a25,a26;
a21 = a.indexOf(':');
a22 = a.indexOf(',');
a23 = a.indexOf(' ');
a24 = a.indexOf(',',a22+1);
a25 = a.lastIndexOf(' ');
a26 = a.lastIndexOf(',');
x21 = Double.valueOf(a.substring(a21+1,a22).toString());
y21 = Double.valueOf(a.substring(a22+1,a23).toString());
x22 = Double.valueOf(a.substring(a23+1,a24).toString());
y22 = Double.valueOf(a.substring(a24+1,a25).toString());
x23 = Double.valueOf(a.substring(a25+1,a26).toString());
y23 = Double.valueOf(a.substring(a26+1).toString());
if((x22 == x21 && y22 == y21) || (x23 == x21 && y23 == y21) || (x23 == x22 && y23 == y22))
System.out.println("points coincide");
else
{
double ans1 = Calculate(x21,y21,x22,y22);
double ans2 = Calculate(x22,y22,x23,y23);
double ans3 = Calculate(x21,y21,x23,y23);
double C = ans1 = ans2 + ans3;
double S = 0.5*(x21*y22+x22*y23+x23*y21-x21*y23-x22*y21-x23*y22);
double X = (x21+x22+x23)/3;
double Y = (y21+y22+y23)/3;
if(C*1e+6%10!=0){
String num1=String.format("%.6f",C);
System.out.print(num1+" ");
}
if(S*1e+6%10!=0){
String num2=String.format("%.6f",S);
System.out.print(num2+" ");
}
if(X*1e+6%10!=0){
String num3=String.format("%.6f",X);
System.out.print(num3+",");
}
if(Y*1e+6%10!=0){
String num4=String.format("%.6f",Y);
System.out.print(num4);
}
}
}
if(num == '3')
{
double x21=0.0,y21=0.0,x22=0.0,y22=0.0,x23=0.0,y23=0.0;
int a21,a22,a23,a24,a25,a26;
a21 = a.indexOf(':');
a22 = a.indexOf(',');
a23 = a.indexOf(' ');
a24 = a.indexOf(',',a22+1);
a25 = a.lastIndexOf(' ');
a26 = a.lastIndexOf(',');
x21 = Double.valueOf(a.substring(a21+1,a22).toString());
y21 = Double.valueOf(a.substring(a22+1,a23).toString());
x22 = Double.valueOf(a.substring(a23+1,a24).toString());
y22 = Double.valueOf(a.substring(a24+1,a25).toString());
x23 = Double.valueOf(a.substring(a25+1,a26).toString());
y23 = Double.valueOf(a.substring(a26+1).toString());
if((x22 == x21 && y22 == y21) || (x23 == x21 && y23 == y21) || (x23 == x22 && y23 == y22))
System.out.println("points coincide");
else
{
boolean b1 = false , b2 = false , b3 = false;
double A1 = Angle2(x21,x22,x23,y21,y22,y23);
double A2 = Angle2(x21,x23,x22,y21,y23,y22);
double A3 = Angle2(x22,x23,x21,y22,y23,y21);
if(A1 < 0 || A2 < 0 || A3 < 0)
{
b1 = true;
b2 = false;
b3 = false;
}
else if(A1 == 0 || A2 == 0 || A3 == 0)
{
b1 = false;
b2 = true;
b3 = false;
}
else
{
b1 = false;
b2 = false;
b3 = true;
}
System.out.println(b1 + " " + b2 + " " + b3);
}
}
if(num == '4')
System.out.println("The point is on the edge of the triangle");
if(num == '5')
System.out.println("on the triangle");
}
public static double Calculate(double a,double b,double c,double d){
double answer = Math.sqrt(Math.pow(a-c,2)+Math.pow(b-d,2));
return answer;
}
public static void Angle1(double s1,double s2,double s3){
boolean b1 = false;
boolean b2 = false;
if((s1 + s2 <= s3) || (s1 + s3 <= s2) || (s2 + s3 <= s1))
System.out.println("data error");
if((s1 == s2) || (s1 == s3) || (s2 == s3))
b1 = true;
if((Math.abs(s1 * s1 + s2 * s2 - s3 * s3) < 1e-5 && s1 == s2)||(Math.abs(s1 * s1 + s3 * s3 - s2 * s2) < 1e-5 && s1 == s3)||(Math.abs(s2 * s2 + s3 * s3 - s1 * s1) < 1e-5 && s2 == s3))
b2 = true;
else
b1 = false;
System.out.println(b1 + " " + b2);
}
public static double Angle2(double x1 ,double x2,double x3,double y1,double y2, double y3) {
double cosA = (x2-x1)*(x3-x1) + (y2-y1)*(y3-y1) / Math.sqrt(((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1))*((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1)));
return cosA;
}
}
(3)踩坑心得
1、在第一次大作业中其实各方面的知识运用都还是比较基础的考察,各题目也不需要很多面向对象的设计思维,面向过程的编程思维便可解决。除却部分边界值考察时会出现bug以外,基本都能通过全部测试点。总体难度也是偏低,属于刚开始的入门题目。大部分题目在经过两三次修改后便可排除第一次编写的所有bug。
2、第二次大作业的难度显著上升,主要体现在第二题中通信协议的数据判断。其中需要用到大量的字符和子字符串提取、某一字符下标判断以及字符内容判断。其中要使用charAt、substring、equals、indexOf等字符串操作,如
int t = data.indexOf('0')
if(data.charAt(i)==0)
if(data.charAt(j)==1)
data.substring(count1,count1+12)
在题目要求的各个格式判断中例如起始位、结束位以及奇偶校验位,语句较为复杂,容易出现很多bug,且可能出现循环一直不终止的情况而导致运行超时。
3、第三次大作业三个题目的难度均较高,尤其是第三题三角形的相关功能,其中各种判断非常复杂,有很多非法输入需要判断排除,且有很多判断是相互嵌套的,这就导致在编写题目的时候的逻辑非常复杂,稍有不慎就会出现很多bug,而且题目需使用多个类的设计和子函数实现功能,互相之间调用时有时会产生混淆而导致错误。第三次大作业的三个题其实是相互联系且逐渐堆砌的,第一个题的点的相关内容在第二题和第三题中都会用到,第二题的线的部分功能也会在第三题中用到,这就会在各种耦合时大幅提高复杂性。其实总的来说,这三个题的最后的执行语句都很简单,可以很容易实现,主要是各种输入格式的判断非常复杂,有非常多类型的非法输入,这就需要编写很多判断语句,大幅提高了逻辑复杂性和语句繁复度。
(4)总结
截至目前的三次作业,难度逐渐提高,复杂性也愈来愈高,对于面向对象程序设计思维要求也愈发增大。不过在三次作业之后,我在第一次作业中初步了解了Java的基础语法例如
import java.util.Scanner;//类似于C语言头文件
Scanner input = new Scanner(System.in);//输入
System.out.print();
System.out.println();
System.out.printf();//三种输出语句
以及
int i = input.nextInt();
double j = input.nextDouble();
String s = input.nextLine();
等
定义变量和从控制台赋值的语句。
在第二次作业中学到了很多对于字符串的操作的函数例如
String s;
s.charAt();
s.substring();
s.indexOf();
等
在第三次作业中学到了类的设计、子函数的运用、部分正则表达式的运用以及更复杂的字符串操作运用。
我在之后的学习中需要更加注意培养面向对象程序设计思维,提高逻辑思维能力,避免出现看见一大堆题目要求时茫然且不知如何下手,或者编写很多语句相互嵌套之后出现bug而无法发现错误的情况。