oop第三阶段作业总结
一、前言:
针对第三阶段的题目集,知识点、题量、难度等情况作如下总结:
oop训练集07:
该题目集题量一颗星(只有一道题),对我而言难度比较大,这次是菜单题目的又一次叠加,要求在菜单计价程序-4的基础上进行了添加和修改,由于前面的题目都没有完整的写出来过,所以相对我来说,这次的题目又是一个狠活儿;对前面每一次都写出来的大佬们,肯定就算简单的了。这是一道综合性的题目,知识点覆盖面很广,可以说java相关基础加中难度知识都可以用的上,关键看每个人的思路,思路不同,用的知识就不一样嘛。
oop训练集08:
本次题目集也只有一道题,难度中等,没有菜单难,知识点涉及广泛,也是一道综合性的题目,并且是新的一轮迭代题目的开始。
oop训练集09:
此次题目集题量--一道题,题目难度较大,如果只是单纯的满足题目要求,写出满足的代码难度没有太大,但是老师对代码长度提出了要求,想要拿到最好的分数,感觉不是那么容易。主要知识点是新学的Map和Set集合相关知识。
oop训练集10:
本次题目集题量中等,总共四道,一道容易,两道中等,一道难(没错,难的那题是训练集09的迭代)。知识点包括java基础知识的所有,以及集合中具体实现类HashSet和HashMap的相关知识,简单的那题用的是多态。
oop训练集11:
学期最后一次作业题目集,题量中等,难度有难的有容易的。知识点主要涉及了ArrayList类,Collections集合中的排序方法,String类的相关知识,Arrays.toString()方法,栈的一些知识,还有需要新学习的IntegerStack接口。
二、设计与分析:
菜单程序题在做的过程中老是出现各种各样的问题,我觉得问题大概率出在我的类和方法设计上,在编程的过程会出现一些复杂的方法调用,以及不断对代码进行大幅度调整修改的情况,导致最后进度缓慢,代码功能实现不全。下面是同学的类图,希望自己积极学习,看看别人是如何进行类的设计处理的。

课程成绩统计程序与菜单程序相比,要好一点,但也不是很容易就能写出代码来的,经过菜单程序的摧残后,这次成绩的迭代战况没有菜单的那么惨烈,好歹最后代码能运行实现一些功能了。下面是课程成绩统计程序2和3的类图,以及SourceMonitor生成的相关报表:





根据报表可以看出,代码的圈复杂度都很大,代码写的比较复杂了,不好维护,的确,在编程过程中一直都在出现不好修改的情况。
三、采坑心得:
菜单计价程序-5,最终到截止时间为止还是没有写出,功能未能完全实现,代码报错也挺多的,很遗憾,菜单系列没有一次完整实现过,自己的编程能力可能还需经过多次锻炼来提升。
课程成绩统计程序-1这题相对菜单好得多,但最后代码功能未能完全实现,测试点就过了几个,但过的几个测试点基本都是格式错误,真正需要算法的测试点基本都有问题,所以这次题目集也算是侥幸得了点分,代码需改善的地方还很多。
身份证排序题,前几次代码逻辑都存在问题,导致输出的结果总是有问题,只输出一部分,经过几次调整后,成功拿下这道题。这题也是当时困扰了我很久的题目,不知道那时候自己编写的时候逻辑哪里出了问题,最后也是调试了很多次才得到正确结果的。
错误代码:
import java. util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//输入
int n = sc.nextInt();
ArrayList<String> id = new ArrayList<>();
for(int i=0;i<n;i++) {
String str = sc.nextLine();
id.add(str);
}
String flag = sc.nextLine();
if(flag.equals("sort1")) {
ArrayList<String> list = new ArrayList<>();
for(String str : id) {
String year = str.substring(6,10);
String month = str.substring(10,12);
String day = str.substring(12,14);
String s1= year+"-"+month+"-"+day;
list.add(s1);
}
Collections.sort(list);
for(String s1:list) {
System.out.println(s1);
}
}
else if(flag.equals("sort2")) {
// 按年月日排序输出身份证号
id.sort((o1, o2) -> {
String year1 = o1.substring(6, 10);
String month1 = o1.substring(10, 12);
String day1 = o1.substring(12, 14);
String s1 = year1 + month1 + day1;
String year2 = o2.substring(6, 10);
String month2 = o2.substring(10, 12);
String day2 = o2.substring(12, 14);
String s2 = year2 + month2 + day2;
return s1.compareTo(s2);
});
for (String str : id) {
System.out.println(str);
}
}
else {
// 输入无效,输出exit
System.out.println("exit");
}
}
}
正确代码如下:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = Integer.parseInt(sc.nextLine());
ArrayList<String> id = new ArrayList<>();
for (int i = 0; i < n; i++) {
String str = sc.nextLine();
id.add(str);
}
String sortType = sc.nextLine();
if (sortType.equals("sort1")) {
ArrayList<String> list = new ArrayList<>();
for (String str : id) {
String year = str.substring(6, 10);
String month = str.substring(10, 12);
String day = str.substring(12, 14);
String s1 = year + "-" + month + "-" + day;
list.add(s1);
}
Collections.sort(list);
for (String s1 : list) {
System.out.println(s1);
}
}
else if (sortType.equals("sort2")) {
Collections.sort(id, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
String year1 = o1.substring(6, 10);
String month1 = o1.substring(10, 12);
String day1 = o1.substring(12, 14);
String s1 = year1 + month1 + day1;
String year2 = o2.substring(6, 10);
String month2 = o2.substring(10, 12);
String day2 = o2.substring(12, 14);
String s2 = year2 + month2 + day2;
return s1.compareTo(s2);
}
});
for (String str : id) {
System.out.println(str);
}
}
System.out.println("exit");
}
}
这道自定义接口ArrayIntegerStack的题目,空栈和满栈的情况在首次写出的代码中一直没有找到问题,后来参考网上的相关知识,将代码中的this.top=-1修改为this.top=0,并对代码进行对应修改后,终于空栈、满栈的测试点通过,不过,我现在还是没有很清楚这道题的原理,下来自己还需要花时间和精力去研究一下。
有问题代码如下:
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
// 创建对象
IntegerStack stack = new ArrayIntegerStack(n);
int m = sc.nextInt();
for(int i=0;i<m;i++) {
int item = sc.nextInt();
Integer result = stack.push(item);
System.out.println(result);
}
System.out.println(stack.peek()+","+stack.empty()+","+stack.size());
System.out.println( Arrays.toString(((ArrayIntegerStack)stack).getArray()));
int x = sc.nextInt();
for(int i=0;i<x;i++) {
Integer result = stack.pop();
System.out.println(result);
}
System.out.println(stack.peek()+","+stack.empty()+","+stack.size());
System.out.println(Arrays.toString(((ArrayIntegerStack)stack).getArray()));
}
}
interface IntegerStack {
public Integer push(Integer item);
//如果item为null,则不入栈直接返回null。如果栈满,也返回null。如果插入成功,返回item。
public Integer pop();
//出栈,如果为空,则返回null。出栈时只移动栈顶指针,相应位置不置为null
public Integer peek();
//获得栈顶元素,如果为空,则返回null.
public boolean empty();
//如果为空返回true
public int size();
//返回栈中元素个数
}
class ArrayIntegerStack implements IntegerStack {
private Integer[] array;
private int top;
public ArrayIntegerStack(int n) {
this.array = new Integer[n];
this.top = -1;
}
@Override
public Integer push(Integer item) {
if (item == null || top == array.length) {
return null;
}
top++;
array[top] = item;
return item;
}
@Override
public Integer pop() {
if (empty()) {
return null;
}
Integer item = array[top];
top--;
return item;
}
@Override
public Integer peek() {
if (empty()) {
return null;
}
return array[top];
}
@Override
public boolean empty() {
if(top==-1) {
return true;
}
else {
return false;
}
}
@Override
public int size() {
return top+1;
}
public Integer[] getArray() {
return array;
}
}
正确代码如下:
import java.util.*;
public class Main{
public static void main(String [] args){
Scanner in=new Scanner(System.in);
int n = in.nextInt();
ArrayIntegerStack stack = new ArrayIntegerStack(n);
int m = in.nextInt();
for(int i=0;i<m;i++) {
int item = in.nextInt();
System.out.println(stack.push(item));
}
System.out.println(stack.peek()+","+stack.empty()+","+stack.size());
System.out.println(Arrays.toString(stack.array));
int x = in.nextInt();
for(int j = 0;j<x;j++) {
System.out.println(stack.pop());
}
System.out.println(stack.peek()+","+stack.empty()+","+stack.size());
System.out.println(Arrays.toString(stack.array));
}
}
interface IntegerStack{
public Integer push(Integer item);
//如果item为null,则不入栈直接返回null。如果栈满,也返回null。如果插入成功,返回item。
public Integer pop(); //出栈,如果为空,则返回null。出栈时只移动栈顶指针,相应位置不置为null
public Integer peek(); //获得栈顶元素,如果为空,则返回null.
public boolean empty(); //如果为空返回true
public int size(); //返回栈中元素个数
}
class ArrayIntegerStack{
public Integer [] array;
private int top;
public ArrayIntegerStack(int n) {
this.array = new Integer[n];
top=0;
}
public Integer push(Integer item) {
if(item==null) {
return null;
}
if(top==this.array.length) {
return null;
}
array[top++]=item;
return item;
}
public Integer pop() {
if(top==0) {
return null;
}
top--;
return array[top];
}
public Integer peek() {
if(top==0) {
return null;
}
return array[top-1];
}
public boolean empty() {
if(top==0) {
return true;
}
else {
return false;
}
}
public int size() {
return top;
}
}
四、改进建议:
首先,通过SourceMonitor生成的报表,很明显,自己在对复杂要求的题目的编码相对复杂,虽然对降低代码的圈复杂度的要求不是一朝一夕可以实现,但希望自己在今后编程过程中时刻谨记要提高代码的可维护性,对类的设计要仔细考虑,严格遵守类的单一职责原则,以及其他的软件设计原则,养成好的编程习惯。另外,在题目要求较多的时候,自己的编程逻辑不是很好,总是会漏掉一些东西,或者是出现逻辑错误,今后需要多思考,多考虑,慢慢提高自己的逻辑思维能力,减少类似的错误。
五、总结:对本阶段(10-16周)综合性总结,学到了什么,哪些地方需要进一步学习及研究,对教师、课程、作业、实验、课上及课下组织方式等方面的改进建议及意见。
通过第三阶段的题目集训练,自己的编程能力相对与之前进步了一些,虽然与那些“大佬”同学他们相比,自己还差一大截,因此,自己还需在以后的空余时间自己坚持不懈的学习和实践,相信经过今后的学习和越来越多实践,自己对java这门编程语言也会越来越精通。在第三阶段(10-16周)中,还包括两次限时现场编程的题目集训练,一次期中测试,一次课堂测试,经过这两次的实践,我发现自身存在的一些问题:现场编程速度较慢,反映也比较慢,个别知识点不熟悉,代码出现问题时不善于调试查找,而是自己在哪里找半天,期中考试最终只拿到及格分,原因是对期中考试前的Comparable和Comparator接口知识没有及时加强巩固,导致考试时不太会用,编译都不能通过。随堂测验时,不选择调试查找代码问题,导致入门第一题花费太长时间解决结果错误问题。所以,在今后编程过程中还是要注意时间效率的问题。
另外,本阶段的题目集训练后,我对面向对象编程的概念有了进一步的理解,能够熟练运用类、对象、继承、多态、接口等进行编写代码。经过该阶段的学习,我学到了java数据结构中的栈的相关知识,如进出栈方法,先进后出原则等。还学到了java集合框架,其主要包括两种类型的容器,一种是集合(Collection),储存一个元素集合,另一种是图(Map),储存键/值对映射。主要学习的是具体实现类HashSet和HashMap的相关知识点,对此,我掌握了添加add()方法、移除remove()等基础方法,还掌握了两个类的异同:HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合;HashSet 允许有 null 值。
HashSet 是无序的,即不会记录插入的顺序;HashMap 是一个散列表,它存储的内容是键值对(key-value)映射;HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步;HashMap 是无序的,即不会记录插入的顺序。除了以上内容外,我还学到javaFX图形用户界面的一些知识,stage、窗口、面板、布局、控件......
而且能运用其实现简单的图形界面和动画。对以上的知识掌握都比较浅显,以后还需要继续研究学习,学得更深更精才行。
最后对教师、课程、作业、实验、作业、课上即课下组织方式等方面,我有以下改进建议:1、希望老师能够提供更多实例和案例讲解,帮助学生更好地理解和运用所学知识。2.希望老师对实验和作业中我们出现问题较多的地方进行提示或讲解。
总的来说,本阶段的学习对我而言是一次重要的成长和学习机会,学到了新东西,也发现了自己新的不足处,虽然本阶段的结束也意味着这学期的结束,但学习永不结束,java的知识体系非常庞大,还有很多新的世界需要我去探索。
六、附:关于对本课程的教学理念、教学方法、教学组织、教学过程及教学模式的建议如下:
- 希望学期初的时候OBE的教学理念的应用偏少一点,教师多讲一点,为学生打下坚实的基础,让学生紧跟教师步伐,然后再慢慢推进该教学理念,相信有了踏实的基础知识储备后,以后的OBE教学理念推进将会更顺利。
- 边讲边练的教学方法很不错,“现炒现卖”,让学生理解后及时实践应用,帮助他们更好掌握。
- 线上线下混合式教学,建议主要以线下教学为主,线上可以为提供学生预习或复习的资料即可,毕竟线下教学相比线上教学效果更好。
- 对于PTA题目集,容易,中难度,高难度肯定都要覆盖,希望可以根据学生每次完成题目集的情况做一些回应,比如,学生出现问题较多的地方给予提示或讲解;PTA截止后重新开放,让学生在学习一段时间后再去做之前未完成或者是有问题的题目,看看经过进一步的学习是否能解决之前没能解决的问题,算是验证学生是否有进步的方法吧。另外,确保PTA题目集题目的全面性、有代表性,并能够引导学生进行思考和实践。
- 确保BOPPPS教学模式的设计灵活性、适应性强,能够满足不同学生的需求和学习节奏。
-
最后建议在这些教学理念和模式的实施过程中充分考虑学生个体差异和学习需求,提供更多样化、互动性强的教学活动和资源。
浙公网安备 33010602011771号