由于个人原因,最后两次题目集未提交,对自己的放纵感到愧疚,后期的补练我也会抽出时间完成这两道题
经过分析,题目集7,是在前面的基础上加上了一个新概念:互斥开关,以及模拟一种受控窗帘,
在我的想法,互斥开关便可当作两个普通开关去完成电路,窗帘则是新增一个用电器。
题目集8,有以下新增内容:
1)增加管脚电压的显示
在输出每个电器的状态信息后,再依次输出该电器每个管脚的电压。(格式详见输出信息部分)
2)电流限制
电器在工作时,过大的电流会引起电器过热,从而烧坏电路。本次迭代,每个元器件都有最大电流的设置,当实时电流超过最大电流时,在该电器输出信息的最后加入提示“exceeding current limit error”,与前面的信息之间用英文空格分隔。
本题各类电器的最大限定电流如下:
开关20、分档调速器18、连续调速器18、白炽灯9、日光灯5、吊扇12、落地扇14、互斥开关20、受控窗帘12、二极管8。
3)短路检测
如果电路出现无穷大的电流造成短路,所有元器件信息不输出,仅输出提示“short circuit error”
4)并联电路中包含并联
本次迭代考虑并联电路中包含并联电路的情况,即构成并联电路的串联电路可以包含别的并联电路。例如如下输入的电路,并联电路M2的其中一条串联电路T4中包含了另一条并联电路M1:
T1:[IN D2-1] [D2-2 H1-2] [H1-1 OUT]
T2:[IN D1-1] [D1-2 H1-3] [H1-1 OUT]
M1:[T1 T2]
T4:[IN K3-1] [K3-2 M1-IN] [M1-OUT OUT]
T5:[IN K1-1] [K1-2 B1-1] [B1-2 OUT]
M2:[T4 T5]
5)二极管
增加二极管元件,其电路特性为:正向导通,反向截止;其电器符号如图4所示,当电流从左至右流过时,二极管导通”conduction”,电阻为0;电流从右至左流动时,二极管截止”cutoff”,电阻无穷大,相当于开关打开。
图2 二极管符号
二极管的标识符为’P’,左侧管脚编号为1,右侧管脚编号为2。
二极管如果两端电压相等,没有电流流过,分以下两种情况输出:
1、如果两端电压为0,二极管的导通/截止状态由接入方向决定,1号引脚靠近电源则状态为导通,反之为截止。
2、如果两端电压不为0,二极管导通。
以下分析题目集1~3最后一题
第一次
知识点:类的应用,类与类之间的关系,题量:5,难度:中等
要求实现一个判题程序,输入题号,题目,和答卷,根据题目后面接着的标准答案和给出的答卷的提交答案进行比较,最终输出答题情况和对错。总体比较简单,通过主函数输入信息,进行存储题目信息在试卷类,
这
我有一点未作完善,我的试卷类只能存储一个题目,答卷类是比较试卷类中的那一道题目和标准答案的正确情况,输出最后的格式。这一次的题目虽然简单,但是对后面的迭代有着比较重大的意义,每次一都是在这
一次的基础下进行修改。****
类图:
耦合度:
第一次作业比较简单,考虑的情况也比较少。
第二次
知识点:类的应用,类与类之间的关系,ArrayList的使用,题量:4,难度:稍难
要求实现一个更加完善的判题程序,这一次相比于上一次的难点在于,要求输入内容有题目信息和标准答案,试卷题目和对应的分数,答题信息,在上一次的基础上迭代,题目稍微难,这一次我稍作修改,根据在主
函数输入的信息中识别内容,进行相应位置的存储,一张试卷存放着该试卷的全部题目,一张答卷存放着对应试卷号和该试卷题目的提交答案,进行一一比较了,输出格式也稍微有所改动,首先输出该试卷总分是否
为100分,其次依次输出试卷的答题情况和总分,如果答案信息中试卷的编号找不到,则输出”the test paper number does not exist”,如果输入的答案信息少于试卷的题目数量,答案的题目要输"answer is
null"。最后我通过修改,任然有一个测试点未通过
类图:
耦合度:
这次作业类的关系相比于上一次更为复杂
第三次
知识点:类的应用,类与类之间的关系,ArrayList的使用,题量:3,难度:困难
在第二次的基础上加以迭代,实现一个更加完美的判题程序,要求输入内容有题目信息和标准答案,试卷题目和对应的分数,答题信息,以及学生信息,题目稍难,这一次我基于第二次的方法,依旧使用ArrayLst,
在主函数中输入信息并识别,另加了一个小功能,就是可实现对题库中的题目进行删除功能,接着要判断输入信息是否合法,并输出相应提示,接着进行相应位置的存储,一张试卷存放着该试卷的全部题目,一张答
卷存放着对应试卷号和该试卷题目的提交答案,进行一一比较,输出格式与第二次相差不大,首先输出那部分格式错误,再而输出该试卷总分是否为100分,不同就是在输出得分前加上该答卷的学生学号和姓名,删
除题目信息为独行输入,每一行为一条删除信息,多条删除信息可分多行输入。该信息用于删除一道题目信息,题目被删除之后,引用该题目的试卷依然有效,但被删除的题目将以0分计,同时在输出答案时,题目
内容与答案改为一条失效提示,例如:”the question 2 invalid~0”,试卷错误地引用了一道不存在题号的试题,在输出学生答案时,提示”non-existent question~”加答案,输入信息只要不符合格式要求,
均输出”wrong format:”+信息内容,如果答卷信息中试卷的编号找不到,则输出”the test paper number does not exist”,答卷中的答案不用输出,但最终还有奖金五个测试点未通过
类图:
耦合度:
这一次比较难,类的个数也比较多,关系也复杂
三.踩坑心得:
一.第一次大作业我是输入一个识别一个,当时这个方法是可行的,到了第二次我的脑子任然是想着这个方法,但是后面写着写着看到了题目说了一句话:输入顺序不确定,我便放弃了这样的解决方式,后面我的解决方法是将内容一次性以一行一行的字符串输入存入到一个字符串数组中,再后来我将输入的内容存入到了元素为String的ArrayList里面,下面是我的展示:
第一次:
第二次:
第三次:
二.就是第三次作业的判断输入的内容是否合法,我的做法是先切分后使用用正则表达式,这里不做过多讲解,举出一例当作样例即可:
这是一个判断输入的题目是否合法的代码:
测试结果如下,
输入:
N:1 #Q:1+1= #:2(本应该为#N:1 #Q:1+1= #A:2)
T:1 1-5
X:20201103 Tom
S:1 20201103 #A:1-5
end
输出:
三.类似于输入试卷信息的格式,有很多部分是格式相同的,例如:#T:1 1-5 2-8,除了#T:之外,都是"题号-分数"的格式,这个判断格式是否正确的放我我也做了思考,我不知道我的是否为最优解,所以我也打算拿
出那展示,后面看看同学的是否有更优解,加以学习。
这是一段判断输入试卷是否合法的代码:
//输入试卷
for(int k=0;k<content.size();k++){
for(i=0;i<content.size();i++) {
if (content.get(i).startsWith("#T:")){
String[] parts = content.get(i).split("\s+");
j++;
int Paper_num = Integer.parseInt(parts[0].substring(3));
if(Paper_num == j){
Paper paper = new Paper(Paper_num);
int flag1=1;for (int l = 1; l < parts.length; l++) {String regex = "^\\d+-\\d+";Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(parts[l]);if(!matcher.matches()){System.out.println("wrong format:" + content.get(i));flag1=0;break;}}if (flag1==1) {for (int l = 1; l < parts.length; l++) {String[] questionPart = parts[l].split("-");int questionNumber = Integer.parseInt(questionPart[0]);int flag=0;for(int x = 0;x<questions.size();x++){if(questions.get(x).getNum() ==questionNumber){flag=1;paper.addQuestions(questions.get(x));break;}}if(flag==0){paper.addQuestions(new Question(0,questionNumber,null,null));}int score = Integer.parseInt(questionPart[1]);paper.addQuestionScore(score);}papers.add(paper);}}}}
}
测试结果如下:
输入:
N:1 #Q:1+1= #A:2
N:2 #Q:2+2= #A:4
T:1 1-5 3~8(正确格式为:#T:1 1-5 3-8)
X:20201103 Tom-20201104 Jack-20201105 Www
S:1 20201103 #A:1-5 #A:2-4
D:N-2
end
输出:
四.改进建议
我的建议是我在我的类的内容进行改进,题目类有题目类的方法,试卷类哟试卷类的方法,答卷类有答卷类的方法,试卷类还是存放这相应的题目,答卷类存放对应试卷的题目编号和学生写的答案,其内部有判题方法对答案进行判断是否正确,更加完善单一职责,在原来的题目基础上进行深一步的迭代。
五。总结:
在三次大作下来,我也学到了很多知识,明白了我们软件工程不容易,既来之则安之,我也要更加努力学习,通过一次次的作业不断提升自我。在本次阶段的大作业,我一次一次对代码进行改善,当然也是一次一次的学习,找出最优的解决方法,
建议和意见:
一.题目:对不友好的一点我觉得就是测试点问题,我们都知道未来遇到很多问题可能并不会给出我们问题所在,也不会明确告诉我们测试点,提交答案的提示很多测试点都是一样的提示,很多同学在测了很久很久才写
出来,甚至可能都还没写出,但这并不是我们不会,也不是因为题目很难,也不是因为我们实现不了哪些功能,而是测试点都是出题方的主观因素,导致我们并没有想法往那个方向思考,我也相信学院在接下来的培养我们,我们也能更加进一步提升自身能力和水平。
二.课程,实验等方面:
对学校的教学方式很满意,学生通过课前看发布的视频,先一步了解,提升了我们的自学能力(很重要),实验课也能帮助我们解决心中的问题,教师也很好,有的同学因为学习能力偏差,在大作业稍微有点吃力,老
师能很认真的和他们交谈,我觉得很好,在课上和课下,老师很认真的讲课,出一些课堂练习给我们当场练习,然后讲解,也会对大作业进行讲解,课后也会认真在QQ给我们解答问题。
自我加以改进:
1.对自己出现的bug加以分析其原因,在写代码之前分析好类关系图。
2.学习新知识,简化代码,完善单一职责
3.对前三次的未通过的测试点加以分析,在下一次攻克难题
最后也对自己后期的学习态度感到愧疚