检查文件相互之间的“欺诈”

时间:2013-11-27 00:05:02

标签: java file math

是的,这是我正在做的实验室,但我完全迷失了。

如果我有一组文件,全部由扫描仪导入,其中包含数学问题。我将如何检查文件以确保它们没有像“某人”改变方程式以获得更好的等级那样“改变”。 (我的目的是作为一名教师,通过评分程序从学生那里获取文件并自动评分)

如果问题通常就是这个

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

2 个答案:

答案 0 :(得分:2)

当您正在浏览收集正确答案的文件时,请同时浏览主文件。对于每个正确答案,将线(或适当的等式)与匹配的主条目进行比较,并标记不同的条目。

基本上,在您单独检查“正确答案”之前(即答案是否匹配),现在您有两个检查(答案是否匹配,并且方程匹配)。

附录:

我不知道你目前的节目。我不知道你的输入格式。所以,这都是假设。

不知何故,你有一个正确答案的清单。不知何故,你有一份测试答案清单。您已经证明可以将正确的答案与测试答案进行比较。

您的所有表示都是完整的等式(1 + 1 = 2),但不清楚您是如何从提交的答案文本中获取答案值的。但是,假设您正在这样做,并且正确答案也表示为589 + 66 = 655,即与提交的答案格式相同,那么如果您能够从1 + 1 = 2中提取答案值,那么你应该能够以类似的方式从589 + 66 = 655中提取正确的答案值。

如果您能够提取相应的答案,然后使用相同的技术,您也应该能够提取问题。也就是说,从1 + 1 = 2开始,您应该能够同时提取1 + 1 =2

那么,在对答案进行评分时,您要做的是同时读取两个文件,正确的答案密钥和提交的答案。

例如:

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();

因此,希望您可以看到如何同时扫描这两个文件,比较数据。我们假设正确的答案文件是规范的,因此如果测试文件很快停止,或者长时间停止,那么这是另一个错误来源。除此之外,您要比较正确答案密钥文件和测试文件的等式的两个部分,并按照您的方式进行迭代。

答案 1 :(得分: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();