PHP アルゴリズム
各多肢選択問題は 3 ポイントの価値がありますあなたの説明によると、あなたの多肢選択問題はテキスト入力の代わりにチェックボックスを使用する
ではなく、代替回答は9つ以下です
したがって、スコアは次のように書くことができます
count(array_intersect(str_split($正解), str_split ($submit 回答)));
つまり、それを配列に切り取り、交差を取得します
4 つの代替回答があります 1 2 3 4
チェックボックスを使用する場合
次に、結果が得られます。提出後は配列です
特定のコードが取得されます $正解 = array(1, 2, 3)
$Submit Answer = array( 1, 2); $Score = count(array_intersect($正しい答え, $Submit 答え)) ; //2
$correct = array(1, 2, 3); (1, 2);
$score = count(array_intersect($correct, $submit));
$正解 = array(1, 2, 3) );
$Submit Answer = array(1, 2);
$Score = count(array_intersect ($正しい答え, $submit Answer));
echo $score; の要件を満たしていません。たとえば、回答が配列 (1,2,4) として送信された場合、交差部分も (1 ,2) になるため、実際には 0 点が得られるはずです
はい、完全には得られません。一貫性があります
そうであれば、質問者は意図的に誤解を招いていることになります。回答者
このように質問しなければならない場合は、次のように
$正确答案 = array(1, 2, 3);$错误答案 = array(4);$提交答案 = array(1, 2, 4);$得分 = array_intersect($错误答案, $提交答案) ? 0 : count(array_intersect($正确答案, $提交答案));echo $得分; //0
$ 回答を送信 = array(1, 2);
$score = count(array_intersect($正しい答え, $submit 答え));
echo $score; //2
交差は投稿者の質問の要件を満たしていません。答えは array(1,2,4) で、交差部分も (1,2) となり、実際には 0 点が得られるはずです。
…
相違点を交差させて結合するだけです
解答用紙が前、答えが後ろにあります
相違がある場合は得点は与えられません
交点がなければ得点は与えられません(前のものを除外した後、白紙の答案用紙を考慮した場合です。そうでないことが確認された場合は、「白紙の答案用紙になります」という文は省略できます)
差分集合はありません。交差部分はあります。交点の数 = 解答用紙、0.5 点
差分セットはありません、交点はあります、交点の数 = 解答用紙、満点 (これについてはロジックを記述する必要はありません。else を使用することもできます)
1. 上記は、いくつかの判定条件が省略されているため、スイッチ許容ロジックではなく、else if 互換性のないロジックであるため、順番に判定する必要があります
2.解答用紙と解答の両方 値が重複していないことを確認してください。そうしないと、交点の数の判断に問題が生じます
はい、完全に一致しているわけではありません。
でも、1,2,4を選んだ場合にポイントが入らないのは理不尽です。 4 が否定的な選択肢でない限り、たとえば: なし
この場合、質問者は意図的に回答者を誤解させています
このように質問しなければならない場合は、次のような PHP コードを書くことができます?12345$正解 = array(1, 2, 3);$間違った答え = array(4);$提出する答え = array(1, 2, 4);$Score = array_interse...
えー、上で書き間違えてしまいました
交点の数! = 解答用紙 / 交点の数 = 解答用紙
交点の数! = 解答 / 交点の数 = 解答
はビット演算で計算できます
A:1 B:2 C:4 D: 8
ABの選び方 そうすると3になります
たとえば、正解が4の場合、Nと4を選んだ結果を見てください
if (N==4) 3点
if 4&N==N 2点
可以用位运算来计算
A:1 B:2 C:4 D:8
如何选择AB 则为3
如何选择ABCD 则为15
比如正确为4 则 看看选择的结果为N跟4比
if(N==4) 3分
if 4&N==N 2分
其他 O分
位运算是不错的选择,选择肢<32个(因系统和php版本可能多至63),很方便
但更大就不太方便了
按照老大的思路,可以这样做
$correct = array(1, 2, 3);$submit = array(1, 2);$score = count(array_intersect($correct, $submit));if($score < count($submit)){//如果多选了给0分 $score = 0;}echo $score; //2
楼主 #11 的贴图与楼主 #2 的补充不符
既然是用 checkbox 提交的,提交答案就不会是 array( [0] => 12 ) 形式
而是 array( [控件名] => array( [0] => 1 [2] => 2) ) 这种形式
否则是需要拆分成数组后才能使用数组函数的
那个是每道题的答案
贴出你的表单片段,我给你详细解释
#11的图 我是处理过的 这个每个数字对应一道题
对呀,你的 name="answer66[]"
所以提交后(假定全部选中) $_POST['answer66'] 是 array(1, 2, 3, 4) 这样的数组
此时你同样需要把答案处理成 array(1, 2, 3) 这样的数组,才能应用数组函数
对于这一点,我 #1 的回复已经说了
function fen($a,$b){ //$a答案 $b正确答案 if($a==$b){ return 3; } foreach ($a as $value){ if(!in_array($value, $b)){ return 0; } } return 2;}
最后老师说 多选和少选都不给分 - -! 不过还是学习到很多东西了
#11的图 使用的代码是#9 不过这个问题先缓缓了
多选和少选都不给分
就用差集为空
交并差就可以了
答卷在前,答案在后
有差集,不给分
无交集,不给分(排除上一个后这个是考虑空白答卷的情况,如果确认不会有白卷这句可以不用)
无差集,有交集,交集数量!=答卷,半分
无差集,有交集,交集数量=答卷,满分(这个可以不写逻辑,直接用else也行,因为排除上面几种情况剩下就是交集相等)
注意
1.上面要顺序判断,是 else if 不相容逻辑而不是 switch 可容逻辑,因为省了一些判断条件
2.答卷和答案都要确保无重复值,不然交集数量判断会有问题
有差集就给不给分,如果 正确答案是:1 2 4 提交的答案是:1 2
哪他们的差集就是4,,按道理应该有一半的分的。