2013-11-27 41 views
2

是的,這是針對我正在做的實驗,但我完全失去了。針對「欺詐」互相檢查文件

如果我有一組文件,所有這些文件都是由掃描儀導入的,其中存在數學問題。我將如何去檢查這些文件,以確保它們沒有被「改變」,就像「某人」改變方程以獲得更好的成績一樣。 (我的意思作爲與分級程序的老師拿學生文件,並自動分級它們)

一樣,如果這些問題通常是這

589 + 66 = 3 134 - 49 = 2 343 + 24 = 3 455 - 92 = 4

但它們在文件中被「改變」爲

1 + 1 = 2 1 + 1 = 2 1 + 1 = 2 1 + 1 = 2

爲了欺騙分級程序。我如何檢查文件對照主文件(只有沒有像589 + 66 =這樣的答案的問題),以便它能夠注意到文件是否被更改?

我不能使用正則表達式,try/catch,數組或systemTokenizers。

現在,我的計劃,通過該文件運行,並打印出有多少文件的答案是正確的

SubmissionA 20      
SubmissionB 17    
SubmissionC 20   
SubmissionD 16 

但是,讓我們說submissionC是一個地方的學生改變了問題1 + 1 = 2爲了欺騙程序。我想要打印的程序:

SubmissionA 20      
SubmissionB 17    
SubmissionC File has been altered!  
SubmissionD 16 
+0

所以結果應該說'589 + 66 = 3',你需要的部分比較起來的=,看它是否符合'589 + 66 ='和你所要做的,對於每一個問題?這些問題是分開的嗎?或者他們都像在向他們展示一樣? –

+0

他們都在不同的線路上。是的,我必須針對「主」文件檢查每個問題。 – CherryBomb95

+0

也許是程序的一個示例運行的簡短片段,測試以及您期望程序實現的結果以及真實結果和錯誤結果的結果。你的問題很不清楚 –

回答

2

當你正在瀏覽收集正確答案的文件時,同時通過主文件。對於每個正確的答案,將該行(或適當的公式)與匹配的主條目進行比較,並標記不同的條目。

基本上,在您對「正確答案」(即回答匹配)進行單一檢查之前,現在您有兩項檢查(答案是否匹配,並且方程是否匹配)。

補遺:

我不知道您當前的計劃。我不知道你的輸入格式。所以,這都是假設。

不知何故,你有一個正確答案的列表。不知何故,你有一個測試答案的列表。你已經證明你可以比較測試答案的正確答案。

所有的表示都是完整的方程式(1 + 1 = 2),但不清楚如何從提交的答案文本中獲得答案值。但是,假設你正在這樣做,並且正確的答案也被表示爲589 + 66 = 655,即與提交的答案相同的格式,那麼如果你能從1 + 1 = 2中提取答案值,那麼你應該能夠提取以類似的方式從589 + 66 = 655得到正確的答案值。

如果你能夠提取相應的答案,然後使用相同的技術,你應該能夠提取問題。也就是說,從1 + 1 = 2您應該能夠提取1 + 1 =2

那麼,您在分級答案時做了什麼,您是否同時閱讀了BOTH文件,正確的答案和提交的答案。

例如:

File correctAnswers = new File("correctanswers.txt"); 
File testAnswers = new File("testanswers.txt"); 

BufferedReader correctReader = new BufferedReader(new FileReader(correctAnswers)); 
BufferedReader testReader = new BufferedReader(new FileReader(testAnswers)); 

String correctLine = correctReader.readLine(); 
String testLine = testReader.readLine(); 

while(correctLine != null) { 
    if (testLine == null) { 
     System.out.println("Bad Test, there are too few test lines."); 
     break; 
    } 
    String correctEquation = getEquation(correctLine); 
    String correctAnswer = getAnswer(correctLine); 
    String testEquation = getEquation(testLine); 
    String testAnswer = getAnswer(testLine); 
    if (correctEquation.equals(testEquation)) { 
     if (correctAnswer.equals(testAnswer)) { 
      correctAnswers = correctAnswers + 1; 
     } else { 
      wrongAnswers = wrongAnswers + 1; 
     } 
    } else { 
     System.out.println("Bad Test, an equation was tampered with."); 
     break; 
    } 
} 
if (testLine != null) { 
    System.out.println("Bad Test, there are too many lines in the test."); 
} 
correctReader.close(); 
testReader.close(); 

所以,我希望你可以看到在同一時間,你通過這兩個文件如何掃描,當您去比較數據。我們假設正確的答案文件是規範的,所以如果測試文件很快停止,或者持續很長時間,那麼這就是另一個錯誤來源。除此之外,您正在比較方程的兩個部分,用於正確的答案密鑰文件和測試文件,並沿着您的方式進行迭代。

+0

你可能會給我一個例子嗎?或者請更深入地解釋一下?對不起,我只是沒有把握它。 – CherryBomb95

1

下面的代碼比較兩行方程式的差異。

String line1 = input1.nextLine().trim(); // "8 + 2 =" 

            // examples from you other deleted post 

String line2 = input2.nextLine().trim(); // "1 + 1 = 2" 

String line2trim = line2.substring(0, line2.length() - 2)).trim(); // "1 + 1 =" 

if (!line1.equals(line2trim)){ 
    // test is corrupted 
} 

只是循環遍歷這兩個文件來檢查損壞。

編輯:甚至更​​好的方法來回答長度超過一個數字,例如, 100

String line2trim = line2.substring(0, (line2.indexOf("=") + 1).trim();