Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Государственный университет информатики и искусственного интеллекта
Кафедра систем искусственного интеллекта
Методические указания
для студентов специальности
«Системы искусственного интеллекта»
к курсовому проектированию
по дисциплине «Алгоритмизация и программирование»
Семестр 2
Старший преподаватель Патрушев В. А.
Донецк 2012
Содержание
1. Цели и задачи курсовой работы |
3 |
2. Тематика курсовых работ |
3 |
3. Порядок выполнения курсовой работ |
5 |
4. Основные требования к выполнению и оформлению курсовой работы |
5 |
5. Список рекомендуемой литературы |
7 |
Приложение А (справочное) |
8 |
1. Цели и задачи курсовой работы
Выполнение курсовых работ направлены на формирование у обучаемых навыков самостоятельной научно-исследовательской и практической деятельности, закрепления основ и углубление знаний приемов программирования на языке С++, грамотного оформления полученных результатов. Основными целями курсового проекта являются:
- систематизация и закрепление полученных теоретических знаний, полученных студентами при изучении дисциплины «Основы программирования и алгоритмические языки»;
- углубление практических навыков;
- формирование умений применять теоретические знания при решении поставленных практических вопросов;
- раскрытие содержательной характеристики выбранной темы;
- приобретение и закрепление навыков самостоятельной работы;
- проверка умения формулировать основные выводы по результатам анализа конкретной темы.
Курсовой проект представляет собой результат выполнения следующих взаимосвязанных этапов:
1. Выбор темы;
2. Разработка рабочего плана, проектирование структуры программного продукта;
3. Сбор, анализ и обобщение материалов исследования, формулирование основных теоретических положений;
4. Разработка алгоритмов и составление программ на выбранном языке (тестирование, отладка).
5. Документирование созданного программного продукта и оформление курсового проекта;
6. Защита.
Работа выполняется самостоятельно в произвольное время и сдается в строго оговоренные сроки.
2. Тематика курсовых проектов
Тематика курсовых проектов по дисциплинам определяется преподавателем. При этом выбор основывается как на государственном стандарте, так и на направлениях научно-исследовательской и учебно-методической работы. Студенту предоставляется право выбора одной из предложенных тем или предложения своей темы с обоснованием целесообразности ее разработки.
1.Изображения графиков функций: sin(x+const), cos(x*const), tg(x/const). Ввод const осуществлять с клавиатуры.
2. Игра "15". Вот ее правила. В прямоугольной коробочке находятся 15 фишек, на которых написаны числа от 1 до 15. Размер коробочки 4 x 4, таким образом, в коробочке есть одна пустая ячейка. В начале игры фишки перемешаны. Задача игрока состоит в том, чтобы, не вынимая фишки из коробочки, выстроить фишки в правильном порядке.
3. "Собери картинку" аналог игры "15", в которой игрок будет перемещать не цифры, а фрагменты картинки.
4. Игра "Парные картинки" развивает внимание. Вот ее правила. Игровое поле разделено на клетки, за каждой из которых скрыта картинка. Картинки парные, т. е. на игровом поле есть две клетки, в которых находятся одинаковые картинки. В начале игры все клетки "закрыты". Щелчок левой кнопкой мыши "открывает" клетку, в клетке появляется картинка. Теперь надо найти клетку, в которой находится такая же картинка, как и в открытой клетке. Щелчок к другой клетке открывает вторую картинку. Если картинки в открытых клетках одинаковые, то эти клетки "исчезают". Если разные то клетки ос таются открытыми. Очередной щелчок закрывает открытые клетки и открывает следующую. Следует обратить внимание, что две открытые клетки закрываются даже в том случае, если открытая картинка такая же, как и одна из двух открытых. Игра заканчивается, когда игрок откроет ("найдет") все пары картинок.
5. Игра "Сапер".
6. Программа тестирования общих знаний пользователя полученных по школьной программе с различными видами тестов.
7. Составить программу обучения работе с клавиатурой. Программа должна выдавать на экран буквы, цифры, слова и фразы, которые следует набрать на клавиатуре, и оценивать правильность и скорость набора. В программе предусмотреть три уровня подготовленности обучающегося.
8. Разработать программу, моделирующую игру “Морской бой”. На поле 10 на 10 позиций стоят невидимые вражеские корабли: 4 корабля по 1 клетке, 3 корабля по 2 клетки, 2 корабля по 3 клетки, 1 корабль в 4 клетки. Необходимо поразить каждую из клеток кораблей. Два игрока вводят позиции кораблей в виде цифр (1, 2, 3, 4) в соответствующие элементы матрицы, тем самым определяя конфигурацию и положение кораблей. Игроки по очереди “наносят удары” по кораблям противника. Если позиция корабля указана верно, то она помечается крестиком на поле. Предусмотреть вариант игры, когда одним из играющих является ЭВМ.
9. Разработать программу, моделирующую игру “Кости”. Играющий называет любое число в диапазоне от 2 до 12 и ставку, которую он делает в этот ход. Программа с помощью датчика случайных чисел дважды выбирает числа от 1 до 6 (“бросает кубик”, на гранях которого цифры от 1 до 6). Если сумма выпавших цифр меньше 7 и играющий задумал число меньшее 7, он выигрывает сделанную ставку. Если сумма выпавших цифр больше 7 и играющий задумал число большее 7, он также выигрывает сделанную ставку. Если играющий угадал сумму цифр, он получает в четыре раза больше очков, чем сделанная ставка. Ставка проиграна, если не имеет место ни одна из описанных ситуаций. В начальный момент у играющего 100 очков. В программе должно присутствовать графическое изображение поверхности кубика при каждом ходе игрока.
10. Поле шахматной доски задается парой натуральных чисел: первое указывает номер вертикали при счете слева направо, второе номер горизонтали при счете снизу вверх. Расстановка фигур задается таким образом, что в начале указываются поля, на которых стоят перечисленные белые фигуры, затем поля, на которых стоят перечисленные черные фигуры. Решить задачу - на доске стоят два ферзя. Указать поля, на которые может пойти белый ферзь так, чтобы не попасть под удар черного ферзя.
11. Напишите программу, которая генерирует или считывает шахматную позицию и определяет, не находится ли один из королей под шахом и не является ли шах матом. В программе предусмотреть два варианта ввода исходных данных: 1) шахматная позиция генерируется с помощью датчиков случайных чисел; 2) шахматная позиция вводится с клавиатуры ЭВМ.
12. Игра «Змейка»
13. Обучающая программа с системой тестирования полученных знаний по курсу «Основы программирования и алгоритмические языки».
14. Программа справочник «Чемпионат мира по футболу 2014» с возможностью тотализатора на результаты матчей.
15. Игра «Блек-Джек», набирать балы пока не 21 очко.
16. Поле шахматной доски задается парой натуральных чисел: первое указывает номер вертикали при счете слева направо, второе номер горизонтали при счете снизу вверх. Расстановка фигур задается таким образом, что в начале указываются поля, на которых стоят перечисленные белые фигуры, затем поля, на которых стоят перечисленные черные фигуры. Решить задачу у белых на доске остался только король, у черных король, конь, слон. Охарактеризовать положение белых с помощью слов: мат, шах, пат, обыкновенная позиция.
17 Игра «Крестики-нолики».
18. Игра «О счастливчик», с хранением вопросов и ответов в файлах.
Для выполнения курсовых работ студенты должны освоить язык программирования C++ с решением задач, поставленной перед ними руководителем курсовой работы. В процессе решения студенты разрабатывают математическое, алгоритмическое и программное обеспечение, анализируют полученные результаты и делают соответствующие выводы. После согласования темы курсового студент указывает каким языком программирования будет пользоваться для решения поставленных задач.
При решении задачи необходимо придерживаться техники пошаговой детализации, использовать стандартные структуры, не забывая при этом о развитии программного окружения программиста, расширяя возможности языка за счет включения новых процедур и функций.
При разработке алгоритма необходимо предусмотреть средства проверки и тестирования программы, удобство работы пользователя, возможные модификации.
При написании программы не следует забывать о хорошем стиле программирования, о таких понятиях, как читабельность, эффективность, надежность. Необходимо искать наиболее простые и естественные приемы и методы решения.
3. Порядок выполнения курсовой работы
3.1. Курсовая работа выполняется студентами индивидуально в соответствии с заданием, полученным от преподавателя.
3.2. Выполнение курсовой работы состоит из трех этапов.
3.2.1. Подготовительный этап (разработка эскизного и технического проектов).
3.2.2. Практическая работа за компьютером (разработка рабочего проекта).
3.2.3. Оформление пояснительной записки.
3.3. Защита курсового проекта осуществляется на ПЭВМ после представления студентами материалов, перечисленных в пункте 3.2.1 и 3.2.3.
4. Основные требования к выполнению и оформлению курсовой работы
4.1. Работа оформляется в принятом для научных работ виде, включает в себя текст пояснительной записки и, в качестве приложений, дискеты, содержащие программы (тексты и исполняемые файлы), данные, а также объемные приложения, включение которых в текст работы является нецелесообразным.
4.2. В процессе работы над курсовым проектом студент обязан:
4.3. Пояснительная записка к курсовой работе содержит (более подробное описание представлено в следующем разделе):
4.4. В процессе разработки программных средств при курсовом проектировании необходимо обеспечить дружественный интерфейс для пользователя (кнопки, панели, интерактивный режим, меню, систему помощи и т.д.).
4.5. Во время защиты курсовой работы студенты должны быть готовы продемонстрировать работоспособность разработанного ими программного продукта и ответить на вопросы преподавателя.
5. Содержание разделов курсовой работы
Все этапы разработки программы отражаются в пояснительной записке.
Пояснительная записка состоит из следующих разделов:
1. Оглавление.
2. Разработка эскизного и технического проектов программы (ГОСТ 19.40479).
2.1. Введение.
2.2. Назначение и область применения.
2.3. Технические характеристики.
2.4. Источники, использованные при разработке.
3. Разработка рабочего проекта.
3.1. Разработка программы.
3.2. Спецификация программы.
3.3. Текст программы.
3.4. Описание программы.
3.5. Тестирование программы.
4. Внедрение.
5. Литература.
При написании пояснительной записки необходимо придерживаться требований единой системы программной документации (ЕСПД).
5.1 Оглавление
Оглавление составляется в соответствии с содержанием пояснительной записки и должно отражать все разделы курсовой работы. После написания пояснительной записки в оглавлении проставляются страницы.
5.2 Разработка эскизного и технического проектов программы
Стандарт ГОСТ 19.40479 устанавливает требования к содержанию и оформлению программного документа “Пояснительная записка”, входящего в состав документов на стадиях разработки эскизного и технического проектов программы.
5.2.1. Введение
В разделе “Введение” указывается тема курсовой работы, прилагается документ, на основании которого ведется разработка, с указанием организации и даты утверждения.
5.2.2. Назначение и область применения
В разделе “Назначение и область применения” указывают назначение программы и краткую характеристику области применения программы.
5.2.3. Технические характеристики
Раздел “Технические характеристики” должен содержать следующие подразделы:
1. Постановка задачи.
2. Описание алгоритма.
3. Организация входных и выходных данных.
4. Выбор состава технических и программных средств.
5.2.3.1. Постановка задачи
Решение задачи начинается с ее постановки. Дается точное описание исходных данных, условий задачи и целей ее решения. На этом этапе условия задачи, записанные в форме различных словесных описаний, необходимо выразить на формальном языке математики. Обычно математическая модель это набор уравнений, неравенств и ограничений, приближенно описывающих задачу. При построении математической модели отбрасываются некоторые свойства реальной задачи, мало влияющие на решение.
В этом разделе могут быть описаны основные приемы программирования и типы данных, используемые при решении аналогичных задач. Например, если в задаче используются динамические структуры, то перечисляются виды динамических структур данных и основные процедуры по работе с динамическими структурами. Если задача заключается в формировании базы данных и дальнейшей работе с базой, то приводится описание используемых типов данных (характеристика данных записного типа) и приемы работы с файлами.
Далее описываются возможные пути решения задачи с указанием их достоинств и недостатков. Выбирается и обосновывается метод решения задачи. Описываются ограничения, накладываемые на исходные данные, необходимая разрядность и точность представления исходных данных и результатов решения. Указываются возможные пределы изменения входных параметров задачи.
5.2.3.2. Описание алгоритма
В разделе дается обобщенное словесное описание алгоритма решения поставленной задачи, излагаются основные требования к алгоритму и пути их реализации. Приводится схема алгоритма, состоящая из укрупненных модулей. Дается пояснение назначения и состава каждого модуля. Обобщенный алгоритм обычно использует обозначения и термины исходной задачи.
На следующем этапе каждый модуль детализируется. Выделяются укрупненные команды, реализуемые по вспомогательным алгоритмам. Тот же подход применяется при разработке вспомогательных алгоритмов.
5.2.3.3. Организация входных и выходных данных
Данный раздел содержит описание и обоснование выбора метода организации входных и выходных данных.
5.2.3.4. Выбор состава технических и программных средств
На основании разработанного алгоритма делается вывод о необходимости использования того или иного языка программирования. Перечисляются достоинства выбранной среды программирования. Определяются технические средства, необходимые для оптимальной работы будущей программы.
5.2.4. Источники, использованные при разработке
Данный раздел должен присутствовать в пояснительной записке, если в основном тексте встречались ссылки на готовые разработки, используемые в программе. Здесь указывают перечень научно-технических публикаций, нормативно-технических документов и других научно-технических материалов.
5.3. Разработка рабочего проекта
Этап разработки рабочего проекта включает в себя разработку программы и программной документации, а также испытание программы.
5.3.1. Разработка программы
Программы курсового проекта разрабатываются при тесном взаимодействии двух процессов: процесс конструирования графического меню;процесс написания кода, придающего элементам этого окна и программе в целом необходимую функциональность.
Проект графического интерфейса должен быть представлен в виде графической схемы, на которой расположены все визуальные и невизуальные компоненты, разрабатываемого интерфейса. Компоненты на схеме должны быть пронумерованы. После схемы приводится расшифровка изображенных на схеме компонентов: название и имя компонента; назначение в программе; события, на которые данный компонент откликается. Для каждого компонента должны быть указаны свойства, измененные при проектировании интерфейса.
На этапе разработки рабочего проекта необходимая степень детализации алгоритмов обычно выбирается такой, чтобы предписания разработанных алгоритмов могли записываться на языке программирования, выбранном для составления текста программы. При детализации алгоритма необходимо перейти к обозначениям, принятым для разработки программ на алгоритмическом языке. При этом имена следует выбирать таким образом, чтобы они отражали сущность используемых параметров.
Кодирование должно быть простым. Изощренное программирование может обойтись слишком дорого при отладке и модификации программы. Необычное кодирование (например, использование скрытых возможностей машины) часто препятствует отладке программы и затрудняет ее использование другими программистами. Программа должна быть по возможности универсальной. Универсальные программы обеспечивают независимость программы от конкретного набора данных. Например, универсальная программа использует в качестве параметров переменные, а не константы, обрабатывает вырожденные случаи и т. д. Универсальность программы экономит время по дальнейшей работе над ней и обеспечивает широкие возможности по использованию. Разрабатывая такие программы, можно предвидеть будущие изменения в спецификациях этой программы.
Входные форматы должны быть разработаны с учетом максимального удобства для пользователя и минимальной возможности ошибок. Порядок переменных и форматы данных, привычные для пользователя, помогут избежать ошибок и облегчат использование программ.
При написании программы следует применять операторы, позволяющие использовать основные алгоритмические структуры.
При написании программ не следует забывать о хорошем стиле программирования. После заголовка процедуры или функции записывается комментарий, содержащий поясняющий текст, а именно: назначение подпрограммы; перечень и назначение формальных параметров, их тип. Комментариями должны быть снабжены и основные смысловые блоки программы или подпрограммы. Для облегчения чтения текста программы отдельные операторы программы записываются с отступом.
5.3.2. Спецификация программы
В разделе спецификация приводится точное название программы и ее состав.
5.3.4. Описание программы
Раздел “Описание программы” согласно ГОСТ 19.40278* должен содержать следующие подразделы:
Отдельные разделы можно объединять. Некоторые пункты этого раздела повторяют разделы технического проекта. Такие повторения предусмотрены ГОСТом, так как на этапе рабочего проекта возникают некоторые дополнения или изменения в составе технических средств или программе. Здесь приводятся более конкретные и точные данные.
В подразделе “Общие сведения” должны быть указаны: обозначение и наименование программы; программное обеспечение, необходимое для функционирования программы; языки программирования, на которых написана программа.
В подразделе “Функциональное назначение” должны быть указаны классы решаемых задач и (или) назначение программы и сведения о функциональных ограничениях на применение.
В подразделе “Описание логической структуры” должны быть указаны используемые методы; структура программы с описанием функций составных частей и связи между ними; связи программы с другими программами. Описание логической структуры программы выполняют с учетом текста программы на исходном языке.
В подразделе “Используемые технические средства” должны быть указаны типы ЭВМ и устройств, которые используются при работе программы.
В подразделе “Вызов и загрузка” должны быть указаны способ вызова программы с соответствующего носителя данных, входные точки в программу.
В подразделе “Входные данные” должны быть указаны: характер, организация и предварительная подготовка входных данных, формат, описание и способ кодировки входных данных.
В подразделе “Выходные данные” должны быть указаны: характер, организация и предварительная подготовка выходных данных, формат, описание и способ кодировки выходных данных.
5.3.5. Тестирование программы
Кратко описывается среда программирования. Приводятся основные команды, выполняемые при вводе и редактировании программы, команды записи программы на диск, чтения с диска. Перечисляются и описываются средства отладки.
Перечисляются требования, подлежащие проверке при испытании программы, а также порядок и методика их контроля. Приводятся исходные данные для решения контрольного примера и ожидаемые результаты.
Прилагается распечатка решения контрольного примера. Распечатка должна содержать фамилию, имя и отчество исполнителя, группу и дату.
5.4 Внедрение
В разделе описываются:
В разделе “Условия выполнения программы” должны быть указаны условия, необходимые для выполнения программы (минимальный и/или максимальный состав аппаратурных и программных средств и т.п.).
В разделе “Выполнение программы” должна быть указана последовательность действий оператора, обеспечивающих загрузку, запуск, выполнение и завершение программы. В разделе приводятся сведения для проверки, обеспечения функционирования и настройки программы на условия конкретного применения. Перечисляется порядок и последовательность ввода исходных данных и получения результатов расчета.
В разделе “Сообщения оператору” должны быть приведены тексты сообщений, выдаваемых в ходе выполнения программы, описание их содержания и соответствующие действия оператора.
Содержание разделов допускается иллюстрировать поясняющими примерами, таблицами, схемами.
5.5 Литература
В разделе перечисляется литература, использованная при выполнении курсовой работы. При оформлении литературы необходимы следующие данные:
Источники нумеруются для того, чтобы на них можно было ссылаться из текста пояснительной записки.
6 Требования к содержанию и оформлению технического задания
Техническое задание (ТЗ) исходный документ для проектирования разработки программного продукта.
ТЗ содержит основные технические требования, предъявляемые к программному продукту и исходные данные для разработки; в ТЗ указываются назначение объекта, область его применения, стадии разработки проектной и программной документации, её состав, сроки исполнения и т. д., а также особые требования, обусловленные спецификой самого объекта либо условиями его эксплуатации. Как правило, ТЗ составляют на основе анализа результатов предварительных исследований, расчётов и моделирования.
Техническое задание позволяет: представить готовый программный продукт, уменьшить число ошибок, связанных с изменением требований в результате их неполноты или ошибочности, понять суть задачи, показать будущий программный продукт, спланировать выполнение проекта и работать по намеченному плану, отказаться от выполнения работ, не указанных в ТЗ
Техническое задание исходный документ определяющий порядок и условия проведения работ, содержащий цель, задачи, принципы выполнения, ожидаемые результаты и сроки выполнения работ.
Техническое задание на курсовую работу содержит следующие разделы.
7. Оформление пояснительной записки
Курсовая работа выполняется на стандартных листах формата 204 х 285. Текст пишут на одной стороне листа с полями: левое поле 30 мм; правое 15 мм; размеры нижнего и верхнего полей 20 мм. На титульном листе указываются университет, кафедра, наименование изучаемой дисциплины, тема курсовой работы, фамилия и инициалы студента, группа, а также фамилия и инициалы руководителя.
Изложение пояснительной записки курсовой работы должно быть кратким, четким. В тексте допускаются общепринятые сокращения. Исходные данные, цифровые материалы, результаты решения необходимо свести в таблицы, форма которых либо задана, либо разработана студентом. Схемы алгоритмов и другой иллюстративный материал выполняются вручную с четким изображением и размещаются сразу после ссылки на них в тексте. Нумерация страниц, рисунков и таблиц сквозная. Рисунки должны иметь подрисуночную подпись. Например, “Рис. 3. Схема алгоритма подпрограммы”. Каждая таблица должна иметь наименование, под которым указывается “Таблица. . .” и ее порядковый номер. Ссылка на таблицу дается сокращенно.
8 Критерии зачетных оценок
Оценивание курсового проекта будет производится по трем критериям: балы за техническое задание, программный продукт и пояснительную записку.
Техническое задание. Максимальный рейтинг 20 балов.
Факторы, которые влияют на снижение оценки: несоответствие требования, предъявленных к содержанию и оформлению ТЗ; очевидная несамостоятельность работы; сдача задания позже установленного срока.
Термин сдачи технического задания 10 12 неделя весеннего семестра.
Программный продукт. Максимальный рейтинг 45 балов.
Шкала рейтинга программного продукта.
Программа выполняет основной алгоритм 10 балов.
Предусмотрен контроль ввода некорректных данных 5 балов.
Разработан графический интерфейс 10 балов.
Предусмотрено использование манипулятора мышь или используются дополнительные спецэффекты 5 балов.
В работе программы не обнаружены критические ошибки и работает в соответствии с заданием 10 балов.
Программный код структурирован, используются подпрограммы или модули разработчика 5 балов.
Факторы, которые влияют на снижение оценки: несоответствие работы продукта с заданием; очевидная несамостоятельность работы.
Пояснительная записка. Максимальный рейтинг 35 балов.
Факторы, которые влияют на снижение оценки: несоответствие требования, предъявленных к содержанию и оформлению пояснительной работы; неполнота изложенного материала; сдача записки позже установленного срока.
Пояснительная записка сдается за два дня до защиты курсовой работы.
9. Список рекомендуемой литературы
ПРИЛОЖЕНИЕ А
(справочное)
1. Работа с графикой.
БИБЛИОТЕКА ГРАФИКИ
Использование графической библиотеки многошаговый процесс, включающий:
-определение типа видеоадаптера;
-установка режима работы видеоадаптера;
-инициализация графической системы в заданном режиме;
Только после этого можно воспользоваться библиотечными подпрограммами для построения основных графических примитивов и вывода текста с использованием различных шрифтов.
В состав библиотеки входит набор так называемых BGI - драйверов, каждый из которых является обработчиком прерывания 10Н и выполняет установку и обновление ряда внешних переменных, которые могут изменяться как подпрограммами операционной системы, так и подпрограммами библиотеки графики Турбо С.
ИНИЦИАЛИЗАЦИЯ И ЗАКРЫТИЕ СИСТЕМЫ ГРАФИКИ
Состоит в загрузке BGI - драйвера, соответствующего адаптеру или режиму, установке начальных значений внешних переменных, выборе шрифта и т. Д. Поддерживаемые библиотекой графические режимы задаются символьными константами, описанными в файле <graphics.h> в перечислимом типе gtaphics_modes. Некоторые из этих констант:
Константа |
Разрешение |
Палитра |
Режим |
CGAC0 |
320x200 |
0 |
4,5 |
CGAC1 |
1 |
||
CGAC2 |
2 |
||
CGAC3 |
3 |
||
CGAHI |
640X200 |
6 |
|
EGALO |
640X200 |
16цветов |
0EH |
EGAHI |
640X350 |
16цветов |
10H |
VGALO |
640X200 |
16цветов |
0EH |
VGAMED |
640X350 |
16цветов |
10H |
VGAHI |
640X480 |
16цветов |
12H |
Инициализацию графики выполняет функция
void far initgraph(int far *graphdriver,int far *graphmode, char far *pathtodriver) - инициализирует графическую систему, загружая BGI - драйвер graphdriver, устанавливает режим graphmode, используя путь доступа к драйверу, заданный строкой pathtodriver.
BGI - драйвер может тоже задаваться символьной константой из набора (приведены некоторые):
Константа |
Значение |
Описание |
DETECT |
0 |
Автоматическое определение типа драйвера |
CGA |
1 |
|
EGA |
3 |
|
VGA |
9 |
Если нашей программе больше не нужна графическая библиотека, следует обратиться к функции
void far closegraph(void) - освобождает память под драйверами графики, шрифтами и пр., восстанавливает предыдущий режим адаптера.
Скелет программы, выполняющей всю необходимую подготовку для использования графической библиотеки:
#include <graphics.h>
int main(void)
{
int graph_driver,graph_mode,graph_error_code;
graph_driver=DETECT;
initgraph(&graph_driver,&graph_mode,”c:\\bc\\bgi”);
graph_error_code=graphresult();
if(graph_error_code!=grOk){/*Обработка ошибки*/
return 255;}
...
closegraph();
}
Наиболее защищенный способ использования функции инициализации требует предварительного уточнения типа адаптера - для этого либо вызывается initgraph() с драйвером, определенным через DETECT, либо явно вызывается функция:
void far detectgraph(int far *graphdriver,int far * graphmode)
Обработка ошибок
После любого обращения к detectgraph() или initgraph() желательно вызвать функцию
int far graphresult(void), возвращающую код ошибки, а его текстовую расшифровку можно получить с помощью функции
char *far grapherrormsg(int errorcode)
ОПРЕДЕЛЕНИЕ И УСТАНОВКА ГРАФИЧЕСКОГО РЕЖИМА.
После инициализации графической системы можно установить другой, не превышающий максимального, режим видеоадаптера и выбрать цвета для пикселов.
Установку режима выполняет функция setgraphmode().
Целая группа функций - getgraphmode(), getmaxmode(), getmodename(), getmoderange() - упрощает работу по определению текущего установленного видеорежима;
две функции - getmaxx(), getmaxy() - позволяют определить высоту и ширину экрана в пикселах для текущего режима;
функция restorecrtmode() возвращает адаптер в текстовый режим.
Синтаксис и параметры этих функций всегда можно уточнить через help - систему IDE Borland C++.
УПРАВЛЕНИЕ ЦВЕТАМИ И ПАЛИТРАМИ.
CGA - адаптеры в режимах 4,5 320х200 аппаратно поддерживают задание цвета фона и выбор одной из 4-х предопределенных палитр. Код цвета пиксела 0 соответствует цвету фона и может быть выбран равным любому из 16 возможных цветов:
Константа |
Значение |
Цвет |
BLACK |
0 |
ЧЕРНЫЙ |
BLUE |
1 |
СИНИЙ |
GREEN |
2 |
ЗЕЛЕНЫЙ |
CYAN |
3 |
СИНЕ-ЗЕЛЕНЫЙ |
RED |
4 |
КРАСНЫЙ |
MAGENTA |
5 |
КРАСНО-СИНИЙ |
BROWN |
6 |
КОРИЧНЕВЫЙ |
LIGHTGRAY |
7 |
СВЕТЛО СЕРЫЙ |
DARKGRAY |
8 |
ТЕМНО-СЕРЫЙ |
LIGHTBLUE |
9 |
ЯРКО-СИНИЙ |
LIGHTGREEN |
10 |
ЯРКО-ЗЕЛЕНЫЙ |
LIGHTCYAN |
11 |
ЯРКИЙ СИНЕ-ЗЕЛЕНЫЙ |
LIGHTRED |
12 |
ЯРКО-КРАСНЫЙ |
LIGHTMAGENTA |
13 |
ЯРКИЙ КРАСНО-СИНИЙ |
YELLOW |
14 |
ЖЕЛТЫЙ |
WHITE |
15 |
БЕЛЫЙ |
Установку кода цвета фона выполняет функция setbkcolor(), а функция getbkcolor() позволяет узнать код цвета фона в текущий момент. Выбор же палитры осуществляется по символьной константе, задающей режим работы.
У EGA, VGA - адаптеров возможности управления палитрами значительно шире - библиотека графики Турбо С тоже содержит группу функций для определения текущей и установки новой палитры EGA,VGA - адаптеров: getdefaultpalette(), gemaxcolor(), getpalette(), getpalettesize(), setallpalette(), setpalette().
УПРАВЛЕНИЕ ВИДЕОСТРАНИЦЕЙ.
Как уже отмечалось, многие адаптеры позволяют хранить в видеопамяти несколько страниц. Отображаемая в текущий момент называется видимой, а та, на которую выполняется вывод - активной. Первоначально активная и видимая страница имеют номер 0, но могут и не совпадать, в этом случае картинка формируется “за кулисами”. Для управления страницами в С есть 2 функции:
void far setactivepage(int page)
void far setvisualpage(int page)
ЗАДАНИЕ ЭКРАННОГО ОКНА (VIEWPORT), ОПРЕДЕЛЕНИЕ И УСТАНОВКА ГРАФИЧЕСКИХ КООРДИНАТ.
Графическое окно может иметь отличающиеся от других участков экрана цвета фона и пикселов, маску заполнения и другие характеристики. Для описания окна используется функция
void far setviewport(int left,int top,int right,int bottom,int clip)
Получить текущие характеристики окна можно через обращение к
void far getviewsettings(struct viewporttype far *viewport), которая заполнит поля структурной переменной.
В графическом окне определены относительные координаты, измеряемые в пикселах относительно левого верхнего угла окна. Текущие координаты доступны через функции getx(),gety(), а установить нужные координаты можно функциями moveto() и moverel().
В Borland С++ есть возможность встроить в .EXE - файл программы необходимые BGI - драйверы. Для этого с помощью утилиты BGIOBJ.EXE (при большом количестве драйверов - с ключом /F) файл драйвера преобразуется в .OBJ - файл, который компонуется с программой после регистрации с помощью функций:
int registerbgidriver(void(*driver)(void))
int far registerfarbgidriver(void far *driver)
Пример: registerfarbgidriver(EGAVGA_driver)
ВЫВОД ТЕКСТА.
Во-первых, вывод текста можно осуществить всеми функциями стандартного вывода - при этом будет задействована функция АН=9 прерывания 10Н со всеми вытекающими последствиями, которые обсуждались ранее.
Библиотека графики позволяет выводить текст на экран различными шрифтами двух типов - битовым и сегментированным (или векторным). Для битового шрифта используется таблица знакогенератора 8х8. Сегментированные шрифты задают правило рисования каждого символа, описываемого как совокупность отрезков прямых линий или сегментов. Программа может задать масштаб для каждого символа.
В Турбо С доступны 4 сегментированных шрифта: Triplex, Small, SansSerif, Gothic. Файлы сегментированных шрифтов с расширением .CHR, как и .BGI - драйверы, загружаются как оверлеи во время исполнения программы. Выводить в графике текст можно слева направо и снизу вверх, масштаб задается по отношению к знакоместу шрифта 8х8, а для сегментированных шрифтов - и в относительных единицах масштаба по вертикали и по горизонтали. Кроме того, выводимые строки могут по разному выравниваться - влево и вверх, влево и вниз и т. П. Относительно текущей точки отсчета. Поведение графической системы при выводе текста характеризуется набором внутренних переменных, значения которых доступны через функцию :
void gettextsettings(struct textsettingstype far *texttypeinfo), заполняющую поля структурной переменной по шаблону textsettingstype
Интерпретация отдельных полей этой структуры приводится в описании функции:
void settextstyle(int font, int direction, int charsize)
Доступные шрифты задаются символьными константами:
Константа |
Значение |
Файл шрифта |
DEFAULT_FONT |
0 |
- |
TRIPLEX_FONT |
1 |
TRIP.CHR |
SMALL_FONT |
2 |
SMAL.CHR |
SANS_SERIF_FONT |
3 |
SANS.CHR |
GOTHIC_FONT |
4 |
GOTH.CHR |
Направление может задаваться HORIZ_DIR, VERT_DIR. Функция:
void far setusercharsize(int multx, int divx, int multy,int divy)
позволяет установить масштабы по горизонтали и вертикали раздельно значениями числителя и знаменателя.
Установленные размеры символов можно узнать через функции textheight(),textwidth().
Способ выравнивания задается функцией settextjustify(int horiz,int vert), horiz может быть LEFT_TEXT, CENTER_TEXT, RIGHT_TEXT, vert может быть BOTTOM_TEXT, CENTER_TEXT, TOP_TEXT.
Собственно вывод осуществляется функциями:
void far outtext(char far *textstring)
void far outtextxy(int x, int y, char far *textstring)
Включение .CHR-файлов в выполняемый файл выполняют аналогично драйверам после регистрации функциями
registerbgifont(),
registerfarbgifont().
Имена шрифтов при регистрации
triplex_font, triplex_font_far
small_font. small_font_far
sansserif_font, sansserif_font_far
gothic_font.gothic_font_far
ВЫВОД ГРАФИЧЕСКОЙ ИНФОРМАЦИИ. ПАРАМЕТРЫ И АТРИБУТЫ ГРАФИЧЕСКОГО ВЫВОДА.
После успешной инициализации графической системы становятся доступными функции графической библиотеки для построения основных графических примитивов: отрезков прямых, дуг, окружностей, эллипсов, прямоугольников, секторных и столбцовых диаграмм и т.д. Многие из замкнутых фигур могут быть залиты текущим цветом с использованием текущего шаблона или маски заполнения. Есть также функции для запоминания прямоугольных областей экрана и восстановления их в заданном месте. Все функции работают в пределах текущего графического окна с использованием текущего цвета пиксела, установленного функцией setcolor().
При выводе отрезков прямых можно определить такой параметр как стиль линий:
void far setlinestyle(int linestyle, unsigned upattern, int thickness)
Аргумент upattern используется только если
linestyle = = USERBIT_LINE - тогда 16 бит upattern задают маску линии.
Линия с определенным пользователем стилем может иметь толщину только в 1 пиксел.
Поддерживается ряд предопределенных стилей и можно описать собственный. Задается стиль целым числом или символьной константой:
Константа |
Значение |
Стиль |
SOLID_LINE |
0 |
Сплошная |
DOTTED_LINE |
1 |
Точечная |
CENTER_LINE |
2 |
Штрих-пунктир |
DASHED_LINE |
3 |
Штриховая |
USERBIT_LINE |
4 |
Определяется пользователем |
Толщина может быть 1 или 3 пиксела.
При выводе отрезков прямых можно дополнительно задать режим вывода линий:
void far setwritemode(int mode), при этом mode может быть либо COPY_PUT (0) либо XOR_PUT (1).
Следующие параметры - это маска и стиль заполнения. Маска определяется 8-мибайтовым шаблоном и рассматривается как битовая карта 8х8, вся заполняемая область разбивается на блоки по 8х8 пикселов. Наложение маски осуществляется так: если бит в маске 1, то пиксел имеет код текущего цвета, иначе не меняется. Маска и цвет пикселов задается функцией:
void far setfillpattern(char far * upattern, int color)
По умолчанию - белый цвет и маска с единицами во всех битах. Для удобства в библиотеке предусмотрен ряд предопределенных масок в комбинации с цветами, называемую стилем заполнения и устанавливаемую функцией:
void far setfillstyle(int pattern, int color)
Константа |
Значение |
Описание |
EMPTY_FILL |
0 |
Цветом фона |
SOLID_FILL |
1 |
Текущим цветом |
LINE_FILL |
2 |
Символами |
LTSLASH_FILL |
3 |
// нормальной толщины |
SLASH_FILL |
4 |
//удвоенной толщины |
BKSLASH_FILL |
5 |
\\ |
LTBKSLASH_FILL |
6 |
\\ |
HATCH_FILL |
7 |
вертикально-горизонтальная штриховка |
XHATCH_FILL |
8 |
редкая штриховка крест-накрест |
INTERLEAVE_FILL |
9 |
густая штриховка крест-накрест |
WIDE_DOT_FILL |
10 |
редкими точками |
CLOSE_DOT_FILL |
11 |
частыми точками |
USER_FILL |
12 |
определенная пользователем маска |
Для коррекции неквадратности пиксела на некоторых мониторах можно воспользоваться функцией установки коэффициента сжатия:
void far setaspectratio(int far xasp, int far yasp)
ЧТЕНИЕ - ЗАПИСЬ ОТДЕЛЬНЫХ ПИКСЕЛОВ.
Для манипуляции пикселами есть 2 функции:
unsigned far getpixel(int x,int y)
void far putpixel(int x, int y, int pixelcolor )
ВЫВОД ГРАФИЧЕСКИХ ПРИМИТИВОВ
line(int x1,int y1,int x2,int y2); линия между 2-мя точками
linerel(int dx, int dy); линия из текущей позиции
lineto(int x, int y); линия из текущей позиции в заданную точку.
circle(int x, int y, int r); окружность с центром в точке x,y, и радиусом r
ellipse(int x, int y, int rx, int ry); эллипс с центром в точке x,y, и радиусами rx и ry
fillellipse(int x, int y, int rx, int ry); заполненный эллипс с центром в точке x,y, и радиусами rx и ry , заполнение производится цветом и стилем установленными в setfillstyle
2. Работа с файлами в C / C++.
FILE *fopen(const char * filename, const char *mode);
Функция fopen() открывает файл и инициализирует связанный с ним поток данных. Аргумент mode устанавливает режим открытия файла (табл. 2).
• Спецификация режима может быть дополнена символами t или b, указывающими, в текстовом или двоичном режиме открывается файл.
• Возвращаемое значение: Функция возвращает указатель на структуру типа FILE (см. 8). Этот указатель затем передается в качестве аргумента следующим функциям, работающим с потоком. Если файл не может быть открыт, возвращается NULL-указатель.
Таблица 1. Режимы открытия файлов
Режим |
Описание |
r |
Файл открывается только для чтения |
w |
Файл открывается только для записи с усечением. Если файл не существует, он создается в каталоге, заданном в параметре filename. Указатель записи-чтения устанавливается в нуль. После закрытия файл имеет новый размер, соответствующий текущему положению указателя записи-чтения |
а |
Файл открывается для пополнения, т.е. после его открытия указатель записи-чтения устанавливается на позицию конца файла |
r+ |
Файл открывается для обновления. Он доступен для чтения и записи, но после закрытия не происходит усечения файла. Сразу после открытия указатель записи-чтения устанавливается в начало файла |
W+ |
Файл открывается для обновления, т.е. доступен для чтения и записи. Если файл не существует, он создается в каталоге, заданном в параметре filename. Указатель записи-чтения устанавливается в нуль. После закрытия файл имеет новый размер, соответствующий текущему положению указателя записи-чтения |
а+ |
Файл открывается для обновления, т.е. доступен для чтения и записи. После его открытия указатель записи-чтения устанавливается в позицию конца файла. После закрытия файла не происходит его усечения |
int fprintf (FILE *stream, const char *format...);
Функция формирует по заданным аргументам символьную строку, которая записывается в поток stream. Форматирование символьной строки происходит таким же образом, как и в функции printf().
Параметр Описание
stream Указатель на структуру FILE потока данных
format Символьная строка формата (см. printf())
... Переменное число аргументов
• Возвращаемое значение: число записанных в поток символов. В случае ошибки возвращается отрицательное значение (чаще всего EOF (WEOF)).
__________________________________________________________________
int fscanf (FILE *stream, const char *format, ...);
Функция считывает данные из потока данных stream. Она использует аргумент format для преобразования считываемых символов по заданному формату. Следующие аргументы являются указателями на переменные, которым присваиваются вводимые значения.
• Возвращаемое значение: число успешно преобразованных и присвоенных полей либо EOF в случае попытки считывания конца файла.
__________________________________________________________________
int fputc(int character, FILE *stream);
Функция выводит отдельный символ из потока ввода-вывода.
• Возвращаемое значение: записанный в поток символ или EOF в случае ошибки.
__________________________________________________________________
int fputs(const char*string, FILE *stream);
Функция записывает символьную строку в поток данных. Перенос завершается при достижении символа конца строки '\0'. Сам нуль-терминатор в файл не передается и не заменяется символом '\n'.
• Возвращаемое значение: код последнего записанного в файл символа. В случае ошибки возвращается EOF.
__________________________________________________________________
int fgetc(FILE*stream);
Функция считывает символ из потока stream. После считывания указатель записи-чтения файла устанавливается в новую позицию.
• Возвращаемое значение: считанный символ в виде целого беззнакового значения типа int; EOF означает ошибку или конец файла.
__________________________________________________________________
char*fgets(char *string, int n, FILE*stream);
Функция считывает строку из потока stream до тех пор, пока не будут считаны n символов, либо символ конца строки '\n', либо символ конца файла. Символ '\n' не передается в считанную строку. Функция автоматически дополняет полученную строку нуль-терминатором '\0'.
• Возвращаемое значение: указатель на string, а в случае ошибки или при получении символа конца файла NULL-указатель.
__________________________________________________________________
size_t fread(void*buffer, size_t size, size_t nelem, FILE* stream);
Функция считывает nelem элементов размером size байт каждый в область памяти, на которую указывает buffer, из открытого потока stream.
• Возвращаемое значение: количество безошибочно считанных элементов данных.
__________________________________________________________________
size_t fwrite(const void *buffer, size_t size, size_t nelem, FILE *stream);
Функция записывает в поток stream nelem элементов данных размером size байтов каждый из области памяти, на которую указывает buffer. После записи указатель записи-чтения потока устанавливается на новое место. Если поток открыт в текстовом режиме, то каждый символ '\n' преобразуется в пару символов: перевода строки и возврата каретки.
Возвращаемое значение: число фактически записанных элементов данных.
__________________________________________________________________
int fseek(FILE *stream, long offset, int from_where);
Функция передвигает указатель записи-чтения файла на заданное аргументом offset количество байтов. Аргумент from_where задает точку отсчета для сдвига.
• Для файлов, открытых в двоичном режиме, количество байтов смещения указателя соответствует числу символов, на которые должен передвинуться указатель записи-чтения файла (может быть также и отрицательным).
• Для файлов, открытых в текстовом режиме, количество байтов смещения должно вычисляться с помощью функции ftell(), причем аргумент from_where должен быть равен SEEK_SET. Для аргумента from_where могут быть заданы три различные константы.
SEEK_CUR сдвиг выполняется от текущей позиции
указателя чтения-записи файла
SEEK_END сдвиг выполняется от конца файла
SEEK_SET сдвиг выполняется от начала файла
• Возвращаемое значение: нуль в случае успеха, в противном случае любое ненулевое значение.
__________________________________________________________________
long ftell(FILE *stream);
Функция возвращает текущее значение указателя записи-чтения файла, связанного с потоком stream.
Возвращаемое значение: текущая позиция указателя записи-чтения файла.
• Если файл открыт в двоичном режиме, функция возвращает число байтов от начала файла до текущей позиции.
• Если файл открыт в MS DOS текстовом режиме, то каждый символ '\n' преобразуется в пару символов: перевода строки и возврата каретки (CR/LF). В этом случае значение, возвращаемое ftell(), не соответствует физическому байтовому смещению. В случае ошибки возвращаемым значением является 1L.
__________________________________________________________________
Пример использования приведенных выше функций работы с файлами.
#include <iostream.h>
#include <stdio.h>
void main( void )
{
FILE *file;
char* file_name = "file.txt";
char load_string[50] = "none";
file = fopen( file_name, "w" );
//открываем файл с именем file.txt на запись
fputs( "string", file ); // записываем в него слово string
fclose( file ); //закрываем файл
file = fopen( file_name, "r" );
// открываем этот же файл на чтение
if( file != 0 )
//если файл был действительно открыт, т.е. указатель file содержит адрес
//открываемого файла и, следовательно, не равен 0, то
{
fgets( load_string, 50 , file );
//считываем из файла строку длиной 50 в переменную load_string символов
// из открытого файла (указатель на него file)
cout << "load_string = " << load_string << endl;
// выводим считанную строку на экран
}
else
cout << "File not found !!!" << endl;
// иначе (если файл не был открыт) сообщаем об ошибке
fclose(file); // закрываем файл
}