0

I´m searching information about how to compare two codes and decide if the code submitted by someone is correct or not (based on a solution code defined before).

I could compare the output but many codes may have the same output. Then I think I must compare someway the codes and give a percentage of similitude.

Anybody can help me?

(the language code is C but I think this isn´t important)

4

2 回答 2

1

我的一些老师使用在线自动程序评分系统,例如http://web-cat.org/

在作业中,他们会指定您必须提供的公共 api,然后他们会针对您的函数编写测试,就像单元测试一样。他们会故意选择会利用边界条件和其他学生因没有考虑而臭名昭著的事情的测试,然后用许多不同的输入调用你的代码,试图让你的代码失败。

有时他们会对预期值进行硬编码,有时他们会允许某个范围内的值,有时他们只是自己完成分配并完成分配,因此您自己的代码必须与他们的代码产生的结果相匹配。

显然,并非所有程序都可以通过这种方式有效地评分。这也有点容易出错,因为有时即使是老师也犯了错误并溢出了一个 int 或其他东西,那么正确的学生提交的内容与老师的错误结果不匹配。但是,一个系统不一定要完美才能有用。但我认为这提出了一个重要的观点,即通过阅读代码手动评分也不一定会揭示所有错误。

于 2012-12-15T22:18:00.220 回答
0

另一种可能性是复制提交的代码,去除所有空白并搜索必须存在的子字符串才能使代码正确和/或不存在的子字符串才能被视为正确的代码。麻烦的一点可能是设置为允许一些更棘手的要求,例如 [(a 或 c)、((a 或 b) 和 c)、((a 或 b) 和 c)],其中变量是关于与变量相关的子字符串是否存在于代码中的布尔检查结果。

例如,[("printf"),("for"), (not "1,2,3,4,5,6,7,9,10")] 将需要 "printf" 和 "for"是代码中的子字符串,而“1,2,3,4,5,6,7,9,10”我不熟悉C,所以我假设这里需要“printf”能够在不涉及输出流的情况下打印任何内容,这可以通过 [("printf" or "out"),("for"), (not "1,2,3,4,5,6 ,7,9,10")],其中“out”是使用输出流所需的 C 代码的一部分。

可以根据“正确”代码自动找到所需的子字符串,但正如其他人所提到的,还有其他方法可以做事。这就是为什么可能需要对“解决方案”进行硬编码的原因。即便如此,您很可能会错过一个必需的子字符串,并且它会被标记为错误,但这可能是您可以在一定程度上成功完成您所要求的事情的唯一方法。

正则表达式在这里可能很有用。

于 2012-12-17T04:55:43.377 回答