<?php
header("Content-Type: text/plain");
/* Программа вывода вопросов и проверки ответов,
* добавлен тип вопросов с вводом числа
*/
// Общий класс для всех вопросов
abstract class AbstractQuestion
{
public $text; // текст вопроса
public $points = 5; // число баллов, по умолчанию 5
public $correctAnswer; // правильный ответ
public $hintAnswer; // подсказка
// Сверяем введенный ответ с правильным
public function checkAnswer ($answer) {
if ($answer == $this->correctAnswer) {
return true;
} else {
return false;
}
}
// Абстрактный метод вывода вопроса
abstract public function printQuestion ();
}
// Класс для вопросов с вариантами ответов
class VariantQuestion extends AbstractQuestion
{
public $answers; // варианты ответов
// Вывод вопроса
public function printQuestion () {
// Склеиваем текст вопроса и инструкцию для пользователя
$message = $this->text . "\n\n" . "Варианты ответов:\n";
// Добавляем варианты ответов
foreach ($this->answers as $letter => $answer) {
$message .= $letter . ". " . $answer . "\n";
}
return $message;
}
}
// Класс для вопросов с вводом числа
class NumberQuestion extends AbstractQuestion
{
// Вывод вопроса
public function printQuestion () {
// Склеиваем текст вопроса и инструкцию для пользователя
$message = $this->text . "\n\n" . "Введите правильное значение\n";
return $message;
}
}
// Функция, создающая массив с вопросами:
function createQuestions()
{
// Вопрос 1
$q1 = new VariantQuestion;
$q1->text = "Какая планета располагается четвертой по счету от Солнца?";
$q1->points = 10; // 10 баллов за ответ
$q1->answers = array('a' => 'Венера', 'b' => 'Марс', 'c' => 'Юпитер', 'd' => 'Меркурий'); // Варианты ответа $q1->correctAnswer = 'b'; // Правильный ответ
$q1->hintAnswer = 'Круглая'; // Подсказка
// Кладем вопрос в массив
$questions[] = $q1;
// Вопрос 2
$q2 = new VariantQuestion;
$q2->text = 'Какой город является столицей Великобритании?';
$q2->points = 5;
$q2->answers = array('a' => 'Париж', 'b' => 'Москва', 'c' => 'Нью-Йорк', 'd' => 'Лондон'); $q2->correctAnswer = 'd';
$q2->hintAnswer = 'Английский';
// Кладем вопрос в массив
$questions[] = $q2;
// Вопрос 3
$q3 = new VariantQuestion;
$q3->text = 'Кто придумал теорию относительности?';
$q3->points = 30;
$q3->answers = array('a' => 'Джон Леннон', 'b' => 'Джим Моррисон', 'c' => 'Альберт Эйнштейн', 'd' => 'Исаак Ньютон'); $q3->correctAnswer = 'c';
$q3->hintAnswer = 'Кто-то из них';
// Кладем вопрос в массив
$questions[] = $q3;
// Вопрос 4
$q4 = new NumberQuestion;
$q4->text = 'Сколько весит твоя мамаша?';
$q4->points = 100;
$q4->correctAnswer = 200;
$q4->hintAnswer = 'Гораздо больше, чем она может поднять';
// Кладем вопрос в массив
$questions[] = $q4;
// Выведем содержимое, чтобы проверить, что все верно
//var_dump($questions);
return $questions;
}
// Функция выводящая список вопросов
function printQuestions($questions)
{
$i = 1; // номер вопроса
foreach ($questions as $question) {
// Выводим номер вопроса и текст вопроса
echo "{$i} . {$question->printQuestion()}\n\n";
$i++;
}
}
// Проверить ответы, посчитать число баллов и вывести вопросы, на который дан неправильный ответ
function checkAnswers($questions, $answers)
{
// Проверим, что число ответов равно числу вопросов (защищаемся от ошибки)
die("Число ответов и вопросов не совпадает\n"); }
$pointsTotal = 0; // сколько набрано баллов
$pointsMax = 0; // сколько можно набрать баллов при всех правильных ответах
$correctAnswers = 0; // сколько отвечено верно
$totalQuestions = count($questions); // Сколько всего вопросов
// Цикл для обхода вопросов и ответов
for ($i = 0; $i < count($questions); $i++) { $question = $questions[$i]; // Текущий вопрос
$answer = $answers[$i]; // текущий ответ
// Считаем максимальную сумму баллов
$pointsMax += $question->points;
// Проверяем ответ
if ($question->checkAnswer($answer)) {
// Добавляем баллы
$correctAnswers ++;
$pointsTotal += $question->points;
} else {
// Неправильный ответ
$number = $i + 1;
echo "Неправильный ответ на вопрос №{$number} ({$question->text}), подсказка: ({$question->hintAnswer})\n";
}
}
// Выведем итог
echo "Правильных ответов: {$correctAnswers} из {$totalQuestions}, баллов набрано: {$pointsTotal} из {$pointsMax}\n";
}
$questions = createQuestions();
printQuestions($questions);
$answers = array('b', 'z', 'a', 200); checkAnswers($questions, $answers);
?>