第二次blog大作业

news/2024/10/15 22:28:40

1.前言
第四次到第六次大作业所覆盖的知识点还是很多的,例如:抽象类,集合,排序方法,接口等等。第四次的大作业是关于学生答卷的流程,考察了我们对于集合和排序算法,以及类与类之间的关系,相比他前面的三个小弟,他增加了多选题和填空题,在难度上还是有所提升的,不过也还好,也不是完全动不了手,题目量业并不是很多,仅仅只有三道题目,而且其他两道题目都是送分的,只有第一题的学生答卷的那道题的难度稍微大点,第五次大作业开始了新的流程,这次改成了写电路模拟过程,主要考察了输出顺序,集合,以及继承与多态,还有抽象类的运用,第五次大作业也只有三道题,也是有两道送分题,而这次的电路迭代也只有一条串联电路,而且还限制了只有一个受控设备,还没有电阻电压,难度降低了很多,但是因为要考虑到后面的迭代,所以要把眼光放长远一点,主要考察了我们对题目的分析能力,以及我们日后在工作中独立思考的能力,还有我们对电路的见解,以及看法,还考察了我们对类与类之间的关系,如何将这些电器串联起来,第六次大作业难度又上升了,增加了电阻,电压,以及普通的并联,还有并联与串联电路结合的类型,还增加了一个落地扇的电器,不过这次只有一道题,这次还考察了我们对精度的把控问题。
2.设计与分析
第四次大作业我构建了一个题目类,试卷类,还有答卷和学生类,再加一个工具类,题目类又可以分成单选题,多选题和填空题,让这三个题目木类继承一个最大的题目类,将输入每行的信息先都用arraylist集合存储起来,然后在工具类中对每一条信息做处理将我们需要的信息提取出来,可以将每道题目的分值放在答卷类里面,这样下次再用到这道题的时候又可以重新给他赋分值了


这是题目类,里面有题号,题目内容,以及是否正确,给了一个构造函数,还有最基础的get和set方法,再加上了一个判断题目是否正确的方法以便与正确答案做比较
class Question{
protected String num;
protected String neirong;
protected boolean is=true;

public Question(String num, String neirong) {this.num = num;this.neirong = neirong;
}
public void setIs(boolean is) {this.is = is;
}
public boolean getIs() {return is;
}
public String getNum(){return this.num.trim();
}
public String getNeirong(){return this.neirong.trim();
}
public int panduan(String a){return 1;}

}
下面是我的试卷类,我在里面添加了一个编号属性,以便于找到这张试卷,然后再加了一个分数集合与题目集合,我们只需要将分数集合与题目集合得索引对应上,这样就可以做到每一道题都对应每一个分数,在这里面除了最基础得set与get方法,还加上了一个得到分数的方法,而且我在构建试卷里面的题目时,我就已经开始将所有的分数都算出来,并且判断他是否满足100分,直接输出判断结果。
class Test{
private String bianhao;
private List score = new ArrayList();
private List question = new ArrayList<>();

public void setQuestion(Question b){question.add(b);
}
public void setScore(int score){this.score.add(score);
}
public void settScore(List<Integer> a){this.score=a;
}
public List getScore(){return score;
}
public int getScore(int k){return score.get(k);
}
public void setBianhao(String bianhao){this.bianhao=bianhao;
}
public String getBianhao(){return this.bianhao;
}
public Question getQuestion(int k){return this.question.get(k);
}
public int getSize(){return question.size();
}public void getPaper(){int total=0;for(int v=0;v<this.question.size();v++){total=total+this.score.get(v);}if(total!=100){System.out.println("alert: full score of test paper"+this.bianhao+" is not 100 points");}
}
public List returnScore(){List<Integer> a=new ArrayList<>();for(int i=0;i<this.score.size();i++){a.add(this.score.get(i));}return a;
}

}
在答卷类中,我同样放置了编号属性,还放置了学生的学号,答案集合以及答卷答题题号的集合,编号用于查找试卷,学号用于查找学生,将学生信息打印出来,答案集合是为了存储学生回答题目的答案,与题目里面的标准答案做比对,题号是为了查找试卷的题目。这个类里面最复杂的就是输出答卷信息的方法,他不仅要判断答卷与试卷能否对的上号,还要判断答卷里面的题目是否在试卷里出现,还要计算学生的总成绩,以及比对学生学号来输出学生的信息
class Answer{
private String bianhao;
private String studentID;
private List answer = new ArrayList();
private List num=new ArrayList<>();

public int getNum(int k) {return num.get(k);
}public void setNum(int num) {this.num.add(num);
}public String getStudentID() {return studentID;
}public void setStudentID(String studentID) {this.studentID = studentID;
}public String getBianhao(){return this.bianhao;
}
public void setBianhao(String bianhao){this.bianhao=bianhao;
}
public void reserve(String a){answer.add(a);
}
public String getAnswer(int k){return answer.get(k);
}
public int getsize(){return answer.size();
}public void outPaper(List<Test> a,Student b,List<Question> c){int y=0;for(int i=0;i<a.size();i++){List<Integer> list=new ArrayList<>();list=a.get(i).returnScore();if(this.bianhao.compareTo(a.get(i).getBianhao())==0){y=1;int total=0;for(int j=0;j<a.get(i).getSize();j++){if(j<num.size()) {int ll = 0;for (int kj = 0; kj < c.size(); kj++) {if (a.get(i).getQuestion(j).getNum().compareTo(c.get(kj).getNum()) == 0) {ll = 1;for (int k = 0; k < a.get(i).getSize(); k++) {if (this.num.get(j) == k+1) {if (a.get(i).getQuestion(k).getIs()) {if (a.get(i).getQuestion(k).panduan(this.answer.get(j))>0) {total += a.get(i).getScore(k);System.out.println(a.get(i).getQuestion(k).getNeirong() + "~" + this.answer.get(j) + "~true");}else if(a.get(i).getQuestion(k).panduan(this.answer.get(j))==0){int ak=a.get(i).getScore(k)/2;total+=ak;a.get(i).getScore().set(k, ak);System.out.println(a.get(i).getQuestion(k).getNeirong() + "~" + this.answer.get(j) + "~partially correct");}else {a.get(i).getScore().set(k, 0);System.out.println(a.get(i).getQuestion(k).getNeirong() + "~" + this.answer.get(j) + "~false");}}}}if(j==num.size()-1) {for (int k = 0; k < a.get(i).getSize(); k++) {if (!a.get(i).getQuestion(k).getIs()) {a.get(i).getScore().set(k, 0);System.out.println("the question " + a.get(i).getQuestion(k).getNum() + " invalid~0");}}}}}if (ll == 0) {System.out.println("non-existent question~0");}}}for(int sd=0;sd<a.get(i).getSize()-num.size();sd++){System.out.println("answer is null");a.get(i).getScore().set(num.size()+sd,0);}int lk=0;for(int p=0;p<b.getSize();p++){if(this.studentID.compareTo(b.getStudentID(p))==0){lk=1;System.out.print(b.getStudentID(p)+" "+b.getName(p)+":");for(int j=0;j<a.get(i).getSize();j++){//20201103 Tom: 0 0~0System.out.print(" "+a.get(i).getScore(j));if(j==a.get(i).getSize()-1)System.out.println("~"+total);}}}if(lk==0) {System.out.println(this.studentID + " not found");}}a.get(i).settScore(list);}if(y==0){System.out.println("The test paper number does not exist");}
}

}
接下来是我的第五次大作业与第六次大作业的设计与分析
第五次大作业我主要分享电路设计的这题,他主要有控制设备模拟与受控设备模拟,然而控制设备里面又有开关和变压器,变压器里面又有分档变压器和连续变压器,受控设备里面有灯与风扇,灯又可以分为日光灯,白炽灯,风扇只有一种,吊扇。首先我设计了一个电器类,然后再设计了一个变压器类和开关类,让变压器类与开关类继承电器类,然后又设计了分挡变压器和连续变压器类,让他们两个都继承变压器类,再设计了一个风扇类与电灯类,让吊扇继承风扇类,让日关灯类与白炽灯类都继承电灯类。每个电器都会有两个引脚,输入引脚和输出引脚,为了方便计算风扇和电灯的输出值,我在电器类里加上了一个电压,用输入引脚减去输出引脚。


首先这是我的电器类,我在这里面放置了两个引脚和名字还有电压属性,再在这个类里面写了几个抽象方法,如输出信息,计算输出引脚等;让所有的其他电器都继承这个电器类。
abstract class Electric {
protected String name;
protected double pin1=0;
protected double pin2=0;
protected double v;
public Electric(String name){
this.name=name;
}
public void setPin1(double pin1){
this.pin1=pin1;
}
public void setPin2(double a){
pin2=a;
}
public abstract void setPin2();
public abstract void display();
public void setV(){
v=pin1-pin2;
}
}
然后是我定义的抽象的变压器类,让他继承电器类,给了变压器最基本的get与set方法,还有输出自己信息的抽象方法。
abstract class Governor extends Electric{
public Governor(String name) {
super(name);
}

public double getPin1() {return pin1;
}public void setPin1(int pin1) {this.pin1 = pin1;
}public abstract void setPin2() ;public abstract void display();

}
这是我的分档调压器,我用一个数组记录了他的挡位,然后再在里面定义了一个num作为挡位的索引,如果是F+就让num加一,反之减一,再给定范围,防止数组越界报错。
class Fgovernor extends Governor{
private static int num=0;
private final double[] a={0,0.3,0.6,0.9};
public Fgovernor(String name) {
super(name);
}

public void upNum(){if(num<3){num++;}
}
public void downNum(){if(num>0){num--;}
}
@Override
public void setPin2() {super.pin2=super.getPin1()*a[num];
}@Override
public void display() {System.out.println("@"+super.name+":"+num);
}

}
电器我就只分享一下我对白炽灯的设计与分析,首先我给了他一个亮度属性,里面给了一个计算亮度的方法,为了方便计算完就直接输出,我直接在输出方法里面调用计算亮度的方法,这样就可以减少代码的复杂性,否则会有大量方法在test类中。
class WhiteLight extends Electric{
private int brightness;

public WhiteLight(String name) {super(name);
}@Override
public void setPin2() {pin2=pin1;}public void setBrightness(){super.v=pin1-pin2;if(v<=9){this.brightness=0;}else{this.brightness= (int) (50+(v-10)*5/7);}
}
@Override
public void display() {this.setBrightness();System.out.println("@"+super.name+":"+brightness);
}

}
最后是关于第六次大作业的分析与设计,第六次大作业看起来很难,但其实也是有迹可循,串联加并联其实都相差不大,两个串联就看可以构成并联电路,然而并联电路可以打包起来看成是一个普通的电器,我们只需要把并联电路中的电阻,以及他在主电路中分的压计算出来就可以了,再将他分压传入并联电路中的支路,这样就可以计算出每个电器的分压,从而可以输出自己所输出的信息。

先在工具类中将信息处理一下存储起来,
public static void massage(String a){
char b=a.charAt(1);
switch(b){
case 'T':{
setLines(a);
break;
}
case 'M':{
setMoreLines(a);
break;
}
default : setMassage(a);
}
}
这是计算分压的方法,将所有的电阻加起来,再计算每一个电器的分压。
public static void getV(){
double totalV=220;
for(int i=0;i<lines.size();i++){
lines.get(i).getTotalR();
}
for(int i=0;i<electrics.size();i++){
if(electrics.get(i).name.charAt(0)'L'||electrics.get(i).name.charAt(0)'F'){
totalV=totalV*((Governor)electrics.get(i)).getDangwei();
}
}
((MainLine)main).setV(totalV);
}
下面两个方法是我的输出的方法,因为输出信息要按照开关、分档调速器、连续调速器、白炽灯、日光灯、吊扇、落地扇的顺序输出,所以我把所有的电器先放进一个集合里面,再遍历这个集合分别寻找这些电器,再按照他给的顺序输出就看可以了。
public static void shows(char a){
ArrayList k=new ArrayList<>();
for (int i = 0; i< electrics.size(); i++) {
if (electrics.get(i).name.charAt(0) == a) {
k.add(electrics.get(i));
}
}
if(k.size()>1) {
Sort.selectSort(k);
}
for(int i=0;i<k.size();i++){
k.get(i).display();
}
}
public static void show(){
//按开关、分档调速器、连续调速器、白炽灯、日光灯、吊扇、落地扇
shows('K');
shows('L');
shows('F');
shows('B');
shows('R');
shows('D');
shows('A');
}
这是我的并联电路类,先记录这些电器类的名字,来构建出电器,然后再分别计算电压,和整个并联电路的电阻,
class MoreLine extends Line {
ArrayList list=new ArrayList<>();
ArrayList smallLines=new ArrayList<>();

public MoreLine(String name){super(name);
}public void getMassage(String a){ArrayList<Integer> p=new ArrayList<>();for(int i=0;i<a.length();i++){if(a.charAt(i)==' '){p.add(i);}}list.add(a.substring(1,p.get(0)));for(int i=0;i<p.size()-1;i++){list.add(a.substring(p.get(i),p.get(i+1)));}list.add(a.substring(p.get(p.size()-1)+1,a.length()-1));
}@Override
public void setLine() {}public void setV(){for(int i=0;i<smallLines.size();i++){((SmallLine)smallLines.get(i)).setV(super.v);}
}
@Override
public void getTotalR() {double sum=0;for(int i=0;i<smallLines.size();i++){sum=sum+ (double) 1 /smallLines.get(i).r;}super.r=1/sum;
}public void ssetLine(ArrayList<Line> list){for(int i=0;i<list.size();i++) {for (int j = 0; j < this.list.size(); j++) {if (list.get(i).name.compareTo(list.get(j).name) == 0) {smallLines.add(list.get(i));}}}
}public void display() {}
}

除此之外,我还设计了一个支路类,这个支路可以处理本条电路的所有信息。
class SmallLine extends Line {
ArrayList list=new ArrayList<>();
public SmallLine(String name){
super(name);
}
public void setV(double v){
super.v=v;
for(int i=0;i<super.getLines().size();i++){
super.getLines().get(i).v=super.v*super.getLines().get(i).r/super.r;
}
}
@Override
public void getMassage(String a) {
ArrayList p=new ArrayList<>();
ArrayList q=new ArrayList<>();
for(int i=0;i<a.length();i++){
if(a.charAt(i)' '){
p.add(i);
}
if(a.charAt(i)
'['){
q.add(i);
}
}
int x=0;
for(int i=0;i<q.size();i++){
list.add(a.substring(q.get(i)+1,p.get(x)));
x=x+2;
}
list.add("OUT");
}

@Override
public void setLine() {for(int i=1;i<list.size()-1;i++){String a=list.get(i);String name=this.getName(a);//K、F、L、B、R、D分别表示开关、分档调速器、连续调速器、白炽灯、日光灯、吊扇。switch (a.charAt(0)){case 'K':{Electric kai=new Switch(name);super.getLines().add(kai);Tool.electrics.add(kai);break;}case 'F':{Governor FGovernor=new Fgovernor(name);super.getLines().add(FGovernor);Tool.electrics.add(FGovernor);break;}case 'L':{Governor LGovernor=new Lgovernor(name);super.getLines().add(LGovernor);Tool.electrics.add(LGovernor);break;}case 'B':{Electric BLight=new WhiteLight(name);super.getLines().add(BLight);Tool.electrics.add(BLight);break;}case 'R':{Electric RLight=new DayLight(name);super.getLines().add(RLight);Tool.electrics.add(RLight);break;}case 'D':{Electric DFan=new CeilingFan(name);super.getLines().add(DFan);Tool.electrics.add(DFan);break;}case 'A':{Electric standFan=new Standfan(name);super.getLines().add(standFan);Tool.electrics.add(standFan);break;}default : throw new IllegalStateException("Unexpected value: " + a.charAt(0));}}
}public void getTotalR(){for(int i=0;i<getLines().size();i++){super.r=getLines().get(i).r+super.r;}
}public String getName(String a){int p=0;for (int i=0;i<a.length();i++){if(a.charAt(i)=='-'){p=i;}}return a.substring(0,p);
}

public void display() {
}
}

3.踩坑心得
我再写第五次大作业时,没有考虑开关在后面的情况,导致输出的所有信息都是0,其实可以有一个很简单的设计,就是直接将输出引脚的电压定义为0,因为只考虑一个电器,所以可以这样写,但是又因为我想要考虑后面的迭代,但又考虑不全面,所以导致错误不断露出,还有第六次大作业,我都已进快构建完了,在跟同学交流时突然发现还有电阻,由于我的看题不仔细,导致都白费了之前的努力,所以我们都应该仔细看题,不要马马虎虎,还有开始在构建变压器时,没有考虑范围,导致数组越界出错。还有输出的信息的时候,刚开始的时候我还打算直接给每个电器都在工具类中定义一个show方法,导致代码十分冗长,所以当时的代码可读性就非常的低。
刚开始就打算写七个shows方法,这是改进后的方法,极大的缩减了代码的长度,提高了代码的可读性。
public static void shows(char a){
ArrayList k=new ArrayList<>();
for (int i = 0; i< electrics.size(); i++) {
if (electrics.get(i).name.charAt(0) == a) {
k.add(electrics.get(i));
}
}
if(k.size()>1) {
Sort.selectSort(k);
}
for(int i=0;i<k.size();i++){
k.get(i).display();
}
}
public static void show(){
//按开关、分档调速器、连续调速器、白炽灯、日光灯、吊扇、落地扇
shows('K');
shows('L');
shows('F');
shows('B');
shows('R');
shows('D');
shows('A');
}
4.改进建议
我的代码还是有很大改进的地方,就第六次大作业,我感觉我设计的支路类和主电路类两者有很多相似之处,我完全不需要定义两个类,可直接将支路又当成主路一样处理,只需要将支路的电压当成是主路的电源电压就可以了,还有很多方法只是在电器中有用,在电路类中没有用,但由于我在电器类中设计的为抽象类,所以我就必须将他加在电路类中,所以我感觉我可以再定义一个接口,这样就不用再类中重写一些对自己无用的方法了,还有输出方法,也需要改进,还有对正则表达式的运用,我还是在用switch判断,如果我能合理利用正则表达式的话,我的代码肯定能更上一层,还有我的电器类是抽象类,我定义的属性都是用protected修饰的,但我还写了get方法,这些都是无用的方法,所以我应该还要加强自己对属性修饰符的运用范围的理解。
5总结
我对抽象类的理解更加深入了,以及进一步强化了我对修饰符的理解,更加合理运用数组与集合,老师已进做的很好了,对实验我认为老师能提醒一下实验截至时间,以及改善实验提交系统,我每一个不小心点到了外面,他提交系统里面未保存的东西就会消失,还是有bug的,所以我建议还是用以前的方法提交吧,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/41649.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boot入坑-8-定时任务

概述在企业级的项目业务中,往往会有一系列的任务需要在有逻辑的指定时间点执行,如系统间定时同步数据、定时做某个复杂的计算、订单提交后30分钟需要付款等上述这些,就需要任务的定时调度与执行来完成,这是程序的基本需要在Java语言中,提供了基础的基于Timer和ScheduledEx…

计算机简史第三章 机电时代之机电式计算机

电、电路形成了机电式计算机电、电路形成了机电式计算机 ‍ 制表机:穿孔时代的到来 从 1790 年开始,美国每十年进行一次人口普查。百年间,随着人口繁衍和移民的增多,从 1790 年的 400 万不到,到 1880 年的 5000 多万,人口总数呈爆炸式地增长。 1880 年开始的第 10 次人口…

Zerto 10.0 U4 - 适用于本地、混合和多云环境的灾难恢复和数据保护

Zerto 10.0 U4 - 适用于本地、混合和多云环境的灾难恢复和数据保护Zerto 10.0 U4 - 适用于本地、混合和多云环境的灾难恢复和数据保护 勒索软件防护、灾难恢复和多云移动性的统一解决方案 请访问原文链接:https://sysin.org/blog/zerto-10/,查看最新版。原创作品,转载请保留…

实验6 C语言结构体、枚举应用编程

//task4.c#include <stdio.h>#include <stdlib.h>#include <string.h>#define N 10typedef struct { char isbn[20]; // isbn号 char name[80]; // 书名 char author[80]; // 作者 double sales_price; // 售价 …

如何在markdown中换行?

📜 背景 学习markdown的语法格式进行博客写作。有时候需要排版,在不同行之间增加空白以美化观感。 ❓ 问题 Markdown的换行语法是什么? 💡 方案 💫 知识 🌟 HTML换行语法 <br></br>是HTML中的一个标签,用于在文本中插入换行符。<br>标签本身是一个…

Fortinet FortiOS 6.4.15 (FortiGate For ESXi, Hyper-V, KVM, Xen) 下载

Fortinet FortiOS 6.4.15 (FortiGate For ESXi, Hyper-V, KVM, Xen) 下载Fortinet FortiOS 6.4.15 (FortiGate For ESXi, Hyper-V, KVM, Xen) 下载 下一代防火墙 (NGFW)、虚拟化 NGFW 和云原生防火墙 请访问原文链接:https://sysin.org/blog/fortios-6/,查看最新版。原创作品…

中国移动魔百盒-九联UNT413A刷机教程

家里最近单独安装了一条宽带,移动赠送了路由器和电视盒子,路由器挺好上网不卡,但电视盒子看啥都要开会员,也不能装第三方app,故从网上找了教程,试试刷一个无限制的安卓系统,最后刷成功了,体验不赖下面说一下刷机流程吧(刷机有风险,刷前要认真看流程) 一、准备工作 移…

立创 eda 标号相关

编号起始 嘉立创EDA的原理图的元件编号是全局的,即使你创建了多页原理图也可以保持编号连续性。当你放置元件在原理图时,编辑器会帮你自动增序编号,不需你进行手动编号。当然你也可以进行手动修改指定。 双击编号,或者点击它,在右边属性面板修改。 编号冲突 若你的原理图和…