Разработка информационно-обучающей системы на тему “Атомно-молекулярная теория. Доказательство существования атомов и молекул

РЕФЕРАТ



Данный программный продукт, выданный как тема для курсового проекта, представляет собой реализацию информационно-обучающей системы предназначенной для ознакомления и обучения пользователей атомно–молекулярной теории, которая доказывает существование атомов и молекул. В программном продукте реализованы следующие возможности:

1)	Обучение атомно–молекулярной теории;

2)	возможность поиска информации по ключевым словам;

3)	предоставление справки по работе с программой;

4)	предоставление справки о разработчиках системы;

5)	возможность постраничного скроллинга информации. 

Эта программа удобна в использовании, так как имеет простой и интуитивно-понятный графический интерфейс. 

Перспективами дальнейшей разработки программного продукта являются: оптимизация алгоритмов тестирования пользователя и поиска необходимой информации по контексту.



ИНФОРМАЦИОННО-ОБУЧАБЩАЯ СИСТЕМА, СКРОЛЛИНГ, ПОИСК, ЭКСПЕРИМЕНТ, МОДЕЛЬ, ПРЕДСКАЗАНИЕ, ТЕОРИЯ, ТЕСТИРОВАНИЕ, ПОЛЬЗОВАТЕЛЬ



Фамилия	Подпись	Дата

Разработал	

Разработка информационно обучающей системы на тему: “Атомно-молекулярная теория. Доказательство существования атомов и молекул”. Литера	Лист	Листов

Рук. проекта

Н. Контр.

Зав. Каф.	Белозерский Л.А.	
СОДЕРЖАНИЕ



Введение 

1.	Постановка задачи 

Цель разработки 

Функциональные требования

2.	Основные методы и алгоритмы

Реализация управления системой

Реализация графических элементов

Реализация функции скроллинга

Реализация функции поиска по ключевым словам

Реализация процесса тестирования и оценки уровня знаний

3.	Обоснование выбора языка программирования

4.	Описание программного продукта

Входные данные

Контроль входных данных

Выходные данные 

Модульная структура программного продукта

4.4.1 Перечень модулей 

4.4.2 Схема связи модулей

Функциональная структура программного продукта

4.5.1 Перечень основных функций

4.5.2 Функциональная схема

5.	Комплект поставки и порядок инсталляции

Комплект поставки

Порядок инсталляции 

Запуск программного продукта

6.	Тестирование программного продукта

Реакция на корректные данные 

Реакция на некорректные данные

Анализ эффективности

6.3.1 Положительные черты программного продукта

6.3.2 Отрицательные черты программного продукта

6.3.3 Пути улучшения программного продукта

Выводы

Перечень использованных источников

Приложение А Техническое задание

Приложение Б Руководство пользователя

Приложение В Экранные формы

Приложение Г Листинг программы



Разработал 	Фамилия	Подпись	Дата	Лист


ВВЕДЕНИЕ



На сегодняшний день, разнообразные информационно-обучающие системы являются, наряду с компьютерными играми, пожалуй, одним из самых популярных и востребованных видов программного обеспечения. Их назначение – помощь в процессе приобретения и накопления пользователем знаний и навыков в узких предметных областях. Спектр применения информационно-обучающих систем достаточно широк, и это обусловливает высокий потребительский спрос на программные продукты подобного типа, что в свою очередь способствует дальнейшему их развитию, и появлению все новых и новых видов обучающих систем. Практически на каждом персональном компьютере можно встретить хотя бы одну такую программу. Их надежность и высокие показатели эффективности привели к тому, что информационно-обучающие системы стали широко применяться во многих школах и вузах. А использование ими новейших достижений в области мультимедиа позволяет использовать такие системы даже в процессе так называемого дистанционного обучения.

Стоит отметить, что, некоторые обучающие системы позволяют так же моделировать на экране ситуации, близкие к реальным. И это обусловливает еще одну возможность применения информационно-обучающих систем, а именно, их использование в качестве тренажеров – симуляторов при подготовке и переподготовке специалистов самых различных уровней в самых различных областях знаний.

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

Таким образом, простота обращения с информационно-обучающими системами, их доступность и понятность широкому кругу пользователей, полнота и структурированность изложенной в них информации, возможность выбора наиболее подходящего для каждого конкретного пользователя метода обучения способствуют все большему и большему росту их популярности. Компьютер, снабженный информационно-обучающей системой становиться не просто машиной для проведения сложных расчетов, но и активным помощником в процессе приобретения и накопления новых знаний.


1 ПОСТАНОВКА ЗАДАЧИ



Цель разработки



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



Функциональные требования



Поскольку основной задачей данного программного продукта является обучение, то необходимой является его ориентация именно на пользователей. Необходимо создать условия, при которых эффект от процесса обучения был бы максимальным. То есть необходимо создание простого, понятного, функционального и привлекательного пользовательского интерфейса, а так же удобных инструментов, которые позволили бы использовать возможности информационно-обучающей системы в полной мере.

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

Управление основными возможностями системы должно быть организовано с посредством системы раскрывающихся меню, доступ к которым должен обеспечиваться непосредственным выбором.

Информационно-обучающая система должна быть снабжена справочной системой, которая позволит использовать максимум ее возможностей даже не подготовленному пользователю, системой обучения, а так же системой тестирования и оценки знаний, полученных пользователем в процессе обучения.

Справочная система должна содержать информацию о способе навигации в системе, функциональных клавишах, информацию о разработчике программного продукта и основных возможностях которыми располагает данная система.

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

Система тестирования и оценки знаний пользователя должна содержать инструменты, позволяющие объективно оценить уровень знаний, полученных пользователем в процессе обучения. Поэтому, в системе необходимо наличие простого, понятного и эффективного метода оценивания. 


2 ОСНОВНЫЕ МЕТОДЫ И АЛГОРИТМЫ



При создании данного программного продукта использовался принцип нисходящего программирования, т.е. задача разбивалась на некоторые подзадачи, каждая из которых в свою очередь снова детализировалась, пока не достигались, простые задачи. В первую очередь были выделены и решены следующие четыре основные подзадачи:

		организация пользовательского интерфейса;

		организация системы обучения;

		организация системы поиска информации по ключевым словам;

		организация системы тестирования.

Следует отметить, что система была реализована таким образом, что в каждый конкретный момент времени ее состояние могло измениться только в результате некоторых действий пользователя. Поэтому система использует только так называемый последовательный процесс, при котором все действия выполняются строго последовательно. На рисунке 2.1 представлен алгоритм работы основной программы. Заметим, что основной структурной единицей процесса работы программы является процесс обработки команды пользователя. Ему принадлежит основной приоритет.




Инициализация программы (инициализация констант, показ заставки)

 

Начало





Обработка команды пользователя





Quit_Variable: =0



Прорисовка рабочего экрана





Обработка команды пользователя





  Quit_vqriable: =-1нет





Конец

Завершающие действия (закрытие файлов и т.д.)да





Рисунок 2.1 – Алгоритм работы программы



	2.1 Реализация управления системой



Пользователь реализует управление системой через клавиатуру.

Для реализации этой особенности существует набор переменных, характеризующих состояние системы в каждый конкретный момент ее работы. Очевидно, что в общем случае система может находиться в следующих четырех состояниях:

		горизонтальное меню;

		вертикальное меню;

		активен один из пунктов системы;

		активно поисковое окно.

Каждое из приведенных выше состояний обрабатывается собственными функциями. 

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

На рисунке 2.2 приведен способ организации интерфейса, реализованный в данном программном продукте. 





Первое активное состояние  (главное меню)





Выбор пункта меню

Второе активное состояние   (подменю)





Четвертое активное                          состояние

  (Выход)



Третье активное состояние

(инструмент)





Реквизиты разработчика



Выход из системы





	Рисунок 2.2 – Схема интерфейса



	В системе реализованы следующие виды видов диалоговых окон:

– окно запроса.

Заметим, что при отображении окна запроса, остальные процессы, происходящие в системе – приостанавливаются. В общем случае структура окна диалога системы содержит следующие элементы:

– поле информации;

– меню окна диалога. 

В окне запроса нажатие клавиши ENTER означает выбор активного пункта диалогового меню; клавиши ESCAPE – выход из диалогового окна. 



2.2 Реализация графических элементов



В процессе разработки была реализована графическая библиотека, назначение которой состоит в следующем:

		прорисовка отдельных графических элементов управления;

		прорисовка диалоговых окон с последующим их сокрытием;

		прорисовка основного окна программы и окон инструментов;

		прорисовка заставки.

Некоторые графические элементы прорисованы таким образом, что создают эффект объема. Достигается это за счёт дополнительных линий более темного цвета чем внешний цвет, что создает эффект углубления. Еще больший эффект объема достигается за счет подборки фона, на котором прорисован графический элемент. Он должен контрастировать с цветами сторон графических элементов. 

Рисование объёмного текста осуществляется путём вывода одного и того же текста два раза разными цветами со сдвигом в 1-2 пикселя. Рисование всех графических элементов основано на рисовании таких графических примитивов, как линия, прямоугольник и строка текста. 

При прорисовке большинства элементов указывается конкретный цвет, хранящийся специальных константах.



2.3 Реализация функции скроллинга



При разработке программного продукта была реализована специальная возможность, отвечающая за быстрый доступ пользователя к информации, содержащейся в обучающей системе. Эта возможность – постраничный скроллинг информации, выдаваемой системой. Алгоритм работы скроллинга состоит в следующем:

– в переменную oldpos заносится позиция указателя в файле, откуда будет проводиться чтение;

– с этой позиции из файла читается, и одновременно выводиться на экран первые двадцать строк, oldpos: =74*20, oldpos присваивается значение новой позиции указателя;

– система ждет команды пользователя;

– при нажатии пункта “« Назад” (на страницу вверх), проверяется, является ли текущая позиция в файле больше чем 74*20 и если является, то oldpos:= -74*20+oldpos. Происходит смещение указателя на позицию, хранящуюся в ячейке oldpos, до тех пор, пока oldpos не станет меньше позиции 74*20 – тогда oldpos присвоит себе указатель на начальную позицию файла;

– при нажатии пункта “ Далее»” (на страницу вниз), проверяется, является ли текущая позиция в файле меньше чем 540*20 и если является, то oldpos:= 74*20+oldpos. Происходит смещение указателя на позицию, хранящуюся в ячейке oldpos, до тех пор, пока oldpos не станет больше или равна позиции 540*20 – тогда oldpos присвоит себе указатель на конечную позицию файла;

Схема работы функции скроллинга представлена на рисунке 2.3




Занесение позиции указателя в переменную oldpos



Чтение из файла с позиции  oldpos







Ожидание команды пользователя



“Далее»” (на страницу вниз)

“«Назад” (на страницу вверх)





Проверка, можно ли еще читать из файла

Проверка, не является ли текущая позиция в файле нулевой.







Чтение и вывод на экран с текущей позиции, oldpos:= 74*20+oldpos занесение в oldpos новой текущей позиции.

oldpos:= -74*20+oldpos

смещение на позицию, указанную в ячейке oldpos чтение с новой позиции.Нет         да







	

Рисунок 2.3 – Схема работы функции скроллинга

	

	2.4 Реализация функции поиска информации по ключевым словам



В процессе обучения пользователю важно иметь быстрый доступ не только ко всей возможной информации, хранящейся в системе, в целом, но так же и к отдельным ее частям. С этой целью в информационно-обучающей системе была предусмотрена возможность эффективного поиска необходимой информации в зависимости от контекста введенных лексем. Алгоритм работы функции поиска состоит в следующем:

		получение от пользователя искомой лексемы, занесение ее в переменную searchstr;

		занесение текущей позиции указателя в файле в специальную переменную oldpos;

		чтение строки из файла в переменную tmp;

		занесение текущей позиции указателя в файле в специальную переменную tmppos;

		поиск подстроки searchstr в строке tmp;

		если подстрока найдена, то перевод указателя на позицию, хранящуюся в переменной tmppos, и вывод информации, из файла начиная с этой позиции, иначе – переход на пункт номер два.

Ниже на рисунке 2.4 приведена схема работы функции поиска информации по ключевым словам.





Ввод искомой лексемы, занесение ее в переменную searchstr





Чтение строки из файла в переменную tmp

Занесение текущей позиции указателя в файле в переменную oldpos





Занесение текущей позиции указателя в файле в переменную tmppos 







Поиск подстроки searchstr

в строке tmp











Продолжение поиска

Строка не найдена





Строка найдена

Вывод информации





Рисунок 2.4 – Схема работы функции поиска по ключевым словам



Очевидно, что поиск информации прекращается только тогда, когда обработана вся информация, содержащаяся в файле, то есть все строки файла не будут проверены на вхождение в них подстроки searchstr. 

Стоит так же отметить, что файл с информацией может содержать не одно, а несколько вхождений искомого термина. Кроме того, в процессе работы с полученной информацией пользователь может перемещаться по файлу, тем самым, изменяя позиции указателя в файле. Очевидно, так же, что пользователю может понадобиться не первое, а второе или, скажем, третье его вхождение. Поэтому необходима возможность продолжения поиска с учетом предшествующего перемещения пользователя по файлу. Для реализации этой возможности и вводиться специальная переменная tmppos, которая в каждый конкретный момент времени хранит позицию в файле, до которой все строки файла уже обработаны (проверены на вхождение искомого термина). Таким образам, возобновляя поиск, мы смещаем указатель на позицию tmppos и продолжаем искать вхождения термина уже в той части текста, которая еще не обработана.



2.5 Реализация процесса тестирования и оценки уровня знаний



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

		задается вопрос;

		пользователь дает ответ;

		ответ пользователя сравнивается с правильным ответом;

		в случае совпадения к общему числу баллов прибавляется число баллов, полученных за правильный ответ; 

		возвращаемся на пункт 1.

Возникает вопрос: “Каким образом система оценивает правильность ответа пользователя?” В данной информационно-обучающей системе использовались тестовые файлы со следующей структурой:

		текст вопроса;

		текст ответов (все варианты ответов на вопрос пронумерованы);

Ответы на вопросы хранятся в отдельном файле ANSWER, в формате dat.

Таким образом, варианты правильных ответов считываются заранее и заносятся в массив otvet[k], а уже затем читаются и выводятся на экран тексты вопроса и вариантов ответов. Выбор каждого из вариантов ответов интерпретируется системой, как некоторая цифра, соответствующая номеру выбранного варианта, которая также хранится в массиве user_otvet[k]. Сравнивая выбранный пользователем вариант ответа, с вариантом ответа, прочитанным из файла система, может оценить правильности данного ответа.

Стоит отметить, что информационно-обучающая система содержит один тестовый файл с различными вопросами одного уровня. Все тестовые вопросы оценивается в один балл.

После прохождения теста (десять вопросов) количество баллов, за тест представляется на экране. На экране так же представляется общее количество набранных баллов за пройденный тест. После этого подводится итог знаний пользователя, то есть выводится оценка за тест.

На рисунке 2.5 приведена схема процесса тестирования и оценки уровня знаний пользователя.




Открытие файла, содержащего правильные ответы, answer, k:=0, bad:=0, good:=0

Запуск процесса тестирования





Открытие файла, содержащего тесты, test  

Занесение правильных ответов в массив otvet[k]





Чтение вопроса и вариантов ответов 



Вывод результатов



Ожидание действия пользователя





Выход

	

k < общего числа вопросов

Занесение ответа пользователя в  массив user_otvet[k]. Анализ ответа (сравнение с правильным).да  нет







bad:=bad+1

Не верно





Good:=good+1

Верно

k: =k+1





Рисунок 2.5 – схема системы тестирования и оценки знаний



После того как пользователь пройдет данное ему тестовое задание, максимальное количество баллов, которое он сможет набрать равно десяти (по одному баллу за каждый вопрос). В конце тестового задания подводится итог знаниям, полученным пользователем. Исходя из этого, шкала оценивания тестового задания выглядит следующим образом:

		пользователь набрал меньше 3 баллов – уровень подготовки «Плохо»;

		от 3 до 6 баллов – уровень подготовки «Удовлетворительно»;

		больше 6 баллов – уровень знаний «Хорошо»;

		10 баллов – «Отлично».


3. ОБОСНОВАНИЕ ВЫБОРА ЯЗЫКА ПРОГРАММИРОВАНИЯ

	

	Первая версия языка С была разработана в 1972 г. сотрудником фирмы Bell Laboratories Денисом Ритчи, когда он и Кен Томпсон занимались созданием операционной системы UNIX. Важным моментом является то, что язык С был создан в качестве инструмента для программистов – практиков, поэтому главная цель разработки этого языка заключалась в том, чтобы сделать его полезным при создании различных прикладных программ.

	За истекшие три десятилетия С превратился в один из наиболее важных и популярных языков программирования. Правда в течении последнего десятилетия многие программисты перешли на более популярный сегодня С++. Однако С по – прежнему остается важным языком программирования и как сам по себе, и как промежуточная ступень при переходе на С++. С обладает множеством преимуществ. Он является современным языком программирования, включающим в себя управляющие структуры, наличие которых в языке считается желательным с точки зрения теории и практики программирования. Этот язык построен так, что позволяет естественным образом применять планирование сверху – вниз, структурный подход к программированию, модульное проектирование программ. В результате на С получаются более надежные и “прозрачные программы”.

	Для языка С характерна достаточно высокая эффективность. Здесь сполна применяются возможности современных компьютеров. Программы на С получаются компактными и быстро выполняемыми. 

	Языку С присуща высокая степень переносимости. Это означает, что программы на языке С, написанные для одной операционной системы, могут выполняться в других системах с небольшими изменениями. Кроме того язык С является достаточно мощным и гибким. На нем написана большая часть операционной системы UNIX. 

	Важным является то, что язык С является языком программирования, ориентированным на удовлетворение потребностей программистов. Он предоставляет доступ к аппаратным средствам и позволяет оперировать отдельными битами оперативной памяти. Он включает в себя набор операторов, позволяющих программисту выражать свои идеи в компактном виде. Язык программирования С менее строгий, чем, скажем, язык Pascal, в смысле ограничения свободы действий программиста. С одной стороны это является несомненным достоинством, но с другой – таит в себе определенную опасность. Достоинства заключается в том, что многие задачи, например преобразование форм данных, С позволяет решать гораздо проще, чем другие языки программирования. Опасность же заключается в том, что язык С позволяет совершать такие ошибки, которые не возможны в других языках.

	Язык С обеспечивает программисту большую степень свободы, но и накладывает большую степень ответственности.

	Вот почему именно язык С был выбран автором для реализации данного программного продукта. 

	
4 ОПИСАНИЕ ПРОГРАММНОГО ПРОДУКТА

	

	4.1 Входные данные

	

	Входными данными являются: данные справочного материала (вводятся из файла справки), данные теории (вводятся из файла теории), тестовые данные (вводятся из тестовых файлов). 

	Файлы справки и теории – это два текстовых файла, длина строк которых не превышает шестидесяти – семидесяти четырех символов. Файлы организованы так, что каждые двадцать строк составляют одну страницу. Для таких файлов используется расширение «*.txt».

	Файлы тестов – это текстовые файлы, содержащие тестовые задания, предназначенные для тестирования и оценки уровня знаний, полученных пользователем в процессе обучения. Длинна строк этих файлов не превышает тридцати – сорока символов. Для таких файлов так же используется расширение «*.txt». Для файла правильных ответов используется расширение «*.dat». 

	

	4.2 Контроль входных данных

	

	Система осуществляет контроль входных данных, и адекватно реагирует на некорректные данные. Перед открытием файла справки, теории, тестовых заданий и фала правильных ответов система проверяет их наличие в текущем каталоге. В случае отсутствия файла, система сообщает об этом пользователю. 

	
4.3 Выходные данные

	

	Выходными данными информационно-обучающей системы являются результаты тестирования пользователя полученные в результате выполнения пользователем всех тестовых заданий.

	

	4.4 Модульная структура программного продукта

	

	4.4.1 Перечень модулей

	Программный продукт включает в себя следующие одиннадцать основных модулей:

		 BIB.c – основной модуль, вызывающий все стандартные модули языка С, такие как: STRING.h, STDIO.h, CONIO.h, GRAPHICS.h, STDLIB.h.

		 RAMKA.c – модуль, который занимается прорисовкой графического интерфейса (рамки по боковым краям экрана). 

		MENU.c – графический модуль. Отвечает за прорисовку основных графических элементов системы (главное меню, тестовое меню, курсор, передвижение курсора по меню), а так же за вывод заставки при запуске программы и прорисовки активной подсказки.

		 ZASTAVKA.c - модуль, отвечающий за вывод на экран заставки при запуске программы.

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

		 POISK.c – модуль, отвечающий за возможность поиска информации в тексте теории в зависимости о контекста введенных пользователем лексем. Осуществляет поиск, вывод на экран и дальнейшее возобновление поиска.

		 FILE_OP.c – модуль, отвечающий за возможность открытия файлов теории, вывод теории на экран, скроллинг, прорисовка меню пункта «Теория», навигация по этому меню.

		TEST.c – модуль, отвечающий за возможность тестирования и оценки уровня знаний пользователя, осуществляет чтение и вывод на экран вопросов из тестовых файлов, а также вывод на экран результатов, полученных в результате тестирования. 

		HELP.c – модуль, отвечающий за возможность открытия файлов справки, вывод справки на экран.

		EXIT.c – модуль, отвечающий за возможность выхода из программы, при выходе выводит реквизиты разработчика.

		OSHIBKA.c – модуль, осуществляющий проверку наличия необходимых файлов системы, выводит соответствующее сообщение об ошибке при отсутствии этих файлов.

		MODULI.c – основной модуль программы, содержащий в себе все перечисленные выше модули.

	

4.4.2 Схема связи модулей

На рисунке 4.1 отображена схема связи между основными модулями системы. Стрелка от одного модуля к другому означает, что функции первого модуля вызываются вторым.




MODULI.c

OSHIBKA.c







ZASTAVKA.c

BIB.c

EXIT.c





HELP.c

    RAMKA.c





FILE_OP.c



TEST.c

MENU.c





POISK.c





Рисунок 4.1 – Схема связей основных модулей системы



	4.5 Функциональная структура программного продукта

	

	4.5.1 Перечень основных функций

	Программный продукт содержит более девяти функций, состоящих во взаимосвязях друг с другом.

	Ниже приводится краткое описание основных из них:

	Функции модуля BIB.c: 

		Данный модуль содержит только стандартные модули языка С.

	Функции модуля RAMKA.c:

– ramka (). Данная функция занимается прорисовкой рамки по боковым краям экрана.

	Функции модуля MENU.c

			menu (). Функция, занимающаяся прорисовкой главного меню, курсора в главном меню, его навигацию.

– ramka (). Данная функция занимается прорисовкой рамки по боковым краям экрана.

	Функции модуля ZASTAVKA.c:

			zastavka (). Функция, которая осуществляет вывод заставки перед появлением главного меню. 

– ramka (). Данная функция занимается прорисовкой рамки по боковым краям экрана.

	Функции модуля POISK.c:

			search (). Функция, которая осуществляет поиск искомого слова, прорисовку поискового окна.

	Функции модуля FILE_OP.c:

			search (). Функция, которая осуществляет поиск искомого слова, прорисовку поискового окна.

– ramka (). Данная функция занимается прорисовкой рамки по боковым краям экрана.

			show_file (). Функция, которая занимается открытием файлов теории, выводом информации на экран скроллингом, прорисовкой меню «Теории», навигацией по этому меню.

	Функции модуля TEST.c:

			menu (). Функция, занимающаяся прорисовкой главного меню, курсора в главном меню, его навигацию .

– ramka (). Данная функция занимается прорисовкой рамки по боковым краям экрана.

			test (). Осуществляет открытие файлов с правильными ответами, с тестовыми вопросами, осуществляет вывод этих вопросов на экран, подводит итог набранным пользователем баллам, выводит на экран результат тестирования.

	Основные функции модуля HELP.c:

		help (). Открывает файл со справочной информацией. Отображает оперативную подсказку.

– ramka (). Данная функция занимается прорисовкой рамки по боковым краям экрана.

	Основные функции модуля EXIT.c:

		help (). Открывает файл со справочной информацией. Отображает оперативную подсказку.

			exit (). Осуществляет завершение программы (выход), при выходе выводит реквизиты разработчика.

	Основные функции модуля OSHIBKA.c:

			oshibka (). Осуществляет проверку наличия необходимых файлов системы, выводит соответствующее сообщение об ошибке при отсутствии этих файлов.

			exit (). Осуществляет завершение программы (выход), при выходе выводит реквизиты разработчика. 

	Основные функции модуля MODULI.c:

	– Не содержит функций. Осуществляет взаимодействие между всеми модулями программы.

	

	4.5.2 Функциональная схема

	На рисунке 4.2 отображена схема связей между основными функциями программного продукта. Стрелка от одной функции к другой означает то, что первая функция вызывается второй в процессе работы программы.

	


zastavka

search

show_file

	

	

        ramka

	

	

	

help

menu

test

	

	

	

exit

	

	

oshibka

	

	

	Рисунок 4.2 – Связь между основными функциями программного продукта

	
5 КОМПЛЕКТ ПОСТАВКИ И ПОРЯДОК ИНСТАЛЛЯЦИИ

	

	5.1 Комплект поставки 

	

	Программный продукт поставляется на дискете 3,5". В корневом каталоге дискеты находится каталог RusKrabota, содержащий следующие файлы:

	Kproekt.exe – главный исполняемый файл;

	Egavga.bgi – драйвер видеоадаптера;

	Keyrus.com – драйвер клавиатуры;

	help.txt – файл со справочными сведениями по работе с программой;

	1.txt – файл, содержащий обучающий материал, предлагаемый системой;

	test.txt – файл, содержащий тестовое задание;

	answer.dat – файл, содержащий правильные ответы к тестовому заданию;

	

	5.2 Порядок инсталляции

	

	Процедура инсталляции состоит в следующем:

			 средствами операционной системы создаётся каталог для программы (возможно также использование уже существующего каталога, но создание для программы отдельного каталога является предпочтительным);

			 средствами операционной системы файлы, входящие в комплект поставки, переносятся из каталога RusKrabota дискеты в подготовленный каталог.

	
5.3 Запуск программного продукта

	

	Для запуска программного продукта для начала необходимо выполнить файл Keyrus.com, а после запустить файл Kproekt.exe. В случае отсутствия некоторых файлов, система выдаст соответствующее предупреждение, и если эти файлы были критически важными, прекратит работу.

	
6 ТЕСТИРОВАНИЕ ПРОГРАММНОГО ПРОДУКТА

	

	6.1 Реакция на корректные данные

	

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

	

	6.2 Реакция на некорректные данные

	

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

	

	6.3 Анализ эффективности

	

	6.3.1 Положительные черты программного продукта

	Созданный программный продукт обладает простым в обращении, удобным и интуитивно-понятным графическим интерфейсом.

	Тестирование показало, что разработанный программный продукт, является эффективной и надежной информационно-обучающей системой, обладающей объективной системой оценки уровня знаний, полученных пользователем в процессе обучения, а наличие объемной справки позволяет работать с системой даже не подготовленным пользователям. Наличие в системе возможности поиска информации в зависимости от контекста введенных лексем делает систему еще более привлекательной для пользователей, которым необходима небольшая по объему, простая в обращении информационно-обучающая система, позволяющая получить необходимые знания наиболее простым и доступным способом.

	

	6.3.2 Отрицательные черты программного продукта

	В ходе тестирования были выявлены и некоторые отрицательные черты.

	Постраничный скроллинг текста, выводимого на экран, при использовании теории является, очевидно, менее удобным в использовании, хотя и более простым в реализации, чем по строковый скроллинг.

	Информационно-обучающая система содержит лишь наиболее необходимые в процессе обучения инструменты (поиск по контексту, тестирование, непосредственное чтение информации через режим теории), что в определенных условиях является существенным недостатком в процессе обучения. 

	Недостатком управления системой является то, что система поддерживает только один способ управления, а именно, только при помощи клавиатуры. Очевидно, что более удобным была бы реализация дополнительной возможности управления посредством использования мыши.

	Недостатком реализации системы является так же то, что при отсутствии файла, содержащего тестовые задания функция тестирования в информационно-обучающей системе не реализуется.

	

	6.3.3 Возможности улучшения программного продукта 

	Исходя из вышесказанного, можно указать следующие способы улучшения программного продукта:

			 улучшение функции скроллинга (возможность прокрутки текста как крупными, так и мелкими шагами), добавление полос прокрутки;

			 введение дополнительной возможности управления системой посредством мыши;

			 введение в систему дополнительных возможностей, таких, как возможность моделирования;

			 оптимизация процесса поиска по контексту;

			 оптимизация процесса тестирования и оценки уровня знаний пользователя;

			 оптимизация процесса представления результатов тестирования, расширение базы вариантов тестовых заданий;

			добавление возможности управления программным продуктом при помощи так называемых «горячих» клавиш;

			добавление звуковых эффектов, сопровождающих действия пользователя;

			внесение возможности загрузки графического файла в «*.bmp» формате.

	
ВЫВОДЫ

	

	Целью работы данного программного продукта является обучение и ознакомление пользователя с таким разделом химии как «Атомно – молекулярная теория. Доказательства существования атомов и молекул». Поэтому основное внимание уделяется реализации удобного, простого в обращении и интуитивно понятного графического интерфейса, который позволил бы пользователю работать с системой с максимальным удобством, а так же реализации эффективного метода тестирования и оценивания. Программа имеет как положительные, так и отрицательные черты. К положительным чертам можно отнести удобный интерфейс, невысокие аппаратные требования. 

	Программа имеет недостатки и, следовательно, может быть улучшена. Можно усовершенствовать способы взаимодействия отдельных частей системы посредством реализации возможности управления системой при помощи мыши, оптимизировать процесс скроллинга информации и тестирования пользователя, ввести в систему новые дополнительные возможности. 


ПЕРЕЧЕНЬ ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ



Герберт Шилдт Справочник программиста по C/С++, 2-е издание – М.: Вильямс, 2001 – 700 с.

Прата Стивен «Язык программирования С. Лекции и упражнения» – СанктПетербург, ООО «ДиаСофтЮП», 2002г. – 896c.

Ниглаус Вирт Алгоритмы и структуры данных: пер. с англ. – 2-е изд., испр. – СПб.: Невский Диалект, 2001. – 352 с.: ил. 

Ахо, Альфред, В., Хопкрофт, Джон, Ульман, Джеффри, Д. Структуры данных и алгоритмы.: пер. с англ.: М. Издательский дом “Вильямс”, 2001. – 384 с.: ил.

Подбельский В.В., Фомин С.С. Программирование на языке С: Учеб. Пособие. – 2-е доп. изд. – М.: Финансы и статистика, 2002. – 600 с. ил. 

Кузьменко Н. Е., Еремин В. В., Попков В. А. К89 Начала химии. Современный курс для поступающих в вузы. Т. 1/Н. Е. Кузьменко и др. – 7-е изд., перераб. и доп. – М.: Экзамен, 2002 – 384 с.


Приложение А



ТЕХНИЧЕСКОЕ ЗАДАНИЕ



А.1 Общие сведения



Задание: Разработка информационно-обучающей системы на тему “Информатика. Структуры данных. Списки”.

Дата получения задания: 20.02.2006.

Плановый срок завершения работы: 30.05.2006.



А.2 Основания для разработки



Основанием для разработки программного продукта, является задание на курсовой проект по дисциплине “Основы программирования и алгоритмические языки” выданное кафедрой программного обеспечения интеллектуальных систем студенту группы ИС-05б Чубатову Руслану Евгеньевичу.



А.3 Цель работы



Цель разработки – создание программного продукта, позволяющего обучать пользователя такому разделу химии как «Атомно – молекулярная теория. Доказательства существования атомов и молекул», а так же эффективно оценивать уровень полученных им в процессе обучения знаний. 


А.4 Требования к программному продукту



А.4.1 Общие требования



Программный продукт должен соответствовать следующим требованиям:

		удобный графический интерфейс;

		наличие системы помощи по навигации в системе;

		наличие справки о разработчике;

		наличие справочного материала по разделу химии: «Атомно – молекулярная теория. 

	Доказательства существования атомов и молекул». 

		наличие системы поиска ключевым словам;

		наличие системы тестирования и оценки уровня знаний пользователя.



А.4.2 Требования к аппаратному обеспечению



Программный продукт должен нормально функционировать на компьютере со следующими характеристиками:

		CPU –IBM 80486 или выше;

		ОЗУ – 350 Kb и выше;

		около 200 килобайт свободного дискового пространства;

		VGA-совместимый монитор с поддержкой разрешения 640x480 при 16-ти цветах;

		клавиатура.


А.4.3 Организационные требования



Программный продукт должен:

		быть написан на языке C (совместимом с компилятором Borland C++ 3.1);

		функционировать под операционной системой MS-DOS 5.0 и выше;

		быть снабжён пояснительной запиской не менее 30 страниц и руководством пользователя.

Вся документация должна быть оформлена в соответствии с требованиями ДСТУ 300895 "Документация. Отчеты в сфере науки и техники. Структура и правила оформления".

Инсталляционная копия продукта вместе с технической документацией в формате Microsoft Word и исходным кодом должна поставляться на дискете 3,5". Инсталляционная копия должна содержаться в каталоге RusKrabota, техническая документация – в каталоге DOCUM, исходный код – в каталоге KOD. Запускаемым файлом должен являться пакетный файл Kproekt.exe, расположенный в каталоге RusKrabota.



А.5 Этапы разработки и сроки выполнения



Сроки выполнения приведены в таблице А.1.


Таблица А.1 Сроки выполнения работы

№

Вид работы

Длительность этапа

Дата завершения этапа

1

Получение задания на разработку



20 февраля 2006г.

2

Разработка и согласование технического задания

1 неделя

27 февраля 2006г.

3

Подбор методического и справочного материала

1 неделя

5 марта 2006г.

4

Разработка графического интерфейса 

2 недели

13 марта 2006г.

5

Разработка основных алгоритмов

2 недели

27 марта 2006г.

6

Реализация основных алгоритмов, дополнительных возможностей

2 недели

11 апреля 2006г.

7

Реализация справочной системы, окончательная стыковка модулей

1 неделя

24 апреля 2006г.

8

Тестирование и отладка программы

2 недели

1 мая 2006г.

9

Написание пояснительной записки

2 недели

12 мая 2006г.

10

Защита курсового проекта



30 мая 2006г.


Приложение Б



РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ



Б.1 Установка и запуск программного продукта



Установка и запуск программного продукта на ваш ПК не требует специальной процедуры инсталляции. Достаточно просто скопировать файлы с инсталляционной дискеты на ваш жесткий диск и запустить пакетный файл Kproekt.exe. Система готова к работе.



Б.2 Управление возможностями системы



После запуска программы на экран будет выведена заставка, приведенная на рисунке В.1. Для входа в систему нажмите клавишу ENTER и на экране появиться основное окно программы с главным меню (оно представлено рисунке В.2).

Основное меню состоит из следующих четырех пунктов:

теория;

тесты;

помощь;

выход.

Выбор одного из пунктов меню приведет либо к раскрытию соответствующего подменю (пункты “Теория”, “Помощь” основного меню), либо к запуску одного из инструментов системы (пункт меню “Тесты”).

Перемещение по системе подменю осуществляется при помощи клавиш горизонтальных стрелок; выбор пункта – нажатие клавиши ENTER; выход из подменю – нажатие клавиши ESCAPE или соответствующего пункта подменю.

При выходе из системы на экране появляется информация о разработчике программы (рисунок В.9). Повторное нажатие клавиши ESCAPE приведет к полному выходу из программы.



Б.3 Описание основных возможностей системы



Основное меню позволяет получить доступ к основным обучающим возможностям, которыми располагает система.

Пункт меню “Теория” содержит информацию по теме: “Атомно-молекулярная теория. Доказательство существования атомов и молекул” и состоит из подпункта:

– Поиск: содержит инструменты, позволяющие пользователю получать информацию в соответствии с контекстом веденных лексем.

Пункт меню “Тесты” содержит инструменты, предназначенные для эффективной и объективной оценки знаний, приобретенных пользователем в процессе обучения.

Пункт меню “Помощь” содержит информацию по навигации в системе.

Пункт меню “Выход” предназначен для завершения работы и выхода из системы.



Б.4 Использование справки



Система обладает справкой, вызов которой осуществляется посредством выбора пункта меню “Помощь” главного меню. Справка содержит информацию по навигации в системе, а также все клавиши, используемые при управлении системой. Общий вид окна справки показан на рисунке В.4.

Дополнительная информация о разработчике системы находится в пункте меню “Выход” и выводится на экран перед завершением программы (рисунок В.9).

Б.5 Использование теории



Доступ к возможности системы под названием “Теория”, осуществляется посредством выбора соответствующего подпункта в подменю пункта “Теория”. После этого на экране появиться окно этого пункта меню (оно показано на рисунке В.3). Перемещение по страницам осуществляется при помощи выбора клавиш подменю «Назад (на страницу вверх) и Далее» (на страницу вниз).



Б.6 Использование функции поиска



Доступ к функции поиска посредством выбора соответствующего подпункта в подменю “Теория”. После осуществления выбора на экране появиться окошко, в котором вам будет предложено ввести искомый термин (рисунок В.5). Длинна термина не должна превышать 9 символов.

Введите искомый термин и нажмите клавишу ENTER. Введенное слово будет выведено на верхнюю позицию (будет находится в самой верхней строке).

Если введенное слово не обнаружено в тексте учебника или его вхождений нет, на экран выводятся соответствующее сообщение, представленное на рисунке В.6.

ESCAPE – выход из режима поиска.



Б.7 Использование функции тестирования



После запуска процесса тестирования, посредством выбора соответствующего пункта меню, на экране появится окно тестирования с тестовыми вопросами (рисунок В.7).

Тест содержит 10 вопросов, за которые в общей сложности можно получить 10 баллов. Ниже приведена соответствующая шкалы оценивания.

Шкала оценивания одного тестового задания выглядит следующим образом:

- пользователь набрал меньше 3 баллов – уровень подготовки «Плохо»;

- от 3 до 6 баллов – уровень подготовки «Удовлетворительно»;

- больше 6 баллов – уровень знаний «Хорошо»;

- 10 баллов – «Отлично».

	После прохождения тестового задания на экране появляется окно с количеством баллов за пройденный тест (оно изображено на рисунке В.8).

Нажатие клавиши ESCAPE так же означает завершение процесса тестирования. 



Б.8 Возможные неполадки и их устранение



Система может выдать сообщения о следующих ошибках.

«Не найден файл справки». Это значит, что файл справки help.txt и autor.txt просто отсутствует в каталоге, из которого запускалась программа. Проверьте наличие данного файла и в случае необходимости установите его.

«Невозможно установить видеорежим». Данная ошибка может возникнуть при повреждении либо отсутствии драйвера видеоадаптера (файла Egavga.bgi). Проверьте его целостность и наличие. Убедитесь также, что ваш монитор поддерживает 16-цветный VGA-режим с разрешением 640x480.

«Не найден файл теории». Данная ошибка может возникнуть при отсутствии файла теории 1.txt в каталоге программы. Проверьте его наличие.

«Не найден файл тестов». Данная ошибка может возникнуть при отсутствии файла тестовых заданий в каталоге, из которого запускалась программа. Проверьте его наличие и в случае необходимости проведите установку.

«Не найден файл правильных ответов». Ошибка происходит, если в каталоге отсутствует требуемый файл answer.dat. Проверьте его наличие.


Приложение В



ЭКРАННЫЕ ФОРМЫ





















Рисунок В.1 – Общий вид заставки























Рисунок В.2 – Общий вид окна программы




























Рисунок В.3 – Окно программы в режиме теория





























Рисунок В.4 – Окно программы в режиме справки




























Рисунок В.5 – Окно теории в режиме поиска





























Рисунок В.6 – Поиск не дал результатов. 




























Рисунок В.7 – Окно программы в режиме тестирования





























Рисунок В.8 – Окно результатов тестирования




























Рисунок В.9 – Общий вид окна информации о разработчике


Приложение Г



ЛИСТИНГ ПРОГРАММЫ



//модуль BIB.с



#include <string.h>

#include <stdio.h>

#include <conio.h>

#include <graphics.h>

#include <stdlib.h>

#include <dos.h>



//модуль RAMKA.c



#include "bib.h"

//-----------------------Построение рамки на экране--------------------------

void ramka()

{

cleardevice();

//------------------------     //Очистка экрана

setfillstyle(1,7);       //Сплошная заливка серым цве-

bar(0,0,640,19);      //том боковых граней экрана

bar(630,19,640,480);

bar(0,461,640,480);

bar(0,0,19,480);

setcolor(8);         //Темно-серый цвет линий-рамок

rectangle(20,20,630,460);    //создающих эффект трехмернос-

rectangle(21,21,629,459);    //ти

rectangle(22,22,628,458);

//------------------------

}

/////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////

	

	//модуль MENU.c



#include "bib.h"

//------------------------Меню программы,ее пункты---------------------------

int menu(char zaglavie[50], char punkt1[50], char punkt2[50], char punkt3[50], char punkt4[50])

{

 ramka();

 setcolor(6);          //Цвет надписи вопроса и "Главное меню"

 settextjustify(CENTER_TEXT, CENTER_TEXT); // Их расположение на экране

 settextstyle(0,0,2);

 outtextxy(320,80,zaglavie);    //Вывод на экран надписи вопроса и "Главное меню"

//***************************************************

 setcolor(15);				  //Цвет пунктов меню и отв.на вопросы

 settextjustify(LEFT_TEXT, RIGHT_TEXT);  //Их пложение на экране

 settextstyle(0,0,2);

 outtextxy(265,170,punkt1);    //Вывод на экран пунктов меню

 outtextxy(265,220,punkt2);    //и вариантов ответов на воп-

 outtextxy(265,270,punkt3);    //росы

 outtextxy(265,320,punkt4);

//***************************************************

 int cursor=0;

  do

  {

  int key=0;         //Начальное положение курсора

  for (int i=0; i<4; i++)

	{

	 setfillstyle(SOLID_FILL,16);    //Цвет курсора,когда он не активен

	 if (i==cursor)

	 setfillstyle(SOLID_FILL,3);   //Цвет курсора,когда он активен

	 setcolor(16);        //Рамка цвета курсора,когда он не активен

	 fillellipse(240,175+(i*50),10,10);  //Прорисовка закрашенного курсора

	}

  key = getch();

  if (key == 72)

	 cursor--;

  if (key == 80)

	 cursor++;

  if (key==27)

	 return -1;

  if ((cursor==4)&&(key==13))

	 return -1;

  if (key==13)

	 return cursor;

  if (cursor==4)

	 cursor=0;

  if (cursor==-1)

	 cursor=3;

  }

  while(1);

}

/////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////



	//модуль ZASTAVKA.c



#include "bib.h"

//-------------------Вывод на экран названия курс. работы--------------------

int zastavka2()

{

ramka();

setcolor(8);

settextstyle(0,0,2);

outtextxy(65,25,"Информационно - обучающая система");

//---------

setcolor(7);           //Смещение текста на два

settextstyle(0,0,2);         //пикселя,создающее эффект

outtextxy(63,25,"Информационно - обучающая система"); //трехмерности

//---------

setcolor(8);

settextstyle(0,0,2);

outtextxy(65,45,"на тему:");

//---------          //Смещение текста на два

setcolor(7);         //пикселя,создающее эффект

settextstyle(0,0,2);       //трехмерности

outtextxy(63,45,"на тему:");

//---------

setcolor(3);

settextstyle(0,0,2);

outtextxy(120,180,"АТОМНО-МОЛЕКУЛЯРНАЯ ТЕОРИЯ.");

outtextxy(105,200,"ДОКАЗАТЕЛЬСТВА СУЩЕСТВОВАНИЯ");

outtextxy(185,220," АТОМОВ И МОЛЕКУЛ");

setcolor(8);

settextstyle(0,0,1);

outtextxy(65,430,"Нажмите ENTER для продолжения");

//---------

setcolor(7);           //Смещение текста на два

settextstyle(0,0,1);         //пикселя,создающее эффект

outtextxy(63,430,"Нажмите ENTER для продолжения"); //трехмерности

//---------

setcolor(8);

settextstyle(0,0,1);

outtextxy(65,440,"Нажмите esc для выхода");

//---------            //Смещение текста на два

setcolor(7);           //пикселя,создающее эффект

settextstyle(0,0,1);          //трехмерности

outtextxy(63,440,"Нажмите esc для выхода");

//---------

//****************************************************

do      //События нажатия клавиш Enter и Esc

{

 int choice;

 choice=getch();

 if (choice==27) return -1; //Если Esc, то выход из программы

 if (choice==13) return 0; //Если Enter, то переход к меню

}

while(1);

//****************************************************

}

/////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////



//модуль POISK.c



#include"bib.h"

//-----------------------------Поиск слова-----------------------------------

char searchstr[30];

int search(FILE *f)

{

 char in[2] = {' ','\0'};

 int k;

 int tmppos,oldpos;    //Позиция строки в переменной tmp и текущая позиция слов

 char *tmp;      //Переменная tmp,в которую происходит считывание строк из 

	 oldpos = ftell(f);             //файла

 setfillstyle(SOLID_FILL,7);          //Цвет окна поиска

 settextjustify(CENTER_TEXT, CENTER_TEXT); //Положение строки в полосе поиска

 bar(220,190,420,250);    //Окно поиска

 setcolor(7);     //Цвет рамки окна поиска

 rectangle(220,190,420,250);   //Рамка окна поиска

 setfillstyle(SOLID_FILL,16);   //Цвет полосы поиска

 setcolor(15);      //Цвет букв меню поиска

 outtextxy(320,225,"Esc - Выход");

 outtextxy(320,240,"Enter - Далее");

//****************************************************

 do

 {

  bar(230,200,410,215);     //Полоса поиска

  setcolor(8);        //Цвет рамки трехмерности на полосе поиска

  rectangle(231,201,409,214);   //Рамка на полосе поиска эффекта трехмерности

  setcolor(15);        //Цвет вводимого искомого слова

  outtextxy(320,210,searchstr);   //Набор искомого слова

  k=getch();

  if ((k!=13)&&(k!=27))

  {

 if (k!=8)

 {

  in[0]=k;

  if (strlen(searchstr)<9)    //Если слово меньше 9-ти знаков

  strcat(searchstr,in);      //дописываем в конец слова

 }           //признак окончания строки,иначе

 else          //стираем последний знак слова и

 searchstr[strlen(searchstr)-1]='\0';  //все равно дописываем знак окончания

  }          //строки ('\0')

 }           //Заносим искомое слово в переменную

 while((k!=13)&&(k!=27));    //searchstr

//****************************************************

 fgets(tmp,74,f);        //Считываем строки из файда в

//**************************************************** //переменную tmp

 do

 {           //Освобождаем занятую па-

 freemem(tmppos); 	    //мять под эту переменную

 //------------------------------

 tmppos = ftell(f);

 fgets(tmp,74,f);

 if (strstr(tmp,searchstr)!=NULL)    //Ищем подстроку searchstr в строке tmp,

  return tmppos;        //и если подстрока существует,

 }             //то возвращаем его позицию (tmppos)

 while(!feof(f));       //на позицию первой строки,ищем пока не дойдем

//**************************************************** //до конца файла

 bar(230,200,410,215);      //Полоса поиска

 setcolor(8);        //Цвет рамки трехмерности на полосе поиска

 rectangle(231,201,409,214);    //Рамка на полосе поиска эффекта трехмерности

 setcolor(15);        //Цвет надписи "Строка не найдена"

 outtextxy(320,210,"Строка не найдена");   //Если слово не найдено

 getch();        //то положение строк на

 return oldpos;       //экране не меняется

}

/////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////



//модуль FILE_OP.с



#include"bib.h"

//-----------------------Загрузка информации из файла------------------------

int show_file(char filename[12], int pos)

{

 FILE *f;

 char str[75];

 int oldpos,cur=0;

//====================================

 if ((f = fopen(filename,"r"))!=NULL)

 {

 do

 {

 ramka();

 settextstyle(0,0,0);

 int cury = 0;      //Приращение на которое сместится

 oldpos=pos;      //следующая строка

 fseek(f,pos,SEEK_SET);

//****************************************************

 do

 {        //Выводит на экран строку в 74

 fgets(str,74,f);     //символа

 str[strlen(str)-1]='\0';

 setcolor(15);     //Цвет текста(Белый)

 settextjustify(LEFT_TEXT,LEFT_TEXT);

 if (!feof(f)) outtextxy(40,35+cury,str);

 cury+=12;      //Увеличение счетчика смещения

 }

 while((!feof(f))&&(cury<370));

//****************************************************

 pos=ftell(f);

 if (feof(f)) pos=-1;

 setcolor(7);

 line (35,409,615,409);    //Две прямые над кнопками

 line (35,414,615,414);    //выбора в меню обучение

 setcolor(8);

 line (35,410,615,410);    //Тени двух прямых над кнопками

 line (35,415,615,415);    //выбора в меню обучение

 int k;

//===================================

//****************************************************

 do

 {

 for (int i=0; i<4; i++)    //Пока курсор находится в нужном

 {        //месте его цвет серый,иначе

 if (i==cur) setcolor(7);    //в других местах-черный

 else setcolor (16);

 rectangle(42+160*i,422,118+160*i,448); //Прямоугольник выбора с прираще-

 rectangle(41+160*i,421,119+160*i,449); //нием счетчика i (нужно для пе-

 rectangle(40+160*i,420,120+160*i,450); //редвижения рамки выбора по экрану

 rectangle(39+160*i,419,121+160*i,451);

 }

 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 for (i=0; i<4; i++)    //Пока курсор находится в нужном

 {       //месте его цвет темносерый,иначе

 if (i==cur) setcolor(8);   //в других местах-черный

 else setcolor (16);

 rectangle(42+160*i,422,118+160*i,448); //Тень п для рямоугольник выбора с прираще-

 rectangle(41+160*i,421,119+160*i,449); //нием счетчика i (нужно для пе-

					 //редвижения рамки выбора по экрану

 }

 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 settextjustify(CENTER_TEXT,LEFT_TEXT);

 setcolor(8);

 settextstyle(0,0,1);

 outtextxy(81,440,"Выход");   //Тени для кнопок выбора

 outtextxy(241,440,"Поиск");   //действий в меню обучения

 outtextxy(401,440,"<<Назад");

 outtextxy(561,440,"Далее>>");

 //-----------------------------------------

 setcolor(7);

 outtextxy(79,440,"Выход");   //Кнопки выбора действий

 outtextxy(239,440,"Поиск");   //в меню обучения

 outtextxy(399,440,"<<Назад");

 outtextxy(559,440,"Далее>>");

 //-----------------------------------------

 k=getch();

 if (k==77) cur++;     //Пердвижение курсора вправо

 if (k==75) cur--;     //Пердвижение курсора влево

 if (cur==-1) cur=3;    //Переход на крайний правый пункт

 if (cur==4) cur=0;    //Переход на крайний левый пункт

 if (k==27) return -1;    //Если ESC,то выход из меню "Теория"

//***********************************

 if ((k==13)&&(cur==0)) return -1;  //Выход из меню "Теория"

//***********************************

 if ((k==13)&&(cur==1))    //Поиск слова, фразы

 {

 fseek(f,oldpos,SEEK_SET);

 pos = search(f);    //Присвоение позиции функции

 }       //поиска слова

//***********************************

 if ((k==13)&&(cur==2))

 {

 if (oldpos>(74*20))    //Скролинг экрана вверх

 {

 fseek(f,-74*20+oldpos,SEEK_SET);

 fgets(str,74,f);

 pos=ftell(f);

 } else pos=0;

 }

//***********************************

 if ((k==13)&&(cur==3))

 {

 if (oldpos<(540*20))    //Скролинг экрана вниз

 {

 fseek(f,74*20+oldpos,SEEK_SET);

 fgets(str,74,f);

 pos=ftell(f);

 } else pos=oldpos;    //Если конец текста,то не куда не

 }        //двигаемся

//***********************************

 }

 while(k!=13);

 }

 while(pos!=-1);

 fclose(f);

 }

 return pos;      //Функция возвращает позицию

}

/////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////



//модуль TEST.c



#include"bib.h"

//-------------------------------Тестирование--------------------------------

char *otvet;      //Правильный ответ

char *user_otvet;

void test()

{

	FILE *fansw;

	FILE *test_file;

	char i = 0, k = 0, len = 0;



	fansw = fopen("answer.dat", "rb");

	fread(&len, 1, 1, fansw);    //считываем

	otvet = (char *)malloc(len+1);  //Резервируем память под

	user_otvet = (char *)malloc(len+1);  //данные переменные

	memset(otvet, 0, len+1);

	memset(user_otvet, 0, len+1);

	fread(otvet, len, 1, fansw);   //считываем

	fclose(fansw);     //Закрытие файла

	if ((test_file = fopen("test.txt","rt"))!=NULL)

	{

		char otv1[50];

		char otv2[50];

		char otv3[50];

		char otv4[50];

		char vopr[50];

		char tmp[50];

		int good=0, bad=0;

		i = 0;

		while (!feof(test_file)) {

			memset(vopr, 0, 50);

			memset(otv1, 0, 50);

			memset(otv2, 0, 50);

			memset(otv3, 0, 50);

			memset(otv4, 0, 50);

			fgets(vopr,50,test_file);   //Выводим вопрос на

			*(vopr+strlen(vopr)-1)='\0';  //экран, а также все

			fgets(otv1,50,test_file);   //четыре вопроса и

			*(otv1+strlen(otv1)-1)='\0';  //дописываем в конец

			fgets(otv2,50,test_file);   //каждой строки

			*(otv2+strlen(otv2)-1)='\0';  //символ "окнчания

			fgets(otv3,50,test_file);   //строки"

			*(otv3+strlen(otv3)-1)='\0';

			fgets(otv4,50,test_file);

			*(otv4+strlen(otv4)-1)='\0';

			int k;

			k = menu(vopr,otv1,otv2,otv3,otv4);

			if (k==-1) return;

			user_otvet[i] = k+1;   //ответ пользователя

			i++;     //увеличивается

		}

		ramka();      //Прорисовка рамки

		for(k=0;k<i;k++)

		 {

		 if (otvet[k] == user_otvet[k])

		 good++;

		 else bad++;

		 }

		memset(tmp,0,50);

		itoa(good,tmp,10);

		outtextxy(30,50,"Правильных ответов: "); //Подсчет результата

		outtextxy(350,50,tmp);    //ответов пользователя

		memset(tmp,0,50);     //и вывод соответствую-

		itoa(bad,tmp,10);     //щего сообщения с ре-

		outtextxy(30,80,"Неправильных ответов: "); //зультатами

		outtextxy(380,80,tmp);

		outtextxy(30,400,"Ваша оценка знаний: ");

		settextstyle(1,0,2);

		outtextxy(30,440,"Нажмите ESC для возврата в предыдущее меню");

		settextstyle(0,0,2);    //Характеристики текста

		if (good<=3)      //слова результатов

		 {       //тестирования

			memset(tmp,0,50);   //Выделение памяти под переменную tmp

			strcpy(tmp," Плохо ");   //Копирует строку "Плохо"

		 }       //в строку tmp

		if (good>3 && good<=6)

		 {

			memset(tmp,0,50);

			strcpy(tmp,"Удовлетворительно"); //Копирует строку "Удовлетворительно"

		 }       //в строку tmp

		if (good > 6)

		 {

			memset(tmp,0,50);

			strcpy(tmp, "Хорошо");   //Копирует строку "Хорошо"

		 }       //в строку tmp

		if (good == 10)

		 {

			memset(tmp,0,50);

			strcpy(tmp, " Отлично!!! ");  //Копирует строку "Отлично"

		 }       //в строку tmp

		outtextxy(340,400,tmp);   //В зависимости от набранных

	  }        //баллов выводит результат

	do         //События нажатия клавиш Enter и Esc

	 {

	 int choice;

	 choice=getch();

	 if (choice==27) return ;     //Если Esc, то выход из программы

	 }

	while(1);

}

/////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////



//модуль HELP.c



#include "bib.h"

//----------------------------------Помощь-----------------------------------

int help(int autor)

{

 FILE *f;

 int cury = 0;

 char str[75];

 char filename[12];

 if (autor)

 strcpy(filename,"autor.txt");

 else strcpy(filename,"help.txt");

 ramka();

 setcolor (15);

 settextstyle(0,0,0);

 if (autor)

 outtextxy(260,440,"г. ДОНЕЦК 2006 год");

 else

 outtextxy(40,440,"Нажмите ESC для возврата в предыдущее меню");

 settextstyle(0,0,0);

 if ((f = fopen(filename,"r")) != NULL)

 {

 while(!feof(f))

 {

 fgets(str,74,f);

 str[strlen(str)-1]='\0';

 setcolor(15);

 settextjustify(LEFT_TEXT,LEFT_TEXT);

 if (!feof(f)) outtextxy(40,35+cury,str);

 cury+=8;

 }

 }

 do       //События нажатия клавиш Enter и Esc

 {

 int choice;

 choice=getch();

 if (choice==27) return 0;   //Если Esc, то выход из программы

 }

 while(1);

}

/////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////



//модуль EXIT.c



#include"bib.h"

//----------------------------------Выход------------------------------------

void exit()

{

 help(1);     //При выходе выводит информацию о пользователе

}

/////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////



//модуль OSHIBKA.c



#include"bib.h"

//--------------------------Вывод сообщения ошибки---------------------------

void oshibka(char *fn)

{

 textcolor(LIGHTRED);

 cprintf("Критическая ошибка - не найден файл: %s Программа прервана.", fn);

 exit(-1);

}

/////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////

//модуль MODULI.c



//----------------------------Модули программы-------------------------------

#include "bib.h"

#include "ramka.h"

#include "menu.h"

#include"zastavka.h"

#include"poisk.h"

#include"file_op.h"

#include"test.h"

#include"help.h"

#include"exit.h"

#include"oshibka.h"

/////////////////////////////////////////////////////////////////////////////



//сама программа



//-------------------------------Библиотеки----------------------------------

#include "moduli.h"

//-------------------------------Сама программа------------------------------

void main()

{

 FILE *F1;

//***************************************************************

 if ((F1 = fopen("1.txt", "r")) == NULL)

 oshibka("1.txt");

 fclose(F1);

//***************************************************************

 if ((F1 = fopen("autor.txt", "r")) == NULL)

 oshibka("autor.txt");

 fclose(F1);

//***************************************************************

 if ((F1 = fopen("help.txt", "r")) == NULL)

 oshibka("help.txt");

 fclose(F1);

//***************************************************************

 if ((F1 = fopen("test.txt", "r")) == NULL)

 oshibka("test.txt");

 fclose(F1);

//***************************************************************

 if ((F1 = fopen("answer.dat", "r")) == NULL)

 oshibka("answer.dat");

 fclose(F1);

//***************************************************************

 if ((F1 = fopen("egavga.bgi", "r")) == NULL)

 oshibka("egavga.bgi");

 fclose(F1);

//***************************************************************

 int gdriver = DETECT, gmode, errorcode;

 initgraph(&gdriver, &gmode, "");



 if (zastavka2()==-1)

 {

 exit();

 return;

 }

 do

 {

 int k=0;

 k=menu("ГЛАВНОЕ МЕНЮ","Теория","Тесты","Помощь","Выход");

//-----------------------------------------------------------

 if (k==-1)

 {

 exit();

 return;

 }

 if (k==1) test();

 if (k==2) help(0);

 if (k==3)

 {

 exit();

 return;

 }

 if (k==0)

 do

 {

 show_file("1.txt",0); break;

 }

 while((k!=-1)&&(k!=3));

 }

 while(1);

}

//////////////////////////////////////////////////////////////////////////////