Студенты vs тесты

от
PHP/MySQL    php

Честно долго сомневался где написать этот пост, но пусть он будет все таки в статьях. Приправлю все это самыми "сочными" кусочками кода чтоб соответствовать разделу. Все будет на php, хотя уже я умудрился все это портировать и на Android.

Суть проблемы:
Итак, как многие уже знают что учусь я в медицинском университете и может слышали что учится там очень сложно, но не верьте им, если это не сам ад, то один из филиалов точно. Ну и как во всяком вузе тут есть свои особенности. Да, учится интересно и в меру сложно, но понимаешь что все идет на пользу дела, в конце концов цена наших ошибок в будущем - человеческая жизнь. Но есть и одна сугубо отрицательная вещь - это тесты. Делались они ради благого дела, но получилось как всегда. Примерно за два-три года до того как я поступал в нашем вузе внедрили в обучение "современные технологии" и как итог на многих кафедрах (а впоследствии на всех) тестов появилось безумное количество - 1500 штук на один предмет и даже больше (интересный факт: чем больше тестов тем меньше кафедра связана с медициной), плюс ко всему иногда неадекватная шкала оценки - 50-70% правильных ответов это все еще незачет. Справляются студенты как могут - кто-то учит неделю, кто то забивает и получает два и идет с такой оценкой на экзамен, но у нас особый подход.

Итак учить лень, а плохую оценку неохота, что же делать? Разберемся! Тестов всего два вида:
Первый: тесты выложены в сеть, студент должен дома со своего ПК на сайте вуза эти тесты решить - оценка уходит в журнал.
Второй: тесты пишутся под непосредственным контролем преподов и лаборантов на кафедре.
И если с первым типом все понятно - был написан бот на php (+curl) который 30-40 раз решает эти тесты пропуская вопросы и в конце каждой попытки собирает правильные ответы. Позже бот единственный раз решает но уже правильно, используя накопленную базу, итог работы программы - вся наша группа решает тесты на отлично.

Вот плавно подходим ко второму варианту, тесты надо списать, а главное сделать это вполне реально - преподаватели прекрасно знают что найти нужный тест который рандомно выпал из тысячи ни в какой шпоре нереально, поэтому особо за студентами не смотрят, а если студент и пытается листать методичку/распечатки то только посмеиваются.

Как списать?
C бумаженок списывать нереально - была идея отсортировать все тесты по алфавиту, но шпора была похожа на общую тетрадку, размерами разве что поменьше. Тогда вспомнили про телефон - забить все в txt-файл и искать нужный тест через поиск - но опять же набрать нужный вопрос это очень долго - а времени всего 30 секунд на вопрос.
После нескольких дней размышлений в голову пришла одна идея - а что если искать тесты по первой букве каждого слова. Например для теста:
Пути распространения эпидемических болезней средневековья: - искать прэбс. Идея оказалась настолько удачная, что впоследствии оказалось не надо было вводить все буквы, хватало первых 3, максимум 4 букв и вопрос уже находился. Было решено организовать онлайн-сервис где вводив эти самые буквы можно было получить список из совпадений по тестам. Плюс еще планировалась программа под андроид - все таки хоть и не часто, но на телефоне может периодически отваливаться интернет, что в момент списывания - просто катастрофа.

Итак, приступим.
Все тесты и правильные ответы к ним кафедры заботливо выкладывают в вордовских файликах на сайте, нам это только на руку. Скачиваем, копируем их в txt-файл и заносим маленьким скриптом в базу. Тесты обычно разделены друг от друга двойным переносом, поэтому хватает банального
  1. $array = explode("\n\r\n\r",file_get_contents('file_with_tests.txt'));
и прохода полученного массива циклом с целью отделить сам текст вопроса + выдрать регулярками правильные ответы. Приводить что-то конкретное не буду, все зависит от способов выделения правильных ответов. Бывает что ответы находятся в отдельном файлике, поэтому приходится разбирать и его. Позже пришлось, правда, отказаться от хранения вопросов в базе Mysql и сделать свой универсальный формат для базы с тестами, чтоб подходил и для онлайн сервиса, и для программы для андрюши.
Общая структура файлика с базами (пускай расширение будет .wdt):
Название предмета|||вно;;;внд|||вопрос номер один;;;вопрос номер два|||ответ к вопросу 1;;;ответ к вопросу 2
Поскольку базы были уже собраны, пришлось их конвертировать в wdt-файлы:
Тут важен механизм построение файлика с базами тестов.
Открыть спойлер
Нехитрым кодом читаем наш файлик subject.wdt:
  1. $id = 'subject';
  2. $filedata = file_get_contents('subject.wdt');
  3. $filedata = explode('|||', $filedata);
  4.  
  5. $pre_head = explode(';;;', $filedata[1]);
  6. $test_heads = explode(';;;', $filedata[2]);
  7. $test_bodies = explode(';;;', $filedata[3]);

В итоге $filedata[0] содержит название предмета, $pre_head - первые буквы каждого слова в вопросе теста, $test_heads - сами вопросы, $test_bodies - правильные ответы.

И теперь самый "сок" - ищем подходящие тесты в нашей базе:
  1. //Чтоб не было проблем с кодировкой в строковых функциях
  2. mb_internal_encoding('UTF-8');
  3.  
  4. //Получаем введенные данные
  5. $let = trim($_POST['letters']);
  6.  
  7. //Делаем ограничение, ибо если ввести одну букву,
  8. // не каждый телефон переварит страницу полученной длины
  9. if(mb_strlen($let) < 2)
  10.   exit('Минимум 2 буквы!');
  11.  
  12. foreach($pre_head AS $key => $value)
  13. {
  14.     //отсеиваем тесты где общее количество слов меньше полученных букв
  15.     if(mb_strlen($value) >= $let)
  16.     {
  17.         //обрезаем данные из $pre_head до количества введенных символов
  18.         $ch_to = mb_substr($value, 0, mb_strlen($let));
  19.         if($ch_to == $let)
  20.         {
  21.            echo '<span style="color:red">'.$test_heads[$key].'</span><br/>';
  22.            echo $test_bodies[$key].'<hr/>';
  23.         }
  24.     }
  25. }

Вот что в итоге получилось у меня:
Вводим "ксм" получаем:
myvers.jpg

PS:
Не знаю пригодится кому-нибудь или нет полученный опыт, но все таки надеюсь что было полезно.
  • +19
  • views 5039