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