前言

第一次作业主要学习了Java语言的基础语法,变量,数据类型,运算符,控制流程等,此前在c语言的课程学习中已经有所得,总的来说难度不大,题量较多但不难,但是里面有一道判断三角形类型的题关于判断条件我有些不解。
第二次作业相比起第一次可难多了,就像是刚学会二元一次方程组的学生开始着笔算微积分一样,有些题写了很久,仍旧不能得到满分,题量较多,难度有难有易吧,反正从第一次跳转到第二次还是有难度的。
第三次作业开始展现了Java面向对象的特征了,复杂难度跳跃太大,尤其是那道65分的题,实在是太难了,难怪他配得上65分,其他三题还算是简单的,但是第一题还是没有获得满分,十分遗憾。

设计与分析

题目集2-7-1

这道题要求创建学生类,包含

属性:学号(String)、姓名(String)、语文成绩(int)、数学成绩(int)、物理成绩(int)

方法:计算总分、计算平均分

输入5个学生的信息,将每个学生的信息封装在一个学生对象中。
我编写的代码如下:
import java.util.Scanner;
public class Main{
public static class student{
private String stu_id;
private String name;
private int chinese;
private int math;
private int physical;
public int all_score(int x,int y,int z){
return x+y+z;
}
public double average(int x,int y,int z){
return (x+y+z)/3.0;
}
}

public static void main(String[] args){
    Scanner input = new Scanner(System.in);
    student[] stus= new student[5];
    for (int i=0;i<5;i++)
    {
        stus[i] = new student();
        stus[i].stu_id=input.next();
        stus[i].name=input.next();
        stus[i].chinese=input.nextInt();
        stus[i].math=input.nextInt();
        stus[i].physical=input.nextInt();
        }
    for (int i=0;i<5;i++)
        System.out.printf("%s %s %d %.2f\n",stus[i].stu_id,stus[i].name,stus[i].all_score(stus[i].chinese,stus[i].math,stus[i].physical),stus[i].average(stus[i].chinese,stus[i].math,stus[i].physical));
}

}`

题目集2-7-2

题目要求创建成绩类,包含:

属性:平时成绩(int)、期末成绩(int)

方法:计算总成绩(计算规则:平时成绩0.4+期末成绩0.6,保留整数部分,小数部分直接丢弃)

创建学生类,包含:

属性:学号(String)、姓名(String)、语文成绩(成绩类)、数学成绩(成绩类)、物理成绩(成绩类)

方法:计算总分、计算平均分

输入3个学生的信息,将每个学生的信息封装在一个学生对象中。

按输入顺序依次输出3个学生的总分、平均分(精确到小数点后两位,舍去部分按四舍五入规则计入最后一位)。
我编写的代码如下:
`import java.util.Scanner;

public class Main{
public static class student{
private String stu_id;
private String name;
private int chinese;
private int math;
private int physical;
public int all_score(int x,int y,int z){
return x+y+z;
}
public double average(int x,int y,int z){
return (x+y+z)/3.0;
}
}
public static class score{
private int usualscores;
private int finalscores;
public int sumscore(int x,int y){
return (int)(x0.4+y0.6);
}

}
 public static void main(String[] args){
    Scanner input = new Scanner(System.in);
    student[] stu= new student[3];
     score[][] sco=new score[3][3];
     for(int i=0;i<3;i++)
     {
         for(int j=0;j<3;j++)
         {
             stu[i]=new student();
             sco[i][j]=new score();
         stu[i].stu_id=input.next();
         stu[i].name=input.next();
             input.next();
             sco[i][j].usualscores=input.nextInt();
             sco[i][j].finalscores=input.nextInt();
             
         }
         stu[i].chinese= sco[i][0].sumscore(sco[i][0].usualscores,sco[i][0].finalscores);
        stu[i].math= sco[i][1].sumscore(sco[i][1].usualscores,sco[i][1].finalscores);
         stu[i].physical= sco[i][2].sumscore(sco[i][2].usualscores,sco[i][2].finalscores);
     }
     for(int i=0;i<3;i++)
     {
         double x=stu[i].average(sco[i][0].usualscores,sco[i][1].usualscores,sco[i][2].usualscores);
         double y=stu[i].average(sco[i][0].finalscores,sco[i][1].finalscores,sco[i][2].finalscores);
         double z=stu[i].average(stu[i].chinese,stu[i].math,stu[i].physical);
             System.out.printf("%s %s %d %.2f %.2f %.2f\n",stu[i].stu_id,stu[i].name,stu[i].all_score(stu[i].chinese, stu[i].math, stu[i].physical),x,y,z);
     }
 }

}`
这道题一开始数据总是会差一点,跟输出的样例不一样,后来才发现是题目说保留整数部分不是最后的结果保留整数部分,是每一个成绩计算结果都直接丢弃小数,例如平时成绩*0.4时需要保留整数部分,这部分修改比较多,特别是这种参数比较多,每次都要修改许多,通过这个问题我觉得以后还是得取简单点的名字或者搞个缩写代替,太冗长了自己都容易看串。

题目集3-7-2

题目对输入输出的格式还有要求太高了,实在是难以写出能运行的代码,最终也是以零分告终,光是类就有七个,还要将他们分别联系起来,我还需要时间沉淀。

菜单计价题目

某饭店提供4种菜,每种菜品的基础价格如下:
西红柿炒蛋 15
清炒土豆丝 12
麻婆豆腐 12
油淋生菜 9

设计点菜计价程序,根据输入的订单,计算并输出总价格。
订单由一条或多条点菜记录组成,每条记录一行,最后以"end"结束
每条点菜记录包含:菜名、份额两个信息。
份额可选项包括:1、2、3,分别代表小、中、大份)

不同份额菜价的计算方法:
小份菜的价格=菜品的基础价格。
中份菜的价格=菜品的基础价格1.5。
小份菜的价格=菜品的基础价格2。
如果计算出现小数,按四舍五入的规则进行处理。

参考以下类的模板进行设计:
菜品类:对应菜谱上一道菜的信息。
Dish {
String name;//菜品名称
int unit_price; //单价
int getPrice(int portion)//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份)
}

菜谱类:对应菜谱,包含饭店提供的所有菜的信息。
Menu {
Dish[] dishs ;//菜品数组,保存所有菜品信息
Dish searthDish(String dishName)//根据菜名在菜谱中查找菜品信息,返回Dish对象。
}

点菜记录类:保存订单上的一道菜品记录
Record {
Dish d;//菜品
int portion;//份额(1/2/3代表小/中/大份)
int getPrice()//计价,计算本条记录的价格
}

订单类:保存用户点的所有菜的信息。
Order {
Record[] records;//保存订单上每一道的记录
int getTotalPrice()//计算订单的总价
Record addARecord(String dishName,int portion)
//添加一条菜品信息到订单中。
}
我编写的代码如下:`import java.util.Scanner;

class Dish {
String name; // 菜品名称
int unit_price; // 单价

int getPrice(int portion) {
    int lastPrice = 0;
    switch (portion) {
        case 1:
            lastPrice = unit_price;
            break;
        case 2:
            lastPrice = (int) Math.round(unit_price * 1.5);
            break;
        case 3:
            lastPrice = (int) Math.round(unit_price * 2);
            break;
    }
    return lastPrice;
}

}

class Menu {
static Dish[] dishs=new Dish[4];

static Dish searchDish(String dishName) {
    for (Dish dish : dishs) {
        if (dish.name.equals(dishName)) {
            return dish;
        }
    }
    return null;
}

}

class Record {
Dish d;
int portion;

int getPrice() {
    return d.getPrice(portion);
}

}

class Order {
Record[] records;
int count;

Order() {
    records = new Record[100];
    count = 0;
}

int getTotalPrice() {
    int totalPrice = 0;
    for (int i = 0; i < count; i++) {
        totalPrice += records[i].getPrice();
    }
    return totalPrice;
}

void addARecord(String dishName, int portion) {
    Dish dish = Menu.searchDish(dishName);
    if (dish == null) {
        System.out.println(dishName + " does not exist");
        return;
    }
    Record record = new Record();
    record.d = dish;
    record.portion = portion;
    records[count++] = record;
}

}
public class Main { public static void main(String[] args) { Menu menu = new Menu(); Scanner input = new Scanner(System.in); String dish; String[] menuItems = new String[4]; menuItems[0] = "西红柿炒蛋"; menuItems[1] = "清炒土豆丝"; menuItems[2] = "麻婆豆腐"; menuItems[3] = "油淋生菜"; int[] prices = {15, 12, 12, 9}; menu.dishs = new Dish[4]; for (int i = 0; i < 4; i++) { Dish dish1 = new Dish(); dish1.name = menuItems[i]; dish1.unit_price = prices[i]; menu.dishs[i] = dish1; } Order order = new Order(); while (true) { String orderInfo = input.nextLine(); if (orderInfo.equals("end")) { break; } String[] orderItems = orderInfo.split(" "); String dishName = orderItems[0]; int portion = Integer.parseInt(orderItems[1]); order.addARecord(dishName, portion); } int totalPrice = order.getTotalPrice(); System.out.println(totalPrice); } } //Order类中使用动态数组records存储多条记录,并提供了计算订单总价格的方法getTotalPrice和添加一条记录的方法addARecord,通过循环读取用户输入的菜品和份数,调用addARecord方法添加记录最终实现输出订单总价格。

踩坑心得

1.可以多上网查下有什么包里面的语句是可以用的上的,不要一个劲的自己生想,会浪费很多时间,当你一搜索,你会发现有很多方便的方法,在这个网络时代,要学会利用网络,或者在B站看看什么入门教程,然后自己尝试着使用,特别是像计算日期的题目,关于日期格式,判断闰年,判断早晚,两日期之间的间隔等都是有专门的包专门的语句可以用的,不要一个人用自己那套死板的算法去判断。
2.在关于类的题目里,分析好什么东西属于什么类即分类是很重要的,而我感觉我就缺乏了这个能力,在菜单计价题目里面,题目里面已经告诉我们有哪些类,类里面包含了哪些属性,根据这个我就会有思路怎么去写,但是在题目集三里面那道学生的题目,没有告诉我那些类里面应该有什么,便显得艰难无比了。
3.类名与文件名不一致
在编译器进行编译中,每个类都需要保存在一个单独的.java文件中,并且文件名必须与公共类名相同。如果文件名与类名不一致,将会导致编译错误。一开始我还不知道这个,我用的都是main,不管怎样都编译错误。
4.类型转换错误
Java是一种强类型语言,需要进行显式类型转换。如果类型转换错误,将会导致编译错误或者运行时异常的情况发生。例如很多题目最后都是计算出来会有小数结果的,最后可以在计算中强制类型转换变成dobble类型,这样才不会报错。
5.变量作用域问题
变量的作用域指的是变量在程序中可以被访问的范围。如果变量的作用域设置不当,可能会导致程序出现逻辑错误。public和private可以使用的范围不能搞混。

主要困难以及改进建议

关于三角形判断等腰直角三角形条件时,我的代码当时对我来说有些困惑。如下
if(a+b>c&&a+c>b&&b+c>a) { if(a==b&&b==c) System.out.println("Equilateral triangle"); else if((a==b&&a*a+b*b==c*c)||(b==c&&b*b+c*c==a*a)||(a==c&&a*a+c*c==b*b)) { System.out.println("Isosceles right-angled triangle"); }
在判断两边相等后得到的结果是
输入1 1 1.4(即根号2保留一位小数)后竟然得到的结果只是等腰三角形,他无法判断是不是直角,后来我发现只要将代码改成如下 if(a+b>c&&a+c>b&&b+c>a) { if(a==b&&b==c) System.out.println("Equilateral triangle"); else if((a==b&&a*a+b*b-c*c<0.0001)||(b==c&&b*b+c*c-a*a<0.0001)||(a==c&&a*a+c*c-b*b<0.0001)) { System.out.println("Isosceles right-angled triangle"); }便能成功,因为在学习中我们一直被灌输的是等腰直角三角形判断依据是a==b&&a*a+b*b==c*c,但是在这道题里面我们没法输入根号几,我们只能输入一个最多保留一位小数的数值,因此只要两者之差小于0.0001就行了,甚至还可以少一点零。

总结

本阶段三次题目集的题目品质都是极高的,很好的把重点融入到题目中,让我们能够在不断地调试与改进中发现自己的不足以及能够及时修改,对于学习Java,也有了巨大的收获,学习到了如何封装,如何分类,如何通过编译器的提示找出自己的BUG,对于自己的建议还有就是代码总是不够简洁,而且通常想出来的算法效率较低,对于算法的学习还需要深入,还有就是对题目的分析,不可以偏解,哪部分保留小数就在哪部分先写好了,不要最后再来保留,否则就会有一些边角料影响结果的正确性,大大降低写代码的速度和修改速度。对于Java这门课程,我要学习的还有很多,我也希望能一直保持一颗渴望探索的心。蔡老师教的很好,就是希望作业难度适中一点,能够激发学生主动思考和学习,创造更加有趣的课堂氛围,促进学生全面发展。

posted on 2023-10-07 21:40  香香螺蛳粉  阅读(14)  评论(0编辑  收藏  举报