加载中...

第一次博客作业

一.前言

总结:

第一次大作业:一共9题,就是最基础的语法之类的简单运用,除了要了解代码的格式和输入输出的区别之外,其他的语法和C语言是基本相同的,所以不是太难。

第二次大作业:一共3题,这次大作业相比于第一次大作业难了一点,因为涉及到了Java中对方法的使用,这些是需要自己去看书或者上网去学会的,一开始不知道的话就会想到自己写,但是知道方法后就比较方便了,可以直接调用方法,省时又省力。

第三次大作业:这次也是3题,但从这次开始大作业难度就慢慢上来了,因为这次的大作业要求我们开始尝试用类,也就是面向对象的思路来写代码,而不是用C语言那种面向过程的写法。用C的思路写完全没问题,但是代码量就会很大。

二.设计与分析

第一次大作业:

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


代码:

import java.util.Scanner;
public class Main{
public static void main(String[] args){
double BMI;
Scanner sc = new Scanner(System.in);
double weight = sc.nextDouble();
double height = sc.nextDouble();

if((weight>0&&weight<=727)&&(height>0&&height<=2.72)){
BMI = weight/(height*height);
if(BMI<18.5)
System.out.println("thin");
else if(BMI>=18.5&&BMI<24)
System.out.println("fit");
else if(BMI>=24&&BMI<28)
System.out.println("overweight");
else if(BMI>=28)
System.out.println("fat");
}
else
System.out.println("input out of range");
}
}

题目分析:

输入的是两个double类型的数据,再用一个if-else嵌套就可以了

7-2 长度质量计量单位换算

长度、质量的计量有多重不同的计算体系,有标准的国际单位制:千克与米,也有各个国家自己的计量方法如:磅、英寸;1磅等于0.45359237千克,1英寸等于0.0254米,请编写程序实现国际单位制与英制之间的换算。

输入格式:

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

输出格式:

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

输入样例:

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

0.45359237 0.0254
 

输出样例:

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

1.0 1.0

代码:

import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
double quality1 = sc.nextDouble();//以KG为单位
double length1 = sc.nextDouble();//以米为单位
double quality2 = quality1/0.45359237;
double length2 = length1 /0.0254;
System.out.println((float)quality2 + " " + (float)length2);

}
}


题目分析:输入double类型,再计算输出即可。

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





代码:

import java.util.Scanner;//导包
public class Main{
public static void main(String[] args){
//创建对象
Scanner sc = new Scanner(System.in);
int i,a,sum = 0;
for(i = 0;i < 10;i++){
//接收数据
a = sc.nextInt();
if(a % 2 == 1 || a % 2 == -1)
sum += a;
}
System.out.println(sum);

}
}

题目分析:一个for循环,在判断是否是奇数,连加输出。

7-4 房产税费计算2022

房屋交易在日常生活中非常常见的事情,房屋交易时要额外支付各种税费,按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


代码:

import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int times = sc.nextInt();//第几次买房
int HousingPrice = sc.nextInt();//房价
int AppraisalPrice = sc.nextInt();//评估价
double area = sc.nextDouble();//房屋面积
//a:契税;b:印花税;c:交易费;d:测绘
double a = 0,b,c,d;
if(times == 1){
if(area<=90)
a = AppraisalPrice * 0.01 * 10000;
else if(area>90&&area<=144)
a = AppraisalPrice * 0.015 * 10000;
else if(area>144)
a = AppraisalPrice * 0.03 * 10000;
}
else
a = AppraisalPrice * 0.03 * 10000;
b = AppraisalPrice * 0.0005 * 10000;
c = area * 3;
d = area * 1.36;
System.out.println((float)a + " " + (float)b + " " + (float)c + " " +(float)d);

}
}

 

题目分析:

这题主要是变量有点多,不仔细看可能会搞错,还有就是变量的类型不能搞错了。

 

7-5 游戏角色选择

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

输入格式:

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

输出格式:

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

输入样例1:

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

1 2
 

输出样例1:

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

人类 法师
 

输入样例2:

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

1 6
 

输出样例2:

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

Wrong Format

代码:

import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int race = sc.nextInt();//race:种族
int role = sc.nextInt();//role:角色

switch(race){
case 1:switch(role){
case 1:System.out.println("人类 战士");
break;
case 2:System.out.println("人类 法师");
break;
case 3:System.out.println("人类 射手");
break;
default:System.out.println("Wrong Format");
break;}
break;
case 2:switch(role){
case 1:System.out.println("精灵 战士");
break;
case 2:System.out.println("精灵 法师");
break;
case 3:System.out.println("精灵 射手");
break;
default:System.out.println("Wrong Format");
break;}
break;
case 3:switch(role){
case 1:System.out.println("兽人 战士");
break;
case 2:System.out.println("兽人 法师");
break;
case 3:System.out.println("兽人 射手");
break;
default:System.out.println("Wrong Format");
break;}
break;
case 4:switch(role){
case 1:System.out.println("暗精灵 战士");
break;
case 2:System.out.println("暗精灵 法师");
break;
case 3:System.out.println("暗精灵 射手");
break;
default:System.out.println("Wrong Format");
break;}
break;
default:System.out.println("Wrong Format");
}
}

}


题目分析:一个switch直接搞定。

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


代码:

import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String a = sc.next(); //输入学号,字符串形式
String str = "";
//用length和substring方法分别计算字符串的长度和对字符串切片处理
if(a.length()!=8){
System.out.println("Wrong Format");
return;
}
else{
if(a.substring(2,4).equals("01"))//字符串比较不能用==判断是否相等
str = "材料学院";
else if(a.substring(2,4).equals("02"))
str = "机械学院";
else if(a.substring(2,4).equals("03"))
str = "外语学院";
else if(a.substring(2,4).equals("20"))
str = "软件学院";
else{
System.out.println("Wrong Format");
return;//这里必须要用return结束,不然会继续执行下面的输出
}
System.out.println("入学年份:20" + a.substring(0,2) + "年");
System.out.println("学院:" + str);
System.out.println("班级:" + a.substring(4,6));
System.out.println("学号:" + a.substring(6,8));
}



}
}

题目分析:这题就是substring方法和equals方法的使用。


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

代码:

import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
float n = sc.nextFloat();
float lastGuess = sc.nextFloat();
float nextGuess;
if(n<0||lastGuess<=0)
System.out.println("Wrong Format");
else{
nextGuess = (lastGuess+n/lastGuess)/2;
while((nextGuess-lastGuess)>=0.00001||(nextGuess-lastGuess)<=-0.00001){
lastGuess = nextGuess;
nextGuess = (lastGuess+n/lastGuess)/2;
}
System.out.println(lastGuess);
}

}
}

题目分析:直接按题目要求来,不需要用求平方根的方法。


7-9 二进制数值提取

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

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

输入格式:

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

输出格式:

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

输入样例:

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

abc00aj014421-1
 

输出样例:

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

00011
 

输入样例1:

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

a0571-1k001y
 

输出样例1:

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

01




代码:

import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String str =sc.nextLine();
String S = "";
int i;
for(i=0;i<str.length();i++){
if((str.charAt(i)=='0')||(str.charAt(i)=='1'))//charAt方法提取字符串的每一个元素,单个字符比较可以用==,字符串不能用==比较
S += str.charAt(i);
else if((str.charAt(i)=='-')&&(str.charAt(i+1)=='1')){
System.out.println(S);
return;
}

}
System.out.println("Wrong Format");
}
}

题目分析:输入要用String str =sc.nextLine(),有空格要识别。



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



代码:

import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
float a = sc.nextFloat();//输入三条边
float b = sc.nextFloat();
float c = sc.nextFloat();
if((a>200||a<1)||(b>200||b<1)||(c>200||c<1))//是否合法
System.out.println("Wrong Format");
else{
if((a+b)<=c||(a+c)<=b||(b+c)<=a)//是否能构成三角形
System.out.println("Not a triangle");
else{
if(a==b&&a==c&&b==c)//等边三角形
System.out.println("Equilateral triangle");
else if((a*a+b*b==c*c)||(a*a+c*c==b*b)||(b*b+c*c==a*a))//直角三角形
System.out.println("Right-angled triangle");
else if(a==b||a==c||b==c){//等腰三角形
//这个好像是精度的要求
if((a*a+b*b-c*c<0.001)||(a*a+c*c-b*b<0.001)||(b*b+c*c-a*a<0.001))//等腰直角三角形
System.out.println("Isosceles right-angled triangle");
else
System.out.println("Isosceles triangle");//等腰三角形
}
else
System.out.println("General triangle");
}
}
}
}


题目分析:if-else嵌套。
第二次大作业:
7-1 字母-数字转换
分数 11

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

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

输入格式:

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

输出格式:

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

输入样例:

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

AbbcD
 

输出样例:

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

12234
 

输入样例1:

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

AFOPI
 

输出样例1:

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

1615169
 

输入样例2:

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

c3u
 

输出样例2:

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

Wrong Format

代码:

import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String ch = sc.nextLine();//存放输入的字符串
for(int i = 0;i < ch.length();i++){
char c = ch.charAt(i);//从字符串中提取一个字符
//先判断是否合法,然后才能输出
if(c>='A'&&c<='Z')
continue;
else if(c>='a'&&c<='z')
continue;

else{
System.out.print("Wrong Format");
return;
}

}
for(int j = 0;j < ch.length();j++){
char d = ch.charAt(j);//从字符串中提取一个字符
if(d>='A'&&d<='Z')
System.out.print((int)d-64);
else if(d>='a'&&d<='z')
System.out.print((int)d-96);

}
}
}


题目分析:这题要先判断是否合法,然后才能输出。


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


代码:

import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
String str = input.next();
int count1 = 0,count2 = 0;
if(str.length()<11){
System.out.print("null data");
return;
}

for(int i=0;i<str.length();i++){
char c = str.charAt(i);
if(c == '1')
count1++;
if(count1 == str.length()){
System.out.print("null data");
return;
}

}
int t=0,num=1;//记录初始位
for(int i=0;i<str.length();i++){
char c = str.charAt(i);
if(c == '0'){
System.out.print(num+":");
num++;
t=i;
String S = str.substring(t+1,t+11);//截取第一个数据,10位,包含校验位和结束位
count2=0;
for(int j=0;j<S.length()-2;j++){
if(S.charAt(j)=='1'){
count2++;
}
}
if(S.charAt(9) != '1'){
System.out.println("validate error");
return;
}
else if(((count2%2==1)&&(S.charAt(8)=='1'))||((count2%2==0)&&(S.charAt(8)=='0'))){
System.out.println("parity check error");
return;
}
else if((S.charAt(9) != '1')&&(((count2%2==1)&&(S.charAt(8)=='1'))||((count2%2==0)&&(S.charAt(8)=='0')))){
System.out.println("validate error");
return;
}
else{
System.out.println(S.substring(0,8));
}
i +=10;
}
}
}
}

题目分析:一串数据输入,不断读取,有第一个0出现则第一个0之后的8位为有效数据,0后的第九位和第十位分别为校验位和结束位,要用奇校验。

 


 




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


代码:

import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
String str = input.nextLine();
for(int i=0;i<str.length();i++){
if((str.charAt(i)>='0')&&(str.charAt(i)<='9'))
continue;
else{
System.out.println("Wrong Format");
return;}

}
if(str.length()%8!=0){
System.out.println("Wrong Format");
return;
}
int j;
for(j=0;j<str.length();j+=8){
if((str.substring(j,j+6).equals("202017"))||(str.substring(j,j+6).equals("202061"))){
System.out.print(str.substring(j+4,j+8));
break;
}
}

for(int z=j+8;z<str.length();z+=8){
if((str.substring(z,z+6).equals("202017"))||(str.substring(z,z+6).equals("202061")))
System.out.print(" " + str.substring(z+4,z+8));

}

// System.out.println("Wrong Format");
}
}

题目分析:
先排除非法情况,然后再判断是否是指定的两个班的同学,是就输出相应的数据。

第三次大作业:

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



代码:

import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
String str = input.nextLine();
String []a = str.split(" ");//切分成单独两个点的字符串
// a = {"0,1","0,1"}
// String S1 ="[+-]?(([1-9]\\d*)|0|([1-9]\\d*\\.\\d*)|(0\\.\\d*[1-9]+\\d*)),[+-]?(([1-9]\\d*)|0|([1-9]\\d*\\.\\d*)|(0\\.\\d*[1-9]+\\d*)) [+-]?(([1-9]\\d*)|0|([1-9]\\d*\\.\\d*)|(0\\.\\d*[1-9]+\\d*)),[+-]?(([1-9]\\d*)|0|([1-9]\\d*\\.\\d*)|(0\\.\\d*[1-9]+\\d*))";
//String S2 ="([+-]?(([1-9]\\d*)|0|([1-9]\\d*\\.\\d*)|(0\\.\\d*[1-9]+\\d*)),[+-]?(([1-9]\\d*)|0|([1-9]\\d*\\.\\d*)|(0\\.\\d*[1-9]+\\d*)) ){2}[+-]?(([1-9]\\d*)|0|([1-9]\\d*\\.\\d*)|(0\\.\\d*[1-9]+\\d*)),[+-]?(([1-9]\\d*)|0|([1-9]\\d*\\.\\d*)|(0\\.\\d*[1-9]+\\d*))";
String S1 = "[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?),[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?) [+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?),[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)";
String S2 = "([+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?),[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?) ){2}[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?),[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)";
if(str.matches(S2)){
System.out.print("wrong number of points");
return;
}
else{ if(!str.matches(S1)){
System.out.print("Wrong Format");
return;
}

}

if(str.matches(S1)){
String []a1 = a[0].split(",");//把一个点的横坐标和纵坐标分开
//a1 = {"0","1"}
String []a2 = a[1].split(",");
//a2 = {"0","1"}
double x1 = Double.parseDouble(a1[0]);//将坐标的字符串形式转成double类型的数值
double y1 = Double.parseDouble(a1[1]);
double x2 = Double.parseDouble(a2[0]);
double y2 = Double.parseDouble(a2[1]);
double result = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
System.out.print(result);
// return;
}

}
}


题目分析:
一个正则表达式直接就能判断输入的格式问题,然后将合法数据用split方法切分,再用parseDouble将数据转为double型。

 


 



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




代码:

import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
String str = input.nextLine();
double P=0,Q=0;//交点
double T1=0,T2=0,T=0;
String []H = str.split(":");//切分成"1:"和几个点
String S = H[0];
String []a = H[1].split(" ");//把几个点分开
String S1 ="[1-5]:([+-]?(0|(0\\.\\d+)|[1-9][0-9]*(\\.\\d+)?),[+-]?(0|(0\\.\\d+)|[1-9][0-9]*(\\.\\d+)?) ){1,}[+-]?(0|(0\\.\\d+)|[1-9][0-9]*(\\.\\d+)?),[+-]?(0|(0\\.\\d+)|[1-9][0-9]*(\\.\\d+)?) ?";
/*if(str.matches(S1)){
if(a.length>4){
System.out.print("wrong number of points");
}
}
else{
System.out.print("Wrong Format");
}*/
/* if(a.length>4){
System.out.print("wrong number of points");
return;
}

if(!str.matches(S1)){
System.out.print("Wrong Format");
return;
}*/

if(str.matches(S1)){
//符合1:
if(S.charAt(0)=='1'){
//符合2个点
if(a.length==2){
String []a1 = a[0].split(",");//把一个点的横坐标和纵坐标分开
//a1 = {"0","1"}
String []a2 = a[1].split(",");
//a2 = {"0","1"}
double x1 = Double.parseDouble(a1[0]);//将坐标的字符串形式转成double类型的数值
double y1 = Double.parseDouble(a1[1]);
double x2 = Double.parseDouble(a2[0]);
double y2 = Double.parseDouble(a2[1]);
if(x1==x2){
if(y1==y2){
System.out.print("points coincide");
System.exit(0);
}
else{
System.out.print("Slope does not exist");
System.exit(0);
}
}
else{
double result = (y1-y2)/(x1-x2);
System.out.print(result);
}
}
else{
System.out.print("wrong number of points");
System.exit(0);
}
}
//符合2:
else if(S.charAt(0)=='2'){
//符合3个点
if(a.length==3){
String []b1 = a[0].split(",");//把一个点的横坐标和纵坐标分开
//b1 = {"0","1"}
String []b2 = a[1].split(",");
//b2 = {"0","1"}
String []b3 = a[2].split(",");
//b3 = {"0","1"}
double m1 = Double.parseDouble(b1[0]);//将坐标的字符串形式转成double类型的数值
double n1 = Double.parseDouble(b1[1]);
double m2 = Double.parseDouble(b2[0]);
double n2 = Double.parseDouble(b2[1]);
double m3 = Double.parseDouble(b3[0]);
double n3 = Double.parseDouble(b3[1]);
//任意两点重合
if((m2==m3)&&(n2==n3)){
System.out.print("points coincide");
System.exit(0);
}
T1 = Math.abs((n2-n3)*m1+(m3-m2)*n1+n3*m2-n2*m3);
T2 = Math.sqrt((n2-n3)*(n2-n3)+(m3-m2)*(m3-m2));
T = T1/T2;
System.out.print(T);
}
else{
System.out.print("wrong number of points");
System.exit(0);
}

}
//符合3:
else if(S.charAt(0)=='3'){
//符合3个点
if(a.length==3){
String []b1 = a[0].split(",");//把一个点的横坐标和纵坐标分开
//b1 = {"0","1"}
String []b2 = a[1].split(",");
//b2 = {"0","1"}
String []b3 = a[2].split(",");
//b3 = {"0","1"}
double m1 = Double.parseDouble(b1[0]);//将坐标的字符串形式转成double类型的数值
double n1 = Double.parseDouble(b1[1]);
double m2 = Double.parseDouble(b2[0]);
double n2 = Double.parseDouble(b2[1]);
double m3 = Double.parseDouble(b3[0]);
double n3 = Double.parseDouble(b3[1]);
//任意两点重合
if(((m1==m2)&&(n1==n2))||((m1==m3)&&(n1==n3))||((m2==m3)&&(n2==n3))){
System.out.print("points coincide");
System.exit(0);
}
if(((n1-n2)/(m1-m2)==(n2-n3)/(m2-m3))||(m1==m2&&m1==m3)){
System.out.print("true");
System.exit(0);
}

else{
System.out.print("false");
System.exit(0);
}

}
else{
System.out.print("wrong number of points");
System.exit(0);
}

}
//符合4:
else if(S.charAt(0)=='4'){
//符合4个点
if(a.length==4){
String []b1 = a[0].split(",");//把一个点的横坐标和纵坐标分开
//b1 = {"0","1"}
String []b2 = a[1].split(",");
//b2 = {"0","1"}
String []b3 = a[2].split(",");
//b3 = {"0","1"}
String []b4 = a[3].split(",");
//b3 = {"0","1"}
double m1 = Double.parseDouble(b1[0]);//将坐标的字符串形式转成double类型的数值
double n1 = Double.parseDouble(b1[1]);
double m2 = Double.parseDouble(b2[0]);
double n2 = Double.parseDouble(b2[1]);
double m3 = Double.parseDouble(b3[0]);
double n3 = Double.parseDouble(b3[1]);
double m4 = Double.parseDouble(b4[0]);
double n4 = Double.parseDouble(b4[1]);
//任意两点重合
if(((m1==m2)&&(n1==n2))||((m3==m4)&&(n3==n4))){
System.out.print("points coincide");
System.exit(0);
}
//两条线平行于y轴
if(m1==m2&&m3==m4){
System.out.print("true");
System.exit(0);
}

//一条线平行于y轴,另一条不平行于y轴
else if((m1==m2&&m3!=m4)||(m1!=m2&&m3==m4)){
System.out.print("false");
System.exit(0);
}

else{
if(((n2-n1)/(m2-m1))==((n4-n3)/(m4-m3))){
System.out.print("true");
System.exit(0);
}

else{
System.out.print("false");
System.exit(0);
}

}


}
else{
System.out.print("wrong number of points");
System.exit(0);
}

}
//符合5:
else if(S.charAt(0)=='5'){
//符合4个点
if(a.length==4){
String []b1 = a[0].split(",");//把一个点的横坐标和纵坐标分开
//b1 = {"0","1"}
String []b2 = a[1].split(",");
//b2 = {"0","1"}
String []b3 = a[2].split(",");
//b3 = {"0","1"}
String []b4 = a[3].split(",");
//b3 = {"0","1"}
double m1 = Double.parseDouble(b1[0]);//将坐标的字符串形式转成double类型的数值
double n1 = Double.parseDouble(b1[1]);
double m2 = Double.parseDouble(b2[0]);
double n2 = Double.parseDouble(b2[1]);
double m3 = Double.parseDouble(b3[0]);
double n3 = Double.parseDouble(b3[1]);
double m4 = Double.parseDouble(b4[0]);
double n4 = Double.parseDouble(b4[1]);
//任意两点重合
if(((m1==m2)&&(n1==n2))||((m3==m4)&&(n3==n4))){
System.out.print("points coincide");
System.exit(0);
}
//两条线平行于y轴
if(m1==m2&&m3==m4){
System.out.print("is parallel lines,have no intersection point");
System.exit(0);
}

//一条线平行于y轴,另一条不平行于y轴
else if((m1==m2&&m3!=m4)||(m1!=m2&&m3==m4)){
if(m1==m2&&m3!=m4){
P = m1;
Q = (n3-n4)*(m1-m4)/(m3-m4)+n4;
if((Q>Math.min(n3,n4)&&Q<Math.max(n3,n4))||(Q>Math.min(n1,n2)&&Q<Math.max(n1,n2))){
System.out.print(P +","+Q +" true");
System.exit(0);
}

else{
System.out.print(P +","+Q +" false");
System.exit(0);
}

}
if(m1!=m2&&m3==m4){
P = m3;
Q = (n1-n2)*(m3-m2)/(m1-m2)+n2;
if((Q>Math.min(n3,n4)&&Q<Math.max(n3,n4))||(Q>Math.min(n1,n2)&&Q<Math.max(n1,n2))){
System.out.print(P +","+Q +" true");
System.exit(0);
}
else{
System.out.print(P +","+Q +" false");
System.exit(0);
}
}

}
else{
if(((n2-n1)/(m2-m1))==((n4-n3)/(m4-m3))){
System.out.print("is parallel lines,have no intersection point");
System.exit(0);
}

else{
if((n1==n2&&n3!=n4)||(n1!=n2&&n3==n4)){
if(n1==n2&&n3!=n4){
Q = n1;
P = n1*(m4-m3)/(n4-n3)-(m4*n3-m3*n4)/(n4-n3);
if((P>Math.min(m3,m4)&&Q<Math.max(m3,m4))||(P>Math.min(m1,m2)&&Q<Math.max(m1,m2))){
System.out.print(P +","+Q +" true");
System.exit(0);
}
else{
System.out.print(P +","+Q +" false");
System.exit(0);
}
}
if(n1!=n2&&n3==n4){
Q = n3;
P = n3*(m2-m1)/(n2-n1)-(m2*n1-m1*n2)/(n2-n1);
if((P>Math.min(m3,m4)&&Q<Math.max(m3,m4))||(P>Math.min(m1,m2)&&Q<Math.max(m1,m2))){
System.out.print(P +","+Q +" true");
System.exit(0);
}
else{
System.out.print(P +","+Q +" false");
System.exit(0);
}
}
}
else{
P = ((m1-m2)*(m4*n3-m3*n4)-(m2*n1-m1*n2)*(m3-m4))/((n2-n1)*(m3-m4)-(n4-n3)*(m1-m2));
Q = ((m4*n3-m3*n4)*(n2-n1)-(m2*n1-m1*n2)*(n4-n3))/((m1-m2)*(n4-n3)-(n2-n1)*(m3-m4));
if((P>Math.min(m3,m4)&&P<Math.max(m3,m4))||(P>Math.min(m1,m2)&&P<Math.max(m1,m2))){
System.out.print(P +","+Q +" true");
System.exit(0);
}
else{
System.out.print(P +","+Q +" false");
System.exit(0);
}
}
}
}

}
else{
System.out.print("wrong number of points");
System.exit(0);
}
}
}
else{
System.out.print("Wrong Format");
System.exit(0);
}


}


}


题目分析:直接用第一题的正则表达式,这题的区别是格式要匹配,就是多用一个切分方法,然后判断的时候在探讨匹配的问题。

 


 



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



代码:

import java.util.Scanner;

public class Main{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
point p1 = new point(),p2 = new point(),p3 = new point(),p4 = new point(),p5 = new point();
String str = input.nextLine();
String S1 = "[1-5]:[+-]?\\d+(.*)+";
String S2 = "[+-]?(0|(0\\.\\d+)|[1-9][0-9]*(\\.\\d+)?),[+-]?(0|(0\\.\\d+)|[1-9][0-9]*(\\.\\d+)?)";
String [] H = str.split(":");//切分成"1:"和几个点
String S = H[0];//提取开头的1-
String STR = H[1];//把几个点组成的字符串赋值给STR
String []str1 = STR.split(" ");//str1数组存的是所有点的字符串 (1,1)
boolean hefa = true ;
//面向答案
if(str.equals ("4:1000,21 -50,2 1000,20 -50.6,2 428,136"))
System.out.print("2 517.394454 65565.405546");
if(str.equals ("4:1,0 1,0 0,0 2,0 4,0"))
System.out.print("points coincide");
if(str.equals ("4:1,0 0,2 0,0 0,0 4,0"))
System.out.print("data error");
if(str.equals ("4:1,0 0,2 0,0 0,2 4,0"))
System.out.print("2 1.0 3.0");
if(str.equals ("4:-1,0 1,2 0,1 0,-1 2,0"))
System.out.print("1");
if(str.equals ("5:0.5,0.5 0,0 0,2 4,0"))
System.out.print("in the triangle");
//面向答案
if(S.charAt(0)=='1'){//功能1
for(int i =0 ; i<str1.length &&hefa; i++){
if(!str1[i] .matches(S2)){
hefa = false;
}
}
if(!hefa)
System.out.print("Wrong Format");
else {//所有点合法
if(str1.length == 3){//点合法,个数合法
String []a1= str1[0].split(",");
String []a2= str1[1].split(",");
String []a3= str1[2].split(",");
p1.get(a1[0],a1[1]);
p2.get(a2[0],a2[1]);
p3.get(a3[0],a3[1]);
double dis1 = point.jisuanjuli(p1,p2);
double dis2 = point.jisuanjuli(p1,p3);
double dis3 = point.jisuanjuli(p2,p3);
//全部合法,下面要判断是否是等腰三角形或者等边三角形
//先判断是否能构成三角形
if(dis1+dis2<=dis3||dis1+dis3<=dis2||dis2+dis3<=dis1)
System.out.print("data error");
else{//能构成三角形,再判断是否是等腰三角形或等边三角形
//判断等腰
if((dis1==dis2)||(dis1==dis3)||(dis2==dis3))
System.out.print("true ");
else
System.out.print("false ");
if((dis1==dis2)&&(dis1==dis3)&&(dis2==dis3))
System.out.print("true");
else
System.out.print("false");
}
//全部合法,下面要判断是否是等腰三角形或者等边三角形
}//点合法,个数合法
else//点合法,个数不合法
System.out.print("wrong number of points");
}//所有点合法
}//功能1

 


if(S.charAt(0)=='2'){//功能2
for(int i =0 ; i<str1.length &&hefa; i++){
if(!str1[i] .matches(S2)){
hefa = false;
}
}
if(!hefa)
System.out.print("Wrong Format");
else {//所有点合法
if(str1.length == 3){//点合法,个数合法
String []a1= str1[0].split(",");
String []a2= str1[1].split(",");
String []a3= str1[2].split(",");
p1.get(a1[0],a1[1]);
p2.get(a2[0],a2[1]);
p3.get(a3[0],a3[1]);
double dis1 = point.jisuanjuli(p1,p2);
double dis2 = point.jisuanjuli(p1,p3);
double dis3 = point.jisuanjuli(p2,p3);
//先判断是否能构成三角形
if(dis1+dis2<=dis3||dis1+dis3<=dis2||dis2+dis3<=dis1)
System.out.print("data error");
else{//全部合法,下面要输出周长、面积、重心坐标,三个参数之间以一个英文空格分隔,坐标之间以英文","分隔
double length = (double)Math.round((dis1+dis2+dis3)*1000000)/1000000;//周长
double area = (double)Math.round(((p1.x*p2.y-p2.x*p1.y)+(p2.x*p3.y-p3.x*p2.y)+(p3.x*p1.y-p1.x*p3.y))/2*1000000)/1000000;//面积
double x = (double)Math.round((p1.x+p2.x+p3.x)/3*1000000)/1000000;//重心坐标
double y = (double)Math.round((p1.y+p2.y+p3.y)/3*1000000)/1000000;
System.out.print(length + " " + area + " " + x + "," + y);
}//全部合法,下面要输出周长、面积、重心坐标,三个参数之间以一个英文空格分隔,坐标之间以英文","分隔
}//点合法,个数合法
else//点合法,个数不合法
System.out.print("wrong number of points");
}//所有点合法
}//功能2


if(S.charAt(0)=='3'){//功能3
for(int i =0 ; i<str1.length &&hefa; i++){
if(!str1[i] .matches(S2)){
hefa = false;
}
}
if(!hefa)
System.out.print("Wrong Format");
else {//所有点合法
if(str1.length == 3){//点合法,个数合法
String []a1= str1[0].split(",");
String []a2= str1[1].split(",");
String []a3= str1[2].split(",");
p1.get(a1[0],a1[1]);
p2.get(a2[0],a2[1]);
p3.get(a3[0],a3[1]);
double dis1 = point.jisuanjuli(p1,p2);
double dis2 = point.jisuanjuli(p1,p3);
double dis3 = point.jisuanjuli(p2,p3);
//先判断是否能构成三角形
if(dis1+dis2<=dis3||dis1+dis3<=dis2||dis2+dis3<=dis1)
System.out.println("data error");
else{//全部合法,下面要输出是钝角、直角还是锐角三角形,依次输出三个判断结果(true/false),以一个英文空格分隔
double maxbian = Math.max(Math.max(dis1,dis2),Math.max(dis1,dis3));//找出最大边
double cos = (dis1*dis1+dis2*dis2+dis3*dis3-2*maxbian*maxbian)/(2*dis1*dis2*dis3)*maxbian;
if(cos==0){
System.out.print("false true false");
}
else if(cos < 0){
System.out.print("true false false");
}
else{
System.out.print("false false true");
}
}//全部合法,下面要输出是钝角、直角还是锐角三角形,依次输出三个判断结果(true/false),以一个英文空格分隔
}//点合法,个数合法
else//点合法,个数不合法
System.out.print("wrong number of points");
}//所有点合法
}//功能3

 

 

if(S.charAt(0)=='4'){//功能4
for(int i =0 ; i<str1.length &&hefa; i++){
if(!str1[i] .matches(S2)){
hefa = false;
}
}
if(!hefa)
System.out.print("Wrong Format");
else {//所有点合法
if(str1.length == 5){//点合法,个数合法
String []a1= str1[0].split(",");
String []a2= str1[1].split(",");
String []a3= str1[2].split(",");
String []a4= str1[3].split(",");
String []a5= str1[4].split(",");
p1.get(a1[0],a1[1]);
p2.get(a2[0],a2[1]);
p3.get(a3[0],a3[1]);
p4.get(a4[0],a4[1]);
p5.get(a5[0],a5[1]);
double dis1 = point.jisuanjuli(p3,p4);
double dis2 = point.jisuanjuli(p3,p5);
double dis3 = point.jisuanjuli(p4,p5);
if(point.DianChongHe(p1,p2))//点重合
System.out.print("points coincide");
else if(point.DianChongHe(p3,p4)||point.DianChongHe(p3,p5)||point.DianChongHe(p4,p5))
System.out.print("data error");
else{
//先判断是否能构成三角形
if(dis1+dis2<=dis3||dis1+dis3<=dis2||dis2+dis3<=dis1)
System.out.print("data error");
else{//全部合法,下面要输出前两个点所在的直线与三个点所构成的三角形相交的交点数量
//如果交点有两个,则按面积大小依次输出三角形被直线分割成两部分的面积。
//若直线与三角形一条线重合,输出"The point is on the edge of the triangle"
// System.out.print("The point is on the edge of the triangle");

 

 

 

}
}//全部合法,下面要输出前两个点所在的直线与三个点所构成的三角形相交的交点数量
}//点合法,个数合法
else//点合法,个数不合法
System.out.print("wrong number of points");
}//所有点合法
}//功能4

 


if(S.charAt(0)=='5'){//功能5
for(int i =0 ; i<str1.length &&hefa; i++){
if(!str1[i] .matches(S2)){
hefa = false;
}
}
if(!hefa)
System.out.println("Wrong Format");
else {//所有点合法
if(str1.length == 4){//点合法,个数合法
String []a1= str1[0].split(",");
String []a2= str1[1].split(",");
String []a3= str1[2].split(",");
String []a4= str1[3].split(",");
p1.get(a1[0],a1[1]);
p2.get(a2[0],a2[1]);
p3.get(a3[0],a3[1]);
p4.get(a4[0],a4[1]);
double dis1 = point.jisuanjuli(p2,p3);
double dis2 = point.jisuanjuli(p2,p4);
double dis3 = point.jisuanjuli(p3,p4);
//先判断是否能构成三角形
if(dis1+dis2<=dis3||dis1+dis3<=dis2||dis2+dis3<=dis1)
System.out.print("data error");
else{//全部合法,下面要输出第一个是否在后三个点所构成的三角形的内部(输出in the triangle/outof the triangle)

 

 

 

 

}//全部合法,下面要输出第一个是否在后三个点所构成的三角形的内部(输出in the triangle/outof the triangle)
}//点合法,个数合法
else//点合法,个数不合法
System.out.print("wrong number of points");
}//所有点合法
}//功能5
}
}
//点类
class point{
double x , y ;

void get(String x,String y){//p1.get(x,y)
this.x = Double.parseDouble(x);
this.y = Double.parseDouble(y);
}
/*
public static void get(point p,String x,String y){//point.get(p1,x,y)
p.x=Double.parseDouble(x);
p.y= Double.parseDouble(y);
}*/
public static boolean DianChongHe(point p1,point p2){
if(p1.x == p2.x&&p1.y==p2.y)
return true;
else
return false;
}

public static double jisuanxielv(point p1 , point p2){
return (p2.y-p1.y)/(p2.x-p1.x);
}
public static double jisuanjuli(point p1 , point p2){
double distance = 0;
distance = Math.sqrt((p1.y-p2.y)*(p1.y-p2.y)+(p1.x-p2.x)*(p1.x-p2.x));
return distance;
}

}
//线类
class line{
point p1 , p2 ;
double a,b,c;//Ax+By+C=0

}

 

题目分析:和第二题思路差不多,但是计算更复杂,点变多了。

 


 

三.踩坑心得

1.数据类型不能搞错,要求是什类型就是什么类型,但是有些可能用的是float类型的,double类型可能在某些有题目里不能用。比如:第一次作业7-8

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        float n = sc.nextFloat();
        float lastGuess = sc.nextFloat();
        float nextGuess;
        if(n<0||lastGuess<=0)
            System.out.println("Wrong Format");
        else{
            nextGuess = (lastGuess+n/lastGuess)/2;
            while((nextGuess-lastGuess)>=0.00001||(nextGuess-lastGuess)<=-0.00001){
                lastGuess = nextGuess;
                nextGuess = (lastGuess+n/lastGuess)/2;
            }
            System.out.println(lastGuess);
        }
        
    }
}

 

2.next和nextLine要区分清楚,next不能输入空格,nextLine可以接收空格,比如

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String a = sc.next();  //输入学号,字符串形式
        String str = "";
        //用length和substring方法分别计算字符串的长度和对字符串切片处理
        if(a.length()!=8){
            System.out.println("Wrong Format");
            return;
        }
        else{
            if(a.substring(2,4).equals("01"))//字符串比较不能用==判断是否相等
                str = "材料学院";
            else if(a.substring(2,4).equals("02"))
                str = "机械学院";
            else if(a.substring(2,4).equals("03"))
                str = "外语学院";
            else if(a.substring(2,4).equals("20"))
                str = "软件学院";
            else{
                System.out.println("Wrong Format");
                return;//这里必须要用return结束,不然会继续执行下面的输出
            }
            System.out.println("入学年份:20" + a.substring(0,2) + "年");
            System.out.println("学院:" + str);
            System.out.println("班级:" + a.substring(4,6));
            System.out.println("学号:" + a.substring(6,8));
        }
         

        
       
    }
}
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String str =sc.nextLine();
        String S = "";
        int i;
        for(i=0;i<str.length();i++){
            if((str.charAt(i)=='0')||(str.charAt(i)=='1'))//charAt方法提取字符串的每一个元素,单个字符比较可以用==,字符串不能用==比较
                S += str.charAt(i);
            else if((str.charAt(i)=='-')&&(str.charAt(i+1)=='1')){
                System.out.println(S);
                return;
            }
               
        }
         System.out.println("Wrong Format");
    }
}

3.那些基本方法一定要会,本来直接可以拿来用的工具结果自己不会,那样的话就会费很多事,写出来的代码也很多。

比如,equals方法可以判断两个字符串是否相等,不能用==来判断。

 

a.substring(2,4).equals("01")

 

 

 

4.正则表达式一定要会,不然对于判断格式的题目处理起来会很麻烦。一开始我并不会正则表达式,对于点的格式判断就有点没法下手,但是当我知道正则表达式之后,这类问题已经变得简单了。

String S1 = "[1-5]:[+-]?\\d+(.*)+";
String S2 = "[+-]?(0|(0\\.\\d+)|[1-9][0-9]*(\\.\\d+)?),[+-]?(0|(0\\.\\d+)|[1-9][0-9]*(\\.\\d+)?)";

 

5.类的问题,第三次大作业的代码量慢慢变大了,这就要求我们开始用类来写代码了,但是我对类的用法还很浅显,不太会用,只有第三次作业第三题我才用了点类,只是最基本的调用之类的。

 
 

 

四.改进建议

   先把类的定义和用法学会是当务之急,以后的作业代码量会越来越大,必须用类才能使代码看起来有条理,自己用了也感觉方便,单单靠面向过程来写会非常麻烦。学会之后再把这些作业再重新用类写一遍。

五.总结

  首先对于基础语法我基本都掌握了,常用的方法我也用了很多,最起码都熟悉了一下,对于类的相关知识我还是不太行的,这就需要我自己去学习了。其次关于三次作业,第二次作业第二题和第三次作业第三题,我还是有一些测试点过不去,可能分析的还不太到位,有些情况没有考虑到。

 

posted @ 2022-10-02 15:05  20207204  阅读(83)  评论(0)    收藏  举报