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

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


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

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


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

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


4 . Сколько весит твоя мамаша?

Введите правильное значение


Неправильный ответ на вопрос №2 (Какой город является столицей Великобритании?), подсказка: (Английский)
Неправильный ответ на вопрос №3 (Кто придумал теорию относительности?), подсказка: (Кто-то из них)
Правильных ответов: 2 из 4, баллов набрано: 110 из 145