OOP 4-6次作业总结

23201636-曾繁榕
目录

  1. 前言
  2. 设计与分析
  3. 踩坑心得
  4. 改进建议
  5. 总结
    前言
    本次作业知识点:类与对象的复杂使用,继承的进阶使用,各种接口的实现,还主要考察了正则表达式的运用,字符串的提取分割;
    个人体会:本次作业难度适中,题量适中,但有些比较复杂的类设计上容易出现错误;第六次作业未给出测试点,自行测试使作业难度增加,测试时间增多
    大题源码
    第四次作业
    答题判题程序-4
import java.util.*;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.ArrayList;
class Question{
    String num;
    String question;
    String answer;
    String ans[];
    boolean isDelete=false;
    Question(){
        
    }
    Question(String num,String question,String answer){
        this.num = num;
        this.question = question;
        this.answer = answer;
    }
    public void add(String an){
        if(ans==null)
        {
            String a[] = new String[1];
            a[0] = an;
            ans = a;
        }
        else{
            String a[] = new String[ans.length+1];
            for(int i=0;i<ans.length;i++)
            {
                a[i]=ans[i];
            }
            a[ans.length] = an;
            ans = a;
        }
    }
    public String toString(){
        return question;
    }
}
class Kquestion extends Question{
    Kquestion(String num,String question,String answer){
        super(num,question,answer);
    }
}
class Zquestion extends Question{
    String ans[];
    Zquestion(String num,String question,String answer){
        super(num,question,answer);
    }
    // public void add(String an){
    //     if(ans==null)
    //     {
    //         String a[] = new String[1];
    //         a[0] = an;
    //         ans = a;
    //     }
    //     else{
    //         String a[] = new String[ans.length+1];
    //         for(int i=0;i<ans.length;i++)
    //         {
    //             a[i]=ans[i];
    //         }
    //         a[ans.length] = an;
    //         ans = a;
    //     }
    // }
}
class Test{
    String tnum;
    String qnum[];
    int score[];
    Test(String tnum){
        this.tnum=tnum;
    }
    public void add(String num,int s){
        if(qnum==null&&score==null)
        {
            String a[] = new String[1];
            int t[] = new int[1];
            a[0] = num;
            t[0] = s;
            qnum = a;
            score = t;
        }
        else{
            String a[] = new String[qnum.length+1];
            for(int i=0;i<qnum.length;i++)
            {
                a[i]=qnum[i];
            }
            a[qnum.length] = num;
            qnum = a;
            int t[] = new int[score.length+1];
            for(int i=0;i<score.length;i++)
            {
                t[i]=score[i];
            }
            t[score.length] = s;
            score = t;
        }
    }
}
class StuTest{
    String st;
    String snum;
    String stuid;
    int anum[];
    String answer[];
    StuTest(){
        
    }
    StuTest(String st,String snum,String stuid){
        this.st = st;
        this.snum = snum;
        this.stuid = stuid;
    }
    public void addanswer(int anumber,String ans){
        if(anum==null&&answer==null)
        {
            int num[] = new int[1];
            String a[] = new String[1];
            num[0] = anumber;
            a[0] = ans;
            anum = num;
            answer = a;
        }
        else{
            int num[] = new int[anum.length+1];
            String a[] = new String[answer.length+1];
            for(int i=0;i<anum.length;i++)
                num[i] = anum[i];
            for(int i=0;i<answer.length;i++)
            {
                a[i]=answer[i];
            }
            num[anum.length] = anumber;
            a[answer.length] = ans;
            anum = num;
            answer = a;
        }
    }
}
class Student{
    String stuID;
    String sname;
    Student(String stuID,String sname){
        this.stuID = stuID;
        this.sname = sname;
    }
    public String toString(){
        return stuID+" "+sname+": ";
    }
}
class Delete{
    String dnum;
    Delete(String dnum){
        this.dnum = dnum;
    }
}
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int num1=0,num2=0,num3=0,num4=0,num5=0;
        Question q[] = new Question[10];
        // Zquestion z[] = new Zquestion[10];
        Test t[] = new Test[5];
        StuTest stu[] = new StuTest[5];
        Student st[] = new Student[5];
        Delete d[] = new Delete[5];
        String s = sc.nextLine();
        String regex = "#N:\\s*(\\d*)\\s+#Q:(.*?)\\s+#A:(.*)";
        String regex1 = "#T:\\s*(\\d*)\\s*(\\d+-\\d+\\s*)*";
        String regex2 = "#S:\\s*(\\d*)\\s*(\\d*)\\s*(#A:(\\s*\\d+-.*\\s*)*\\s*)*";
        String regex3 = "#X:\\s*(\\d*)\\s*(.*?)";
        String regex4 = "#D:\\s*N-(\\d+\\s*)";
        String regex5 = "#Z:\\s*(\\d*)\\s+#Q:(.*?)\\s+#A:(.*)";
        String regex6 = "#K:\\s*(\\d*)\\s+#Q:(.*?)\\s+#A:(.*)";
        Pattern pattern = Pattern.compile(regex);
        Pattern pattern1 = Pattern.compile(regex5);
        Pattern pattern2 = Pattern.compile(regex6);
        while(true){
            if(s.equals("end"))
                break;
            if(Pattern.matches(regex,s))
            {
                Matcher m = pattern.matcher(s);
                if(m.find())
                {
                    q[num1] = new Question(m.group(1).trim(),m.group(2).trim(),m.group(3).trim()+"");
                }
                // System.out.println(q[num1].toString());
                num1++;
            }
            else if(Pattern.matches(regex5,s)){
                Matcher m = pattern1.matcher(s);
                if(m.find())
                {
                    q[num1] = new Zquestion(m.group(1).trim(),m.group(2).trim(),m.group(3).trim());
                    String S = m.group(3).trim();
                    String Str[] = S.split(" ");
                    for(int i=0;i<Str.length;i++)
                    {
                        q[num1].add(Str[i]);
                    }
                }
                num1++;
            }
            else if(Pattern.matches(regex6,s)){
                Matcher m = pattern2.matcher(s);
                if(m.find())
                {
                    // System.out.println(m.group(1).trim()+m.group(2).trim());
                    q[num1] = new Kquestion(m.group(1).trim(),m.group(2).trim(),m.group(3).trim()+"");
                }
                num1++;
            }
            else if(Pattern.matches(regex1,s))
            {
                String str[] = s.split(" ");
                String ss = str[0].replace("#T:","");
                // System.out.println(ss);
                t[num2] = new Test(ss);
                if(str.length>1){
                    for(int i=1;i<str.length;i++)
                    {
                        String str1[] = str[i].split("-");
                        int x = Integer.parseInt(str1[1]);
                        t[num2].add(str1[0],x);
                    }
                }
                num2++;
            }
            else if(Pattern.matches(regex2,s))
            {
                String str[] = s.split("#");
                // System.out.println(str.length);
                String ss = str[1].replace("S:","");
                String ss1[] = ss.split(" ");
                stu[num3] = new StuTest(ss,ss1[0],ss1[1]);
                if(str.length>2){
                    String sstr[] = new String[str.length-2];
                    for(int i=0;i<sstr.length;i++)
                    {
                        sstr[i] = str[i+2].trim();
                    }
                    // Arrays.sort(sstr);
                    for(int i=0;i<sstr.length;i++)
                    {
                        String sss = sstr[i].replace("A:","");
                        if(!sss.equals("")){
                        String str1[] = sss.split("-");
                        if(str1.length==1){
                            int x = Integer.parseInt(str1[0]);
                            stu[num3].addanswer(x,"");
                    }
                        else if(str1.length==2){
                            int x = Integer.parseInt(str1[0]);
                            stu[num3].addanswer(x,str1[1]);
                        }
                        }
                    }
                }
                num3++;
            }
            else if(Pattern.matches(regex3,s))
            {
                String str[] = s.replace("#X:","").split("-");
                for(int i=0;i<str.length;i++){
                    String str1[] = str[i].split(" ");
                    st[num4] = new Student(str1[0],str1[1]);
                    num4++;
                }
            }
            else if(Pattern.matches(regex4,s))
            {
                String str = s.replace("#D:N-","");
                d[num5] = new Delete(str);
                num5++;
            }
            else
                System.out.println("wrong format:"+s);
            s = sc.nextLine();
        }
        // Arrays.sort(sr);
        for(int i=0;i<num3;i++)
        {
            for(int j=0;j<num3-i-1;j++)
            {
                if(stu[j].stuid.compareTo(stu[j+1].stuid)>0)
                {
                    StuTest te;
                    te = stu[j];
                    stu[j] = stu[j+1];
                    stu[j+1] = te;
                }
            }
        }
        for(int i=0;i<num2;i++)
        {
            for(int j=0;j<num2-i-1;j++)
            {
                if(stu[j].snum.compareTo(stu[j+1].snum)>=0)
                {
                    StuTest te;
                    te = stu[j];
                    stu[j] = stu[j+1];
                    stu[j+1] = te;
                }
            }
        }
        for(int i=0;i<num1;i++)
        {
            for(int j=0;j<num5;j++)
            {
                if(q[i].num.equals(d[j].dnum))
                    q[i].isDelete = true;
            }
        }
        for(int i=0;i<num2;i++)
        {
            int sum = 0;
            for(int j=0;j<t[i].score.length;j++)
            {
                sum = sum + t[i].score[j];
            }
            if(sum!=100)
                System.out.println("alert: full score of test paper"+t[i].tnum+" is not 100 points");
        }
        for(int i=0;i<num3;i++)
        {
            int index = -1;
            int sum = 0;
            for(int j=0;j<num2;j++)
            {
                if(stu[i].snum.equals(t[j].tnum))
                    index = j;
            }
            int l = 0;
            if(stu[i].answer!=null){
                l = stu[i].answer.length;
            }
            if(index==-1)
            {
                System.out.println("The test paper number does not exist");
            }
            else
            {
                int x = 0,y = 0;
                for(int m=0;m<t[index].score.length;m++)
                {
                    boolean f = true;
                for(int j=0;j<l;j++)
                {
                    if(m+1==stu[i].anum[j]){
                        f = false;
                    if(j<t[index].score.length){
                    for(int k=0;k<num1;k++)
                    {
                        boolean b = false;
                        if(t[index].qnum[m].equals(q[k].num)&&!q[k].isDelete)
                        {
                            if(q[k] instanceof Zquestion){
                                String ss[] = stu[i].answer[j].split(" ");
                                Arrays.sort(ss);
                                Arrays.sort(q[k].ans);
                                List listA = Arrays.asList(ss);
                                List listB = Arrays.asList(q[k].ans);
                                if(Arrays.equals(q[k].ans,ss))
                                    System.out.println(q[k].question+"~"+stu[i].answer[j]+"~"+"true");
                                else if(listB.containsAll(listA))
                                    System.out.println(q[k].question+"~"+stu[i].answer[j]+"~"+"partially correct");
                                else
                                    System.out.println(q[k].question+"~"+stu[i].answer[j]+"~"+false);
                                if(Arrays.equals(q[k].ans,ss))
                                {
                                    sum = sum + t[index].score[m];
                                }
                                else if(listB.containsAll(listA)){
                                    sum = sum + t[index].score[m]/2;
                                }
                            }
                            else{
                            if(q[k].answer.equals(stu[i].answer[j]))
                            {
                                b = true;
                                System.out.println(q[k].question+"~"+stu[i].answer[j]+"~"+b);
                            }
                            else if(q[k].answer.contains(stu[i].answer[j]))
                                System.out.println(q[k].question+"~"+stu[i].answer[j]+"~"+"partially correct");
                            else
                                System.out.println(q[k].question+"~"+stu[i].answer[j]+"~"+b);
                            if(b)
                            {
                                sum = sum + t[index].score[m];
                            }
                            else if(q[k].answer.contains(stu[i].answer[j])){
                                sum = sum + t[index].score[m]/2;
                            }
                            }
                        }
                    }
                        break;
                    }
                    }
                }
                    if(f)
                        System.out.println("answer is null");
                }
                for(int j=0;j<t[index].qnum.length-l-1;j++)
                    System.out.println("answer is null");
                for(int j=0;j<t[index].qnum.length;j++)
                {
                    boolean c = true;
                    for(int k=0;k<num1;k++)
                    {
                        if(q[k].num.equals(t[index].qnum[j]))
                            c = false;
                    }
                    if(c)
                    {
                        x++;
                    }
                }
                if(x!=0&&l>0)
                    System.out.println("non-existent question~0");
                for(int j=0;j<l;j++)
                {
                    if(j<t[index].score.length){
                    for(int k=0;k<num1;k++)
                    {
                        boolean b = false;
                        if(t[index].qnum[j].equals(q[k].num)&&q[k].isDelete)
                        {
                            System.out.println("the question "+q[k].num+" invalid~0");
                        }
                    }
                    }
                }
                // for(int j=0;j<t[index].qnum.length-l;j++)
                // {
                //     System.out.println("answer is null");
                //     y++;
                // }
                boolean found = false;
                for(int j=0;j<num4;j++)
                {
                    if(stu[i].stuid.equals(st[j].stuID))
                    {
                        System.out.print(st[j].toString());
                        found = true;
                    }
                }
                if(found){
                for(int m=0;m<t[index].score.length;m++)
                {
                    boolean f = true;
                for(int j=0;j<l;j++)
                {
                    if(m+1==stu[i].anum[j]){
                        f = false;
                    if(j<t[index].score.length){
                    for(int k=0;k<num1;k++)
                    {
                        boolean b = false;
                        if(t[index].qnum[m].equals(q[k].num))
                        {
                            if(q[k] instanceof Zquestion){
                                String ss[] = stu[i].answer[j].split(" ");
                                Arrays.sort(ss);
                                Arrays.sort(q[k].ans);
                                List listA = Arrays.asList(ss);
                                List listB = Arrays.asList(q[k].ans);
                                if(Arrays.equals(q[k].ans,ss)&&!q[k].isDelete)
                                {
                                    if(m==t[index].qnum.length-1){
                                        System.out.printf("%d",t[index].score[m]);
                                    }
                                    else{
                                        System.out.printf("%d ",t[index].score[m]);
                                    }
                                }
                                else if(listB.containsAll(listA)&&!q[k].isDelete){
                                    if(m==t[index].qnum.length-1){
                                    System.out.printf("%d",t[index].score[m]/2);
                                }
                                else{
                                    System.out.printf("%d ",t[index].score[m]/2);
                                }
                                }
                                else{
                                if(x==0&&m==t[index].qnum.length-1){
                                    System.out.printf("0");
                                    // y++;
                                }
                                else{
                                    System.out.printf("0 ");
                                    // y++;
                                }
                            }
                            }
                            else{
                            if(q[k].answer.equals(stu[i].answer[j]))
                                b = true;
                            if(b&&!q[k].isDelete)
                            {
                                if(m==t[index].qnum.length-1){
                                    System.out.printf("%d",t[index].score[m]);
                                }
                                else{
                                    System.out.printf("%d ",t[index].score[m]);
                                }
                            }
                            else if(q[k].answer.contains(stu[i].answer[j])&&!q[k].isDelete){
                                if(m==t[index].qnum.length-1){
                                    System.out.printf("%d",t[index].score[m]/2);
                                }
                                else{
                                    System.out.printf("%d ",t[index].score[m]/2);
                                }
                            }
                            else{
                                if(x==0&&m==t[index].qnum.length-1){
                                    System.out.printf("0");
                                    // y++;
                                }
                                else{
                                    System.out.printf("0 ");
                                    // y++;
                                }
                            }
                            }
                        }
                    }
                    }
                }
                }
                }
                    // System.out.println(x+" "+y+" "+l);
                for(int j=0;j<y;j++)
                {
                    if(x==0&&j==y-1)
                        System.out.printf("0");
                    else
                        System.out.printf("0 ");
                }
                    if(l>0){
                for(int j=0;j<x;j++)
                {
                    if(j==x-1)
                        System.out.printf("0");
                    else
                        System.out.printf("0 ");
                }
                    }
                // for(int j=0;j<t[index].qnum.length-l;j++)
                // {
                //     if(x==0&&j==t[index].qnum.length-l-1)
                //         System.out.printf("0");
                //     else
                //         System.out.printf("0 ");
                // }
                System.out.printf("~%d\n",sum);
        }
                else
                    System.out.printf(stu[i].stuid+" not found");
            }
        }
    }
}

第五次作业
家具电路模拟程序-1

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
class Device {
    protected String id;
    protected int state;
    double vt;
    int gear;
    double gea;

    public Device(String id) {
        this.id = id;
        this.state = 0;
    }
    public void updateState(){
        
    }
    public String getStatus(){
        return "";
    }
}

class Switch extends Device {
    public Switch(String id) {
        super(id);
    }
    public void updateState() {
        state = state == 0 ? 1 : 0;
    }
    public String getStatus() {
        return state == 0 ? "turned on" : "closed";
    }
}

class Fcontrol extends Device {
    private final int maxGear;

    public Fcontrol(String id, int maxGear) {
        super(id);
        this.maxGear = maxGear;
    }

    public void updateState() {
        if(gear<maxGear&&state==1)
            gear++;
        else if(gear>0&&state==0)
            gear--;
    }

    public String getStatus() {
        return String.valueOf(gear);
    }
}

class Lcontrol extends Device {
    private double gear;

    public Lcontrol(String id) {
        super(id);
    }

    public void updateState() {
        gear = gea;
    }

    public String getStatus() {
        return String.format("%.2f", gear);
    }
}

class Blight extends Device {
    private int brightness;

    public Blight(String id) {
        super(id);
    }

    public void updateState() {
        if(vt<10)
            this.brightness = 0;
        else if(vt<220)
            this.brightness = 50 + (int) (5.0/7.0*(vt-10));
        else if(vt>=220)
            this.brightness = 200;
    }

    public String getStatus() {
        return String.valueOf(brightness);
    }
}
class Light extends Device {
    private int brightness;
    public Light(String id) {
        super(id);
    }

    public void updateState() {
        if(vt==0)
            this.brightness = 0;
        else 
            this.brightness = 180;
    }

    public String getStatus() {
        return String.valueOf(brightness);
    }
}
class Fan extends Device {
    int speed;
    public Fan(String id) {
        super(id);
    }

    public void updateState() {
        if(vt<80)
            this.speed = 0;
        else if(vt<150)
            this.speed = 80 + (int) (4*(vt-80));
        else if(vt>=150)
            this.speed = 360;
    }

    public String getStatus() {
        return String.valueOf(speed);
    }
}
class Circuit {
    List<Device> devices; // 存储电路中的设备
    public Circuit() {
        devices = new ArrayList<>();
    }

    public void add(Device device) {
        devices.add(device);
    }

    public void updateState(String control) {
        
    }

    public String getStatus() {
        StringBuilder sb = new StringBuilder();
        int sum = 0;
        for (Device device : devices) {
            if(device instanceof Switch||device instanceof Fcontrol||device instanceof Lcontrol){
                sum++;
            if(sum<=devices.size()-1)
                sb.append("@").append(device.id).append(":").append(device.getStatus()).append("\n");
            else
                sb.append("@").append(device.id).append(":").append(device.getStatus());
        }
        }
        for (Device device : devices) {
            if(device instanceof Fan||device instanceof Blight||device instanceof Light){
            sum++;
            if(sum<=devices.size()-1)
                sb.append("@").append(device.id).append(":").append(device.getStatus()).append("\n");
            else
                sb.append("@").append(device.id).append(":").append(device.getStatus());
        }
        }
        return sb.toString();
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Circuit circuit = new Circuit();
        String regex = "K\\d+-\\d+";
        String regex1 = "F\\d+-\\d+";
        String regex2 = "L\\d+-\\d+";
        String regex3 = "B\\d+-\\d+";
        String regex4 = "R\\d+-\\d+";
        String regex5 = "D\\d+-\\d+";
        String regex6 = "#K\\d+";
        String regex7 = "#F\\d+\\+";
        String regex8 = "#F\\d+-";
        String regex9 = "#L\\d+:.+";
        while (sc.hasNext()) {
            String s = sc.nextLine();
            if (s.equals("end")) {
                break;
            }
            s = s.replace("[","");
            s = s.replace("]","");
            String str[] = s.split(" ");
            if(str.length>1&&Pattern.matches(regex,str[1])){
                String str1[] = str[1].split("-");
                Switch k = new Switch(str1[0]);
                circuit.add(k);
            }
            else if(str.length>1&&Pattern.matches(regex1,str[1])){
                String str1[] = str[1].split("-");
                Fcontrol f = new Fcontrol(str1[0],3);
                circuit.add(f);
            }
            else if(str.length>1&&Pattern.matches(regex2,str[1])){
                String str1[] = str[1].split("-");
                Lcontrol l = new Lcontrol(str1[0]);
                circuit.add(l);
            }
            else if(str.length>1&&Pattern.matches(regex3,str[1])){
                String str1[] = str[1].split("-");
                Blight b = new Blight(str1[0]);
                circuit.add(b);
            }
            else if(str.length>1&&Pattern.matches(regex4,str[1])){
                String str1[] = str[1].split("-");
                Light r = new Light(str1[0]);
                circuit.add(r);
            }
            else if(str.length>1&&Pattern.matches(regex5,str[1])){
                String str1[] = str[1].split("-");
                Fan d = new Fan(str1[0]);
                circuit.add(d);
            }
            else if(str.length==1&&Pattern.matches(regex6,str[0])){
                String ss = str[0].replace("#","");
                for(int i=0;i<circuit.devices.size();i++){
                    if(ss.equals(circuit.devices.get(i).id))
                        circuit.devices.get(i).updateState();
                }
            }
            else if(str.length==1&&Pattern.matches(regex7,str[0])){
                String ss = str[0].replace("#","");
                ss = ss.replace("+","");
                for(int i=0;i<circuit.devices.size();i++){
                    if(ss.equals(circuit.devices.get(i).id)){
                        circuit.devices.get(i).state = 1;
                        circuit.devices.get(i).updateState();
                    }
                }
            }
            else if(str.length==1&&Pattern.matches(regex8,str[0])){
                String ss = str[0].replace("#","");
                ss = ss.replace("-","");
                for(int i=0;i<circuit.devices.size();i++){
                    if(ss.equals(circuit.devices.get(i).id)){
                        circuit.devices.get(i).state = 0;
                        circuit.devices.get(i).updateState();
                    }
                }
            }
            else if(str.length==1&&Pattern.matches(regex9,str[0])){
                String ss[] = str[0].split(":");
                double gear = Double.parseDouble(ss[1]);
                String sss = ss[0].replace("#","");
                for(int i=0;i<circuit.devices.size();i++){
                    if(sss.equals(circuit.devices.get(i).id)){
                        circuit.devices.get(i).gea = gear;
                        circuit.devices.get(i).updateState();
                    }
                }
            }
            // 根据输入的控制信息更新电路状态
            // 这里需要根据实际输入的控制信息来更新电路状态
        }
        double vt = 220;
        for(int i=0;i<circuit.devices.size();i++){
            if(circuit.devices.get(i) instanceof Fcontrol){
                if(circuit.devices.get(i).gear==0)
                    vt = 0;
                else if(circuit.devices.get(i).gear==1)
                    vt = (0.3 * vt);
                else if(circuit.devices.get(i).gear==2)
                    vt = (0.6 * vt);
                else if(circuit.devices.get(i).gear==3)
                    vt = (0.9 * vt);
            }
            else if(circuit.devices.get(i) instanceof Lcontrol){
                vt = (circuit.devices.get(i).gea * vt);
            }
            else if(circuit.devices.get(i) instanceof Switch)
            {
                if(circuit.devices.get(i).state == 0)
                    vt = 0;
            }
        }
        for(Device device : circuit.devices){
            if(device instanceof Fan)
            {
                device.vt = vt;
                device.updateState();
            }
            else if(device instanceof Blight)
            {
                device.vt = vt;
                device.updateState();
            }
            else if(device instanceof Light)
            {
                device.vt = vt;
                device.updateState();
            }
        }
        System.out.println(circuit.getStatus());
    }
}

第六次作业
家居电路模拟程序-2

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.Collections;
import java.util.Comparator;
class Device{
    protected String id;
    protected int state;
    double vt;
    int gear;
    double gea;
    double r;

    public Device(String id) {
        this.id = id;
        this.state = 0;
    }
    public void updateState(){
        
    }
    public String getStatus(){
        return "";
    }
}

class Switch extends Device {
    public Switch(String id) {
        super(id);
    }
    public void updateState() {
        state = state == 0 ? 1 : 0;
    }
    public String getStatus() {
        return state == 0 ? "turned on" : "closed";
    }
}

class Fcontrol extends Device {
    private final int maxGear;

    public Fcontrol(String id, int maxGear) {
        super(id);
        this.maxGear = maxGear;
    }

    public void updateState() {
        if(gear<maxGear&&state==1)
            gear++;
        else if(gear>0&&state==0)
            gear--;
    }

    public String getStatus() {
        return String.valueOf(gear);
    }
}

class Lcontrol extends Device {
    private double gear;

    public Lcontrol(String id) {
        super(id);
    }

    public void updateState() {
        gear = gea;
    }

    public String getStatus() {
        return String.format("%.2f", gear);
    }
}

class Blight extends Device {
    private int brightness;

    public Blight(String id) {
        super(id);
        r = 10;
    }

    public void updateState() {
        if(vt<10)
            this.brightness = 0;
        else if(vt<220)
            this.brightness = 50 + (int) (5.0/7.0*(vt-10));
        else if(vt>=220)
            this.brightness = 200;
    }

    public String getStatus() {
        return String.valueOf(brightness);
    }
}
class Light extends Device {
    private int brightness;
    public Light(String id) {
        super(id);
        r = 5;
    }

    public void updateState() {
        if(vt==0)
            this.brightness = 0;
        else 
            this.brightness = 180;
    }

    public String getStatus() {
        return String.valueOf(brightness);
    }
}
class Fan extends Device {
    int speed;
    public Fan(String id) {
        super(id);
        r = 20;
    }

    public void updateState() {
        if(vt<80)
            this.speed = 0;
        else if(vt<150)
            this.speed = 80 + (int) (4*(vt-80));
        else if(vt>=150)
            this.speed = 360;
    }

    public String getStatus() {
        return String.valueOf(speed);
    }
}
class Afan extends Device {
    int speed;
    public Afan(String id) {
        super(id);
        r = 20;
    }

    public void updateState() {
        if(vt<80)
            this.speed = 0;
        else if(vt<100)
            this.speed = 80;
        else if(vt<120)
            this.speed = 160;
        else if(vt<140)
            this.speed = 260;
        else if(vt>=140)
            this.speed = 360;
    }

    public String getStatus() {
        return String.valueOf(speed);
    }
}
class M {
    double r;
    List<T> ts;
    public M() {
        ts = new ArrayList<>();
    }
    public void add(T t) {
        ts.add(t);
    }
    public void computeR(){
        double sum = 0;
        for(T t : ts){
            // System.out.println(1.0/t.r);
            if(t.isClosed()){
                sum = sum + 1.0/t.r;
            }
        }
        this.r = (1.0/sum);
    }
}
class T {
    double r;
    String id;
    List<M> ms;
    List<Device> devices; // 存储电路中的设备
    public T(String id) {
        this.id = id;
        devices = new ArrayList<>();
        ms = new ArrayList<>();
    }

    public void add(Device device) {
        devices.add(device);
    }
    public void addm(M m) {
        ms.add(m);
    }
    public boolean isClosed(){
        for (Device device : devices){
            if(device instanceof Switch){
                if(device.state==0)
                    return false;
            }
        }
        return true;
    }
    public void computeR(){
        for (Device device : devices){
            this.r = this.r + device.r;
        }
        for (M m : ms)
            this.r = this.r + m.r;
    }
}
class Circuit {
    List<Device> devices; // 存储电路中的设备
    public Circuit() {
        devices = new ArrayList<>();
    }

    public void add(Device device) {
        devices.add(device);
    }

    public void updateState(String control) {
        
    }

    public String getStatus() {
        StringBuilder sb = new StringBuilder();
        int sum = 0;
        devices.sort(new Comparator<Device>()
        {
            @Override
            public int compare(Device d1,Device d2)
            {
                String id1 = d1.id;
                String id2 = d2.id;
                return id1.compareTo(id2);
            }
        });
        for (Device device : devices) {
            if(device instanceof Switch){
                sum++;
            if(sum<=devices.size()-1)
                sb.append("@").append(device.id).append(":").append(device.getStatus()).append("\n");
            else
                sb.append("@").append(device.id).append(":").append(device.getStatus());
        }
        }
        for (Device device : devices) {
            if(device instanceof Fcontrol){
                sum++;
            if(sum<=devices.size()-1)
                sb.append("@").append(device.id).append(":").append(device.getStatus()).append("\n");
            else
                sb.append("@").append(device.id).append(":").append(device.getStatus());
        }
        }
        for (Device device : devices) {
            if(device instanceof Lcontrol){
                sum++;
            if(sum<=devices.size()-1)
                sb.append("@").append(device.id).append(":").append(device.getStatus()).append("\n");
            else
                sb.append("@").append(device.id).append(":").append(device.getStatus());
        }
        }
        for (Device device : devices) {
            if(device instanceof Blight){
            sum++;
            if(sum<=devices.size()-1)
                sb.append("@").append(device.id).append(":").append(device.getStatus()).append("\n");
            else
                sb.append("@").append(device.id).append(":").append(device.getStatus());
        }
        }
        for (Device device : devices) {
            if(device instanceof Light){
            sum++;
            if(sum<=devices.size()-1)
                sb.append("@").append(device.id).append(":").append(device.getStatus()).append("\n");
            else
                sb.append("@").append(device.id).append(":").append(device.getStatus());
        }
        }
        for (Device device : devices) {
            if(device instanceof Fan){
            sum++;
            if(sum<=devices.size()-1)
                sb.append("@").append(device.id).append(":").append(device.getStatus()).append("\n");
            else
                sb.append("@").append(device.id).append(":").append(device.getStatus());
        }
        }
        for (Device device : devices) {
            if(device instanceof Afan){
            sum++;
            if(sum<=devices.size()-1)
                sb.append("@").append(device.id).append(":").append(device.getStatus()).append("\n");
            else
                sb.append("@").append(device.id).append(":").append(device.getStatus());
        }
        }
        return sb.toString();
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Circuit circuit = new Circuit();
        T t[] = new T[5];
        M m = new M();
        int tn = 0;
        String regex = "K\\d+-\\d+";
        String regex1 = "F\\d+-\\d+";
        String regex2 = "L\\d+-\\d+";
        String regex3 = "B\\d+-\\d+";
        String regex4 = "R\\d+-\\d+";
        String regex5 = "D\\d+-\\d+";
        String regex6 = "#K\\d+";
        String regex7 = "#F\\d+\\+";
        String regex8 = "#F\\d+-";
        String regex9 = "#L\\d+:.+";
        String regex10 = "#T\\d+:.*";
        String regex11 = "#M\\d+:.*";
        String regex12 = "M\\d+-IN";
        String regex13 = "A\\d+-\\d+";
        Pattern pattern = Pattern.compile("\\[([^\\[\\]]|\\[.*?\\])*\\]");
        while (sc.hasNext()) {
            String s = sc.nextLine();
            if(Pattern.matches(regex10,s))
            {
                String sstr[] = s.split(":");
                String id = sstr[0].replace("#","");
                t[tn] = new T(id);
                Matcher matcher = pattern.matcher(s);
                List<String> matchs = new ArrayList<>();
                while (matcher.find()){
                    String match = matcher.group(0);
                    match = match.trim();
                    matchs.add(match);
                }
                for(String match : matchs)
                {
                    // System.out.println(match);
                    s = match;
                    s = s.replace("[","");
                    s = s.replace("]","");
                    String str[] = s.split(" ");
                    if(str.length>1&&Pattern.matches(regex,str[1])){
                        String str1[] = str[1].split("-");
                        Switch k = new Switch(str1[0]);
                        circuit.add(k);
                        t[tn].add(k);
                    }
                    else if(str.length>1&&Pattern.matches(regex1,str[1])){
                        String str1[] = str[1].split("-");
                        Fcontrol f = new Fcontrol(str1[0],3);
                        circuit.add(f);
                        t[tn].add(f);
                    }
                    else if(str.length>1&&Pattern.matches(regex2,str[1])){
                        String str1[] = str[1].split("-");
                        Lcontrol l = new Lcontrol(str1[0]);
                        circuit.add(l);
                        t[tn].add(l);
                    }
                    else if(str.length>1&&Pattern.matches(regex3,str[1])){
                        String str1[] = str[1].split("-");
                        Blight b = new Blight(str1[0]);
                        circuit.add(b);
                        t[tn].add(b);
                    }
                    else if(str.length>1&&Pattern.matches(regex4,str[1])){
                        String str1[] = str[1].split("-");
                        Light r = new Light(str1[0]);
                        circuit.add(r);
                        t[tn].add(r);
                    }
                    else if(str.length>1&&Pattern.matches(regex5,str[1])){
                        String str1[] = str[1].split("-");
                        Fan d = new Fan(str1[0]);
                        circuit.add(d);
                        t[tn].add(d);
                    }
                    else if(str.length>1&&Pattern.matches(regex13,str[1])){
                        String str1[] = str[1].split("-");
                        Afan a = new Afan(str1[0]);
                        circuit.add(a);
                        t[tn].add(a);
                    }
                    else if(str.length>1&&Pattern.matches(regex12,str[1])){
                        t[tn].addm(m);
                    }
                }
                // System.out.println(t[tn].r);
                tn++;
            }
            else if(Pattern.matches(regex11,s)){
                String str[] = s.split(":");
                s = str[1].replace("[","");
                s = s.replace("]","");
                String sstr[] = s.split(" ");
                for(int i=0;i<sstr.length;i++){
                    for(int j=0;j<tn;j++){
                        if(sstr[i].equals(t[j].id)){
                            m.add(t[j]);
                        }
                    }
                }
            }
            if (s.equals("end")) {
                break;
            }
            s = s.replace("[","");
            s = s.replace("]","");
            String str[] = s.split(" ");
            if(str.length==1&&Pattern.matches(regex6,str[0])){
                String ss = str[0].replace("#","");
                for(int i=0;i<circuit.devices.size();i++){
                    if(ss.equals(circuit.devices.get(i).id))
                        circuit.devices.get(i).updateState();
                }
                // for(int i=0;i<t[tn-1].devices.size();i++){
                //     if(ss.equals(t[tn-1].devices.get(i).id))
                //         t[tn-1].devices.get(i).updateState();
                // }
            }
            else if(str.length==1&&Pattern.matches(regex7,str[0])){
                String ss = str[0].replace("#","");
                ss = ss.replace("+","");
                for(int i=0;i<circuit.devices.size();i++){
                    if(ss.equals(circuit.devices.get(i).id)){
                        circuit.devices.get(i).state = 1;
                        circuit.devices.get(i).updateState();
                    }
                }
                // for(int i=0;i<t[tn-1].devices.size();i++){
                //     if(ss.equals(t[tn-1].devices.get(i).id)){
                //         t[tn-1].devices.get(i).state = 1;
                //         t[tn-1].devices.get(i).updateState();
                //     }
                // }
            }
            else if(str.length==1&&Pattern.matches(regex8,str[0])){
                String ss = str[0].replace("#","");
                ss = ss.replace("-","");
                for(int i=0;i<circuit.devices.size();i++){
                    if(ss.equals(circuit.devices.get(i).id)){
                        circuit.devices.get(i).state = 0;
                        circuit.devices.get(i).updateState();
                    }
                }
                // for(int i=0;i<t[tn-1].devices.size();i++){
                //     if(ss.equals(circuit.devices.get(i).id)){
                //         t[tn-1].devices.get(i).state = 0;
                //         t[tn-1].devices.get(i).updateState();
                //     }
                // }
            }
            else if(str.length==1&&Pattern.matches(regex9,str[0])){
                String ss[] = str[0].split(":");
                double gear = Double.parseDouble(ss[1]);
                String sss = ss[0].replace("#","");
                for(int i=0;i<circuit.devices.size();i++){
                    if(sss.equals(circuit.devices.get(i).id)){
                        circuit.devices.get(i).gea = gear;
                        circuit.devices.get(i).updateState();
                    }
                }
                // for(int i=0;i<t[tn-1].devices.size();i++){
                //     if(sss.equals(t[tn-1].devices.get(i).id)){
                //         t[tn-1].devices.get(i).gea = gear;
                //         t[tn-1].devices.get(i).updateState();
                //     }
                // }
            }
            // 根据输入的控制信息更新电路状态
            // 这里需要根据实际输入的控制信息来更新电路状态
        }
        for(int i=0;i<tn-1;i++)
        {
            t[i].computeR();
            // System.out.println(t[i].r);
        }
        m.computeR();
        // System.out.println(m.r);
        t[tn-1].computeR();
        // System.out.println(t[tn-1].r);
        double vt = 220;
        for(int i=0;i<t[tn-1].devices.size();i++){
            if(t[tn-1].devices.get(i) instanceof Fcontrol){
                if(t[tn-1].devices.get(i).gear==0)
                    vt = 0;
                else if(t[tn-1].devices.get(i).gear==1)
                    vt = (0.3 * vt);
                else if(t[tn-1].devices.get(i).gear==2)
                    vt = (0.6 * vt);
                else if(t[tn-1].devices.get(i).gear==3)
                    vt = (0.9 * vt);
            }
            else if(t[tn-1].devices.get(i) instanceof Lcontrol){
                vt = (t[tn-1].devices.get(i).gea * vt);
            }
            else if(t[tn-1].devices.get(i) instanceof Switch)
            {
                if(t[tn-1].devices.get(i).state == 0)
                    vt = 0;
            }
        }
        for(int i=0;i<m.ts.size();i++){
            if(m.ts.get(i).isClosed()){
                for(Device device : m.ts.get(i).devices){
                if(device instanceof Fan)
                {
                    device.vt = 1.0*(device.r/m.ts.get(i).r)*m.r/t[tn-1].r*vt;
                    device.updateState();
                }
                else if(device instanceof Afan)
                {
                    device.vt = 1.0*(device.r/m.ts.get(i).r)*m.r/t[tn-1].r*vt;
                    device.updateState();
                }
                else if(device instanceof Blight)
                {
                    device.vt = 1.0*(device.r/m.ts.get(i).r)*m.r/t[tn-1].r*vt;
                    device.updateState();
                }
                else if(device instanceof Light)
                {
                    device.vt = 1.0*(device.r/m.ts.get(i).r)*m.r/t[tn-1].r*vt;
                    device.updateState();
                }
                }
            }
        }
        for(Device device : t[tn-1].devices){
            if(device instanceof Fan)
            {
                device.vt = 1.0*device.r/t[tn-1].r*vt;
                device.updateState();
            }
            else if(device instanceof Afan)
            {
                device.vt = 1.0*device.r/t[tn-1].r*vt;
                device.updateState();
            }
            else if(device instanceof Blight)
            {
                device.vt = 1.0*device.r/t[tn-1].r*vt;
                device.updateState();
            }
            else if(device instanceof Light)
            {
                device.vt = 1.0*device.r/t[tn-1].r*vt;
                device.updateState();
            }
        }
        System.out.println(circuit.getStatus());
    }
}


设计与分析
第四次作业
答题判题程序-4

第四次作业中的类比较,结构较为复杂,类间关系复杂,新加入多选题和填空题两种类,不同题目类可以继承同一个父类;
第五次作业
家居电路模拟程序-1

本次作业是家居电路模拟程序第一次作业,类间关系较为简单,主要为不同电器类与控制设备类继承同一个父类;
第六次作业
家居电路模拟系统-2

本次作业新加入了落地扇类、串联电路与并联电路类,落地扇继承电子设备类,串联电路与并联电路中有不同电器类,两种不同电路类中还有另一个电路类,类间关系更难设计;

踩坑心得
第四次作业
答题判题程序-4
本次作业中出现较多问题,对格式的处理,以及多学生多试卷容易出现非零返回等问题,主要由于各种循环处理不当,信息输出顺序出现问题,导致各种问题出现;
第五次作业
家居电路模拟程序-1
本次作业为家居电路第一次作业,作业难度较为简单,问题主要是对各种设备的输出处理,以及各种设备的输出顺序还有最后一个不回车处理,以及多个开关等情况;
第六次作业
家居电路模拟系统-2
本次作业较上一次有所提高,问题主要出现在计算,对并联电路上多个电器存在时忘记进行分压处理,以及忘记将新添加的落地扇电器进行处理,导致出现问题;

改进建议

  1. 对接口的使用较少,后续比较等可使用Comparable接口代替比较方法
  2. 未使用抽象类,对抽象类理解不足
  3. 对引脚的处理后续可使用Hash Map来储存一个设备的不同引脚
  4. 父类中有很多一些子类不使用的属性,浪费储存空间
  5. 注释过少,后续代码可通过添加注释令代码简单易懂
  6. 对强制转换的使用不够熟练,使用父类时调用父类数据而未调用子类数据

总结
在本次系列作业中,我们经历了从简单的类结构设计到复杂的类间关系构建的过程,通过答题判题程序、家居电路模拟程序等任务,不仅加深了对面向对象编程的理解,也认识到了在实际编程中可能遇到的挑战和问题。
通过这三次作业,我们深刻体会到了面向对象编程中的种种挑战。从循环处理不当、输出顺序错误,到电路计算中的疏忽,每一次问题都让我们对编程的严谨性有了更深的认识。同时,也让我们意识到在编程过程中,不仅要关注代码的逻辑正确性,还要关注代码的可读性和可维护性。
经过连续三次的作业挑战,我对于面向对象编程的理解和应用能力有了显著提升。从答题判题程序到家居电路模拟系统,每一次的作业都加深了我对类设计、继承、多态等核心概念的理解。

posted @ 2024-06-01 10:27  源颖  阅读(40)  评论(0)    收藏  举报