fork download
  1.  
  2. <pre>
  3. <?php
  4. // Базовый класс, содержит поля используемые
  5. // во всех видах вопросов
  6. abstract class AbstractQuestion
  7. {
  8. public $text;
  9. abstract function checkAnswer($answer);
  10. abstract function printQuestion();
  11. }
  12.  
  13. // Вопрос с выбором вариантов
  14. class ChoiceQuestion extends AbstractQuestion
  15. {
  16. public $options; // варианты ответа
  17. public $correctOption; // правильный вариант
  18. function checkAnswer($answer)
  19. {
  20. if($answer == $this->correctOption){
  21. echo "На вопрос '$this->text' Вы дали правильный ответ('$this->correctOption') \n";
  22. } else{
  23. echo "На вопрос '$this->text ' Вы дали неправильный ответ('$answer'), правильный ответ ('$this->correctOption')\n";
  24. }
  25. }
  26. function printQuestion()
  27. {
  28. echo "Варианты ответов:\n";
  29. foreach ($this->options as $letter => $answer){
  30. echo " {$letter}. {$answer}\n";
  31. }
  32. }
  33.  
  34. }
  35.  
  36. // Вопрос с вводом числа
  37. class NumericQuestion extends AbstractQuestion
  38. {
  39. public $answer; // ответ
  40. public $deviation; // допустмая погрешность
  41. function checkAnswer($answer)
  42. {
  43. if (preg_match($this->deviation,$answer)){
  44. echo "На вопрос '$this->text' Вы дали правильный ответ('$answer')\n";
  45. } else{
  46. echo "На вопрос '$this->text' Вы дали неправильный ответ ('$answer'), правильный ответ ('$this->answer')\n";
  47. }
  48. }
  49. function printQuestion()
  50. {
  51. echo "Введите ваш ответ...\n\n";
  52. }
  53. }
  54.  
  55. // Функция, создающая массив с вопросами:
  56. function createQuestions()
  57. {
  58. // Создаем пустой массив
  59. $questions = array();
  60.  
  61. // Создаем и заполняем первый объект
  62. $q = new ChoiceQuestion;
  63. $q->text = "Кем является ОП?";
  64. $q->options =["a" => "Няшей", "b" => "Программистом", "c" => "Хорошим человеком", "d" => "Все перечисленное"];
  65. $q->correctOption = "d";
  66.  
  67. // Кладем вопрос в массив
  68. $questions[] = $q;
  69.  
  70. // Создаем второй объект
  71. $q = new ChoiceQuestion;
  72. $q->text = "Какой город самый лучший?";
  73. $q->options = ["a" => "Москва", "b" => "Токио", "c" => "Киев", "d" => "Это не объективный вопрос"];
  74. $q->correctOption = "d";
  75.  
  76. // Кладем вопрос в массив
  77. $questions[] = $q;
  78.  
  79. // Создаем третий объект
  80. $q = new NumericQuestion;
  81. $q->text = "Лежит груша — нельзя скушать, что это?";
  82. $q->answer = "груша";
  83. $q->deviation = "/^(лампа|лампочка)$/ui";
  84.  
  85. // Кладем вопрос в массив
  86. $questions[] = $q;
  87.  
  88. // Создаем четвертый объект
  89. $q = new NumericQuestion;
  90. $q->text = "Чему равно 2+2*2?";
  91. $q->answer = "6";
  92. $q->deviation = "/^6|шесть$/ui";
  93.  
  94. // Кладем вопрос в массив
  95. $questions[] = $q;
  96.  
  97. // Возвращаем массив из объектов-вопросов
  98. return $questions;
  99. }
  100.  
  101. // Выводим вопросы
  102. function printQuestions($questions)
  103. {
  104. $number = 1; // номер вопроса
  105. foreach ($questions as $question) {
  106. echo "{$number}. {$question->text}\n\n";
  107. $question->printQuestion();
  108. $number++;
  109. }
  110. }
  111.  
  112. // Проверяем ответы на правильность и выводим значения
  113. function checkAnswer($questions, $answers)
  114. {
  115. if (count($questions) == count($answers) ){
  116. for($i = 0; $i < count($questions); $i++){
  117. $questions[$i]->checkAnswer($answers[$i]);
  118. }
  119. } else{
  120.  
  121. die("Число ответов и вопросов не совпадает\n");
  122. }
  123. }
  124.  
  125. // Даем массив из ответов на вопросы
  126. $answers = ["с", "d", "лампочка", "ШЕсть"];
  127.  
  128. //Заполняем массив $questin обьектами-вопросами
  129. $questions = createQuestions();
  130.  
  131. //Выводим вопросы
  132. printQuestions($questions);
  133.  
  134. //Проверяем вопросы
  135. checkAnswer($questions, $answers);
  136. ?>
  137. </pre>
Success #stdin #stdout 0.01s 82944KB
stdin
Standard input is empty
stdout
<pre>
1. Кем является ОП?

Варианты ответов:
  a. Няшей
  b. Программистом
  c. Хорошим человеком
  d. Все перечисленное
2. Какой город самый лучший?

Варианты ответов:
  a. Москва
  b. Токио
  c. Киев
  d. Это не объективный вопрос
3. Лежит груша — нельзя скушать, что это?

Введите ваш ответ...

4. Чему равно 2+2*2?

Введите ваш ответ...

На вопрос 'Кем является ОП? ' Вы дали неправильный ответ('с'), правильный ответ ('d')
На вопрос 'Какой город самый лучший?' Вы дали правильный ответ('d') 
На вопрос 'Лежит груша — нельзя скушать, что это?' Вы дали правильный ответ('лампочка')
На вопрос 'Чему равно 2+2*2?' Вы дали правильный ответ('ШЕсть')
</pre>