Занятие 9. Создание тестов Написание программы по обработке теста проходит несколько этапов. Этап 1. Предварительная подготовка На данном этапе необходимо проанализировать тест. Определить его тип. Например: 1. Вопросы могут иметь однозначный выбор ответа или множественный. 2. «Цена» ответа может отличаться: например, при составлении теста на проверку знаний каждый правильный ответ «стоит» 1 балл, при составлении психологических тестов каждый ответ имеет свое количество баллов. Далее необходимо определится, в каком виде будут храниться вопросы: в текстовом файле или в базе данных. Для текстового файла необходимо определить формат строки. Мы будем создавать тесты с помощью текстового файла. Пусть для каждого вопроса в текстовом файле отводится одна строка. В эту строку записывается текст вопроса и варианты ответов через разделитель. Разделитель выбираем сами, но это должен быть набор символов, который точно не появится в нашем тесте, например, «***». Дополнительно, в строке могут храниться правильные ответы и указатель на тип вопроса (однозначный или множественный выбор ответа). Кроме того, в файле может содержаться название теста и его описание. Иногда возникает необходимость создания дополнительного текстового файла, в котором будут храниться правильные ответы, либо «цена» вариантов ответов (например, для психологических тестов). Этап 2. Обработка теста На этом этапе создается скрипт для обработки теста: вывода вопросов на экран и анализа ответов. Этап 3. Вывод результатов После обработки ответов необходимо вывести результат прохождения теста. Упражнения Задача 1. Создание психологического теста 1. Подготовка текстовых файлов. Создадим два текстовых файла: файл с вопросами (test.txt) и файл с ключами ответов (key.txt). В файле test.txt в первой строке будет храниться название теста, затем после строкиразделителя («***») – описание теста, далее – список вопросов. Каждая строка вопроса будет содержать через разделитель («***»): номер вопроса, текст вопроса, варианты ответов: №***Вопрос***Вариант1***…***ВариантN*** В нашем тесте каждый ответ на вопрос будет иметь свою «цену», поэтому в файле key.txt будет храниться информация в таком виде: балл1***балл2***…***баллN*** 2. Вывод теста на экран. 1) Считываем содержимое файла test.txt в массив: $fp = file (“text.txt”,”r”); // открываем файл в режиме чтения 2) Выделяем название теста ($title). Названием теста является та часть файла, которая расположена перед первым вхождением строки «***». Таким образом, переменная $title будет формироваться в следующем цикле (так как в общем случае название теста может состоять и не из одной строки): $title = ”“; // сначала объявляем пустую переменную for ($i=0; strncmp($fp[$i],"***",3) != 0; $i++) { $title = $title.$fp[$i]; // присоединяем к текущему значению следующую строку } $i++; // перескакиваем строчку «***» Цикл пробегает строки файлы, начиная с 0. Условием цикла является проверка равенства текущей строки строке «***». strncmp(string str1, string str2, int len) сравнивает начала строк, а точнее первые len байтов. Возвращает: 0 - если строки полностью совпадают; 1 - если, строка str1 лексикографически больше str2; 1 – если, наоборот, строка str1 лексикографически меньше str2. 3) Выделяем описание теста ($def). Описание теста в файле размещено между первой и второй строчками «***». $def = ”“; for ($i; strncmp($fp[$i],"***",3) != 0; $i++) { $def = $def.nl2br($fp[$i]); } $i++; // перескакиваем строчку «***» 4) Оставшаяся часть файла – это перечень вопросов и варианты ответов. Поэтому здесь формируем форму с радиокнопками (в нашем случае вопросы имеют однозначные ответы). <FORM METHOD=POST ACTION="index.php"> <? for ($i; $i<count($fp); $i++) { // В переменной $fp[$i] хранится текущая строка файла в формате // «№***вопрос***варианты_ответов***» $str = explode("***",$fp[$i]); // разбиваем строку на массив элементов // // // // сейчас в массиве $str хранятся такие элементы : $str[0] – номер вопроса $str[1] – текст вопроса $str[2]…$str[n-1] – варианты ответов echo "<p>$str[0]. $str[1]</p>"; // выводим номер и текст вопроса for ($j=2; $j<(count($str)-1);$j++) { echo "<INPUT TYPE=radio NAME=q".$str[0]." value=".($j-1).">$str[$j]<br>"; /* варианты ответов оформляем в виде радиокнопок. Каждой группе присваиваем имя q1, q2, … Т.е. «q + номер_вопроса», а каждому варианту – текущее значение в группе. Например, если первый вопрос имеет 4 варианта ответа, то формируется группа радиокнопок с именем (name) q1, а значения (value) от 1 до 4. */ } } ?> <INPUT TYPE=submit name=send value="Проверить"> </FORM> 5) Анализ результата. Для анализа результата открываем файл key.txt и сопоставляем значения. $fp = file ("key.txt","r"); $result = 0; for ($i=0; $i<count($fp); $i++) { $str = explode ("***",$fp[$i]); // Разбиваем строку $num_q = "q".($i+1); if (isset($$num_q)) $result = $result + $str[$$num_q-1]; } Выводим результат согласно ключу теста.