以下内容是我对pta题目集4-6次大作业的总结
nchu-software-oop-2024-上-4
本次作业新增内容:
1、输入选择题题目信息
题目信息为独行输入,一行为一道题,多道题可分多行输入。
格式:"#Z:"+题目编号+" "+"#Q:"+题目内容+" "#A:"+标准答案
格式基本的约束与一般的题目输入信息一致。
新增约束:标准答案中如果包含多个正确答案(多选题),正确答案之间用英文空格分隔。
例如:
// #Z:2 #Q:宋代书法有苏黄米蔡四家,分别是: #A:苏轼 黄庭坚 米芾 蔡襄
多选题输出:
输出格式与一般答卷题目的输出一致,判断结果除了true、false,增加一项“partially correct”表示部分正确。
多选题给分方式:
答案包含所有正确答案且不含错误答案给满分;包含一个错误答案或完全没有答案给0分;包含部分正确答案且不含错误答案给一半分,如果一半分值为小数,按截尾规则只保留整数部分。
例如:
点击查看代码
#N:1 #Q:1+1= #A:2
#Z:2 #Q:党十八大报告提出要加强()建设。A 政务诚信 B 商务诚信 C社会诚信 D司法公信 #A:A B C D
#T:1 1-5 2-9
#X:20201103 Tom
#S:1 20201103 #A:1-5 #A:2-A C
end
输出:
点击查看代码
alert: full score of test paper1 is not 100 points
1+1=~5~false
党十八大报告提出要加强()建设。A 政务诚信 B 商务诚信 C社会诚信 D司法公信~A C~partially correct
20201103 Tom: 0 4~4
2、输入填空题题目信息
题目信息为独行输入,一行为一道题,多道题可分多行输入。
格式:"#K:"+题目编号+" "+"#Q:"+题目内容+" "#A:"+标准答案
格式基本的约束与一般的题目输入信息一致。
例如:#K:2 #Q:古琴在古代被称为: #A:瑶琴或七弦琴
填空题输出:
输出格式与一般答卷题目的输出一致,判断结果除了true、false,增加一项”partially correct”表示部分正确。
填空题给分方式:
答案与标准答案内容完全匹配给满分,包含一个错误字符或完全没有答案给0分,包含部分正确答案且不含错误字符给一半分,如果一半分值为小数,按截尾规则只保留整数部分。
例如:
点击查看代码
#N:1 #Q:1+1= #A:2
#K:2 #Q:古琴在古代被称为: #A:瑶琴或七弦琴
#T:1 1-5 2-10
#X:20201103 Tom
#S:1 20201103 #A:1-5 #A:2-瑶琴
end
输出:
点击查看代码
alert: full score of test paper1 is not 100 points
1+1=~5~false
古琴在古代被称为:~瑶琴~partially correct
20201103 Tom: 0 5~5
3、输出顺序变化
只要是正确格式的信息,可以以任意的先后顺序输入各类不同的信息。比如试卷可以出现在题目之前,删除题目的信息可以出现在题目之前等。
例如:
点击查看代码
#T:1 1-5 2-10
#N:1 #Q:1+1= #A:2
#K:2 #Q:古琴在古代被称为: #A:瑶琴或七弦琴
#X:20201103 Tom
#S:1 20201103 #A:1-5 #A:2-古筝
end
点击查看代码
alert: full score of test paper1 is not 100 points
1+1=~5~false
古琴在古代被称为:~古筝~false
20201103 Tom: 0 0~0
本题考虑多个同学有多张不同试卷的答卷的情况。输出顺序优先级为学号、试卷号,按从小到大的顺序先按学号排序,再按试卷号。
例如:
点击查看代码
#T:1 1-5 2-10
#T:2 1-8 2-21
#N:1 #Q:1+1= #A:2
#S:2 20201103 #A:1-2 #A:2-古筝
#S:1 20201103 #A:1-5 #A:2-瑶琴或七弦琴
#S:1 20201104 #A:1-2 #A:2-瑟
#S:2 20201104 #A:1-5 #A:2-七弦琴
#X:20201103 Tom-20201104 Jack
#K:2 #Q:古琴在古代被称为: #A:瑶琴或七弦琴
end
点击查看代码
alert: full score of test paper1 is not 100 points
alert: full score of test paper2 is not 100 points
1+1=~5~false
古琴在古代被称为:~瑶琴或七弦琴~true
20201103 Tom: 0 10~10
1+1=~2~true
古琴在古代被称为:~古筝~false
20201103 Tom: 8 0~8
1+1=~2~true
古琴在古代被称为:~瑟~false
20201104 Jack: 5 0~5
1+1=~5~false
古琴在古代被称为:~七弦琴~partially correct
20201104 Jack: 0 10~10
我的做法
- 对于选择题的改动,把之前的单选题改成了多选题,并且有半对半错的结果。我的做法是:把答题卡上的答案先存储在一个arrylist集合中,对照正确答案时,先遍历答题卡上的答案,对于答题卡上的每一个选项,都对正确答案进行遍历,将结果分为三种情况,全都能在正确答案上找到且数量与其相当、全都能在正确答案上找到且数量较少、有找不到的。三种情况分别对应全对、半对半错、错。
点击查看代码
class Select extends Question{
public Select(int a,String b,String c){
setnumber(a);
setcontent(b);
setstandardAnswer(c);
}
@Override
public int judge(String answer){
String[] b1=getstandardAnswer().trim().split(" ");
char[] b=new char[b1.length];
for(int i=0;i<b1.length;i++){
b[i]=b1[i].trim().charAt(0);
}
String[] a1=answer.trim().split(" ");
char[] a=new char[a1.length];
for(int i=0;i<a1.length;i++){
a[i]=a1[i].trim().charAt(0);
}
for(char x:a){
int kk=0;
for(char y:b){
if(x==y){
kk=1;
break;
}
}
if(kk==0){
return 1;
}
}
if(a.length==b.length){
return 3;
}
else
return 2;
}
}
- 填空题的增加,跟选择题的做法一致,记录题号、题目内容以及标准答案。与多选题不同的判别正误的地方是,把正确答案和答题卡上的答案的字符串形式的答案拆分成字符数组的形式。找每一个字符是否有对应。
点击查看代码
class Tiankong extends Question{
public Tiankong(int a,String b,String c){
setnumber(a);
setcontent(b);
setstandardAnswer(c);
}
@Override
public int judge(String answer){
char[] a=answer.toCharArray();
char[] b=getstandardAnswer().toCharArray();
for(char x:a){
int kk=0;
for(char y:b){
if(x==y){
kk=1;
break;
}
}
if(kk==0){
return 1;
}
}
if(a.length==b.length){
return 3;
}
else
return 2;
}
}
- 输出顺序打乱,先对输入的内容进行整理和存储,等读取完了输入内容后再将输入的内容相关的联系在一起。(以下是对于部分输入内容判断后的整理存储操作)
点击查看代码
if(N==1)
{
int num=0;
String con="";
String an="";
for(int y=0;y<parts.length;y++)
{
if(parts[y].trim().equals("N"))
num=Integer.parseInt(parts[y+1].trim());
else if(parts[y].trim().equals("Q"))
con=parts[y+1].trim();
else if(parts[y].trim().equals("A"))
an=parts[y+1].trim();
}
Question q=new Commen(num,con,an);
qq.add(q);
}
else if(K==1){
int num=0;
String con="";
String an="";
for(int y=0;y<parts.length;y++)
{
if(parts[y].trim().equals("K"))
num=Integer.parseInt(parts[y+1].trim());
else if(parts[y].trim().equals("Q"))
con=parts[y+1].trim();
else if(parts[y].trim().equals("A"))
an=parts[y+1].trim();
}
Question q=new Tiankong(num,con,an);
qq.add(q);
}
- 多张试卷信息,先遍历学号,再对每个学号遍历所有其对应的试卷号输出。
点击查看代码
for(Answer a:An){
if(a.getanswernumber()==-1){
System.out.print("The test paper number does not exist");
}//遍历答卷输出没有对应试卷的答卷??????????????????????????????
else {
a.print();
int ju=0;
for(Student stu:student){
if(a.getId().equals(stu.getId())){
ju=1;
System.out.print(stu.getId() + " "+ stu.getName() + ":");
int sum=0;
for(int x=0;x<a.getJu().size();x++){//遍历正误卡
Ju j=a.getJu().get(x);
if(j.getResult().equals("true")){
System.out.print(" " +a.gett().getscore().get(x));
sum=sum+a.gett().getscore().get(x);
}
else if(j.getResult().equals("false")){
System.out.print(" " + 0);
sum=sum+0;
}
else {
int l=a.gett().getscore().get(x)/2;
System.out.print(" " + l);
sum=sum+l;
}
}
System.out.println("~" +sum);
}
}
if(ju==0){//没有对应的学生
System.out.print(a.getId() + " not found");
}
}
}
总结与展望
满分82,得分80,还剩一个测试点没过,衷心希望能够在以后的作业中把所有的测试点都列举出来,或者至少给出提示,这样我们才能知道自己哪里没有考虑到,不然就一直蒙在鼓里不会的还是不会甚至不知从何学起!!!
nchu-software-oop-2024-上-5
本次题目大致内容
1、控制设备模拟
本题模拟的控制设备包括:开关、分档调速器、连续调速器。
开关:包括0和1两种状态。
开关有两个引脚,任意一个引脚都可以是输入引脚,而另一个则是输出引脚。开关状态为0时,无论输入电位是多少,输出引脚电位为0。当开关状态为1时,输出引脚电位等于输入电位。
分档调速器
按档位调整,常见的有3档、4档、5档调速器,档位值从0档-2(3/4)档变化。本次迭代模拟4档调速器,每个档位的输出电位分别为0、0.3、0.6、0.9倍的输入电压。
连续调速器
没有固定档位,按位置比例得到档位参数,数值范围在[0.00-1.00]之间,含两位小数。输出电位为档位参数乘以输入电压。
2、受控设备模拟
本题模拟的受控设备包括:灯、风扇。两种设备都有两根引脚,通过两根引脚电压的电压差驱动设备工作。
灯有两种工作状态:亮、灭。在亮的状态下,有的灯会因引脚电位差的不同亮度会有区别。
风扇在接电后有两种工作状态:停止、转动。风扇的转速会因引脚的电位差的不同而有区别。
本次迭代模拟两种灯具。
白炽灯:
亮度在0~200lux(流明)之间。
电位差为0-9V时亮度为0,其他电位差按比例,电位差10V对应50ux,220V对应200lux,其他电位差与对应亮度值成正比。白炽灯超过220V。
日光灯:
亮度为180lux。
只有两种状态,电位差为0时,亮度为0,电位差不为0,亮度为180。
工作电压区间为80V-150V,对应转速区间为80-360转/分钟。80V对应转速为80转/分钟,150V对应转速为360转/分钟,超过150V转速为360转/分钟(本次迭代暂不考虑电压超标的异常情况)。其他电压值与转速成正比,输入输出电位差小于80V时转速为0。
2、连接信息
一条连接信息占一行,用[]表示一组连接在一起的设备引脚,引脚与引脚之间用英文空格" "分隔。
格式:"["+引脚号+" "+...+" "+引脚号+"]"
例如:[K1-1 K3-2 D5-1]表示K1的输入引脚,K3的输出引脚,D5的1号引脚连接在一起。
约束条件:
本次迭代不考虑两个输出引脚短接的情况
考虑调速器输出串联到其他控制设备(开关)的情况
不考虑调速器串联到其他调速器的情况。
不考虑各类控制设备的并联接入或反馈接入。例如,K1的输出接到L2的输入,L2的输出再接其他设备属于串联接线。K1的输出接到L2的输出,同时K1的输入接到L2的输入,这种情况属于并联。K1的输出接到L2的输入,K1的输入接到L2的输出,属于反馈接线。
3、控制设备调节信息
开关调节信息格式:
//#+设备标识K+设备编号,例如:#K2,代表切换K2开关的状态。
分档调速器的调节信息格式:
// #+设备标识F+设备编号+"+" 代表加一档,例如:#F3+,代表F3输出加一档。
//#+设备标识F+设备编号+"-" 代表减一档,例如:#F1-,代表F1输出减一档。
连续调速器的调节信息格式:
//#+设备标识L+设备编号+":" +数值 代表将连续调速器的档位设置到对应数值,例如:#L3:0.6,代表L3输出档位参数0.6。
迭代1:只有一条线路,所有元件串联
输入样例:
点击查看代码
[VCC K1-1]
[K1-2 D2-1]
[D2-2 GND]
#K1
end
输出样例:
点击查看代码
@K1:closed
@D2:360
我的做法
- 按照推荐的类的创建,先建立了控制设备类和受控设备类,L、F都继承于控制设备,这里我把开关独立了出来,B、R、D都继承于受控设备类。再建立一条线路类(即串联主电路)
- 主要思路,总电路电压220V,通过变压器后改变电路电压,得到对应的亮度或者转速。
- 注意事项,若有开关时,需要所有的开关都是closed的状态电流才能流通,否则是断路,对于分段调速器,当档值被调高或调低至其两端的极值时,以极值来计。
点击查看代码
public String stata() {
if(level<=0){
return "0";
} else if (level==1) {
return "1";
} else if (level==2) {
return "2";
} else if (level==3) {
return "3";
}
else
return "3";
}
总结与展望
满分75,得分75,衷心希望能够在以后的作业中把所有的测试点都列举出来,或者至少给出提示,这样我们才能知道自己哪里没有考虑到,不然就一直蒙在鼓里不会的还是不会甚至不知从何学起!!
nchu-software-oop-2024-上-6
本次题目大致内容(改动)
1.本次迭代增加一种落地扇。
工作电压区间为 [80V,150V],对应转速区间为 80-360 转/分钟。电压在[80,100)V 区间对应转速为 80 转/分 钟,[100-120)V 区间对应转速为 160 转/分钟,[120-140)V 区间对应转速为 260 转/分钟,超过 140V 转速 为 360 转/分钟(本次迭代暂不考虑电压超标的异常情况)
2.本次迭代考虑电阻:白炽灯的电阻为 10,日光灯的电阻为 5,吊扇的电阻为 20,落 地扇的电阻为 20
迭代2:线路中包含一个并联电路
输入样例:
点击查看代码
#T1:[IN K1-1] [K1-2 D2-1] [D2-2 OUT]
#T2:[IN K2-1] [K2-2 D1-1] [D1-2 OUT]
#M1:[T1 T2]
#T3:[VCC L1-1] [L1-2 M1-IN] [M1-OUT D3-1] [D3-2 GND]
#K1
end
输出样例:
点击查看代码
@K1:closed
@K2:turned on
@L1:0.00
@D1:0
@D2:0
@D3:0
我的做法
- 增加落地扇类,继承于受控设备类
点击查看代码
class A extends controlled implements Comparable<A>{
@Override
public String getstata() {
int u=(int)getU();
if(u>=80&&u<=99){
return "80";
}
else if(u>=100&&u<=119){
return "160";
}
else if(u>=120&&u<=139){
return "260";
}
else if(u>=140){
return "360";
}
else
return "0";
}
public A() {}
@Override
public int compareTo(A o) {
return Integer.compare(this.getNumber(), o.getNumber());
}
}
- 对于并联电路的增加,我创建了一个串联电路类,一个并联电路类,先计算总电阻(把并联电路当作主串联电路的一个电路元件)算出总电流,再求出并联电路作为电路元件的电压,该并联电路所包含的小串联电路的电压与其电压相等,各串联电路的电路元件的电压都由电路公式求得(以下展示并联电路类和串联电路类)
点击查看代码
class Parallel{
private double U;
private String name;
private double I;
private ArrayList<Series> ser=new ArrayList<Series>();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Parallel() {
}
public double getU() {
return getI()*getR();
}
public void setU(double u) {
U = u;
}
public double getR() {
double r=0;
for(Series s:getSer()){
if(s.getState()==1){
r=r+1/s.getR();
}
}
return 1/r;
}
public int getState() {
int juge=0;
for(Series s: getSer()){
if(s.getState()==1){
juge=1;
break;
}
}
return juge;
}
public double getI() {
return I;
}
public void setI(double i) {
I = i;
}
public ArrayList<Series> getSer() {
return ser;
}
public void setSer(ArrayList<Series> ser) {
this.ser = ser;
}
}
class Series{
private double U;
private String name;
private double I;
private ArrayList<Parallel> par=new ArrayList<>();
private ArrayList<controlled> ctrd=new ArrayList<>();
private ArrayList<controll> ctrl=new ArrayList<>();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Series() {
}
public double getU() {
return U;
}
public void setU(double u) {
U=u;
}
public double getR() {
double r=0;
for(Parallel p:getPar()){
r=r+p.getR();
}
for(controlled c:getCtrd()){
r=r+c.getR();
}
return r;
}
public int getState() {
for(controll c:getCtrl()){
if(c instanceof K){
K k=(K)c;
if(k.getState()==0){
return 0;
}
}
}
for(Parallel p:getPar()){
if(p.getState()==0){
return 0;
}
}
return 1;
}
public double getI() {
return getU()/getR();
}
public void setI(double i) {
I=i;
}
public ArrayList<Parallel> getPar() {
return par;
}
public void setPar(ArrayList<Parallel> par) {
this.par = par;
}
public ArrayList<controlled> getCtrd() {
return ctrd;
}
public void setCtrd(ArrayList<controlled> ctrd) {
this.ctrd = ctrd;
}
public ArrayList<controll> getCtrl() {
return ctrl;
}
public void setCtrl(ArrayList<controll> ctrl) {
this.ctrl = ctrl;
}
}
- 注意事项:最后的输出是按照每个电路元件的序号输出,输入内容的序号是随机的,所以最后要把整个电路的所有电路元件按种类分类并存储,最后根据他们的序号进行输出(对各个记录电路元件的动态数组排序并输出)
点击查看代码
Collections.sort(K_list);
Collections.sort(D_list);
Collections.sort(A_list);
Collections.sort(R_list);
Collections.sort(B_list);
for(K k:K_list){
if(k.getState()==0){
System.out.println("@" + k.getName() + ":" + "turned on");
}
else {
System.out.println("@" + k.getName() + ":" + "closed");
}
}
for(controll c:main_ser.getCtrl()){
if(c instanceof L){
L l=(L)c;
System.out.println("@" + l.getName() + ":" + l.getstate());
}
else if(c instanceof F){
F f=(F)c;
System.out.println("@" + f.getName() + ":" + f.getstate());
}
}
for(B b:B_list){
System.out.println("@" + b.getName() + ":" + b.getstata());
}
for(R r1:R_list){
System.out.println("@" + r1.getName() + ":" + r1.getstata());
}
for(D d:D_list){
System.out.println("@" + d.getName() + ":" + d.getstata());
}
for(A a:A_list){
System.out.println("@" + a.getName() + ":" + a.getstata());
}
总结与展望
满分100,得分89,衷心希望能够在以后的作业中把所有的测试点都列举出来,或者至少给出提示,这样我们才能知道自己哪里没有考虑到,不然就一直蒙在鼓里不会的还是不会甚至不知从何学起!!
详细/类设计: