java6-8次大作业
一. 前言:
#不包代码9056多字
1)第6次大作业:(课程成绩统计程序-1)
知识点:
@ 主要知识点集中在对哈希表的使用,正确理解哈希表中键与值对应的关系HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步。HashMap 继承于AbstractMap,实现了 Map、Cloneable、java.io.Serializable 接口。HashMap 是无序的,即不会记录插入的顺序。所以我单独使用了Collections.sort(strings, collator);对字符串进行排序,通过Collator collator = Collator.getInstance(Locale.CHINA);使其对中文也能进行排序。@ 然后就是对代码整个框架的构建,这步非常重要,会极大地影响后续代码完善,一不小心就需要全部重新写过。
@ 我在作业中运用到了大量动态数组,所以知识点涉及动态数组相关知识的使用。
@ 因为与之前的菜单作业类似,所以主要对输入输出改变一下,大框架差不多。
@ 然后就是要事先明确到底要构建几个类的问题了,要适当构建并处理好类与类之间的关系,合理使用继承、组合、多态等。
@ 学会使用ArrayList(动态数组),ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。ArrayList 类位于 java.util 包中,使用前需要引入它,通过 import java.util.ArrayList引入ArrayList 类,并用 ArrayList<E> objectName =new ArrayList<>()对其进行初始化,E: 泛型数据类型,用于设置 objectName 的数据类型,只能为引用数据类型。同时,我们也可以使用add()方法添加元素到 ArrayList、使用remove()方法删除元素、使用 set()方法修改元素、使用get()方法访问元素、使用size()方法计算数组内元素个数,并且遍历数组有三种方式:for循环遍历、for-each遍历、迭代器遍历。
@使用String中split( )函数用来切割str字符串,返回一个ndarray类型的数据,对输入字符进行处理,同时知道如何用Java 中用于将字符串转换为整数的方法integer.parseint(String s),它是 Integer 类中的静态方法。
@了解类与对象的关系,学会创建类并通过对象正确引用类中的属性与方法。
题量:只有一道题,题量肯定不大啦。
难度:与之前菜单题目相似,但是又比之容易的多。
2)第7次大作业:
7-1 容器-HashMap-检索:
知识点:
@输入输出:使用Scanner类实现对用户输入的处理,读取学生信息和查询学生成绩。
@Map集合:使用HashMap类创建一个存储学生对象的映射,以学号为键、学生对象为值,实现了高效的查找和存储。
@字符串处理:使用String类的split方法将用户输入的字符串按空格进行分割,提取出学号、姓名和成绩等信息。
@类和对象:定义了Student类,作为学生对象的数据模型,其中包含学号、姓名和成绩等属性,以及对应的getter方法获取属性值。
@循环和条件判断:通过while循环和if语句实现了多个学生信息的输入和查询指定学生的成绩。
@异常处理:使用Integer类的parseInt方法将字符串解析为整数时,可能抛出NumberFormatException异常,需要进行异常处理。
@输入终止条件:通过在输入字符串中输入"end"作为结束标志,停止输入学生信息。
@错误处理:如果查询的学生不存在于学生映射中,输出相应的错误信息。
@包的导入和类的定义:使用import语句导入java.util包的Scanner类,将代码封装在Main类和Student类中。
7-2 容器-HashMap-排序:
@导入java.util包,包含所需的类和接口。
@创建一个Scanner对象,用于从标准输入读取用户输入的信息。
@创建一个HashMap对象scoreMap,用于存储学生的学号和姓名+成绩的字符串。
@使用while循环,不断读取用户输入的学生信息,直到输入"end"结束循环。
@使用空格分割输入的字符串,得到学号、姓名和成绩的信息。
@将学号作为键,姓名+成绩的字符串作为值,存入scoreMap中。
@创建一个TreeMap对象sortedScores,并使用Collections.reverseOrder()方法创建一个降序比较器。
@将scoreMap的内容全部存入sortedScores中,由于使用了降序比较器,所以学生信息会按照成绩的降序进行排序。
@使用for-each循环遍历sortedScores的entrySet,并输出学生的学号和姓名+成绩的字符串。
@关闭Scanner对象。
7-3 课程成绩统计程序-2:
@ 这次大作业主要是在作业6基础上对其进行修改的,课程成绩统计程序-2在第一次的基础上增加了实验课,实验的总成绩等于课程每次实验成绩的平均分。实验课程成绩信息包括:学号、姓名、课程名称、实验次数、每次成绩。实验次数至少4次,不超过9次。实验课程信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+实验次数+英文空格+第一次实验成绩+...+英文空格+最后一次实验成绩。实验课成绩格式:课程名称+英文空格+总成绩平均分。
@ 变化的地方主要集中在输入的东西增加了实验和其所对应的算法这两个方面,所以我先从输入方面对其进行修改,所以我使用了正则表达式:str.matches(".+\\s+(必修|选修|实验)\\s+(考试|考察|实验)")。
@对于诸如:实验 实验 结果输入不对应的情况下我写了d.misMix(stt[0],stt[1],stt[2])函数对其进行判断。
@对于之后的数据我则使用str.matches("[0-9]{8} \\S{1,10} \\S{1,10} [4-9](( )([0-9]|[1-9][0-9]|100))+" ) 和str.matches("^([0-9]{8})( )(\\S{0,10})( )(\\S{0,10})( )([0-9]|[1-9][0-9]|10{2})( )([0-9]|[1-9][0-9]|10{2})$"这两个正则表达式。
7-4 动物发声模拟器(多态):
@类的定义和实例化:在main方法中,通过创建Cat、Dog和Goat对象来实例化相应的类。
@静态方法的定义:在AnimalShoutTest2类中,需要定义一个静态方法speak(),用于输出动物的叫声。
@抽象类的定义:在Animal类中,使用abstract关键字定义了一个抽象类。抽象类不能直接实例化,只能被继承。
@方法的重写:在Cat、Dog和Goat类中,通过@Override注解重写了Animal类中的两个抽象方法getAnimalClass()和shout()。
@多态性:在speak()方法中,参数animal的类型是Animal,但可以接受Animal的子类对象,实现了多态性。
@封装和访问修饰符:在Animal类中,getAnimalClass()和shout()方法被声明为public,封装类内部的数据和行为,并且可以被其他类访问。
@输出语句的使用:使用System.out.println()方法输出字符串。
@继承关系:Cat、Dog和Goat类都继承自Animal类,通过extends关键字建立了继承关系。
@接口的使用:没有直接使用接口,但Animal类可以看作拥有两个抽象方法的接口,而Cat、Dog和Goat类都实现了这个接口。
题量:一共有4道,不多。
难度:题目难度中等,难度主要集中在第三题。
3)第8次大作业:
7-1 容器-ArrayList-排序:
@类的定义和实例化:定义了一个名为Student的类,并在其中定义了成员变量id、name、mathScore、physicsScore和totalScore,以及构造函数用于初始化实例。
@集合类ArrayList的使用:创建ArrayList对象studentList用于存储Student对象。
@输入输出操作:使用Scanner类获取用户输入的学生信息,并将输入的字符串转换为对应的数据类型。
@循环控制:使用while循环来持续获取用户输入,直到输入"end"时跳出循环。
@字符串操作:使用String类的split()方法拆分输入的字符串。
@匿名内部类与Comparator接口:使用匿名内部类实现Comparator接口的compare()方法,按照学生总分进行降序排序。
@对集合进行排序:使用ArrayList的sort()方法对studentList进行排序。
@迭代循环:使用增强型for循环遍历studentList中的Student对象,并输出学生的id、name和totalScore信息。
7-2 课程成绩统计程序-3:
@ 这次大作业主要是在课程成绩统计程序-3基础上对其进行修改的,修改类结构,将成绩类的继承关系改为组合关系,成绩信息由课程成绩类和分项成绩类组成,课程成绩类组合分项成绩类,分项成绩类由成绩分值和权重两个属性构成。实验的总成绩等于课程每次实验成绩乘以权重后累加而得。如果解析考试课、实验课时,分项成绩权重值的总和不等于1,输出:课程名称+" : weight value error"
@考试课信息格式:课程名称+英文空格+课程性质+英文空格+考核方式+英文空格+平时成绩的权重+英文空格+期末成绩的权重。考察课信息格式:课程名称+英文空格+课程性质+英文空格+考核方式。实验课程信息格式:课程名称+英文空格+课程性质+英文空格+考核方式+英文空格+分项成绩数量n+英文空格+分项成绩1的权重+英文空格+分项成绩n的权重。实验课程成绩信息包括:学号、姓名、课程名称、每次成绩{在系列-2的基础上去掉了(实验次数),实验次数要和实验课程信息中输入的分项成绩数量保持一致}单门课程成绩按课程名称的字符顺序输出。
@Score是一个抽象类,定义了三个抽象方法getTotalScore()、getUsualScore()和getFinalScore(),用于获取不同类型成绩的总分、平时成绩和期末成绩。
@这道题没写完,目前主要改的地方就是错误判断,通过增加各种判断条件使代码能够检测出输入错误。
7-3 jmu-Java-02基本语法-03-身份证排序:
@类和对象:定义了一个 IDCard 类,具有 id 和 date 两个成员变量,以及构造函数和私有方法。
@字符串处理:使用 substring() 方法截取身份证号中的日期部分,并使用 SimpleDateFormat 类将日期格式进行转换。
@异常处理:使用 try-catch 块捕获 ParseException 异常并打印堆栈信息。
@格式化输入输出:使用 Scanner 类读取输入,并使用 System.out.println() 方法输出结果。
@集合操作:使用 ArrayList 存储一组 IDCard 对象,并使用 add() 方法添加对象到列表中。
@匿名内部类:通过匿名内部类实现了 Comparator 接口,在排序时提供了比较规则。
@集合排序:使用 Collections.sort() 方法对 idCardList 列表进行排序。
@控制流程:使用 while 循环和条件语句 if-else 控制根据不同的排序类型执行不同的代码。
@输入输出:使用 scanner.nextLine() 读取一行输入,并根据输入进行相应的处理,如构造 IDCard 对象和判断排序类型。
@调用方法:在 IDCard 类的构造函数中调用了 extractDate() 方法,对传入的身份证号码进行日期提取。
7-4 jmu-Java-04面向对象进阶-03-接口-自定义接口ArrayIntegerStack:
@接口:定义了一个 IntegerStack 接口,规定了栈的基本操作方法。
@数组:使用 Integer 类型的数组 array 存储栈元素。
@构造函数:ArrayIntegerStack 类具有一个构造函数,用于初始化栈的大小,并创建相应大小的数组。
@栈操作:实现了 push()、pop()、peek()、empty() 和 size() 等方法来操作栈。
@输入输出:使用 Scanner 类读取输入,并使用 System.out.println() 方法输出结果。
@循环:通过 for 循环读取输入的元素,并执行相应的操作。
@数组转字符串:使用 Arrays.toString() 方法将数组转换为字符串形式输出。
7-5 jmu-Java-03面向对象基础-05-覆盖:
@输入输出:使用 Scanner 类读取输入,并使用 System.out.println() 方法输出结果。
@集合:使用 ArrayList 存储 PersonOverride 对象。
@循环:通过 for 循环读取输入和遍历集合。
@条件判断:使用 if 语句判断条件,执行相应的操作。
@类和对象:创建了 PersonOverride 类,具有私有字段和公共方法。
@方法重写:重写了 equals() 和 toString() 方法。
@静态方法:定义了一个静态方法 Exists() 用于判断集合中是否存在指定的对象。
@使用 Arrays.toString() 方法打印 PersonOverride 类的构造函数数组。
@PersonOverride 类具有默认构造函数和带参数的构造函数,以及一些 getter 和 setter 方法。它还重写了 equals() 方法来比较对象的字段值是否相等,并重写了 toString() 方法来返回对象的字符串表示形式。
题量:一共有5道,不多。
难度:难度一般,主要集中在第二题-课程成绩统计程序-3。
二.设计和分析:
课程成绩统计程序-1代码截图如下(可放大观看):
课程成绩统计程序-2部分代码截图如下(可放大观看):
课程成绩统计程序-3部分代码截图如下(可放大观看):
下面是其他题目的代码截图:
创建了一个名为 Student 的类,用于表示学生对象,包含学号、姓名和成绩等属性,以及相应的 getter 方法来获取这些属性的值。
在 Main 类中定义了 main 方法,作为程序的入口点。
在 main 方法中,首先创建了一个 Scanner 对象 scanner,用于接收用户输入。
创建了一个名为 studentMap 的 HashMap 对象,用于存储学生的成绩信息。studentMap 的键是学号(Integer 类型),值是一个 Student 对象。
使用一个循环来接收用户输入的多个学生的成绩信息,输入的格式为:学号、空格、姓名、空格、成绩。循环会持续执行,直到用户输入 “end” 为止。
在循环中,首先读取用户输入的一行字符串,然后通过 split 方法以空格为分隔符将其拆分成一个字符串数组。
将学号、姓名和成绩分别提取出来,并将学生对象添加到 studentMap 中,键为学号,值为一个新创建的 Student 对象。
接下来,读取用户输入的一个整数,作为要查找的学生的学号。
使用 studentMap.containsKey(searchId) 方法来检查学号是否存在于 studentMap 中。
如果存在,根据学号从 studentMap 中获取对应的学生对象,并输出学生的学号、姓名和成绩。
如果不存在,输出相应的提示信息。
最后,关闭 scanner 对象,程序运行结束。
这段代码实现了一个简单的学生信息管理系统,可以输入多个学生的成绩信息,并根据学号进行查询。如果学号存在,则输出对应学生的信息;如果学号不存在,则输出相应提示信息。
在 Main 类中定义了 main 方法,作为程序的入口点。
在 main 方法中,首先创建了一个 Scanner 对象 scanner,用于接收用户输入。
创建了一个名为 scoreMap 的 HashMap 对象,用于存储学生的成绩信息。scoreMap 的键是学号(Integer 类型),值是一个字符串,包含学生的姓名和成绩。
使用一个循环来接收用户输入的多个学生的成绩信息,输入的格式为:学号、空格、姓名、空格、成绩。循环会持续执行,直到用户输入 “end” 为止。
在循环中,首先读取用户输入的一行字符串,然后通过 split 方法以空格为分隔符将其拆分成一个字符串数组。
将学号、姓名和成绩分别提取出来,并将学生信息以字符串的形式添加到 scoreMap 中,键为学号,值为姓名和成绩的字符串。
创建了一个名为 sortedScores 的 TreeMap 对象,它以学号为键,并按降序排序。使用 Collections.reverseOrder() 方法对键进行降序排序。
使用 sortedScores.putAll(scoreMap) 方法将 scoreMap 中的键值对全部添加到 sortedScores 中,实现了按学号降序排序。
使用 entrySet() 方法获取 sortedScores 中的键值对,并通过遍历 for 循环逐个输出学生的学号、姓名和成绩。
最后,关闭 scanner 对象,程序运行结束。
这段代码实现了一个简单的学生信息管理系统,可以输入多个学生的成绩信息,并按学号降序排序后输出学生的信息。
在程序中定义了一个抽象类 Animal,具有两个抽象方法 getAnimalClass() 和 shout()。抽象类不能被实例化,它提供了一种通用的模板,供子类继承和实现。
程序中定义了三个继承自 Animal 的具体子类:Cat、Dog 和 Goat。每个子类都重写了父类 Animal 中的两个抽象方法。
在 Main 类的 main 方法中,创建了一个 Cat 对象、一个 Dog 对象和一个 Goat 对象。然后,通过调用 speak 方法,将这些对象作为参数传递进去。
Main 类中的 speak 方法接受一个 Animal 类型的参数,并调用该参数的 getAnimalClass() 方法和 shout() 方法,并打印出对应的动物类别和叫声。
这段代码展示了多态的特性,通过抽象类和方法的定义,可以处理不同类型的对象,并在运行时选择对应的方法实现。这样可以在统一的接口下实现灵活的对象处理和代码复用。
首先,在代码中定义了一个学生类 Student,包含了学生的学号、姓名、数学成绩、物理成绩和总成绩。构造方法用于初始化学生对象,并计算总成绩。
然后,在 Main 类的 main 方法中,创建了一个 Scanner 对象用来读取输入。还创建了一个 ArrayList 类型的 studentList 用于存储学生对象。
接下来,通过一个循环,不断读取输入的学生信息,直到输入 “end” 为止。每次输入的学生信息包括学号、姓名、数学成绩和物理成绩,通过 split 方法将输入字符串按空格分割,并将值赋给对应的变量。然后,使用这些值创建一个学生对象,并添加到 studentList 列表中。
接着,使用 sort 方法对 studentList 列表进行排序。排序使用了一个匿名内部类 Comparator<Student>,重写了 compare 方法,根据学生对象的总成绩进行比较。
最后,使用增强型 for 循环遍历 studentList 列表,并逐个输出学生的学号、姓名和总成绩。
整个程序实现了输入学生信息、计算总成绩、排序和输出的功能,最终按照总成绩从高到低的顺序输出了学生的信息。
定义了一个表示身份证的类 IDCard,包含身份证号码和日期属性。构造函数接受身份证号码作为参数,并通过 extractDate 方法从身份证号码中提取出日期。
extractDate 方法使用 substring 方法截取身份证号码中的日期部分,并将其转换为指定格式的日期字符串。
在 Main 类的 main 方法中,创建一个 Scanner 对象用于读取输入。然后创建一个 ArrayList,用于存储 IDCard 对象。
接着,从输入中获取一个整数 n,表示待输入的身份证数量。然后使用循环读取 n 行身份证号码,并构造对应的 IDCard 对象,并添加到 idCardList 列表中。
接下来,使用一个 while 循环,根据输入的排序类型进行排序和输出。如果输入的排序类型是 “sort2”,则使用 Collections.sort 方法以日期为基准对 idCardList 列表进行排序,并使用增强型 for 循环逐个输出排序后的身份证号码。
如果输入的排序类型是 “sort1”,则同样使用 Collections.sort 方法以日期为基准对 idCardList 列表进行排序,并使用增强型 for 循环逐个输出排序后的身份证号码。
首先,IntegerStack 接口定义了整数栈的基本操作,包括 push(入栈)、pop(出栈)、peek(查看栈顶元素)、empty(判断栈是否为空)和 size(获取栈中元素个数)。
然后,ArrayIntegerStack 类实现了 IntegerStack 接口。它使用一个数组 array 存储整数元素,通过 y 记录栈顶位置。
在 ArrayIntegerStack 类的构造函数中,通过指定的容量 n 创建了一个大小为 n 的数组,并初始化栈顶位置 y 为 0。
push 方法用于将整数元素入栈,如果元素为 null 或者栈已满,则直接返回 null,否则将元素加入数组并更新栈顶位置 y,然后返回插入的元素。
pop 方法用于出栈,如果栈为空,则返回 null,否则将栈顶元素弹出,并更新栈顶位置 y,然后返回弹出的元素。
peek 方法用于获取栈顶元素,如果栈为空,则返回 null,否则返回栈顶元素。
empty 方法用于判断栈是否为空,如果栈顶位置 y 为 0,则返回 true,否则返回 false。
size 方法用于获取栈中元素个数,即栈顶位置 y 的值。
在 Main 类的 main 方法中,首先通过 Scanner 对象读取输入的整数 n,表示栈的容量。然后创建一个 ArrayIntegerStack 对象 stack。
接下来,读取整数 m,表示待插入栈的元素个数。通过循环读取 m 个整数,并使用 stack.push 方法将它们压入栈中,并输出返回结果。
接着,输出栈顶元素、栈是否为空和栈中元素个数,使用 stack.peek、stack.empty 和 stack.size 方法实现。
然后,读取整数 x,表示要进行出栈的次数。通过循环出栈 x 次,并使用 stack.pop 方法输出出栈的元素。
最后,再次输出栈顶元素、栈是否为空和栈中元素个数,以及整个栈的数组形式。
在 main 方法中,首先通过 Scanner 类读取输入的整数 n 和 m。然后创建两个 ArrayList 对象 person1 和 person2 分别用于存储 PersonOverride 对象。
接下来,使用 for 循环将 n 个默认的 PersonOverride 对象添加到 person1 集合中。
然后,使用另一个 for 循环根据输入创建 PersonOverride 对象,并判断是否已经存在于 person2 集合中,如果不存在,则将其添加到 person2 中。
接着,使用 for 循环遍历 person1 集合并输出每个对象的字符串表示形式。
再使用另一个 for 循环遍历 person2 集合并输出每个对象的字符串表示形式。
之后,输出 person2 集合的大小(元素个数)。
最后,使用 Arrays.toString() 方法打印 PersonOverride 类的构造函数数组。
PersonOverride 类具有默认构造函数和带参数的构造函数,以及一些 getter 和 setter 方法。它还重写了 equals() 方法来比较对象的字段值是否相等,并重写了 toString() 方法来返回对象的字符串表示形式。
如下是相应课程成绩统计程序类图和SourceMonitor的生成报表内容:
通过上面的类图和计算平均复杂度的表格我们知道我所写的代码还存在很大的缺陷,平均复杂度过高,不符合java语言的低复杂度的特点。然后最大的败笔就是期中考试最后一题没写出来,主要还是由于我某一方面的知识不足,由此可见我还需要多多看书,学习关于java的更多相关知识,这样才能写出更好的代码,实现相应的功能。
三.踩坑心得:
1.在课程成绩统计程序-1中有很多坑,下面我一个一个对其进行分析:
@这里的坑主要是算法和构造整个逻辑框架的问题,一不小心就需要改变整个程序架构
@输入和输出格式错误:在读取输入和输出结果时,需要按照题目中描述的格式进行处理。例如,正确解析输入信息的各个字段以及空格的位置,以及在输出结果中正确的空格和换行符。
@数据类型错误:在处理成绩和权重时,需要确保使用合适的数据类型。成绩可以使用整数类型(例如int),而权重可以使用浮点类型(例如double)。
@数组越界错误:在处理多个学生和课程的成绩时,需要确保在访问数组或集合元素时不会超出其范围。例如,使用正确的循环索引或合适的集合方法来遍历学生和课程信息。
@逻辑错误:根据题目要求,需要根据不同的条件执行相应的操作。在编写代码时,需要仔细处理条件语句,确保其逻辑正确。例如,检查课程性质和考核方式是否匹配,或者处理成绩缺失的情况。
2.在课程成绩统计程序-2中也有很多坑,下面我一个一个对其进行分析:
@输入格式验证:在读取用户输入之前,需要对输入的格式进行验证。可以使用正则表达式或字符串分割等方法检查输入是否符合预期的格式要求,例如学号、姓名、课程名称的长度、格式、成绩的取值范围等。
@数据结构设计:需要设计适当的数据结构来存储课程和学生成绩信息。可以使用类和对象来表示课程和学生,使用集合(如ArrayList、HashMap)来存储多个课程和学生的信息,以便后续的计算和输出。
@异常处理:需要处理各种可能发生的异常情况,例如输入格式错误、输入数据与预期不符等。可以使用异常处理机制(try-catch语句块)来捕获并处理异常,然后输出相应的错误信息(不过我没用)。
@数据计算和排序:根据题目要求,需要计算学生的平均成绩、单门课程的平均成绩以及班级的总成绩平均分。使用适当的算法计算平均值,并对结果进行排序(如按学号升序、按课程名称升序)。
@输出结果:根据题目要求,将计算得到的结果按指定的格式输出。可以使用循环遍历数据结构的方式,逐个将结果输出。
@优化和模块化:为了使代码更加清晰、可维护和可扩展,可以考虑将功能模块拆分成多个方法或类,并为每个方法或类添加适当的注释。此外,可以采用面向对象的设计原则,减少代码的冗余,提高代码的重用性。
3.在课程成绩统计程序-2中也有很多坑,下面我一个一个对其进行分析:
@空指针异常:空指针异常是在访问空对象的属性或方法时发生的异常。在使用对象之前,应该先确保对象不为null,否则会抛出空指针异常。可以通过使用条件语句或空指针检查来避免此类异常。
@逻辑错误:逻辑错误是指代码的逻辑错误或算法错误,导致程序不能按预期运行。这些错误可能会导致错误的计算结果或错误的行为。调试和测试是发现和修复逻辑错误的常用方法。
@数组越界异常:数组越界异常是在尝试访问数组的无效索引时发生的异常。当试图访问超出数组边界的索引时,会抛出此异常。为避免此错误,应确保数组索引在有效范围内。
三、主要困难以及改进建议
主要困难: 我主要困难就是对java中的一些东西不够了解,像接口那里,又比如动态数组那块,以至于我花了很多时间在查资料,写大作业时最大的困难就是动态数组总是遇到数组越界以及数组为空或返回空导致无法编译的问题,这些都花了我好长时间去调试找到问题并解决。当然,现在写出的代码还是存在不少的问题,这需要我进一步去完善代码,使其更加的符合java这门语言的习惯。
困难与改进建议: 我的最大的困难就是首先写代码时首先对于整个框架构造的思考,为了找到合适的构造框架,我问了许多同学,最终才勉强找到最合适的框架,然后就是对于哈希表不是特别熟悉,以至于使用哈希表时总是犯错误。至于改进意见主要就是算法的问题,在对于后续输出处理时我对喜欢对存储的数据整个进行处理,但是却又夹杂其他的东西,例如输入后马上输出这种操作,导致最后输出的数据排序乱套,无法进一步完善代码,最终无法完成百分百的正确。
五、总结
这几次的大作业让我受益很深,而期中考试又让我发现了我最大的不足之处,通过这几次的大作业,我对Java“一切皆类,面向对象”的特点有了更深层次的理解,懂得如何创建类与对象同时,我也明白了合理利用网络资源自学的重要性。在写课程成绩统计程序的时候,我学到了好多关于动态数组的知识,知道如何去找到并解决动态数组经常遇见的问题,同时也知道如何对输入的日期进行相应的处理以及格式化,如何使用判断字符串是否为数字、如何对字符串进行排序等。值得一提的是,我发现学习面向对象语言时,我们必须要沉下心来,要学会思考,就算有的问题思考几个小时都可能解决不了,但只要你一直去思考并不断尝试就总是会想到解决方法,因为java中有很多类是可以更加方便地帮助我们解决问题,我们需要耐心的去寻找这类资源并学习,不能一味求快,急于求成,否则这样会事半功倍,严重可能会打消我们学习积极性。然后就是,经过这次的期中考试,我发现我学的并不扎实,还有好多地方存在不足,未来我还需要加倍努力,对不足之处加以弥补。
对于课程的教学,我希望老师能够更多的站在我们学生本身的角度来看待,还有就是有时候下面好多人都还没有弄懂上一个东西老师就讲到下一个知识点了,我希望老师能够多多问一问下面的同学是否弄明白了上一个知识点。当然,我们学生也有几点做的不好,就是说很少有人去主动问老师问题,不懂得东西也一直就让它搁在那里。