質問編集履歴

1

再度、質問を考え直します。

2018/05/15 07:01

投稿

nokonoko
nokonoko

スコア7

test CHANGED
File without changes
test CHANGED
@@ -1,645 +1,7 @@
1
1
  ### 具体的なプロセス
2
-
3
- ・作成したログインフォームを使い、学籍番号を取得する。
4
-
5
- ・学籍番号を取得したら、問題の回答に移る。
6
-
7
- ・問題を1問回答するごとに、正解もしくは不正解かを表示し、能力値を計算し表示する。
8
-
9
- ・問題を全て回答し終えたら、終了するとともに能力値を計算し表示する。
10
-
11
- ・これらの処理が終わったら、再度最初の画面に戻る。
12
-
13
-
14
-
15
- 尚、XAMPPを用いてローカル環境で開発をしています。
16
2
 
17
3
  ### 発生している問題
18
4
 
19
5
 
20
6
 
21
- ```
22
-
23
- ・ログインフォームと問題を回答する画面が同時に出てしまうので、それを順番に表示させたいです。
24
-
25
- また、ログインフォームで取得した学籍番号をソースコード上でうまく活用できていないと思うので、その点の修正方法を教えていただけるとありがたいです。
26
-
27
-
28
-
29
- ・問題を解いたにもかかわらず、能力値が変化しないまま出力されるのを直したいです。
30
-
31
-
32
-
33
- また、問題内容と能力値の計算を行うソースコードも別途記載しましたが、そちら側は直す必要がないかと思われます。
34
-
35
- どうかよろしくお願いします。
36
-
37
-
38
-
39
- ```
40
-
41
-
42
-
43
7
  ### 該当のソースコード
44
-
45
-
46
-
47
- ```PHP
48
-
49
- <?php
50
-
51
- require("ItemBank.php");
52
-
53
- $self_name = basename($_SERVER['PHP_SELF']);
54
-
55
- require("function.php");
56
-
57
-
58
-
59
- session_start();
60
-
61
-
62
-
63
- if(!isset($_POST["Choice"])){ //問題表示
64
-
65
-
66
-
67
- $_SESSION[$user]['now'] = 0;
68
-
69
- $_SESSION[$user]["a"] = array();
70
-
71
- $_SESSION[$user]["b"] = array();
72
-
73
- $_SESSION[$user]["x"] = array();
74
-
75
-
76
-
77
- $i = $_SESSION[$user]['now'];
78
-
79
- $item = $ItemBank[$user][$i];
80
-
81
- $message = "";
82
-
83
- $question= $item[$user]["question"];
84
-
85
- $choice1 = $item[$user]["choice1"];
86
-
87
- $choice2 = $item[$user]["choice2"];
88
-
89
- $choice3 = $item[$user]["choice3"];
90
-
91
- $choice4 = $item[$user]["choice4"];
92
-
93
- $choice5 = $item[$user]["choice5"];
94
-
95
-
96
-
97
-
98
-
99
- }else{ //正誤判定
100
-
101
-
102
-
103
- $i = $_SESSION[$user]['now'];
104
-
105
- $item = $ItemBank[$i];
106
-
107
-
108
-
109
- if($item['correct']==$_POST["Choice"]) $x = 1;
110
-
111
- else $x = 0;
112
-
113
-
114
-
115
- array_push($_SESSION[$user]["x"],$x);
116
-
117
- array_push($_SESSION[$user]["a"],$a);
118
-
119
- array_push($_SESSION[$user]["b"],$b);
120
-
121
-
122
-
123
- $X = $_SESSION[$user]["x"];
124
-
125
- $A = $_SESSION[$user]["a"];
126
-
127
- $B = $_SESSION[$user]["b"];
128
-
129
-
130
-
131
- $M = Multiple_Estimation($X,$A,$B,-4.0,4.0,0.1); //ここの値も疑問です。
132
-
133
-
134
-
135
- switch($x){
136
-
137
- case 1: $message="正解です。能力値は $M です。" ;
138
-
139
- break;
140
-
141
- case 0: $message="不正解です。能力値は $M です。";
142
-
143
- break;
144
-
145
- }
146
-
147
-
148
-
149
- $_SESSION[$user]['now']++;
150
-
151
- $item = $ItemBank[$_SESSION[$user]['now']];
152
-
153
- $question= $item[$user]["question"];
154
-
155
- $choice1 = $item[$user]["choice1"];
156
-
157
- $choice2 = $item[$user]["choice2"];
158
-
159
- $choice3 = $item[$user]["choice3"];
160
-
161
- $choice4 = $item[$user]["choice4"];
162
-
163
- $choice5 = $item[$user]["choice5"];
164
-
165
-
166
-
167
- if($_SESSION[$user]['now']==count($ItemBank)){
168
-
169
- $message = "終了です。能力値は $M です。 ";
170
-
171
- $question = $choice1 = $choice2 =
172
-
173
- $choice3 = $choice4 = $choice5 = "";
174
-
175
- unset($_SESSION[$user]['now']);
176
-
177
- }else{
178
-
179
- $i++;
180
-
181
- $item = $ItemBank[$i];
182
-
183
- $_SESSION[$user]['now'] = $i;
184
-
185
- }
186
-
187
- }
188
-
189
- ?>
190
-
191
-
192
-
193
-
194
-
195
- <!doctype html>
196
-
197
- <html>
198
-
199
- <body>
200
-
201
-
202
-
203
- <form action="<?php echo basename($_SERVER['PHP_SELF']);?>" method="post">
204
-
205
- 学籍番号 : <input type="text" name="id"/>
206
-
207
- <input type="submit" value="送信"/>
208
-
209
- </form>
210
-
211
- <form action="<?php echo basename($_SERVER['PHP_SELF']);?>" method="post">
212
-
213
- <input type="hidden" name="logout"/>
214
-
215
- <input type="submit" value="ログアウト"/>
216
-
217
- </form>
218
-
219
-
220
-
221
- <?php echo $question;?>
222
-
223
-
224
-
225
- <form action="<?php echo $self_name;?>" method="post">
226
-
227
- <input type="radio" name="Choice" value="1" />
228
-
229
- <?php echo $choice1;?><br>
230
-
231
- <input type="radio" name="Choice" value="2" />
232
-
233
- <?php echo $choice2;?><br>
234
-
235
- <input type="radio" name="Choice" value="3" />
236
-
237
- <?php echo $choice3;?><br>
238
-
239
- <input type="radio" name="Choice" value="4" />
240
-
241
- <?php echo $choice4;?><br>
242
-
243
- <input type="radio" name="Choice" value="5" />
244
-
245
- <?php echo $choice5;?><br>
246
-
247
- <input type="submit" value="回答" /><?php echo $message; ?>
248
-
249
- </form>
250
-
251
-
252
-
253
- </body>
254
-
255
- </html>
256
-
257
-
258
-
259
- ```
260
-
261
-
262
-
263
- ```PHP
264
-
265
- <?php
266
-
267
- $ItemBank = array(
268
-
269
- array( //Item25
270
-
271
- 'question'=>'ある暗号規則によれば「埼玉」は「75946535」、「鳥取」は「61636114」と表される。<br />
272
-
273
- この暗号規則で「7394219344’513592」に対する答えとして正しいものはどれか。',
274
-
275
- 'choice1'=>'月曜日',
276
-
277
- 'choice2'=>'火曜日',
278
-
279
- 'choice3'=>'水曜日',
280
-
281
- 'choice4'=>'木曜日',
282
-
283
- 'choice5'=>'金曜日',
284
-
285
- 'correct'=>2,
286
-
287
- 'a'=>0.34592,
288
-
289
- 'b'=>-1.07541
290
-
291
- ),
292
-
293
- array( //Item34
294
-
295
- 'question'=>'ある暗号規則によれば「秋の夜」は「乙一人二白田雨石音弓」と表される。<br />
296
-
297
- この暗号規則で書かれた「乙力目一虫皿」は何を表すか。',
298
-
299
- 'choice1'=>'からす',
300
-
301
- 'choice2'=>'いなほ',
302
-
303
- 'choice3'=>'かかし',
304
-
305
- 'choice4'=>'みかん',
306
-
307
- 'choice5'=>'さくら',
308
-
309
- 'correct'=>2,
310
-
311
- 'a'=>0.46705,
312
-
313
- 'b'=>-0.81124
314
-
315
- ),
316
-
317
- array( //Item48
318
-
319
- 'question'=>'AからF 6チームがサッカーのリーグ戦を行った。<br />
320
-
321
- 途中経過と最終結果の一部が次のようにわかっているとき、このリーグ戦の結果について確実にいえるのは<br />
322
-
323
- 次のうちどれか。<br />
324
-
325
- ・AはDに敗れ1勝1敗 ・Bは1勝1敗 ・CはFに勝ち2勝1敗<br />
326
-
327
- ・DはEに勝ち2勝2敗 ・Eは1勝1敗 ・Fは0勝2敗<br />
328
-
329
- ・引き分け試合はなく、1位から6位まで同率で並ぶことなく終了した。',
330
-
331
- 'choice1'=>'5位はAである。',
332
-
333
- 'choice2'=>'4位はEである。',
334
-
335
- 'choice3'=>'4位はAである。',
336
-
337
- 'choice4'=>'3位はDである。',
338
-
339
- 'choice5'=>'2位はBである。',
340
-
341
- 'correct'=>4,
342
-
343
- 'a'=>0.38727,
344
-
345
- 'b'=>1.63040
346
-
347
- ),
348
-
349
- array( //Item49
350
-
351
- 'question'=>'AからF 6人が相撲のリーグ戦を行った。<br />
352
-
353
- 途中経過と最終結果の一部が次のようにわかっているとき、このリーグ戦の結果について確実にいえるのもの<br />
354
-
355
- は次のうちどれか。<br />
356
-
357
- ・Aは3勝0敗 ・BはCに勝ち1勝2敗 ・CはDに勝ち1勝2敗<br />
358
-
359
- ・DはFに勝ち1勝1敗 ・Eは3勝0敗 ・Fは0勝1敗<br />
360
-
361
- ・引き分け試合はなく、1位から6位まで同率で並ぶことなく終了した。',
362
-
363
- 'choice1'=>'1位はAである。',
364
-
365
- 'choice2'=>'1位はEである。',
366
-
367
- 'choice3'=>'2位はDである。',
368
-
369
- 'choice4'=>'3位はBである。',
370
-
371
- 'choice5'=>'3位はCである。',
372
-
373
- 'correct'=>4,
374
-
375
- 'a'=>0.50406,
376
-
377
- 'b'=>0.78358
378
-
379
- ),
380
-
381
- array( //Item50
382
-
383
- 'question'=>'AからF 6人が囲碁のリーグ戦を行った。<br />
384
-
385
- 途中経過と最終結果の一部が次のようにわかっているとき、このリーグ戦の結果について確実にいえるのは<br />
386
-
387
- 次のうちどれか。<br />
388
-
389
- ・AはDに勝ち1勝2敗 ・Bは2勝2敗 ・CはBに勝ち1勝0敗<br />
390
-
391
- ・Dは0勝2敗 ・Eは0勝1敗 ・FはBに勝ち2勝1敗<br />
392
-
393
- ・引き分け試合はなく、1位から6位まで同率で並ぶことなく終了した。',
394
-
395
- 'choice1'=>'Eはどう頑張っても5位か6位である。',
396
-
397
- 'choice2'=>'Dはどう頑張っても5位か6位である。',
398
-
399
- 'choice3'=>'2位はFである。',
400
-
401
- 'choice4'=>'3位はBである。',
402
-
403
- 'choice5'=>'4位はAである。',
404
-
405
- 'correct'=>2,
406
-
407
- 'a'=>0.77803,
408
-
409
- 'b'=>0.86238
410
-
411
- )
412
-
413
- );
414
-
415
- ?>
416
-
417
- ```
418
-
419
-
420
-
421
- ```PHP
422
-
423
- <?php
424
-
425
-
426
-
427
- function Theta_Range($l,$h,$d){
428
-
429
- $range = array();
430
-
431
-
432
-
433
- for($theta=$l;$theta<=$h;$theta+=$d){
434
-
435
- array_push($range,$theta);
436
-
437
- }
438
-
439
- return $range;
440
-
441
- }
442
-
443
-
444
-
445
- function Normal($theta){
446
-
447
- return 1.0/sqrt(2*M_PI)*exp(-$theta*$theta/2);
448
-
449
- }
450
-
451
-
452
-
453
- function Normal_Distribution($l,$h,$d){
454
-
455
- $distribution = array();
456
-
457
- $theta_range = Theta_Range($l,$h,$d);
458
-
459
- $length = count($theta_range);
460
-
461
-
462
-
463
- for($i=0;$i<$length;$i++){
464
-
465
- $theta = $theta_range[$i];
466
-
467
- $P = Normal($theta);
468
-
469
- array_push($distribution,$P);
470
-
471
- }
472
-
473
- return $distribution;
474
-
475
- }
476
-
477
-
478
-
479
- function Logistic($theta,$a,$b){
480
-
481
- return 1.0/(1.0+exp(1.7*(-$a)*($theta-$b)));
482
-
483
- }
484
-
485
-
486
-
487
- function Correct_Probability($x,$theta,$a,$b){
488
-
489
- $P = Logistic($theta,$a,$b);
490
-
491
- return pow($P,$x)*pow(1.0-$P,1-$x);
492
-
493
- }
494
-
495
-
496
-
497
- function Item_Characteristic_Curve($x,$l,$h,$d,$a,$b){
498
-
499
- $ICC = array();
500
-
501
- $theta_range = Theta_Range($l,$h,$d);
502
-
503
- $length = count($theta_range);
504
-
505
-
506
-
507
- for($i=0;$i<$length;$i++){
508
-
509
- $theta = $theta_range[$i];
510
-
511
- $P = Correct_Probability($x,$theta,$a,$b);
512
-
513
- array_push($ICC,$P);
514
-
515
- }
516
-
517
- return $ICC;
518
-
519
- }
520
-
521
-
522
-
523
- function argmax($vector){
524
-
525
- $length = count($vector);
526
-
527
- $max = -9999;
528
-
529
- $argment = -1;
530
-
531
-
532
-
533
- for($i=0;$i<$length;$i++){
534
-
535
- if($vector[$i]>$max){
536
-
537
- $max = $vector[$i];
538
-
539
- $argment = $i;
540
-
541
- }
542
-
543
- }
544
-
545
- return $argment;
546
-
547
- }
548
-
549
-
550
-
551
- function Multiple_Estimation($X,$A,$B,$l,$h,$d){
552
-
553
- $N = count($X);
554
-
555
-
556
-
557
- $theta_range = Theta_Range($l,$h,$d);
558
-
559
- $length = count($theta_range);
560
-
561
-
562
-
563
- $prior = Log_Vector(Normal_Distribution($l,$h,$d));
564
-
565
-
566
-
567
- for($i=0;$i<$N;$i++){
568
-
569
-
570
-
571
- $likelihood = Log_Vector(
572
-
573
- Item_Characteristic_Curve(
574
-
575
- $X[$i],
576
-
577
- $l,$h,$d,
578
-
579
- $A[$i],
580
-
581
- $B[$i]
582
-
583
- ));
584
-
585
-
586
-
587
- $posterior = Posterior($prior,$likelihood);
588
-
589
- $prior = $posterior;
590
-
591
- }
592
-
593
- $argment = argmax($posterior);
594
-
595
-
596
-
597
- return $theta_range[$argment];
598
-
599
- }
600
-
601
-
602
-
603
- function Posterior($prior,$likelihood){
604
-
605
- $length = count($prior);
606
-
607
- $posterior = array();
608
-
609
-
610
-
611
- for($i=0;$i<$length;$i++){
612
-
613
- array_push($posterior,$prior[$i]+$likelihood[$i]);
614
-
615
- }
616
-
617
- return $posterior;
618
-
619
- }
620
-
621
-
622
-
623
- function Log_Vector($vector){
624
-
625
- $length = count($vector);
626
-
627
- $log_vector = array();
628
-
629
-
630
-
631
- for($i=0;$i<$length;$i++){
632
-
633
- array_push($log_vector,log($vector[$i]));
634
-
635
- }
636
-
637
- return $log_vector;
638
-
639
- }
640
-
641
-
642
-
643
- ?>
644
-
645
- ```