java四五次大作业和期中考试总结
一. 前言:
#不包代码4000多字
1)第四次大作业:
知识点:
@ 主要是在第三次大作业的基础上增加错误输入的处理,考察对输入错误样例的考虑的周全性。
@ 考察对字符串处理能力,学习并了解各种处理字符串的方法,并将其灵活运用至程序中。
@ 我在作业中运用到了大量动态数组,所以知识点主要涉及动态数组相关知识的使用。
@ 因为要对输入错误的字符进行判定,所以程序中我大量使用了正则表达式以便快速判断输入字符是否合法。
@ 为了更方便的处理字符串,我建立了一个方法类(可能有违java的常用习惯),里面包含了各种方法,包括判断所输入字符是否为数字的boolean isDigit(String str)方法,还有处理重复删除、计算折扣等各种方法,这样在主方法中就只需要new一个新的的方法类对象即可以快速使用各种方法。
@ 为了控制动态数组里面的存储数据正确性,我还写了好多个控制增加数据的控制变量。
题量:只有一道题,题量肯定不大啦。
难度:对于我来说算是挺难的。关键是我前面一直拖着的,所以我得从以前的开始补起,这花了我好几天的时间,熬夜熬了好几个晚上,说起来也是比较痛苦的,但又特别的有意义。
2)第五次大作业:
知识点:
@ 这次大作业主要是在作业3基础上对其进行修改的,其和菜单计价程序-4同属菜单计价程序-3的两个不同迭代分支。主要是对特色菜进行了进一步的调整,增加了川菜、晋菜、浙菜和辣度、酸度、甜度这几个新概念。
@ 变化的地方主要集中在输入的东西和算法这两个方面,所以我先从输入方面对其进行修改,而再此之前,我先得有一个特色菜的概念,本来想使用继承,但是基础不扎实,所以我选择了在Dish类中新增加了一个属性T,用来判断是否为特色菜;在Menu菜单类中我修改了addDish方法;在Record订单类中我增加了spicy辣味、acid酸味、sweet甜味这几个属性,用来记录单条订单中酸度、辣度和甜度,以便之后的计算;在Order类中我新增了aveSpicy0、aveAcid0、aveSweet0这几个属性,用来记录每桌菜的平均口味,并对addRecord方法进行修改,此外还新添了一个void aveTaste(Order order)方法用来进行对平均辣度的计算。
@ 值得一提的是我对Table类进行了比较大的修改,在里面新增了repeatNote控制重复输入、还有记录当桌的总价allPP属性、记录客户电话号码和客户名字的字符串TelePhone、personName这几个属性。方法而言,我增加了用来判断口味程度并获取的三个方法,分别为String getSpicy(Order order)、String getAcid(Order order)、String getSweet(Order order)。
@ 另外,在方法类中增加了int findTable(ArrayList<Table> tables,String tableNum)方法用来找到所对应的桌号包含的数据和int repeatTable(Table table1,int jj,ArrayList<Table> tables,int P)方法用来判断是否重复输入点单的桌数据。
题量: 只有一题,题量不大。
难度:对我而言题目难度较大,但好在我已经基本赶上来了,所以上手较快。
3)期中考试题目集:
#题量:一共有4道,不多。
(1)第一题:《测验1-圆类设计》
知识点:
@ 考的是最基础的知识,比较关键的不过就是私有属性,但是不用也能过测试点。
@ 还有个关键的地方就是关于输出时使用的String.format("%.2f",area)方法对输出的数据保留几位小数的问题。
难度: 简单。
(2)第二题:《测验2-类结构设计》
知识点:
@ 根据类图写代码实现相应的功能。
@ 知道如何看懂类图,处理好类与类之间的关系。
@ 知道如何使用Math.方法。
难度:简单。
(3)第三题:《 测验3-继承与多态》
知识点:
@ 学会看懂类图。
@ 知道怎么使用继承与多态,如何创建抽象类,处理子类与父类之间的关系。
@ 知道如何使用instanceof关键字。
@ 本题要将一二题中的类都放进来,所以要进行判断。
难度:难度一般。
(4)第四题:《测验4-抽象类与接口》
知识点:
@ 知道如何重构类设计。
@ 知道怎么使用接口。
@ 知道怎么按升序排序输出列表中各图形的面积。
难度:难度对于我来说是有点难度的,原因是原因是我不太明白“提示:题目中Shape类要实现Comparable 接口。”这句话的意思,还是基础不扎实,对java中的一些知识不甚了解。
二.设计和分析:
菜单计价程序4代码截图如下(可放大观看):





菜单计价程序5代码截图如下(可放大观看):










下面是期中考试的代码截图:
一、

二、

三、由于太长了截图不方便直接上代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
int choice = input.nextInt();
switch(choice) {
case 1://Circle
double radiums = input.nextDouble();
if(radiums<=0)
{
System.out.println("Wrong Format");break;}
Shape circle = new Circle(radiums);
printArea(circle);
break;
case 2://Rectangle
double x1 = input.nextDouble();
double y1 = input.nextDouble();
double x2 = input.nextDouble();
double y2 = input.nextDouble();
Point leftTopPoint = new Point(x1,y1);
Point lowerRightPoint = new Point(x2,y2);
Rectangle rectangle = new Rectangle(leftTopPoint,lowerRightPoint);
printArea(rectangle);
break;
}
}
public static void printArea(Shape re) {
if(re instanceof Circle)
System.out.println(String.format("%.2f",re.getArea()));
else if(re instanceof Rectangle)
System.out.println( String.format("%.2f",re.getArea()));
}
}
class Rectangle extends Shape{
Point leftTopPoint ;
Point lowerRightPoint ;
private double area;
Rectangle(Point leftTopPoint,Point lowerRightPoint){
this.leftTopPoint=leftTopPoint;
this.lowerRightPoint=lowerRightPoint;
area();
}
void area(){
this.area= Math.abs((this.leftTopPoint.x-this.lowerRightPoint.x))*Math.abs((this.leftTopPoint.y-this.lowerRightPoint.y));
}
public double getArea(){
return this.area;
}
}
abstract class Shape{
public void Sharp(){}
public double getArea(){return 1;}
}
class Circle extends Shape{
private double radiums;
private double area;
Circle(double radiums){
this.radiums=radiums;
area(radiums);
}
void setR(double r){
this.radiums=r;
}
double getR(){
return this.radiums;
}
void area(double r){
double area=0;
area=Math.PI*r*r;
this.area=area;
}
public double getArea() {
return this.area;
}
}
class Point{
double x;
double y;
Point(double x,double y){
this.x=x;
this.y=y;
}
}
四、
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Comparator;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
ArrayList<Shape> list = new ArrayList<>();
int choice = input.nextInt();
while(choice != 0) {
switch(choice) {
case 1://Circle
double radiums = input.nextDouble();
Shape circle = new Circle(radiums);
list.add(circle);
break;
case 2://Rectangle
double x1 = input.nextDouble();
double y1 = input.nextDouble();
double x2 = input.nextDouble();
double y2 = input.nextDouble();
Point leftTopPoint = new Point(x1,y1);
Point lowerRightPoint = new Point(x2,y2);
Rectangle rectangle = new Rectangle(leftTopPoint,lowerRightPoint);
list.add(rectangle);
break;
}
choice = input.nextInt();
}
list.sort(Comparator.naturalOrder());//正向排序
for(int i = 0; i < list.size(); i++) {
System.out.print(String.format("%.2f", list.get(i).getArea()) + " ");
}
}
}
abstract class Shape implements Comparator{
public static void naturalOrder( ){
}
public void Sharp(){}
public double getArea(){return 1;}
}
class Rectangle extends Shape{
Point leftTopPoint ;
Point lowerRightPoint ;
private double area;
Rectangle(Point leftTopPoint,Point lowerRightPoint){
this.leftTopPoint=leftTopPoint;
this.lowerRightPoint=lowerRightPoint;
area();
}
void area(){
this.area= Math.abs((this.leftTopPoint.x-this.lowerRightPoint.x))*Math.abs((this.leftTopPoint.y-this.lowerRightPoint.y));
}
public double getArea(){
return this.area;
}
@Override
public int compare(Object o1, Object o2) {
return 0;
}
}
class Circle extends Shape{
private double radiums;
private double area;
Circle(double radiums){
this.radiums=radiums;
area(radiums);
}
void setR(double r){
this.radiums=r;
}
double getR(){
return this.radiums;
}
void area(double r){
double area=0;
area=Math.PI*r*r;
this.area=area;
}
public double getArea() {
return this.area;
}
@Override
public int compare(Object o1, Object o2) {
return 0;
}
}
class Point{
double x;
double y;
Point(double x,double y){
this.x=x;
this.y=y;
}
}
如下是相应菜单计价4和5类图和SourceMonitor的生成报表内容:




通过上面的类图和计算平均复杂度的表格我们知道我所写的代码还存在很大的缺陷,平均复杂度过高,不符合java语言的低复杂度的特点。然后最大的败笔就是期中考试最后一题没写出来,主要还是由于我某一方面的知识不足,由此可见我还需要多多看书,学习关于java的更多相关知识,这样才能写出更好的代码,实现相应的功能。
三.踩坑心得:
1.在菜单计价程序4中有很多坑,下面我一个一个对其进行分析:(由于当时截止之前并未写出故只能提供ideal测试截图)
@ 由于我是从作业2开始一个一个补上来的,所以我在一两个地方卡了很久,就是动态数组越界以及赋空的问题,由 于对动态数组使用的不熟练,在这我的代码一直无法完成编译,直到作业4截止后的凌晨一点才终于解决这个问 题,不得不说是很惨的了。而这知识完成了作业三的修改。
@ 之后又奋斗了几天继续修改代码,其中碰到的一个坑就是对时间的处理,由于知识不够,我找寻了资料知道可以使用date.getDayOfWeek().getValue()判断日期是星期几,后面又将其转化为秒来判断点菜时间是否在营业时间之内。
@ 然后就是如何处理输入的问题,由于和作业3的输入内容不一样,所以我得考虑如何将这些数据存进去。
@ 因为这次作业主要是针对非法输入的问题,要对输入内容进行大量的判断,所以我想到了正则表达式,这节省了我很多功夫,不得不说正则表达式真的非常方便。
@ 还有就是重复删除的问题,我新加了一个动态数组记录删除的信息,但是发现一直显示数组为空,经过不断地思考、修改和查询资料,我知道可以使用ArrayList中的isEmpty()方法判断动态数组是否为空来解决数组为空的问题,同时还学会使用动态数组中的remove()方法对里面的数据进行删除,clear()方法清空所有数组中的数据。
@ 然后就是像1 num out of range 16和 2 portion out of range 4这种问题,我直接加了几个控制变量实现功能,算是小坑。
@ 混合错误:桌号信息格式错误+混合的菜谱信息。对于这个问题我使用了正则表达式以及写了相关方法对点菜时间非法进行判断,混合菜谱信息则有加了一个控制变量实现判断。
@ “tab le 2 2023/3/15 12/00/00”这是一个比较难解决的错误输入,想了很久,最后在同学那里找到灵感,可以判断第二个字符是否为数字来判断输入是否合法,为此我在方法类中加了判断字符串中是否只含数字的方法。




2.在菜单计价程序5中也有很多坑,下面我一个一个对其进行分析:
@ 这是从第三次作业的基础上进行修改的,变化主要是增加了口味和特色菜类型,比较大的坑是我本身算法的问题,由于我是先计算了总价后再将其乘折扣,结果发现之后要加特色菜直接导致整个算法体系崩溃,这迫使我不得不重新写过算法,思路就是通过一个一个计算单个菜价然后根据是否为特色菜乘相应的折扣。
@ 最大的坑我想就是代点菜的坑了,你得将带点菜所代点的桌号找到,这个我写了找到桌号的方法,然后记录代点的菜是否为特色菜,如果是那是怎样的特色菜,然后还要加口味,记录价格,将其加到另一桌上去,特别麻烦。
@ 修改类也是一个大难题,你必须找到合适的地方对其进行改进,还要增加一系列的方法和属性,例如在Dish中加T这个判断是否为特色菜的属性;对Menu 类进行修改;在Record中加口味程度;在Order中有记录本桌代点菜的数量、口味,以及计算本桌平均的口味、记录其特色菜点菜数、计算有折扣和无折扣的价格,在Table类中记录本桌总价格,顾客姓名及联系方式、获取口味度等等。
@ 再者就是修改输出的方法,使其能够按照题目要求进行输出,万万没想到的测试点竟是在没有点特色菜的时候后面还要有一个空格,真的是无法想象的大坑。
@ 其中有一个比较麻烦的是要对同一顾客点的桌进行合并,这个我对其动态数组进行遍历实现了,关键是要进行排序输出,这个我觉得我最巧妙的一点是将字符串全部加了起来,然后用Collections.sort(String)方法对其进行排序,并遍历进行输出,这太巧妙了,一下省了我好多的功夫,节省了很多时间,不得不说,有时候知道关于java中已经写好的方法可以节省自己许多时间。
@ 关于重复输入桌的事我则是单独写了一个方法对其进行判断,从主方法中传入了各种数据最后才实现了相关功能。
@ 最后,还有的坑实在没找到,不知道到底哪里有问题。


3.期中考试:
@ 最关键的就是第四题了,由于接口那里学的实在不怎么样,以至于我实在不知道如何写代码,后面考虑了一下,如果不按照题目要求的那样使用接口好像可以写出来,但是不太符合题意,总而言之,就是基础知识不够。


三、主要困难以及改进建议
主要困难: 我主要困难就是对java中的一些东西不够了解,像接口那里,又比如动态数组那块,以至于我花了很多时间在查资料,写大作业时最大的困难就是动态数组总是遇到数组越界以及数组为空或返回空导致无法编译的问题,这些都花了我好长时间去调试找到问题并解决。当然,现在写出的代码还是存在不少的问题,这需要我进一步去完善代码,使其更加的符合java这门语言的习惯。
困难与改进建议: 首先就是动态数组返回空的问题,对于这个问题我是通过一步一步进行调试发现具体在哪里空了,对于空数组通过java中已经写好的isEmpty()判断数组是否为空。然后就是对日期的处理,如何计算日期是周几,对于这个问题我选择了使用java中已经写好的getDayOfWeek()函数对其进行计算。接着就是整体算法的问题,因为加了特色菜的原因,所以我只能改进算法,之前是将所有的价格算出后乘折扣,这不符合特色菜的算法,也就是很难使其与特色菜匹配,所以最后只能改为一道一道进行计算。最后,也就是本身代码的结构问题,我的代码不太符合java的使用习惯,可复用性不高,本来特色菜最好是用继承来进行处理的,但是由于本身学的不太好,所以只能这样,并且由于菜单5是在菜单3的基础上进行修改的,所以菜单4的非法输入功能菜单5没有,这对于整个菜单的完备性不够好,对于以后的代码改进也不友好。
五、总结
这几次的大作业让我受益很深,而期中考试又让我发现了我最大的不足之处,通过这几次的大作业,我对Java“一切皆类,面向对象”的特点有了更深层次的理解,懂得如何创建类与对象同时,我也明白了合理利用网络资源自学的重要性。在写作业4和5的时候,我学到了好多关于动态数组的知识,知道如何去找到并解决动态数组经常遇见的问题,同时也知道如何对输入的日期进行相应的处理以及格式化,如何使用判断字符串是否为数字、如何对字符串进行排序等。值得一提的是,我发现学习面向对象语言时,我们必须要沉下心来,要学会思考,就算有的问题思考几个小时都可能解决不了,但只要你一直去思考并不断尝试就总是会想到解决方法,因为java中有很多类是可以更加方便地帮助我们解决问题,我们需要耐心的去寻找这类资源并学习,不能一味求快,急于求成,否则这样会事半功倍,严重可能会打消我们学习积极性。然后就是,经过这次的期中考试,我发现我学的并不扎实,还有好多地方存在不足,未来我还需要加倍努力,对不足之处加以弥补。
对于课程的教学,我希望老师能够更多的站在我们学生本身的角度来看待,还有就是有时候下面好多人都还没有弄懂上一个东西老师就讲到下一个知识点了,我希望老师能够多多问一问下面的同学是否弄明白了上一个知识点。当然,我们学生也有几点做的不好,就是说很少有人去主动问老师问题,不懂得东西也一直就让它搁在那里。
浙公网安备 33010602011771号