一、前言
這三次的大作業是一次次的迭代的過程,可以很好的鍛鍊我們的思維能力以及解決問題的能力,在寫這三次大作業的過程中,我很明顯的感覺到我的思維變得更加敏捷,在程式碼運用方面也越來越熟悉,學會了如何將理論的知識運用到實際的程式碼中去,接下來我將從三次作業的知識點,題量,難度等方面對其進行分析
第一次作業
第一次作業的題量較大但難度較低,需要實現的功能也不多,只需按照提示實現正確寫出三個類(題目類,試卷類,答卷類)即可。
這次作業運用到了集合類,連結串列,正則等全新的知識,只要在原有的基礎上學習這幾類的知識,第一次大作業即可圓滿完成。完成這次的大作業使得我對迴圈,方法,正則,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;
}
}