第二次博客作业
(1):前言
1.题目集 四 前言
本次题目集一共只含有3道题目,但难度相对题目集而言难度增加了许多。第一题是将输入的一段字符串,然后输出与输入行相对应的各个整数之和。主要考察了正则表达式的运用,并且考察了如何将字符串中数字提取并转换为浮点型。第二题的难度为本次习题集中最难的一题,题目为坐标要求按顺序依次输入,连续输入的两个顶点是相邻顶点,第一个和最后一个输入的顶点相邻,并且对点和直线与四边形的位置关系。题目比较复杂,考察的也是正则表达式但是相对于第一题而言,第二题的算法更为复杂,因此难度更大,第三题是编写一个银行业务类BankBusiness并且实现几个常用的功能,相对第二题而言比较简单。
2.期中考试 前言
本次考试一共只含有3道题目,难度适中。第一题是输入两点坐标,探究坐标与坐标形成的直线的关系,主要考察的是类成员public与private的区别,难度相对来说并不难。第二题的难度相对而言也不难,在第一题的基础上运用了继承的知识,添加了一个为element的父类,第三题为在“点与线(继承与多态)”题目基础上,对题目的类设计进行重构,增加容器类保存点、线、面对象,并对该容器进行相应增、删、遍历操作,在第二题的基础上运用了Arraylist的知识,难度也不大。
这两道习题集总体而言难度适中,通过此两道习题集,可以让我们更全面的了解java的知识点。虽然后面两次的习题集的题量并没有很多,但是考察的知识点比较全面,可以让我们运用自己所学的新知识点,让我们可以巩固知识点,对知识点的掌握程度大大提高。通过本次的题目集练习,我所掌握的知识点并不全面,更应该花时间在java这门专业课上。
实验3-1前言
实验内容为:农夫过河问题:一个农夫带着一匹狼、一只羊、一颗白菜要过河,河上只有一条船能够渡河,而且农夫每次最多只能带一个动物或物品过河。当农夫不在的时候狼会吃羊,羊会吃白菜。本次实验难度较为容易,主要考察了Java语言中继承的基本概念及使用方法,以及掌握Java语言中super关键字的使用方法;
两次习题集的得分情况:
习题集四:75分
期中考试:92分
(2):设计与分析
题目集4的7-2:
题目:
如果不符合基本格式,输出"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"。
public static void main(String[] args) { Scanner input=new Scanner(System.in); int flag=0,j=0; String data=input.nextLine(); int le = data.length(); for(int i=0;i<le-1;i++){ if((data.charAt(i)=='+' && data.charAt(i+1)=='+' )||data.charAt(i)==','){ System.out.println("Wrong Format"); return ; } } if(data.charAt(0)=='1'){ flag=1; } else if(data.charAt(0)=='2'){ flag=2; } else if(data.charAt(0)=='3'){ flag=3; } else if(data.charAt(0)=='4'){ flag=4; } else if(data.charAt(0)=='5'){ flag=5; } else{ System.out.println("Wrong Format"); return ; } if(data.charAt(1)!=':'){ System.out.println("Wrong Format"); return ; } // System.out.println("flag="+flag); String array[]=data.split("\\s+"); for(String s:array){ j++; }
设计思路:先判断输入数据所满足的选项,再采用正则表达式,将字符串分割为自己想要的数据,再根据选项所以达到的功能进行编译程序,若输入数据不符合基本格式,则直接输出“格式错误”。
题目集4的7-3:
编写一个测试类Main,在main方法中,先后执行以下操作:
(1)调用BankBusiness类的welcome()方法。
(2)接收键盘输入的用户名、密码信息作为参数,调用BankBusiness类带参数的构造方法,从而创建一个BankBusiness类的对象account。
(3)调用account的存款方法,输入正确的密码,存入若干元。密码及存款金额从键盘输入。
(4)调用account的取款方法,输入错误的密码,试图取款若干元。密码及取款金额从键盘输入。
(5)调用account的取款方法,输入正确的密码,试图取款若干元(取款金额大于余额)。密码及取款金额从键盘输入。
(6)调用account的取款方法,输入正确的密码,试图取款若干元(取款金额小于余额)。密码及取款金额从键盘输入。
(7)调用BankBusiness类的welcomeNext()方法。
public class Main { public static void main(String[] args) { String name,password,password2,password3; double balance,balance2; Scanner input=new Scanner(System.in); //带参数的构造方法,完成开户操作。需要账户名name、密码password信息,同时让账户余额为0。 name=input.next(); password=input.next(); BankBusinness account=new BankBusinness(name,password); account.Welcome(); //用户的存款(deposit)操作(公有方法,需要密码和交易额信息),密码不对时无法存款且提示“您的密码错误!”; //密码正确、完成用户存款操作后,要提示用户的账户余额,例如“您的余额有1000.0元。 password2=input.next(); balance=input.nextDouble(); account.deposit(password2,balance); //用户的取款(withdraw)操作 int i=0; for(;i<3;i++) { password3=input.next(); balance2=input.nextDouble(); account.withdraw(password3, balance2); } account.welcomeNext(); } } class BankBusinness{ public static String bankname ="中国银行"; private String name; private String password; private double balance; BankBusinness(String name,String password){ this.name=name; this.password=password; this.balance=0; } public void deposit(String password2,double balance) { if(!this.password.equals(password2)){ System.out.println("您的密码错误!"); } else { this.balance=balance; System.out.println("您的余额有"+balance+"元。"); } } public void withdraw(String password3,double balance2) { if(!this.password.equals(password3)){ System.out.println("您的密码错误!"); } else { if(this.balance<balance2) { System.out.println("您的余额不足!"); } else { this.balance=this.balance-balance2; System.out.println("请取走钞票,您的余额还有"+balance+"元。"); } } } public BankBusinness() { } public void Welcome() { System.out.println(bankname+"欢迎您的到来!"); } public void welcomeNext() { System.out.println("请收好您的证件和物品,欢迎您下次光临!"); } }
设计思路:先进行开户操作,注册账号,再进行存款取款操作,如果密码输入错误,则输出“您的密码错误”;余额不足输出“您的余额不足!”
期中考试 7-3
题目:
在“点与线(继承与多态)”题目基础上,对题目的类设计进行重构,增加容器类保存点、线、面对象,并对该容器进行相应增、删、遍历操作。
- 在原有类设计的基础上,增加一个GeometryObject容器类,其属性为
ArrayList<Element>
类型的对象(若不了解泛型,可以不使用<Element>
) - 增加该类的
add()
方法及remove(int index)
方法,其功能分别为向容器中增加对象及删除第index - 1
(ArrayList中index>=0)个对象交互
首先从类图分析,Element是抽象类,Plane类,Point类,Line类都是Element的子类,继承了Element的方法,gemoetyObject类中含有add(),remove(),getList()方法,此方法是对
- 1:向容器中增加Point对象
- 2:向容器中增加Line对象
- 3:向容器中增加Plane对象
- 4:删除容器中第index - 1个数据
实验3-1:
题目一个农夫带着一匹狼、一只羊、一颗白菜要过河,河上只有一条船能够渡河,而且农夫每次最多只能带一个动物或物品过河。当农夫不在的时候狼会吃羊,羊会吃白菜。
class fulei{ protected boolean isAlive=true; protected boolean crossRiver=false; protected boolean hasCross=false; public void change() { crossRiver=!crossRiver; } public boolean hascross() { return hasCross; } public void death() { isAlive=false; } public boolean isalive() { return isAlive; } public boolean cross() { return crossRiver; } }
在这里建立了一个fulei类,为Wolf类,Sheep类,Cabbage类的父类,将它们的共同之处都添加进fulei类,解决了程序设计中代码复用。
while(!gameOver) { Boat boat=new Boat(); GameGui.menu(); choice = input.nextInt(); switch(choice) { case 0: gameOver=true; break; case 1:/* 农夫独自过河的处理 */ farmer.change(); break; case 2:/* 农夫带狼的处理 */ if(wolf.cross()==boat.cross()) { farmer.change(); wolf.change(); } else { System.out.println("狼不在这一岸,请重新输入"); continue; } break; case 3:/* 农夫带羊的处理 */ if(sheep.cross()==boat.cross()) { farmer.change(); sheep.change(); } else { System.out.println("羊不在这一岸,请重新输入"); continue; } break; case 4:/* 农夫带白菜的处理 */ if(cabbage.cross()==boat.cross()) { farmer.change(); cabbage.change(); } else { System.out.println("白菜不在这一岸,请重新输入"); continue; } break; }
这段代码为实验的主要代码,设计思路为农夫带狼,羊,白菜过河,如果羊或白菜死亡,则游戏失败,反之,如果狼,羊,白菜全部过河,则游戏胜利,
(3)踩坑心得:
题目集四踩坑心得:
1.7-1
int count=0; String regex = "\\d*"; Pattern p = Pattern.compile(regex); Matcher m = p.matcher(data); while (m.find()) { if (!"".equals(m.group())) { int num2 = Integer.parseInt(m.group());
刚开始不懂如何将字符串中的数字提取出来并且转换为浮点类型,查询csdn将此问题解决。
2.7-2
public class Main { public static boolean isPointInRect(Point p ,Point A, Point B, Point C, Point D) { double a = (B.x - A.x)*(p.y - A.y) - (B.y - A.y)*(p.x - A.x); double b = (C.x - B.x)*(p.y - B.y) - (C.y - B.y)*(p.x - B.x); double c = (D.x - C.x)*(p.y - C.y) - (D.y - C.y)*(p.x - C.x); double d = (A.x - D.x)*(p.y - D.y) - (A.y - D.y)*(p.x - D.x); if((a > 0 && b > 0 && c > 0 && d > 0) || (a < 0 && b < 0 && c < 0 && d < 0)) { return true; } // AB X AP = (b.x - a.x, b.y - a.y) x (p.x - a.x, p.y - a.y) = (b.x - a.x) * (p.y - a.y) - (b.y - a.y) * (p.x - a.x); // BC X BP = (c.x - b.x, c.y - b.y) x (p.x - b.x, p.y - b.y) = (c.x - b.x) * (p.y - b.y) - (c.y - b.y) * (p.x - b.x); return false; } public static boolean isPointonRect(Point p ,Point A, Point B, Point C, Point D) { double a = (B.x - A.x)*(p.y - A.y) - (B.y - A.y)*(p.x - A.x); double b = (C.x - B.x)*(p.y - B.y) - (C.y - B.y)*(p.x - B.x); double c = (D.x - C.x)*(p.y - C.y) - (D.y - C.y)*(p.x - C.x); double d = (A.x - D.x)*(p.y - D.y) - (A.y - D.y)*(p.x - D.x); if((a == 0 || b == 0 ||c == 0 || d ==0) ) { if( (p.x<=Math.max(A.x,B.x)&&p.x>=Math.min(A.x,B.x)&&p.y<=Math.max(A.y,B.y)&&p.y>=Math.min(A.y,B.y))|| (p.x<=Math.max(C.x,B.x)&&p.x>=Math.min(C.x,B.x)&&p.y<=Math.max(C.y,B.y)&&p.y>=Math.min(C.y,B.y))|| (p.x<=Math.max(C.x,D.x)&&p.x>=Math.min(C.x,D.x)&&p.y<=Math.max(C.y,D.y)&&p.y>=Math.min(C.y,D.y))|| (p.x<=Math.max(D.x,A.x)&&p.x>=Math.min(D.x,A.x)&&p.y<=Math.max(A.y,D.y)&&p.y>=Math.min(A.y,D.y)) ){ return true; } } // AB X AP = (b.x - a.x, b.y - a.y) x (p.x - a.x, p.y - a.y) = (b.x - a.x) * (p.y - a.y) - (b.y - a.y) * (p.x - a.x); // BC X BP = (c.x - b.x, c.y - b.y) x (p.x - b.x, p.y - b.y) = (c.x - b.x) * (p.y - b.y) - (c.y - b.y) * (p.x - b.x); return false; } public static boolean IsSBX(Point P1, Point P2, Point P3, Point P4) //判断是否是四边形 { if ((P4.y - P3.y) * (P4.x - P2.x) == (P4.y - P2.y) * (P4.x - P3.x)) return false; else if ((P4.y - P3.y) * (P4.x - P1.x) == (P4.y - P1.y) * (P4.x - P3.x)) return false; else if ((P4.y - P2.y) * (P4.x - P1.x) == (P4.y - P1.y) * (P4.x - P2.x)) return false; else if ((P3.y -P2.y) * (P3.x - P1.x) == (P3.y - P1.y) * (P3.x - P2.x)) return false; //任意三个顶点成直线,非四边形 else return true; } public static boolean triangle(Point p1, Point p2, Point p3, Point p4){ double k1=(p1.x-p3.x)/(p1.y-p3.y); double b1=p1.x-k1*p1.y; double k2=(p2.x-p4.x)/(p2.y-p4.y); double b2=p2.x-k1*p2.y; if(p2.x==p2.y*k1+b1||p4.x==p4.y*k1+b1){ if( (p2.x<=Math.max(p1.x,p3.x)&&p2.x>=Math.min(p1.x,p3.x)&&p2.y<=Math.max(p1.y,p3.y)&&p2.y>=Math.min(p1.y,p3.y))|| (p4.x<=Math.max(p1.x,p3.x)&&p4.x>=Math.min(p1.x,p3.x)&&p4.y<=Math.max(p1.y,p3.y)&&p4.y>=Math.min(p1.y,p3.y)) ){ return true; } } if(p3.x==p3.y*k2+b2||p1.x==p1.y*k2+b2){ if( (p3.x<=Math.max(p2.x,p4.x)&&p3.x>=Math.min(p2.x,p4.x)&&p3.y<=Math.max(p2.y,p4.y)&&p3.y>=Math.min(p2.y,p4.y))|| (p1.x<=Math.max(p2.x,p4.x)&&p1.x>=Math.min(p2.x,p4.x)&&p1.y<=Math.max(p2.y,p4.y)&&p1.y>=Math.min(p2.y,p4.y)) ){ return true; } } return false; }
这个代码可以很好的解决判断输入的四个点是否可以组成四边形的问题。
期中考试踩坑心得:
7-3:
for(int i=0;i<gemoetyObject.getlist().size();i++) { gemoetyObject.getlist().get(i).display(); }
采用了 gemoetyObject.getlist().get(i)的方法,可以很好的解决输出多个类的属性。
实验踩坑心得:
case 0: gameOver=true; break; case 1:/* 农夫独自过河的处理 */ farmer.change(); break; case 2:/* 农夫带狼的处理 */ if(wolf.cross()==boat.cross()) { farmer.change(); wolf.change(); } else { System.out.println("狼不在这一岸,请重新输入"); continue; } break; case 3:/* 农夫带羊的处理 */ if(sheep.cross()==boat.cross()) { farmer.change(); sheep.change(); } else { System.out.println("羊不在这一岸,请重新输入"); continue; } break; case 4:/* 农夫带白菜的处理 */ if(cabbage.cross()==boat.cross()) { farmer.change(); cabbage.change(); } else { System.out.println("白菜不在这一岸,请重新输入"); continue; }
代码出现bug,如果农夫和狼,羊,白菜不在同一岸时,农夫任能带它们过桥,故此建立了一个Boat类,解决了几者不在同一侧的问题。
(4)改进建议:
1.在编写代码时应该注意代码的格式,待到代码出现逻辑问题时可以更加有效的检查出自己的问题出现在哪里,可以大大的加大自己的效率。
2.在编写代码时应该采用多种函数的方法,可以更加有效的运行代码,能够把复杂的任务划分成更小、更简单的任务,从而大大减少我们程序的整体复杂性。
3.还有就是要善于用Java中一些功能方便的类,这样可以大大的提高我们的解题效率。
4.设计思维的改进,在每次写代码解题之前就想清楚,各个类之间的关系,以及这个类有怎样的功能,该承担怎样的职责,把这些全部想清楚这样就在写代码时大大的提高了我们的效率。
5.在进行代码的编写时应该尽量避免代码的重复编写,使我的代码更加的简洁.
6,在进行代码的编译时,不应该只有单调的一个了类。
(5) 总结:
1.通过三次的题目集,我了解了如何快速的、有效的、正确的编写程序,尤其是习题四的(7-2)和习题三的(7-3),因为这两道题是所以题目集中难度最高的,所以做作业时花费了大量的时间在这两题上,所以通过这两道题使得我的编程能力大大的加强了。
2.在写题目集的过程中,我了解了在编程的时候使用注释的好处,当自己在测试程序的功能的时候出现bug时,可以快速的寻找注释,更加快速的寻找到测试该功能的代码,方便我的修改和优良。
3.在本次的题目集中,我只使用了一个主函数类,并没有加入多余的类,使得我的代码更加的单调,在后面的题目集中,我应该尝试更多的类,从而使我们的代码更加的简洁,且实现功能。
4.通过此次题目集练习,我的编程能力有了很大的提升,自己的逻辑能力也有了较大的提高。