0

2 つのコードを比較し、誰かが提出したコードが正しいかどうかを判断する方法に関する情報を検索しています (以前に定義されたソリューション コードに基づいて)。

出力を比較できましたが、多くのコードで同じ出力が得られる場合があります。次に、コードを何らかの方法で比較し、類似度のパーセンテージを示す必要があると思います。

誰でも私を助けることができますか?

(言語コードは C ですが、これは重要ではないと思います)

4

2 に答える 2

1

私の教師の何人かは、 http: //web-cat.org/のようなオンライン自動プログラム評価システムを使用していました。

割り当てでは、提供する必要のあるパブリックAPIを指定し、単体テストのように、関数に対するテストを作成します。彼らは意図的に境界条件や学生が考えていないことで悪名高い他のことを悪用するテストを選び、コードを失敗させるために多くの異なる入力でコードを呼び出すだけです。

期待値をハードコーディングする場合もあれば、範囲内の値を許可する場合もあります。また、自分で割り当てを行って自分のコードを作成したため、自分のコードがコードによって生成された結果と一致する場合もあります。

明らかに、すべてのプログラムがこの方法で効果的に採点できるわけではありません。また、教師でさえ間違いを犯してintなどをオーバーフローさせた場合、正しい生徒の提出物が教師の誤った結果と一致しないことがあるという点で、エラーが発生しやすくなります。しかし、システムが有用であるために完璧である必要はありません。しかし、これは、コードを読んで手動で採点しても、必ずしもすべての間違いが明らかになるとは限らないという点で重要なポイントになると思います。

于 2012-12-15T22:18:00.220 に答える
0

もう 1 つの可能性は、送信されたコードをコピーし、すべての空白を取り除き、コードが正しいと見なされるために存在する必要がある部分文字列および/またはコードが正しいと見なされるために存在できない部分文字列を検索することです。[(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" または "out"),("for"), (not "1,2,3,4,5,6 ,7,9,10")]。"out" は、出力ストリームを使用するために必要な C コードの一部です。

「正しい」コードに基づいて必要な部分文字列を自動的に見つけることは可能かもしれませんが、他の人が述べたように、別の方法があります。そのため、おそらく「ソリューション」をハードコーディングする必要があります。それでも、必要な部分文字列を見落として、間違っているとマークされる可能性は十分にありますが、それがおそらく、要求したことをある程度成功させる唯一の方法です。

ここでは正規表現が役立つ場合があります。

于 2012-12-17T04:55:43.377 に答える