对之前发布的PTA题目集、实验作业以及期中考试的总结

(1)前言:由于第四次作业的难度不是很大除了第二题很繁琐,也很考验学生的数学能力,导致第二题很多测试点没写出来,但是第一题的正则表达式掌握的不熟练,导致我写题的效率也很低,其次第三题的审题不仔细,导致效率也很低下,而期中考试,考试的紧张,知识点掌握的不熟练,到时我得分很低,我也意识到了我的很多问题,所以也要紧密完成我的作业,花更多时间去完成作业和掌握知识点,实验的作业很多题目都是有提醒的,所以很多题目看一眼就知道了思路,倒是写的很快,除了又一次的作业大意,有一个类没有new,但是又能运行,但是一输入就报错,所以我知道了要细心一点。

(2)设计与分析:

7-1 sdut-String-2 识蛟龙号载人深潜,立科技报国志(II)(正则表达式)
分数 10
作者 周雪芹
单位 山东理工大学

背景简介:

“蛟龙号”载人深潜器是我国首台自主设计、自主集成研制的作业型深海载人潜水器,设计最大下潜深度为7000米级,也是目前世界上下潜能力最强的作业型载人潜水器。“蛟龙号”可在占世界海洋面积99.8%的广阔海域中使用,对于我国开发利用深海的资源有着重要的意义。

中国是继美、法、俄、日之后世界上第五个掌握大深度载人深潜技术的国家。在全球载人潜水器中,“蛟龙号”属于第一梯队。目前全世界投入使用的各类载人潜水器约90艘,其中下潜深度超过1000米的仅有12艘,更深的潜水器数量更少,目前拥有6000米以上深度载人潜水器的国家包括中国、美国、日本、法国和俄罗斯。除中国外,其他4国的作业型载人潜水器最大工作深度为日本深潜器的6527米,因此“蛟龙号”载人潜水器在西太平洋的马里亚纳海沟海试成功到达7020米海底,创造了作业类载人潜水器新的世界纪录。

从2009年至2012年,蛟龙号接连取得1000米级、3000米级、5000米级和7000米级海试成功。下潜至7000米,说明蛟龙号载人潜水器集成技术的成熟,标志着我国深海潜水器成为海洋科学考察的前沿与制高点之一。

2012年6月27日11时47分,中国“蛟龙”再次刷新“中国深度”——下潜7062米。6月3日,“蛟龙”出征以来,已经连续书写了5个“中国深度”新纪录:6月15日,6671米;6月19日,6965米;6月22日,6963米;6月24日,7020米;6月27日,7062米。下潜至7000米,标志着我国具备了载人到达全球99%以上海洋深处进行作业的能力,标志着“蛟龙”载人潜水器集成技术的成熟,标志着我国深海潜水器成为海洋科学考察的前沿与制高点之一,标志着中国海底载人科学研究和资源勘探能力达到国际领先水平。

‘蛟龙’号是我国载人深潜发展历程中的一个重要里程碑。它不只是一个深海装备,更代表了一种精神,一种不畏艰险、赶超世界的精神,它是中华民族进军深海的号角。

了解蛟龙号”载人深潜器“的骄人业绩,为我国海底载人科学研究和资源勘探能力达到国际领先水平而自豪,小伙伴们与祖国同呼吸、共命运,一定要学好科学文化知识、提高个人能力,增强创新意识,做事精益求精,立科技报国之志!

请编写程序,实现如下功能:读入关于蛟龙号载人潜水器探测数据的多行字符串,从给定的信息找出数字字符,输出每行的数字之和。

提示 若输入为“2012年2月”,则该行的输出为:2014。若干个连续的数字字符作为一个整体,以十进制形式相加。

输入格式:

读入关于蛟龙号载人潜水器探测数据的多行字符串,每行字符不超过80个字符。

以"end"结束。

输出格式:

与输入行相对应的各个整数之和。

输入样例1:

2012年6月27日11时47分,中国“蛟龙”再次刷新“中国深度”——下潜7062米
6月15日,6671米
6月19日,6965米
6月22日,6963米
6月24日,7020米
6月27日,7062米
下潜至7000米,标志着我国具备了载人到达全球99%以上海洋深处进行作业的能力
end
 

输出样例1:

9165
6692
6990
6991
7050
7095
7099
 

输入样例2:

全世界投入使用的各类载人潜水器约90艘,下潜深度超过1000米的仅有12艘,更深的潜水器数量更少
6000米以上深度载人潜水器的国家包括中国、美国、日本、法国和俄罗斯
日本深潜器下潜6527米,蛟龙号在马里亚纳海沟海试成功到达7020米海底,创造了新的世界纪录
从2009年至2012年,蛟龙号接连取得1000米级、3000米级、5000米级和7000米级海试成功
下潜至7000米,说明蛟龙号载人潜水器集成技术的成熟
end
 

输出样例2:

1102
6000
13547
20021
7000

题目分析:
首先这道题需要用到正则表达式,所以很多知识点都需要围绕着正则表达式来写,但是由于我正则表达式学的不是很好,导致很测试点不过关,所以课后我需要多学习一下正则表达式
7-2 点线形系列4-凸四边形的计算
分数 70
作者 蔡轲
单位 南昌航空大学

点线形系列4-四边形题目说明.pdf
用户输入一组选项和数据,进行与四边形有关的计算。
以下四边形顶点的坐标要求按顺序依次输入,连续输入的两个顶点是相邻顶点,第一个和最后一个输入的顶点相邻。
选项包括:
1:输入四个点坐标,判断是否是四边形、平行四边形,判断结果输出true/false,结果之间以一个英文空格符分隔。
2:输入四个点坐标,判断是否是菱形、矩形、正方形,判断结果输出true/false,结果之间以一个英文空格符分隔。 若四个点坐标无法构成四边形,输出"not a quadrilateral"
3:输入四个点坐标,判断是凹四边形(false)还是凸四边形(true),输出四边形周长、面积,结果之间以一个英文空格符分隔。 若四个点坐标无法构成四边形,输出"not a quadrilateral"
4:输入六个点坐标,前两个点构成一条直线,后四个点构成一个四边形或三角形,输出直线与四边形(也可能是三角形)相交的交点数量。如果交点有两个,再按面积从小到大输出四边形(或三角形)被直线分割成两部分的面积(不换行)。若直线与四边形或三角形的一条边线重合,输出"The line is coincide with one of the lines"。若后四个点不符合四边形或三角形的输入,输出"not a quadrilateral or triangle"。
后四个点构成三角形的情况:假设三角形一条边上两个端点分别是x、y,边线中间有一点z,另一顶点s:
1)符合要求的输入:顶点重复或者z与xy都相邻,如x x y s、x z y s、x y x s、s x y y。此时去除冗余点,保留一个x、一个y。
2) 不符合要求的输入:z 不与xy都相邻,如z x y s、x z s y、x s z y
5:输入五个点坐标,输出第一个是否在后四个点所构成的四边形(限定为凸四边形,不考虑凹四边形)或三角形(判定方法见选项4)的内部(若是四边形输出in the quadrilateral/outof the quadrilateral,若是三角形输出in the triangle/outof the triangle)。如果点在多边形的某条边上,输出"on the triangle或者on the quadrilateral"。若后四个点不符合四边形或三角形,输出"not a quadrilateral or triangle"。

输入格式:

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

输出格式:

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

选项1、2、3中,若四边形四个点中有重合点,输出"points coincide"。
选项4中,若前两个输入线的点重合,输出"points coincide"。

输入样例1:

选项1,点重合。例如:

1:-1,-1 -1,-1 1,2 1,-2
 

输出样例:

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

points coincide
 

输入样例2:

不符合基本格式。例如:

1:-1,-1 1,2 -1,1 ++1,0
 

输出样例:

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

Wrong Format
 

输入样例3:

选项1,输入点数量不对。例如:

1:-1,-1 -1,2 
 

输出样例:

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

wrong number of points
 

输入样例4:

选项1,正确输入判断。例如:

1:-1,-1 -1,1 1,2 1,-2
 

输出样例:

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

true false
 

输入样例5:

选项2,输入点不构成四边形。例如:

2:10,10 1,1 0,0 1,20
 

输出样例:

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

not a quadrilateral
 

输入样例6:

选项2,正方形。例如:

2:0,0 0,80 80,80 80,0
 

输出样例:

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

true true true
 

输入样例7:

选项2。例如:

2:0,0 -10,80 0,160 -10,80
 

输出样例:

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

not a quadrilateral
 

输入样例8:

选项3,凸四边形。例如:

3:-1,-1 -1,1 1,2 1,-2
 

输出样例:

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

true 10.472 6.0
 

输入样例9:

选项3,。例如:

3:0,0 -10,100 0,99 10,100
 

输出样例:

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

false 221.097 990.0
我的代码:

import java.util.Scanner;

public class Main {
public static void main(String[] args) {
String a;
double p;
Scanner in = new Scanner(System.in);
a = in.nextLine();
String[] b = a.split(":");
switch (b[0]) {
case "1":
String[] c = b[1].split(" ");
if (c.length != 4) {
System.out.print("wrong number of points");
} else {
String[] d1 = c[0].split(",");
String[] d2 = c[1].split(",");
String[] d3 = c[2].split(",");
String[] d4 = c[3].split(",");
double x1 = Double.parseDouble(d1[0]);
double y1 = Double.parseDouble(d1[1]);
double x2 = Double.parseDouble(d2[0]);
double y2 = Double.parseDouble(d2[1]);
double x3 = Double.parseDouble(d3[0]);
double y3 = Double.parseDouble(d3[1]);
double x4 = Double.parseDouble(d4[0]);
double y4 = Double.parseDouble(d4[1]);
double k1 = (y2 - y1) / (x2 - x1);
double k2 = (y4 - y1) / (x4 - x1);
double k3 = (y3 - y2) / (x3 - x2);
double k4 = (y4 - y3) / (x4 - x3);
if ((x1 == x2 && y1 == y2)
|| (x1 == x3 && y1 == y3)
|| (x1 == x4 && y1 == y4)
|| (x2 == x3 && y2 == y3)
|| (x2 == x4 && y2 == y4)
|| (x3 == x4 && y3 == y4)) {
System.out.print("points coincide");
} else {
if ((k1 == k2) && (k1 == k3)
|| (k1 == k2 && k1 == k4)
|| (k2 == k3) && (k2 == k4)
|| (k1 == k3 && k1 == k4)) {
System.out.print("false ");
} else {
System.out.print("true ");
double p1 =
Math.abs(x1 - x2) * Math.abs(x1 - x2) + Math.abs(y1 - y2) * Math.abs(y1 - y2);
double p2 =
Math.abs(x2 - x3) * Math.abs(x2 - x3) + Math.abs(y2 - y3) * Math.abs(y2 - y3);
double p3 =
Math.abs(x3 - x4) * Math.abs(x3 - x4) + Math.abs(y3 - y4) * Math.abs(y3 - y4);
double p4 =
Math.abs(x4 - x1) * Math.abs(x4 - x1) + Math.abs(y4 - y1) * Math.abs(y4 - y1);
if (p1 == p3 && p2 == p4) {
System.out.print("true");
} else {
System.out.print("false");
}
}
}
}
break;
case "2":
String[] d = b[1].split(" ");
if (d.length != 4) {
System.out.print("wrong number of points");
} else {
String[] d1 = d[0].split(",");
String[] d2 = d[1].split(",");
String[] d3 = d[2].split(",");
String[] d4 = d[3].split(",");
double x1 = Double.parseDouble(d1[0]);
double y1 = Double.parseDouble(d1[1]);
double x2 = Double.parseDouble(d2[0]);
double y2 = Double.parseDouble(d2[1]);
double x3 = Double.parseDouble(d3[0]);
double y3 = Double.parseDouble(d3[1]);
double x4 = Double.parseDouble(d4[0]);
double y4 = Double.parseDouble(d4[1]);
double k1 = (y2 - y1) / (x2 - x1);
double k2 = (y4 - y1) / (x4 - x1);
double k3 = (y3 - y2) / (x3 - x2);
double k4 = (y4 - y3) / (x4 - x3);
if ((k1 == k2) && (k1 == k3)
|| (k1 == k2 && k1 == k4)
|| (k2 == k3) && (k2 == k4)
|| (k1 == k3 && k1 == k4)) {
System.out.print("not a quadrilateral");
} else {
if ((x1 == x2 && y1 == y2)
|| (x1 == x3 && y1 == y3)
|| (x1 == x4 && y1 == y4)
|| (x2 == x3 && y2 == y3)
|| (x2 == x4 && y2 == y4)
|| (x3 == x4 && y3 == y4)) {
System.out.print("not a quadrilateral");
} else {

double p1 =
Math.abs(x1 - x2) * Math.abs(x1 - x2) + Math.abs(y1 - y2) * Math.abs(y1 - y2);
double p2 =
Math.abs(x2 - x3) * Math.abs(x2 - x3) + Math.abs(y2 - y3) * Math.abs(y2 - y3);
double p3 =
Math.abs(x3 - x4) * Math.abs(x3 - x4) + Math.abs(y3 - y4) * Math.abs(y3 - y4);
double p4 =
Math.abs(x4 - x1) * Math.abs(x4 - x1) + Math.abs(y4 - y1) * Math.abs(y4 - y1);
double p5 =
Math.abs(x1 - x3) * Math.abs(x1 - x3) + Math.abs(y1 - y3) * Math.abs(y1 - y3);
double p6 =
Math.abs(x2 - x4) * Math.abs(x2 - x4) + Math.abs(y2 - y4) * Math.abs(y2 - y4);
if (p1 == p2 && p2 == p3 && p3 == p4 && p5 != p6) {
System.out.print("true ");
} else {
System.out.print("false ");
}
if (p1 == p3 && p2 == p4 && p1 != p2 && p5 == p6) {
System.out.print("true ");
} else {
System.out.print("false ");
}
if (p1 == p2 && p2 == p3 && p3 == p4 && p5 == p6) {
System.out.print("true ");
} else {
System.out.print("false");
}
}
}
}
break;
case "3":

break;
default:
System.out.print("Wrong Format");

}
}
}

题目分析:题目是跟上次题目有关联的,首先输入1的话,你需要首先给出连续两点的斜率,其次你还要确保其没有斜率不相等,才可以确保其为四边形,然后再看其是否相对应的两条边是否相等,这样就可以判断使得否为平行四边形,如果选2的话,先把1的判段四边形的条件办搬下来,再来判断是否为棱形,还是正方形还是长方形

7-3 设计一个银行业务类
分数 20
作者 吴光生
单位 新余学院

编写一个银行业务类BankBusiness,具有以下属性和方法:
(1)公有、静态的属性:银行名称bankName,初始值为“中国银行”。
(2)私有属性:账户名name、密码password、账户余额balance。
(3)银行对用户到来的欢迎(welcome)动作(静态、公有方法),显示“中国银行欢迎您的到来!”,其中“中国银行”自动使用bankName的值。
(4)银行对用户离开的提醒(welcomeNext)动作(静态、公有方法),显示“请收好您的证件和物品,欢迎您下次光临!”
(5)带参数的构造方法,完成开户操作。需要账户名name、密码password信息,同时让账户余额为0。
(6)用户的存款(deposit)操作(公有方法,需要密码和交易额信息),密码不对时无法存款且提示“您的密码错误!”;密码正确、完成用户存款操作后,要提示用户的账户余额,例如“您的余额有1000.0元。”。
(7)用户的取款(withdraw)操作(公有方法,需要密码和交易额信息)。密码不对时无法取款且提示“您的密码错误!”;密码正确但余额不足时提示“您的余额不足!”;密码正确且余额充足时扣除交易额并提示用户的账户余额,例如“请取走钞票,您的余额还有500.0元。”。

编写一个测试类Main,在main方法中,先后执行以下操作:
(1)调用BankBusiness类的welcome()方法。
(2)接收键盘输入的用户名、密码信息作为参数,调用BankBusiness类带参数的构造方法,从而创建一个BankBusiness类的对象account。
(3)调用account的存款方法,输入正确的密码,存入若干元。密码及存款金额从键盘输入。
(4)调用account的取款方法,输入错误的密码,试图取款若干元。密码及取款金额从键盘输入。
(5)调用account的取款方法,输入正确的密码,试图取款若干元(取款金额大于余额)。密码及取款金额从键盘输入。
(6)调用account的取款方法,输入正确的密码,试图取款若干元(取款金额小于余额)。密码及取款金额从键盘输入。
(7)调用BankBusiness类的welcomeNext()方法。

输入格式:

输入开户需要的姓名、密码
输入正确密码、存款金额
输入错误密码、取款金额
输入正确密码、大于余额的取款金额
输入正确密码、小于余额的取款金额

输出格式:

中国银行(银行名称)欢迎您的到来!
您的余额有多少元。
您的密码错误!
您的余额不足!
请取走钞票,您的余额还有多少元。
请收好您的证件和物品,欢迎您下次光临!

输入样例:

在这里给出一组输入。请注意,输入与输出是交替的,具体顺序请看测试类中的说明。例如:

张三 123456
123456 1000
654321 2000
123456 2000
123456 500
 

输出样例:

在这里给出相应的输出。请注意,输入与输出是交替的,具体顺序请看测试类中的说明。例如:

中国银行欢迎您的到来!
您的余额有1000.0元。
您的密码错误!
您的余额不足!
请取走钞票,您的余额还有500.0元。
请收好您的证件和物品,欢迎您下次光临!
我的代码:

import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
BankBusiness bankbusiness = new BankBusiness();
bankbusiness.welcome();
bankbusiness.open(in.next(), in.next());
bankbusiness.deposit(in.next(), in.nextDouble());
bankbusiness.withdraw(in.next(), in.nextDouble());
bankbusiness.withdraw(in.next(), in.nextDouble());
bankbusiness.withdraw(in.next(), in.nextDouble());
bankbusiness.welcomeNext();
}
}

class BankBusiness {
public static String bankName = "中国银行";
private String name, password;
private double balance;

public static void welcome() {
System.out.println(bankName + "欢迎您的到来!");
}

public static void welcomeNext() {
System.out.print("请收好您的证件和物品,欢迎您下次光临!");
}

public void open(String name, String password) {
this.name = name;
this.password = password;
balance = 0;
}

public void deposit(String a, double b) {
if (a.equals(this.password)) {
balance = b;
System.out.println("您的余额有" + balance + "元。");

} else {
System.out.println("您的密码错误!");
}
}

public void withdraw(String p, double q) {
if (p.equals(this.password) && q <= balance) {
System.out.printf("请取走钞票,您的余额还有%.1f元。\n", balance - q);

} else if (p.equals(this.password) && q > balance) {
System.out.println("您的余额不足!");
} else {
System.out.println("您的密码错误!");
}
}
}

题目分析:首先,你要认真审题,他是要你输入五次,不是让你循环五次,这样你才能成功哦,之前没认证审题,导致良浪费这么多时间,这题也没什么难点,所以也没什么要注意的,主要是认真审题。。。。。。

7-1 点与线(类设计)
分数 20
作者 段喜龙
单位 南昌航空大学
  • 设计一个类表示平面直角坐标系上的点Point,私有属性分别为横坐标x与纵坐标y,数据类型均为实型数,除构造方法以及属性的getter与setter方法外,定义一个用于显示信息的方法display(),用来输出该坐标点的坐标信息,格式如下:(x,y),数值保留两位小数。为简化题目,其中,坐标点的取值范围设定为(0,200]。若输入有误,系统则直接输出Wrong Format

  • 设计一个类表示平面直角坐标系上的线Line,私有属性除了标识线段两端的点point1、point2外,还有一个字符串类型的color,用于表示该线段的颜色,同样,除构造方法以及属性的getter与setter方法外,定义一个用于计算该线段长度的方法getDistance(),还有一个用于显示信息的方法display(),用来输出线段的相关信息,输出格式如下:

      ```
          The line's color is:颜色值
          The line's begin point's Coordinate is:
          (x1,y1)
          The line's end point's Coordinate is:
          (x2,y2)
          The line's length is:长度值
      ```
    
     

    其中,所有数值均保留两位小数,建议可用String.format("%.2f", data)方法。

      设计类图如下图所示。
    
     

1641304523(1).jpg

** 题目要求:在主方法中定义一条线段对象,从键盘输入该线段的起点坐标与终点坐标以及颜色,然后调用该线段的display()方法进行输出。**

  • 以下情况为无效作业
    • 无法运行
    • 设计不符合所给类图要求
    • 未通过任何测试点测试
    • 判定为抄袭

输入格式:

分别输入线段的起点横坐标、纵坐标、终点的横坐标、纵坐标以及颜色,中间可用一个或多个空格、tab或者回车分隔。

输出格式:

The line's color is:颜色值
The line's begin point's Coordinate is:
(x1,y1)
The line's end point's Coordinate is:
(x2,y2)
The line's length is:长度值
 

输入样例1:

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

5
9.4
12.3
84
Red
 

输出样例1:

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

The line's color is:Red
The line's begin point's Coordinate is:
(5.00,9.40)
The line's end point's Coordinate is:
(12.30,84.00)
The line's length is:74.96
 

输入样例2:

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

80.2356
352.12
24.5
100
Black
 

输出样例2:

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

Wrong Format
我的代码:

import java.util.Scanner;

public class Main{
public static void main(String args[]){

Scanner in=new Scanner(System.in);
double x1 = in.nextDouble();
double y1 = in.nextDouble();
double x2 = in.nextDouble();
double y2 = in.nextDouble();
String color=in.next();
if(x1>0&&x1<=200&&x2>0&&x2<=200&&y1>0&&y1<=200&&y2>0&&y2<=200){
Line line=new Line(new Point(x1,y1),new Point(x2,y2),color);
line.display();
}else{
System.out.println("Wrong Format");
}
}
}

class Point{
private double x,y;
public double a;
public Point(double x,double y){
this.x=x;
this.y=y;
}

public double getX() {
return x;
}
public void setX(double x) {
this.x=x;
}
public double getY() {
return y;
}
public void setY(double x) {
this.y=y;
}
public void display(){

System.out.printf("(%.2f,%.2f)\n",x,y);
}
}
class Line{

private Point point1,point2;
String color;
Line(Point p1,Point p2,String color){
this.point1=p1;
this.point2=p2;
this.color=color;
}
public Point getPoint1(){
return point1;
}

public void setPoint1(){
this.point1=point1;
}

public Point getPoint2(){
return point2;
}

public void setPoint2(){
this.point1=point2;
}

public String getColor(){
return this.color;
}

public void setColor(String color){
this.color=color;
}

public void display() {
System.out.println("The line's color is:" + this.color);
System.out.println("The line's begin point's Coordinate is:");
point1.display();
System.out.println("The line's end point's Coordinate is:");
point2.display();

System.out.printf("The line's length is:%.2f", getDistance());
}

public double getDistance(){
double a;
a=Math.sqrt(Math.pow(point1.getX() - point2.getX(), 2) + Math.pow(point1.getY() - point2.getY(), 2));
return a;
}

}

题目分析:首先你要把题目审清楚,他是要把get和put的情况分开来算,但是由于我的不仔细,导致我的代码很长时间都不成功,到质量费了很多时间,但是其难度还是不高的,我也没什么好分析的

实验二 类与对象(一)

 

一、实验目的

1、  掌握类与对象的基本概念;

2、  掌握类的声明、创建与使用方法;

3、  掌握类的构造方法的定义与使用方法

4、  掌握类的成员变量、成员方法的定义与使用方法;

5、  理解类变量、类方法与实例变量、实例方法的区别;

6、  理解Java语言中包的概念以及package、import语句的使用;

 

 

二、实验要求

1、  根据实验步骤中提出的要求,编写相应的Java程序;

2、  编译、运行自己所编写的Java程序;

3、  根据编译与运行过程中所获得的错误信息修改程序直至获得正确的结果;

4、  记录实验中遇到的各类问题并以及解决办法。

 

三、实验步骤

1、      农夫过河问题:一个农夫带着一匹狼、一只羊、一颗白菜要过河,河上只有一条船能够渡河,而且农夫每次最多只能带一个动物或物品过河。当农夫不在的时候狼会吃羊,羊会吃白菜。

    请以代码为基础,将程序代码补充完整,实现农夫过河游戏功能:由用户选择角色过河,系统自动判断游戏的胜负:当出现有生物被吃掉的时候,游戏失败,所有角色都到了河的另一边,游戏成功。

(1)       主类,用于运行程序;

 

        package 农夫过河;

        import java.util.Scanner;

        public class Main {

            public static void main(String[] args) {

                // TODO Auto-generated method stub

                Game game = new Game();

                game.play();      

            }

        }

 

(2)       游戏界面类,用于显示界面;

 

package 农夫过河;

 

public class GameGui {

   public void menu()

   {

       /* 显示菜单 */

       System.out.println("==================Please choose operation============");

       System.out.println("\t==========1:Cross the river alone===========");

       System.out.println("\t==========2:Cross the river with wolf=========");

       System.out.println("\t==========3:Cross the river with sheep============");

       System.out.println("\t==========4:Cross the river with cabbage==========");

       System.out.println("\t==========0:Quit===============");  

       System.out.println("===================================================");

       System.out.println("Input the number(0~4):");

   }  

 

   public void showStatus(Farmer farmer, Wolf wolf, Sheep sheep, Cabbage cabbage) {

       /* 输出农夫、各种动物、物品的状态(生存、位置) */

           farmer.showStatus();

           wolf.showStatus();

           sheep.showStatus();

           cabbage.showStatus();

       }

}

(3)       游戏类,用于执行游戏;

package 农夫过河;

 

import java.util.Scanner;

 

public class Game {

   Wolf wolf;

   Sheep sheep;

   Cabbage cabbage;

   Farmer farmer;

   //GameGui gui;

  

   Game() {

       wolf = new Wolf();

       sheep = new Sheep();

       cabbage = new Cabbage();

       farmer = new Farmer();

   }

  

  

   protected void play() {

       Scanner input = new Scanner(System.in);

       int choice = 0;        //用户输入选择

       boolean gameOver=false,//游戏结束标志,默认为false,代表游戏进行中,未结束

               win=false;     //游戏输赢标志,默认为false,代表未赢得游戏。

       while(!gameOver)

       {

           GameGui.menu();

           choice = input.nextInt();

           switch(choice)

           {

               case 0: gameOver=true;

                   break;

               case 1:/* 农夫独自过河的处理 */

                   farmer.crossRiver=!( farmer.crossRiver);

                   break;

               case 2:/* 农夫带狼的处理 */

                   farmer.crossRiver=!( farmer.crossRiver);

                   wolf.crossRiver=!( wolf.crossRiver);

                   break;

               case 3:/* 农夫带羊的处理 */

                   farmer.crossRiver=!( farmer.crossRiver);

                   sheep.crossRiver=!( sheep.crossRiver);

                   break;

               case 4:/* 农夫带白菜的处理 */

                   farmer.crossRiver=!( farmer.crossRiver);

                   cabbage.crossRiver=!( cabbage.crossRiver);

                   break;

           }

           wolf.eatSheep(sheep);//狼吃羊,如果羊不在同一边,则吃不到,如果在同一边,羊被吃

           sheep.eatCabbage(cabbage);//同上

           GameGui.showStatus(farmer,wolf,sheep,cabbage);

           gameOver = isGameOver();

       }      

       win=this.hasWin();

       if(win) {

           System.out.println("game over: you win !");

       }else {

           System.out.println("game over: you lose !");

       }

       input.close();

 

   }

   /*

    * 判断游戏是否结束

    * 输入:无

    * 运算:羊、白菜任一实体被吃,游戏结束,或者狼、羊、白菜均未被吃且全部渡过河,游戏结束

    * 输出:游戏结束--返回true ,未结束--返回false

    */

   public boolean isGameOver() {

       if(sheep.isAlive==false||cabbage.isAlive==false) {

           return true;

       }          

       if(wolf.hasCross&&sheep.hasCross&&cabbage.hasCross) {

           return true;

       }

       return false;

   }

   /*

    * 判断游戏是否胜利

    * 前置条件:游戏结束

    * 输入:无

    * 运算:狼、羊、白菜均未被吃且全部渡过河,游戏胜利,否则失败

    * 输出:游戏胜利--返回true ,失败--返回false

    */

   public boolean hasWin() {

       if(sheep.isAlive==false||cabbage.isAlive==false) {

           return false;

       }          

       if(wolf.hasCross&&sheep.hasCross&&cabbage.hasCross) {

           return true;

       }else {

           return false;

       }      

   }

  

}

(4) 游戏输出示例:

==================Please choose operation============

   ==========1:Cross the river alone===========

   ==========2:Cross the river with wolf=========

   ==========3:Cross the river with sheep============

   ==========4:Cross the river with cabbage==========

   ==========0:Quit===============

===================================================

Input the number(0~4):

2

Farmer has Cross  :true

Wolf is alive  :true   Wolf has Cross  :true

Sheep is alive :true   Sheep has Cross :false

Cabbage is alive:false   Cabbage has Cross:false

game over: you lose !

我的代码

运行结果:

 

题目分析:其唯一的难点是其要用到类的互动,其次要把羊和狼中类的eat的对象要设计好,要一个单独的对象来实现其是否羊或者包菜是否被吃掉。

实验二 类与对象(二)

 

一、实验目的

1、  理解引用变量与对象实例之间的关系与区别;

2、  理解方法调用时引用类型参数的传递过程;

3、  掌握private、protected、public等关键的使用场合与使用方法;

4、  掌握对象组合的方式与方法;

5、  理解Java中方法重载的实现方式。

 

二、实验要求

1、  根据实验步骤中提出的要求,使用eclipse等开发工具编写调试Java程序;

2、  根据编译与运行过程中所获得的错误信息修改程序直至获得正确的结果;

3、  记录实验中遇到的各类问题并以及解决办法。

 

三、实验步骤

 

1、  农夫过河问题:将之前的代码进行如下改进:

(1)       对farmer,wolf,sheep,cabbage进行数据封装的改进,将属性隐藏。

(2)       增加Boat(船)类,设计船类的相应方法,并修改main方法中相关的代码,改进农夫带东西过河的功能,解决之前代码中存在的农夫带东西过河的判断问题。

(3)       为wolf,sheep 两个类添加带Stirng name参数的构造函数,当创建wolf,sheep对象时,假设输入了name参数,程序分别输出:

         啊呜~~~我 *name* 狼又回来了

         咩咩,我是可爱的小羊*name*

        当wolf,sheep对象使用showStatus()方法输出状态时,输出内容要带上name的信息,如:

     Sheep *name* is alive :true   Sheep *name* has Cross : false

 

2、  请画出完整类图,包含每个类的类名、属性、方法以及类与类的关联,并用文字说明类之间的关联关系。

3、  将Main类移动到src下,代码出现了什么问题,请说明原因。

 

 

四、实验结果

   附上修改后的代码以及运行截图

我的代码:

运行结果:

 

题目分析:首先我们要先知道其错误,比如羊和农民不在同一河岸处,但是农民要把羊运到河岸另一边,但是运过去以后,羊和农民换了位置,但是此时羊和农民要在同一边,所以,要是运不在同一边的东西,只要物品位置移动就行,所以我们要分情况改变crossRiver的值,
如果其在不是同一边,那么就只改变物品的crossRiver的值,如果在同一边,那么就要改变农民和物品的crossRiver的值。

实验三 继承与多态(一)

 

一、实验目的

1、  掌握Java语言中继承的基本概念及使用方法;

2、  掌握Java语言中super关键字的使用方法;

3、  理解继承与组合的区别;

4、  理解程序设计中代码复用的重要性。

 

二、实验要求

1、  根据实验步骤中提出的要求,使用eclipse等开发工具编写相应的Java程序;

2、  编译、运行自己所编写的Java程序;

3、  根据编译与运行过程中所获得的错误信息修改程序直至获得正确的结果;

4、  记录实验中遇到的各类问题并以及解决办法。

 

三、实验步骤

1、  农夫过河问题:将之前的代码进行如下改进:

(1)       为之前的类添加合适的父类。

(2)       为父类添加适合的属性和方法。并以此为基础修改原有的类,使之与添加的类构成继承关系。

(3)       使用多态改进整个代码,提高代码的复用性。

2、  请画出完整类图,包含每个类的类名、属性、方法以及类与类的关联,并用文字说明关联类的关联关系。

3、  说明你设计的继承关系的理由,为什么不用组合

 

运行界面:

题目分析:首先,因为crossRiver的值为父类的私有制,所以要用到crossRiver的返回值,其次才能判断,如果直接用的话会报错,所以,要用到其函数,其次要把所以子类的代码一样的放在父类中,其子类的cross River和isAlive的返回值要先从父类的crossRiver和isAlive中返回,这样实现了层层相套,其次super也要好好用好,首先这样要和this搞清楚分得清,然后才能明白这个值要用到父类还是子类的,说说这个的优点吧,首先少了代码的复制,代码的复制是代码不优的表现,这样如果要改动的话,只要改父类的代码就行了,大大节省了我们的时间,我也在敲代码时遇到了很多错误代码,但是改的很快

(3)采坑心得:首先要分清父类和子类的关系,其次this和super要分的清,如果是子类的之那么就用this前缀,如果是局部变量,那么就什么都不用加,前提是局部里面没有用到父类和全局标量,如果是子类要调用父类的变量,那么就要用到super,其次在子类的构造函数中他会免费送一个super(),所以,要看清父类的构造函数中要的变量是啥。

(4)改进建议:要避免代码复制,所以要掌握好继承,就比如实验三,我的代码中一直有报错,就是因为在主类中我没分清那个是要用到父类的还是子类的变量,而且你还要用到相应的前缀,这样才能实现代码的真确,还有不能偷懒,比如我把get和put偷懒放在同一个方法中,导致我的代码一输入值就直接说游戏结束,you lose,还是那句话,要细心,不要偷懒。

(5)总结:首先我学会了正则表达式,其次继承中的父类和子类也搞清楚了,其次protected和public和private也搞清楚了关系,但是我觉得pta的题目有点不符合我们现在的要求,比如第四次pta的第二题,我巧了两百行代码,测试点都不知道哪错了,导致我只得了十几分,我觉得pta的题目可以结合我们所学的布置题目,这样我们才不会想做数学题一样那样迷茫,感觉又是做题就想是做数学题不是在敲代码



posted @ 2022-05-09 23:21  我是five啊  阅读(666)  评论(0)    收藏  举报