博客3

课程管理系统及其他

作业6-8

前言:

难度上:由于项目的逐渐增加,题目要求变多,测试点变多,客观而言是不断递增的。主观上而言,第一次,三次是比较难的。由于第一次是开始搭建一个程序,所以是相对难的,并且其给的测试点相对较少而且其测试点的覆盖面比较的窄,只能覆盖一部分的运行样例。第三次给的程序其实与第二次给的有冲突,需要在第二次的基础上修改才可以。

知识点上:三次的课程管理系统知识点其实是差不多的, 他们的知识点的内容都差不多,只是第三次和第二次引入了动态数组储存,其中的实验成绩更多的则是对程序非常奇怪的地方的修改,添加了许多的flag。还有就是对错误输入,输入的判断使用了正则表达式第二三次中的错误类型更加的多,包括没有任何成绩,没有课程成输入课程和考核方式不匹配,超出范围,输入错误权重值不等于一其中权重值不等于一,要考虑到JAVA中浮点型的计算会有一些错误对于JAVA的自定义接口中使用了int类型的站,这种站使用帮我们更好的理解了这一种类型。

 

设计与分析:

1.对浮点型中计算可能存在的误差处理

if(Math.abs(sum-1)>0.001){
    System.out.println(lines[0]+" : weight value error");
    continue;
}

 

  1. 对各种输入错误的处理及解释

kaoShi kaoShi1 = new kaoShi();
Course course = allCourse.findCourse(lines[2]);
int score = (int)(course.quan.get(0)*Integer.parseInt(lines[3])+course.quan.get(1)*Integer.parseInt(lines[4]));
kaoShi1.get(score);
if(kaoShi1.score == -1){
    System.out.println("wrong format");
    continue;
}
if(allCourse.findCourse(lines[2]) == null){
    System.out.println(lines[2] + " does not exist");
    addFlag = false;
}
else if(allCourse.findCourse(lines[2]).kaoFlag != 1){
    System.out.println(lines[0] + " " + lines[1] + " : access mode mismatch");
    addFlag = false;
}
else
{
    if (kaoShi1.score == -1) {
        addClassFlag = false;
        addFlag = false;
    }
    chooseClass chooseClass = new chooseClass(lines[2], lines[0], kaoShi1);

    if (chooseClass.className != null && allChoose.findChoose(chooseClass) == false && addFlag == true) {
        allChoose.chooseClass(chooseClass);
    } else {
        addClassFlag = false;
        System.out.println("wrong format");
    }
}

 

其中采用了很多的flag以便对其进行正确处理。

我采用了判断数组长度进行对每一行的处理。包括对课程,选课,成绩,个人,班级的录入。

其中的判断由于需要对各种错误的考虑,所以要对各个部分认真处理。

在编写处理数组长度的逻辑时,需要考虑到各种可能的情况和错误,以确保程序正确处理数据且不会崩溃。以下是建议的扩充:

 

1. 增加对数组长度的检查:在处理数组时,需要添加对数组长度是否为零或是否超出预期范围的检查,以防止越界或数组为空的错误。

 

2. 增加对读入数据格式的检查:对于输入的数据格式,需要进行严格的检查,以保证输入正确,防止出现格式错误。

 

3. 增加对数据类型的检查:对于输入的数据类型,需要确定其是否正确,特别是在进行计算等操作时,需要确保数据类型一致且不含有非法字符。

 

4. 增加异常处理:根据实际情况,增加适当的异常处理机制,例如对文件读写失败、网络连接中断、数据异常等情况进行处理,以防止程序崩溃或使用者无法正常使用程序。

 

5. 增加对输入数据范围的校验:对于输入数据的范围,要进行判断,保证不会存在过小或过大的数据,以确保算法的正确性和效率。

 

6. 增加对输入数据的去重:对于输入的数据,如果存在相同或重复的内容,需要对其进行去重,以避免重复计算和错误结果的出现。

 

  1. 增加数据的异常处理:在进行数据操作时,需要考虑到数据的异常情况,例如除数为0,负数下标等等,并且为了保证程序的稳定性和数据的安全性而进行特殊处理。

 

  1. 对各个部分成绩的输出

allClass.paiXv();
allClass.studentGrade(allChoose);   //输出每个人的
allCourse.printCourse(allChoose);
allClass.gradePrint();

采用一下方法对学生平均成绩输出,课程平均成绩的输出,班级平均成绩的输出

 

 

 

 

 

8中对接口题目以public Integer pop();   //出栈,如果为空,则返回null。出栈时只移动栈顶指针,相应位置不置为null

    public Integer peek();  //获得栈顶元素,如果为空,则返回null.

    public boolean empty(); //如果为空返回true

public int size();      //返回栈中元素个数

 

为主,对方法进行完善,具体内容比较难,需要自学。

以以下为例

class ArrayIntegerStack implements IntegerStack{

    private int a[];

    private int end=0;

 

    public ArrayIntegerStack(int num) {

        a=new int[num];

    }

 

然后则是对输出的处理与完善

包括

输入n,建立可包含n个元素的ArrayIntegerStack对象

输入m个值,均入栈。每次入栈均打印入栈返回结果。

输出栈顶元素,输出是否为空,输出size

使用Arrays.toString()输出内部数组中的值。

输入x,然后出栈x次,每次出栈均打印。

输出栈顶元素,输出是否为空,输出size

使用Arrays.toString()输出内部数组中的值。

 

容器-ArrayList-排序

这个题目相对简单

但是为了程序的合理与安全

任然需要注意:

    public String getId() {

        return id;

}

采用类似以下方法对其进行处理,避免直接对私有部分的处理,而是通过class内部的方法对其进行处理与输入,输出。

 

 

 jmu-Java-02基本语法-03-身份证排序

这个题目关键在于排序,于是我主要对其采用了以下的处理方法

,对其进行对比,然后排序;

   idNum.idNum.sort(new Comparator<idNum>() {

            @Override

            public int compare(idNum id1, idNum id2) {

                return id1.dayNum.compareTo(id2.dayNum);

            }

        });

 

7-1 容器-HashMap-检索

主要就是了解hashmap中的键和桶。了解后就可以试用

HashMap<String,student> students = new HashMap<>();

其中是以hashmap的学生学号为键对其进行处理的,可以找到该学生信息,然后输出

踩坑心得:

第一次踩坑,主要是在读题不准确,然后就是需要对改程序反复修改,才能完善。所以还是要写想好程序结构,在开始写才能事半功倍。

 

第二次作业的踩坑主要是在于重新对整个题目进行面向对象的设计,第一个问题就是对面向对象其实了解很少,由于加上了实验课,需要对其判断,所以需要

第二个坑是没有提前了解好任务的需求,导致做了好久,做出来的结果。输出的顺序是有很大差距的,就给人一种很大的挫败感。第三个坑是没有了解到它删除的内容,也是需要输出的,只是不在最后的总价中计入,这错误也导致了很多的分数丢失,最后被迫在类里面添加了一个多余的方法来计算删除的价格,还有一个问题,就是整个程序的条理化不够清晰,对程序的了解不够深入,导致每一步的修改都有一些的麻烦困难。

 

第三次作业,7-2重复数据的踩坑,主要在于没有考虑到双重循环对于时间的不合理性,我们直接采用list里面的方法。

for(i=0;i<n;i++)

        {

            s[i] = in.next();

        }

        for(i=0;i<s.length;i++){

            if(!list.contains(s[i]))

                list.add(s[i]);

        }

7-4单词统计与排序的坑在于读题不仔细以及对split方法的不完全了解,由于不仔细导致我不知道要去除重复单词。

s = arr.split("\\,|\\ |\\.");

在之前则是用的方法不对,不知道采用什么样的格式才能正确去除,找了好久的方法才找到之洋的结果。通过学习,我才完全知道了split方法的用法。

 

7-6 踩坑主要是不了解如何在JAVA中输出控制字符位数的结果,采用string.format方法,也算是学到了东西。

String.format("%.6f", result)

 

7-7判断数字是否是相等,由于javafloat类型存在误差,所以采用<0.001作为判断标准,这是一个大坑,并且在其他作者给的样题中,也没有展现到简易这个特点,导致出现较为严重偏差。。

 

 

主要困难及改进意见:

在成绩的三个步骤中,主要存在对于各个部分处理以及优化的部分,以及在对booleanBoolean之间的区别存在着了解。

改进意见是要自己认真学习JAVA的语法。

对于Arraylist中的int,string,string[]等类型排序处理的问题进行了学习。

改进意见是要自己通过其他博客学习list的用法,也可以从同学那里进行学习

存在对一些问题的时间复杂度上过高

改进意见即为学习多种算法或方法来改善这一问题

在对包括接口,Hashmap方法的学习中存在问题

解决的方法是通过对时间以及其他解决方法的学习,试图通过其他方法来解决问题,在学习并询问同学老师

题量有一点多

多学习,多花一些时间在JAVA的学习中去。

存在一些问题无法解决

通过询问老师或同学,进行解答。考虑多种思路的解决方法来完成这一题目。

 

 

总结:

学习到什么:

JAVA的程序结构进行了了解以及学习,了解到了JAVA中的多种接收数据的方法。

主要通过菜单的题目学习到了对面向对象的编程的方法,以及对类的属性和方法进行了认识,知道了接口,hashmaparraylist等。

学会了在CSDN上查询一些方法并进行学习,最后完成题目。

学习了例如多种排序方法,以及自学各种的方法,知道了其是从零月开始计算。了解到需要通过学习一些算法才能解决时间复杂度要求的问题,所以今后需要对其进行广泛的学习。

以及学习了集合list的使用排序等方法,以及对list强制转换为string的学习。

 

需要继续学习的地方:

需要继续对一些小的算法进行学习,以便在某些对时间复杂度和空间复杂度有要求的地方能够通过。

要对JAVAC语言中不同点进行学习,以便融会贯通。

需要对JAVA程序的条理化以及其内容的精髓进行学习。

对于JAVA中的众多方法,例如Calendar或者是List等方法的学习与精通。

 对于任务目标的拆分与解析水平需要提高以及需求的分析能力。

 

对于课堂上的希望:

希望课堂上能够多讲一些JAVA的类型及其用法。

希望有一些简单的算法,节省空间,时间的复杂度

反正结课了,说啥也没用了。

 

posted @ 2023-06-23 18:23  北溪pro  阅读(14)  评论(0)    收藏  举报