fork download
  1. <?php
  2.  
  3.  
  4. abstract class AbstractQuestion
  5. {
  6. public $text; // Текст вопроса
  7. public $points; // Количество баллов
  8. public $correctAnswer; // Правильный ответ
  9.  
  10. /* Функция выводящая вопросы с ответами */
  11. abstract function printQuestions($questions);
  12. /* Функция проверяющая ответы */
  13. abstract function checkAnswers($questions, $answers);
  14. }
  15.  
  16. class MultipleChoiceQuestion extends AbstractQuestion
  17. {
  18. public $points = 5; // По умолчанию 5 баллов
  19. public $answers; // Варианты ответов
  20. public $hint; // Подсказка
  21.  
  22. public function printQuestions($questions) {
  23. $number = 1; // номер вопроса
  24.  
  25. echo "\nВопросы с выбором варианта ответа:\n";
  26.  
  27. foreach ($questions as $question) {
  28.  
  29. echo "\n{$number}. {$question->text}\n\n";
  30. echo "Варианты ответов:\n";
  31.  
  32. foreach ($question->answers as $letter => $answer) {
  33. echo " {$letter}. {$answer}\n";
  34. }
  35. $number++;
  36.  
  37. }
  38. }
  39. public function checkAnswers($questions, $answers) {
  40.  
  41. if (count($questions) != count($answers)) {
  42. die("Число ответов и вопросов не совпадает\n");
  43. }
  44.  
  45. $pointsTotal = 0;
  46. $pointsMax = 0;
  47. $correctAnswers = 0;
  48. $totalQuestions = count($questions);
  49.  
  50. for ($i = 0; $i < count($questions); $i++) {
  51. $question = $questions[$i];
  52. $answer = $answers[$i];
  53.  
  54. $pointsMax += $question->points;
  55.  
  56. if ($answer == $question->correctAnswer) {
  57. $correctAnswers ++;
  58. $pointsTotal += $question->points;
  59. } else {
  60. $number = $i + 1;
  61. echo "\nНеправильный ответ на вопрос №{$number} ({$question->text})\n";
  62. echo "Подсказка: {$question->hint}\n";
  63. }
  64. }
  65.  
  66. echo "Правильных ответов: {$correctAnswers} из {$totalQuestions}, баллов набрано: $pointsTotal из $pointsMax\n";
  67. }
  68. }
  69.  
  70. class NumericalQuestion extends AbstractQuestion
  71. {
  72. public $points = 10;
  73. public $deviation; // допустимая погрешность
  74.  
  75. public function printQuestions($questions) {
  76. $number = 1;
  77.  
  78. echo "\nВопросы с числовым ответом:\n";
  79.  
  80. foreach ($questions as $question) {
  81. echo "\n{$number}. {$question->text}\n";
  82. $number++;
  83. }
  84. }
  85. public function checkAnswers($questions, $answers) {
  86.  
  87. if (count($questions) != count($answers)) {
  88. die("Число ответов и вопросов не совпадает\n");
  89. }
  90.  
  91. $pointsTotal = 0;
  92. $pointsMax = 0;
  93. $correctAnswers = 0;
  94. $totalQuestions = count($questions);
  95.  
  96. for ($i = 0; $i < count($questions); $i++) {
  97. $question = $questions[$i];
  98. $answer = $answers[$i];
  99.  
  100. $pointsMax += $question->points;
  101.  
  102. if ($answer == $question->correctAnswer) {
  103. $correctAnswers ++;
  104. $pointsTotal += $question->points;
  105. } else {
  106. $number = $i + 1;
  107. echo "\nНеправильный ответ на вопрос №{$number} ({$question->text})\n";
  108. }
  109. }
  110.  
  111. echo "Правильных ответов: {$correctAnswers} из {$totalQuestions}, баллов набрано: $pointsTotal из $pointsMax\n";
  112. }
  113. }
  114.  
  115. /* Создает пустой массив, наполяемый вопросами с множественным выбором */
  116. function createMultipleChoiceQuestions() {
  117.  
  118. $questions = [];
  119.  
  120. $q = new MultipleChoiceQuestion;
  121. $q->text = "Какая планета располагается четвертой по счету от Солнца?";
  122. $q->points = 10;
  123. $q->answers = array('a' => 'Венера', 'b' => 'Марс', 'c' => 'Юпитер', 'd' => 'Меркурий');
  124. $q->correctAnswer = 'b';
  125. $q->hint = "Одноименное название носит шоколадный батончик.";
  126.  
  127. $questions[] = $q;
  128.  
  129. $q = new MultipleChoiceQuestion;
  130. $q->text = "Какой город является столицей Великобритании?";
  131. $q->answers = array('a' => 'Париж', 'b' => 'Москва', 'c' => 'Нью-Йорк', 'd' => 'Лондон');
  132. $q->correctAnswer = 'd';
  133. $q->hint = "%Городнейм% из кэпитал оф грейт британ.";
  134.  
  135. $questions[] = $q;
  136.  
  137. $q = new MultipleChoiceQuestion;
  138. $q->text = "Кто придумал теорию относительности?";
  139. $q->points = 30;
  140. $q->answers = array('a' => 'Джон Леннон', 'b' => 'Джим Моррисон', 'c' => 'Альберт Эйнштейн', 'd' => 'Исаак Ньютон');
  141. $q->correctAnswer = 'c';
  142. $q->hint = "Этим парнем был...";
  143.  
  144. $questions[] = $q;
  145.  
  146. return $questions;
  147. }
  148.  
  149. /* Создает пустой массив, наполяемый вопросами с числовым ответами */
  150. function createNumericalQuestions() {
  151.  
  152. $questions = [];
  153.  
  154. $q = new NumericalQuestion;
  155. $q->text = "Чему равна скорость света в км/с?";
  156. $q->correctAnswer = 300000;
  157.  
  158. $questions[] = $q;
  159.  
  160. $q = new NumericalQuestion;
  161. $q->text = "Чему равно число Пи?";
  162. $q->correctAnswer = 3.14;
  163.  
  164. $questions[] = $q;
  165.  
  166. $q = new NumericalQuestion;
  167. $q->text = "В каком году закончилась вторая мировая война?";
  168. $q->correctAnswer = 1945;
  169.  
  170. $questions[] = $q;
  171.  
  172. return $questions;
  173. }
  174.  
  175. $multipleChoiceQuestions = createMultipleChoiceQuestions();
  176. $numericalQuestions = createNumericalQuestions();
  177.  
  178. // Обработка вопросов с множественным выбором ответов
  179. $answers = array('b', 'd', 'a');
  180.  
  181. $print = new MultipleChoiceQuestion;
  182. $print->printQuestions($multipleChoiceQuestions);
  183. $print->checkAnswers($multipleChoiceQuestions, $answers);
  184.  
  185. // Обработка вопросов с числовым ответом
  186. $answers = array('300000', '3.14', '1944');
  187.  
  188. $print = new NumericalQuestion;
  189. $print->printQuestions($numericalQuestions);
  190. $print->checkAnswers($numericalQuestions, $answers);
Success #stdin #stdout 0.04s 23484KB
stdin
Standard input is empty
stdout
Вопросы с выбором варианта ответа:

1. Какая планета располагается четвертой по счету от Солнца?

Варианты ответов:
 a. Венера
 b. Марс
 c. Юпитер
 d. Меркурий

2. Какой город является столицей Великобритании?

Варианты ответов:
 a. Париж
 b. Москва
 c. Нью-Йорк
 d. Лондон

3. Кто придумал теорию относительности?

Варианты ответов:
 a. Джон Леннон
 b. Джим Моррисон
 c. Альберт Эйнштейн
 d. Исаак Ньютон

Неправильный ответ на вопрос №3 (Кто придумал теорию относительности?)
Подсказка: Этим парнем был...
Правильных ответов: 2 из 3, баллов набрано: 15 из 45

Вопросы с числовым ответом:

1. Чему равна скорость света в км/с?

2. Чему равно число Пи?

3. В каком году закончилась вторая мировая война?

Неправильный ответ на вопрос №3 (В каком году закончилась вторая мировая война?)
Правильных ответов: 2 из 3, баллов набрано: 20 из 30