第一次部落格作業

边某發表於2024-04-19

一、前言

這三次的大作業是一次次的迭代的過程,可以很好的鍛鍊我們的思維能力以及解決問題的能力,在寫這三次大作業的過程中,我很明顯的感覺到我的思維變得更加敏捷,在程式碼運用方面也越來越熟悉,學會了如何將理論的知識運用到實際的程式碼中去,接下來我將從三次作業的知識點,題量,難度等方面對其進行分析

第一次作業

第一次作業的題量較大但難度較低,需要實現的功能也不多,只需按照提示實現正確寫出三個類(題目類,試卷類,答卷類)即可。
這次作業運用到了集合類,連結串列,正則等全新的知識,只要在原有的基礎上學習這幾類的知識,第一次大作業即可圓滿完成。完成這次的大作業使得我對迴圈,方法,正則,List等的使用更加熟悉。

第二次作業

第二次的作業在第一次的基礎上加大了難度,除了要求掌握基本的語法和控制結構外,還需要靈活運用函式和陣列來處理更復雜的資料結構,更加註重Java的函式和陣列的應用,在第一次的基礎上新增了hashMap等知識點。由於我第一次大作業的邏輯不夠清晰而且沒有掌握Arraylist和hashMap等知識點,使得第一次的程式碼在第二次大作業毫無用處,再加上最後一題留有的時間不多,導致沒有在規定時間內完成第二次大作業。

第三次作業

第三次的作業在第二次的基礎上再次加大難度,由於難度的加大,題目也從五題減少到了三題,這次的作業在上次的基礎上增加了學號,以及試卷等資訊是否存在的判斷,輸入的資訊也從原來的三種增加到了“題目資訊,試卷資訊,學生資訊,答卷資訊刪除題目資訊”五種,比前兩次的題目更加複雜也需要更加嚴密的思維邏輯。首先我們需要按照題目要求儲存所有的資訊,在儲存之前還需要判斷輸入的資訊格式是否正確(需要運用到正規表示式)。然後根據試卷裡的題目進行逐一判斷,判斷時第一步需要從學生的答卷中找尋,找尋成功再去總題庫中尋找然後判斷對錯,再來計算分數。在此過程中,我們還需要準確的判斷此題目是“不存在”還是“被刪除”,每種情況輸出的結果都是不一樣的,這需要我們對題目掌握的非常清晰,稍有疏忽就有導致邏輯錯誤。
吸取了第二次大作業的教訓,我在開始寫第三次大作業之前先去學習鞏固了List,hashMap,正規表示式等知識點,在完成這次大作業的過程中我明顯感覺到比上次更加遊刃有餘,儘管這次的難度更加大,我仍然在規定時間之前完成了這次的大作業。

二、設計與分析

第一次作業

第二次作業

第三次作業

點選檢視程式碼
import java.util.*;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.Set;
import java.util.regex.*;
//注:除了試卷類要計算分數要用int型別以外別的都用String型別
public class Main{
    static int check1(String line)
    {
        String pattern = "#N:\\d+ #Q:(.+) #A:(.+)*";
            Pattern r = Pattern.compile(pattern);
            Matcher m = r.matcher(line);
            if(m.matches()){
                return 1;
            }
            else{
                return 0;
            }
    }
    static int check2(String line)
    {
        String pattern =  "^#T:\\d+( \\d+-\\d+)*";
            Pattern r = Pattern.compile(pattern);
            Matcher m = r.matcher(line);
            if(m.matches()){
                return 1;
            }
            else{
                return 0;
            }
    }
    static int check3(String line)
    {
        String pattern = "#X:\\d+(\\w+ \\w+)+(-\\w+ \\w+)*";
            Pattern r = Pattern.compile(pattern);
            Matcher m = r.matcher(line);
            if(m.matches()){
                return 1;
            }
            else{
                return 0;
            }
    }
    static int check4(String line)
    {
        String pattern = "#S:\\d+ \\w+( #A:\\w+-(.*)*)*";
            Pattern r = Pattern.compile(pattern);
            Matcher m = r.matcher(line);
            if(m.matches()){
                return 1;
            }
            else{
                return 0;
            }
    }
    static int check5(String line)
    {
        String pattern = "#D:N-\\d+";
            Pattern r = Pattern.compile(pattern);
            Matcher m = r.matcher(line);
            if(m.matches()){
                return 1;
            }
            else{
                return 0;
            }
        }
    //刪除題目連結串列中的題目,將題號改為"刪除",num為要刪除的題目的編號,並將試卷類中的分數換為0
    static void delete(String num,List<Topic> topics,List<Paper> papers)
    {
        for(int i=0;i<topics.size();i++)
        {
            if(topics.get(i).getnum().equals(num))
            {
                topics.get(i).setstandardAnswer("已刪除");
                break;
            }
                
        }
        // for(int i=0;i<papers.size();i++)
        // {
        //     Set<String> keys=papers.get(i).getmap().keySet();
        // for(String key:keys){
        //     if(papers.get(i).getPaperCount().equals(num))
        //     {
        //         papers.get(i).getmap().put(num,0);
        //         break;
        //     }
        // }
        // }
    }
        
     public static void main(String [] args){
         Scanner s = new Scanner(System.in);
         List<Topic> topics=new ArrayList<>();
         List<Paper> papers=new ArrayList<>();
         List<Answer> answers=new ArrayList<>();
         List<String> studentNumber=new ArrayList<>();
         List<String> studentName=new ArrayList<>();
         while (s.hasNextLine()) {
         String line = s.nextLine();
             if (line.equals("end")) {
                break;
            }
             int a=0;
             if (line.startsWith("#N")) {
             a=1;
                 if(check1(line)==0)
                 {
                     System.out.println("wrong format:"+line);
                     continue;
                 }
                     
            } else if (line.startsWith("#T")) {
               a=2;
                 if(check2(line)==0)
                     {
                     System.out.println("wrong format:"+line);
                     continue;
                 }
            } else if (line.startsWith("#X:")) {
                a=3;
                 if(check3(line)==0)
                     {
                     System.out.println("wrong format:"+line);
                     continue;
                 }
            }else if (line.startsWith("#S")) {
                a=4;
                 if(check4(line)==0)
                    {
                     System.out.println("wrong format:"+line);
                     continue;
                 }
            }else if (line.startsWith("#D")) {
                a=5;
                 if(check5(line)==0)
                     {
                     System.out.println("wrong format:"+line);
                     continue;
                 }
            }else
             {
                 System.out.println("wrong format:"+line);
             }
             switch(a)
             {
                     case 1://N
                     String[] parts = line.split(" *#A: *| #Q:|#N:");
                         //("\\s+");
                     //(" *#A: *| #Q:|#N:");
                     // for(int i=0;i<parts.length;i++)
                     // System.out.println(parts[i]);
                     if(parts.length>=4)
                     {
                         String number = parts[1];
                    String content = parts[2];
                    String answer = parts[3];
                     //System.out.println(number+"m"+content+"n"+answer);
                     topics.add(new Topic(number,content,answer));
                     }else
                     {
                         String number = parts[1];
                    String content = parts[2];
                    String answer =" ";
                     //System.out.println(number+"m"+content+"n"+answer);
                     topics.add(new Topic(number,content,answer));
                     }
                    
                     break;
                     case 2://T
                     String[] parts1 = line.split("\\s+");
                    String paperNumber = parts1[0].substring(3);
                    Paper testPaper = new Paper(paperNumber);
                     int totalScore=0;
                    for (int i = 1; i < parts1.length; i++) {
                        String[] subParts = parts1[i].split("-");
                        String questionNumber =subParts[0];
                        int score = Integer.parseInt(subParts[1]);
                        totalScore+=score;
                        testPaper.getmap().put(questionNumber,score);
                        testPaper.nums.add(questionNumber);
                        //testPaper.scores.add(score);
                    }
                     if(totalScore!=100)
                     {
                         System.out.println("alert: full score of test paper" + paperNumber + " is not 100 points");
                     }
                     
                     // System.out.println(testPaper.nums);
                     papers.add(testPaper);
                     break;
                     case 3://X
                     String[] parts2 = line.split("-");
                     String[] subParts1 = parts2[0].split("\\s+");
                     studentNumber.add(subParts1[0].substring(3));
                     studentName.add(subParts1[1]);
                     for (int i = 1; i <parts2.length; i++) {
                        String[] subParts2 = parts2[i].split("\\s+");
                        studentNumber.add(subParts2[0]);
                         studentName.add(subParts2[1]);
                    }
                     break;
                     case 4://S
                     String[] parts3 = line.split("#S:| *#A:");
                         //("\\s+");
                         //("#S:| *#A:");
                     //      for(int i=0;i<parts3.length;i++)
                     // System.out.println(parts3[i]);
                     String[] parts4 = parts3[1].split(" ");
                    String num = parts4[0];
                    String number1 = parts4[1];
                     Answer testAnswer=new Answer(num,number1);
                    for (int i = 2; i < parts3.length; i++) {
                        String[] subParts = parts3[i].split("(?<=\\d)-");
                        String n=" ",an=" ";
                     if(subParts.length==1)
                     {
                          n = subParts[0];
                         an = " ";
                     }else
                     {
                          n = subParts[0];
                        an = subParts[1];
                     }
                        
                        testAnswer.getmap().put(n,an);
                    }
                     answers.add(testAnswer);
                     break;
                     case 5://D
                     String[] subParts = line.split("-");
                     delete(subParts[1],topics,papers);
                     break;
                     default:break;
             }
                
        }
             // for(int i=0;i<papers.size();i++)
             //    { 
             //        if(papers.get(i).getTotalScore()!=100)
             //        {
             //             System.out.println("alert: full score of test paper" + papers.get(i).getPaperCount() + " is not 100 points");
             //        }
             //    }
         for(int i=0;i<answers.size();i++)
         {
             int j=0;
             int index=0;
             //answers.get(i).getnum()->試卷號
             for(j=0;j<papers.size();j++)
             {
                 if(answers.get(i).getnum().equals(papers.get(j).getPaperCount()))
                 {
                     answers.get(i).check(topics,papers.get(j));
                     index=1;
                     break;
                 }
             }
             if(index==0)
                 System.out.println("The test paper number does not exist");
             
             if(index==1)
             {
                 if(checkStudentNumber(answers.get(i),studentNumber)==1)
             {
                     int k=0;
                     //找到學號
                     for(k=0;k<studentNumber.size();k++)
                     {
                         if(studentNumber.get(k).equals(answers.get(i).getnumber()))
                             break;
                     }
                 System.out.print(answers.get(i).getnumber()+" "+studentName.get(k)+":");
                     // Set<String> keys=answers.get(i).getmap().keySet();
                     int iscores=0;
                    for(int m=0;m<papers.get(j).nums.size();m++){
                        System.out.print(" "+answers.get(i).score(topics,papers.get(j),m));
                        iscores+=answers.get(i).score(topics,papers.get(j),m);
                    }
                     System.out.println("~"+iscores);
             }else
                 System.out.println(answers.get(i).getnumber()+" not found");
                 
                     
                     
             }
         }
         
         }
    //檢查學生學號是否存在
        static int checkStudentNumber(Answer answers,List<String> studentNumber)
        {
            int index=0;
             //answers.get(i).getnumber()->學號
               // System.out.println(studentNumber.size());
            for(int j=1;j<=studentNumber.size();j++)
            {
                if(answers.getnumber().equals(studentNumber.get(j-1)))
                    index=1;
            }
            return index;
        }
     }

class Topic{//題目類
    private String num;//題目編號
    private String name;//題目內容
    private String standardAnswer;//題目答案
    void setnum(String x){
        this.num=x;
    }
    String getnum(){
        return this.num;
    }
    void setname(String x){
        this.name=x;
    }
    String getname(){
        return this.name;
    }
    void setstandardAnswer(String x){
        this.standardAnswer=x;
    }
    String getstandardAnswer(){
        return this.standardAnswer;
    }
    public Topic(String num,String name,String standardAnswer)
    {
        this.num = num;
        this.name = name;
        this.standardAnswer = standardAnswer;
    }

    boolean answer(String answer)
    {
        this.standardAnswer=answer;
        if(answer.equals(standardAnswer))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}
class Paper{//試卷類(#T:1 1-5 2-8)
    private String paperCount;//試卷號
    // private List<Topic> questionList;
    private Map<String,Integer> questionScores;
    //按照1-9的順序存入題目分值,有利於後續答案從而算分
    //public List<Integer> scores=new ArrayList<>();
    public List<String> nums=new ArrayList<>();
    
    public Map<String,Integer> getmap(){
        return questionScores;
    }
    //按順序往連結串列中新增題目分數
    // public void addScore(int score){
    //     scores.add(score);
    // }
    //按順序往連結串列中新增題目編號 
    public void addScore(String num){
        nums.add(num);
    }
    //往map裡新增
    public void addQuestionScore(String questionNumber,int score){
        questionScores.put(questionNumber,score);
    }
    public void setPaperCount(String paperCount) {
        this.paperCount = paperCount;
    }
    public Paper() {
    }
    public String getPaperCount() {
        return paperCount;
    }
    public Paper(String questionCount) {
        this.paperCount = questionCount;
        questionScores=new HashMap<>();
    }
    public int getTotalScore()//計算試卷總分
    {
        int totalScore=0;
        for(int score :questionScores.values())
        {
            totalScore+=score;
        }
        return totalScore;
    }
}
class Answer{//(#S:1 20201103 #A:1-5 #A:2-4)"1-5->'1'是順序,'5'是答案
    private String num;//試卷順序號
    private String number;//學生學號
    private Map<String,String> answer;
    public Map<String,String> getmap(){
        return answer;
    }
    public Answer(String num,String number) {
        this.num = num;
        this.number=number;
        answer=new HashMap<>();
    }
    public void addAnswer(String num,String an){
        answer.put(num,an);
    }
    public String getnum()
    {
        return this.num;
    }
    public String getnumber()
    {
        return this.number;
    }
public void check(List<Topic> topics,Paper paper){
    for(int i=0;i<paper.nums.size();i++)
    {
        int index2=0;
            Set<String> keys=answer.keySet();
                for(String key:keys){
                    String value=answer.get(key);
                    if(key.equals(String.valueOf(i+1)))
                    {
                        index2=1;
                        int index1=0;
                        for(int j=0;j<topics.size();j++)
                        {
                             if(topics.get(j).getnum().equals(paper.nums.get(i)))
                                {
                                index1=1;
                            if(topics.get(j).getstandardAnswer().equals("已刪除"))
                                {
                                    System.out.println("the question "+(i+1)+" invalid~0");
                                   break;
                                }
                                if(topics.get(j).getstandardAnswer().trim().equals(value))
                                {
                                    if(value.equals(" "))
                                    {
                                        System.out.println(topics.get(j).getname()+"~~true");
                                    }else
                                    System.out.println(topics.get(j).getname()+"~"+value+"~true");
                                    break;
                                }else{
                                    if(value.equals(" "))//原來是錯誤
                                    {
                                        System.out.println(topics.get(j).getname()+"~~false");
                                    }else
                                        System.out.println(topics.get(j).getname()+"~"+value+"~false");
                                        break;
                                }
                                 
                             }
                        }
                                if(index1==0)
                System.out.println("non-existent question~0");
                    }
                }
                if(index2==0)
                    System.out.println("answer is null");
    }
}
public int score(List<Topic> topics,Paper paper,int i){
        int index2=0;
            Set<String> keys=answer.keySet();
                for(String key:keys){
                    String value=answer.get(key);
                    if(key.equals(String.valueOf(i+1)))
                    {
                        for(int j=0;j<topics.size();j++)
                         {
                            if(topics.get(j).getnum().equals(paper.nums.get(i)))
                            {
                                if(topics.get(j).getstandardAnswer().trim().equals(value))
                                    {
                                    int value1=0;
                                        Set<String> keys1=paper.getmap().keySet();
                                        for(String key1:keys1){
                                        value1=paper.getmap().get(key1);
                                            if(topics.get(j).getnum().equals(key1))
                                                return value1;
                                        }
                                }
                            }
                            
                        }
                    }
                }
    return 0;
    }
}

三、踩坑心得

四、改進建議

五、總結

相關文章