<?php
error_reporting(-1);
abstract class Question
{
public $text; // текст вопроса
public $points = 5; // число баллов, по умолчанию 5
public $hint; // подсказка
abstract function checkQuestionAndAnswer($answer);
}
class ChoiceQuestion extends Question
{
public $options; // варианты ответа
public $correctOption; // правильный вариант
public function checkQuestionAndAnswer($answer)
{
if ($this->correctOption == $answer) {
return true;
} else {
return false;
}
}
}
class NumericQuestion extends Question
{
public $correctAnswer; // правильный ответ
//public $deviation; // допустимая погрешность
public function checkQuestionAndAnswer($answer)
{
if ($this->correctAnswer == $answer) {
return true;
} else {
return false;
}
}
}
// Функция, создающая массив с вопросами:
function createQuestions()
{
// Создаем пустой массив
$questions = [];
// Вопрос 1
$q1 = new ChoiceQuestion;
$q1->text = "Какая планета располагается четвертой по счету от Солнца?";
$q1->points = 10; // 10 баллов за ответ
$q1->options = array('a' => 'Венера', 'b' => 'Марс', 'c' => 'Юпитер', 'd' => 'Меркурий'); // Варианты ответа
$q1->correctOption = 'b'; // Правильный ответ
$q1->hint = 'Сникерс'; // Подсказка
$questions[] = $q1;
// Вопрос 2
$q2 = new ChoiceQuestion;
$q2->text = 'Какой город является столицей Великобритании?';
$q2->points = 5;
$q2->options = array('a' => 'Париж', 'b' => 'Москва', 'c' => 'Нью-Йорк', 'd' => 'Лондон');
$q2->correctOption = 'd';
$q2->hint = 'London is the capital of Great Britain'; // Подсказка
$questions[] = $q2;
// Вопрос 3
$q3 = new ChoiceQuestion;
$q3->text = 'Кто придумал теорию относительности?';
$q3->points = 30;
$q3->options = array('a' => 'Джон Леннон', 'b' => 'Джим Моррисон', 'c' => 'Альберт Эйнштейн', 'd' => 'Исаак Ньютон');
$q3->correctOption = 'c';
$q3->hint = 'Какой-то еврей... Подождите... Ох, нет...'; // Подсказка
$questions[] = $q3;
// Вопрос 4 - с выбором цифры
$q4 = new NumericQuestion;
$q4->text = 'Напишите число Пи до тысячных или хотя бы сотых.';
$q4->points = 30;
$q4->correctAnswer = 3.14;
$q4->hint = 'Это 3,14здец какой-то...'; // Подсказка
$questions[] = $q4;
return $questions;
}
function checkAnswers($questions, $answers) {
if (count($questions) != count($answers)) {
die("Число ответов и вопросов не совпадает\n");
}
$number = 0;
$pointsTotal = 0; // сколько набрано баллов
$pointsMax = 0; // сколько можно набрать баллов при всех правильных ответах
$correctAnswers = 0; // сколько отвечено верно
$totalQuestions = count($questions); // Сколько всего вопросов
// Если ответ из массива $answers и правильный ответ для соответствующего вопроса совпадают - плюсуются $correctAnswers, $pointsTotal
for ($i = 0; $i < count($questions); $i++) {
$number = $i + 1;
$pointsMax += $questions[$i]->points;
if ($questions[$i]->checkQuestionAndAnswer($answers[$i]) == true) {
echo "Ответ на вопрос {$number} правильный\n\n";
$correctAnswers++;
$pointsTotal += $questions[$i]->points;
} else {
echo "Ответ на вопрос {$number} НЕправильный\n Подсказка: {$questions[$i]->hint}\n\n";
}
}
echo "Всего набрано баллов $pointsTotal из $pointsMax.\n Всего правильных ответов: $correctAnswers.\n Всего было вопросов: $totalQuestions\n";
}
function printQuestions($questions)
{
$number = 1; // номер вопроса
foreach ($questions as $question) {
echo "\n{$number}. {$question->text}\n\n";
if (isset($question->options)) {
echo "Варианты ответов:\n";
foreach ($question->options as $letter => $answer) {
echo " {$letter}. {$answer}\n";
}
}
$number++;
}
}
$questions = createQuestions();
$answers = array('b', 'd', 'a', 1);
printQuestions($questions);
checkAnswers($questions, $answers);
preferences:
27.1 ms | 404 KiB | 5 Q