Методические указания к курсовой работе
«Технология программирования»
(наименование дисциплины)
050703 – «Информационные системы»
050704 – «Вычислительная техника и программное обеспечение»
(Специальность: шифр, название специальности)
курс, дневная, вечерняя, заочная
(курс, форма обучения)
Преподаватель: Шайдуллина Динара Ташеновна, ст. преподаватель
ВВЕДЕНИЕ
Целью курсовой работы является закрепление основ и углубление знаний приемов программирования на языке С++, получение практических навыков в создании программного продукта. При выполнении курсовой работы студент самостоятельно осваивает все этапы создания программного комплекса от постановки задачи до практической реализации, сопровождающейся документацией и инструкциями по его использованию. При выполнении курсовой работы студентам необходимо обратить внимание на качество создаваемых программ.
1 ТЕМАТИКА КУРСОВЫХ РАБОТ
Тематика подразделяется на типовую и выбираемую студентом самостоятельно. В типовом работе предлагается разработать комплекс программ по созданию и обработке файлов, используемых для долговременного хранения информации. При этом студенту необходимо самостоятельно определить структуру и характеристики значений вводимых данных, обосновать используемый способ обмена информацией, создать файл во внешней памяти, предусмотреть ряд функций по обработке информации. Каждое задание на курсовую работу уточняется с преподавателем.
2 ЗАДАНИЕ НА ТИПОВУЮ КУРСОВУЮ РАБОТУ
Необходимо разработать программный комплекс по созданию и обработке файлов, используемых для хранения информации. Вводимые данные представляют из себя следующую структуру:
Элемент 1 Элемент 2 Элемент 3 … Элемент N
где 5<=N<=12.
1. Студент должен самостоятельно выбрать предметную область (объект для информационно-поисковой системы).
2. Определить число информационных полей для выбранного объекта, предложить конкретную структуру записи.
3. Сформулировать техническое задание (ТЗ) для конкретной системы.
Любая ИПС должна выполнять следующие функции:
- вывод содержимого файла;
- добавление новых данных в файл;
- выборка информации по любому элементу данных;
- удаление информации об объекте по заданному признаку;
- сортировка информации по выбранному признаку;
- использование динамических структур.
4. Проанализировать задачу с целью выявления отдельных подзадач, выделенные подзадачи (программные модули) рассмотреть на зависимость и независимость друг от друга.
5. Выполнить программную реализацию на языке С++, для проверки работоспособности ПК взять вариант исходных данных не менее 15-20 записей.
6. Результаты проверки работоспособности программы сохранить в файле-протоколе.
3 СОДЕРЖАНИЕ ПОЯСНИТЕЛЬНОЙ ЗАПИСКИ
3.1 Перечень основных разделов
Пояснительная записка должна содержать все разделы, отражающие этапы создания программного комплекса, должны быть выполнены рубрикация текста (см. как это выполнено в данном пособии), пронумерованы страницы, сделаны ссылки на используемую литературу (для ссылок используются квадратные скобки, например [3]) и составлено оглавление.
Основные разделы пояснительной записки:
- техническое задание на разработку информационного и программного обеспечения;
- структура информационного и программного обеспечения;
- описание алгоритмов и подпрограмм (функций и процедур), используемых для создания программного обеспечения;
- тексты программных модулей;
- протоколы работы программного обеспечения (ПО) по всем функциям, заложенным в техническом задании;
- технические условия применения программного обеспечения, инструкция для пользователя ПО;
- список используемой литературы.
3.2 Структура текста курсовой работы
3.2.1. Техническое задание
В процессе разработки технического задания (ТЗ) студент получает первоначальные навыки в составлении ТЗ на программное обеспечение по выданному заданию на курсовую работу. В ТЗ должны быть проработаны следующие основные вопросы:
- введение (состояние поставленной задачи на момент получения задания), где должна быть указана цель разработки, область применения программного обеспечения (ПО), сформулировано авторское наименование программного комплекса (ПК), который соответствует заданию на курсовую работу;
- требования к ПО. Здесь должны быть перечислены все функции, которые необходимо реализовать в процессе создания ПО (ПК студент разрабатывает самостоятельно с учетом наличия готовых программных средств, которые можно включить в ПО).
3.2.2 Структура информационного обеспечения
При получении задания на информационно-поисковую систему
(ИПС), студент должен выбрать тип организации для хранения данных
и способ доступа к ним. Применительно к языку С++ можно остановиться
на последовательном файле. Структура записи должна иметь все поля,
необходимые для реализации заказанных функций в ТЗ.
Для каждого поля записи необходимо определиться с типом
данных.
3.2.3. Структура программного обеспечения
Структура ПК зависит от заданных функций в ТЗ и от выбора
структуры информационного обеспечения. На языке С++ рекомендуется
строить с использованием формы меню, где для каждого заказанного
требования предусмотреть соответственно отдельную функцию.
3.2.4. Алгоритмы по созданию функций
Алгоритмы могут быть приведены в словесной форме, в виде
графических схем, либо в некоторых случаях можно привлечь
математический аппарат. Простые алгоритмы реализации программных
модулей можно не приводить, обеспечив необходимыми комментариями
тексты процедур (тексты разместить в следующем разделе).
В данном разделе необходимо привести полный перечень всех
подпрограмм, входящих в состав ПО с указанием выполняемой функции,
описать назначение формальных параметров, пояснив тип данных для
каждого параметра.
3.2.5. Отладка программных модулей
В этом разделе необходимо привести план тестирования ПК для
контроля этапов алгоритмизации и программирования. Подготовить
эталонные промежуточные и окончательные результаты,
подтверждающие работу ПК по всем заложенным в ТЗ функциям.
Привести необходимые данные для заполнения информационной
базы и написать по каждому требованию ТЗ желаемый результат.
Например: если организуется поиск информации, то в плане
тестирования приводится контрольная информация (в обозримом объеме),
по которой ведется поиск; признак поиска; желаемый результат.
От качества предложенных тестов зависит время, затраченное на
проверку ПК. Удачно подобранные промежуточные данные позволяют
локализовать алгоритмические ошибки [8].
Контроль правильности текстов программ принято рассматривать:
"ручной" (без вмешательства ЭВМ) и автоматизированный (трансляция,
тестирование на ЭВМ). Перед обращением к ЭВМ написанный текст
программы рекомендуется просмотреть на предмет описок и смыслового
расхождения с предложенным вариантом задачи. Путем сплошного
просмотра текста выявляется правильность написания ключевых слов,
операторов, организация циклов.
Полезно сравнить текст с условиями задачи. "Ручная" проверка
индивидуальна, но может быть эффективной, если программист способен
мысленно представить во всех деталях алгоритм написанной программы.
Автоматизированный контроль осуществляет транслятор.
Трансляция выявляет синтаксические ошибки, но не более того.
Правильность работы ПК проверяется на базе контрольных тестов путем
многократного запуска ПК по всем функциям (требованиям) из ТЗ и
сверкой результатов машинных протоколов и предложенных тестов.
3.2.6. Тексты программных модулей
Тексты распечатываются после получения правильных результатов
по всем запланированным функциям ПО.
Тексты должны быть снабжены комментариями.
Комментариями нельзя злоупотреблять, большое количество
загромождает суть программы, ухудшает читабельность текста, как и их
полное отсутствие. При размещении пояснений по тексту ПК следует
придерживаться следующих рекомендаций:
- написать комментарии по разработанным функциям;
- выделить логически завершенные участки, важные по содержательному
пониманию работы ПК.
3.2.7 Протоколы, подтверждающие работоспособность программного
комплекса
Для проверки работоспособности ПК необходимо:
- самостоятельно подготовить данные, подобрав конкретные
значения таким образом, чтобы можно было убедиться в правильности
работы каждой заданной функции в ТЗ;
- в программе параллельно с выводом информации на экран
обеспечить вывод в файл протокола;
- выполнить проверку конкретных значений контрольного
примера по всем предусмотренным в ТЗ функциям;
- распечатать полученный файл с протоколом работы
программы, включающий распечатку данных и, если требуется,
пояснения результатов.
3.2.8 Условия использования программного комплекса
В этом разделе должны быть приведены технические условия и
состав программного обеспечения для работы вышеописанного ПК.
Указать персональную ЭВМ, на которой был отлажен ПК,
операционную систему, язык программирования, указав версию.
Привести состав файлов, входящих в ПК в следующем виде: имя файла с
расширением - размер в байтах - назначение.
Размер ПК указать в исходном виде и в готовом к выполнению, т.е.
привести размеры файлов с расширением ".cpp",".exe".
Привести размеры файлов данных с указанием числа записей.
3.2.9 Список используемой литературы
Список литературы приводится по общепринятым правилам для
технической литературы. На приведенную литературу должны быть
сделаны ссылки в тексте пояснительной записки.
4. ВСПОМОГАТЕЛЬНЫЙ МАТЕРИАЛ
4.1 Перечень вопросов, подлежащих изучению
В процессе выполнения работы студент должен разобраться в
следующих вопросах:
- основы файлового ввода/вывода информации;
- произвольный доступ к файлу;
- организация ввода/вывода для типов, определенных пользователем.
В курсовой работе рассматриваются типизированные и текстовые
файлы, прямой и последовательный доступы к данным.
Студенту необходимо прежде всего понимать как распространяется
блок описания данных на текст программы, что такое файл, поток ввода и
вывода, внешнее имя файла, объявление файла в программе, связь потока
ввода-вывода с внешнем именем файла в среде операционной системы.
4.2. Создание и обработка файлов
4.2.1. Основы файлового ввода/вывода
Файловый ввод/вывод поддерживается той же иерархией классов,
что и консольный ввод/вывод. Для реализации файлового ввода/вывода,
необходимо включить в программу заголовочный файл <fstream.h>, в
котором определено несколько классов, включая ifstream, ofstream и
fstream.
В С++ файл открывается посредством его связывания с потоком.
Имеется три типа потоков: ввода, вывода и ввода/вывода. Перед тем как
открыть файл, нужно, во-первых, создать поток. Для создания потока
ввода необходимо объявить объект типа ifstream. Для создания потока
вывода – объект типа ofstream. Потоки, которые реализуют
одновременно ввод и вывод должны объявляться как объекты типа
fstream.
Например:
ifstream fin; // создание потока ввода
ofstream fout; // создание потока вывода
fstream fio; // создание потока ввода/вывода
После создания потока, одним из способов связать его с файлом
является использование функции open(). Эта функция является членом
каждого из трех потоковых классов.
Прототипы данной функции для каждого класса такие:
void ifstream::open(char *имя_файла,
openmode режим = ios::in);
void ofstream::open(char *имя_файла,
openmode режим = ios::out | ios::trunc);
void fstream::open(char *имя_файла,
openmode режим = ios::in | ios::out);
Здесь имя_файла – имя файла, в которое может входить и
спецификатор пути. Значение режим задает режим открытия файла. Оно
должно быть значением типа openmode, которое является перечислением,
определенным в классе ios. Значение режим может быть одним из
следующих:
ios::app
ios::ate
ios::binary
ios::in
ios::nocreate
ios::noreplace
ios::trunc
ios::app – открытие файла в режиме добавления в конец файла. Это
значение может применяться только к файлам, открываемым для вывода
(записи информации в файл);
ios::ate – поиска конеца файла при его открытии. Хотя данное
значение вызывает поиск конца файла, тем не менее, операции
ввода/вывода могут быть выполнены в любом месте файла;
ios::in – открытие файла для ввода (чтения информации из файла);
ios::out – открытие файла для вывода (записи информации в файл);
ios::binary – открытие файла в двоичном режиме. По умолчанию
все файлы открываются в текстовом режиме. В текстовом режиме имеет
место преобразование некоторых символов, например,
последовательность символов “вовзрат каретки/перевод строки”
превращается в символ новой строки. Если же файл открывается в
двоичном режиме, такого преобразования не выполняется. Любой файл,
независимо от отго, что в нем содержится – отформатированный текст
или необработанные данные – может быть открыть как в текстовом, так и
в двоичном режиме. Отличие между ними только в отсутствии или
наличии упомянутого символьного преобразования;
ios::nocreate – не открывать новый файл. Открытие терпит
неудачу, если файл не существует;
ios::noreplace – не открывать существующий файл. Открытие
терпит неудачу, если файл существует;
ios::trunc- удаление содержимого ранее существовавшего файла с
тем же названием и усечению его до нулевой длины. При создании потока
вывода с помощью ключевого слова ofstream любой ранее
существовавший файл с тем же именем автоматически усекается до
нулевой длины.
Пример открытия файла prim.txt для вывода:
ofstream mystream; // создание потока вывода
mystream.open(“prim.txt”); // связывание потока вывода с файлом
// prim.txt
В этом примере параметр режим функции open() по умолчанию
устанавливается в значение, соответствующее типу открываемого потока,
поэтому нет необходимости указывать его явно.
Как правило, перед тем как пытаться получить доступ к файлу,
следует проверить результат выполнения функции open().
Для проверки правильности открытия файла используют операцию
НЕ (!).
Пример проверки открытия файла с помощью операции НЕ:
if (!mystream)
{
cerr << “Не удалось открыть файл\n”;
// программа обработки ошибки открытия файла
}
Для открытия файлов помимо функции open() можно использовать
конструкторы классов ifstream, ofstream и fstream, которые открывают
файлы автоматически. Конструкторы имеют те же параметры, в том числе
и задаваемые по умолчанию, что и функция open().
Пример открытия файла prim1.txt для ввода (чтения из файла) с
помощью конструктора:
ifstream fi(“prim1.txt”);
Для закрытия файла используется функция close().
Например, для закрытия файла, связанного с потоком fi
используется инструкция:
fi.close();
После того как файл открыт, в него можно записать или прочитать
из него данные. Для этого можно использовать операторы << и >> так же,
как это делалось для консольного ввода/вывода, только следует заменить
поток cin или cout тем потоком, который связан с файлом. Однако в С++
для работы с файлами поддерживается широкий диапазон функций
ввода/вывода.
4.2.2. Основные функции ввода
istream& get(char &символ); - считывает один символ из
связанного с ней потока и передает его значение аргументу символ. Ее
возвращаемым значением является ссылка на поток.
istream &get(char *буфер, int число_байт); - считывает символы
в массив, определенный указателем буфер, до тех пор, пока либо не
считано столько символов, сколько задано параметром число_байт, либо
не встретился символ конца файла. В конце массива, заданного
указателем буфер, функция get() помещает ноль. Если в потоке ввода
встретится символ новой строки, он не извлекается, а остается в потоке до
следующей операции ввода.
istream &get(char *буфер, int число_байт,
char ограничитель=’\n’); - считывает
символы в массив, определенный указателем буфер, до тех пор, пока либо
не считано столько символов, сколько задано параметром число_байт,
либо не встретился символ, заданный параметром ограничитель=’\n’,
либо не встретился символ конца файла. В конце массива, заданного
указателем буфер, функция get() помещает ноль. Если в потоке ввода
встретится символ ограничитель, он не извлекается, а остается в потоке
до следующей операции ввода.
int get(); - возвращает из потока следующий символ. Она
возвращает символ конца файла в случае достижения конца файла.
istream &getline(char *буфер, int число_байт,
char ограничитель = '\n'); -
считывает символы в массив, обозначенный указателем буфер, до тех
пор, пока либо не считано столько символов, сколько задано параметром
число_байт, либо не встретился символ ограничитель=’\n’, либо не
встретился символ конца файла. В конце массива, заданного указателем
буфер, функция getline() помещает ноль. Если в потоке ввода встретится
символ ограничитель, он извлекается, но не помещается в массив.
int peek(); - возвразщает следующий символ из потока ввода или,
если достигнут конец файла, символ конца файла, без его удаления из
потока.
istream &putback(char символ); - возвращает последний
считанный из потока символ обратно в поток.
istream& read(char *буфер, int число_байт); - считывает из
вызывающего потока столько байт, сколько задано в аргументе
число_байт и передает их в буфер, определенный указателем буфер.
Если конец файла достигнут до того, как было считано число_байт
символов, выполнение функции просто прекращается, а в буфере
оказывается столько символов, сколько их было в файле.
4.2.3. Основные функции вывода
ostream &put (char символ); - записывает символ в поток и
возвращает ссылку на поток.
ostream & write(char *буфер, int число_байт); - записывает в
соответствующий поток из буфера, который определен указателем буфер,
заданное аргументом число_байт число байтов.
ostream &flush(); - вызывает физическую запись информации на
диск до заполнения буфера.
4.2.4. Произвольный доступ
Система ввода/вывода С++ управляет двумя указателями,
связанными с файлом. Первый – это указатель считывания (get pointer),
который задает следующее место в файле, откуда будет вводиться
информация. Второй – это указатель записи (put pointer), который задает
следующее место в файле, куда будет выводиться информация. При
каждом вводе или выводе соответствующий указатель последовательно
продвигается дальше. Однако, с помощью функций произвольного
доступа возможен непосредственный доступ к файлу.
4.2.4.1. Функции управления указателем считывания
istream &seekg(long смещение); - устанавливает указатель
считывания соответствующего файла на абсолютную позицию, заданную
величиной смещение.
istream &seekg(long смещение, seek_dir задание); -
устанавливает указатель считывания соответствующего файла в позицию,
отстоящую на величину смещение от заданного места задание.
Тип seek_dir – это перечисление (enum), определенное в классе ios
следующим образом:
enum seek_dir { beg=0, cur=1, end=2 };
Значения данного перечисления имеют такой смысл:
ios::beg – отсчет от начала файла;
ios::cur – отсчет от текущий позиции указателя;
ios::end - отсчет от конца файла.
long tellg(); - возвращает текущую позицию указателя считывания в
потоке ввода.
4.2.4.2. Функции управления указателем записи
ostream &seekp(long смещение); - устанавливает указатель записи
соответствующего потока на абсолютную позицию, заданную величиной
смещение.
ostream &seekp(long смещение, seek_dir задание); -
устанавливает указатель записи соответствующего файла в позицию,
отстоящую на величину смещение от заданного места задание. (Тип
seek_dir имеет такие же значения как и в функции seekg.)
long tellp(); - возвращает текущую позицию указателя записи в
потоке вывода.
4.2.5. Контроль состояния ввода/вывода
В системе ввода/вывода С++ поддерживается информация о
состоянии после каждой операции ввода/вывода. Текущее состояние
потока ввода/вывода, которое хранится в объекте типа io_state, является
перечислением, определенным в классе ios и содержащим следующие
члены:
Название Значение
goodbit Ошибок нет
eofbit Достигнут конец файла
failbit Имеет место нефатальная ошибка
badbit Имеет место фатальная ошибка
Получить информацию о текущем состоянии ввода/вывода можно с
помощью следующих функций:
int rdstate(); - возвращает текущее состояние потока;
int eof(); – возвращает ненулевое значение при условии
достижения конца файла (установлен флаг eofbit);
int fail(); - возвращает ненулевое значение, если операция терпит
неудачу (установлен флаг failbit);
int bad(); - возвращает ненулевое значение, если произошла
ошибка (установлен флаг badbit);
int good(); - возвращает ненулевое значение, если не установлен ни
один флаг состояния (ошибок нет);
После появления ошибки может возникнуть необходимость
сбросить это состояние перед тем, как продолжить выполнение
программы. Для этого используется функция:
void clear (int = 0); - устанавливает состояние потока в нуль.
4.3. Ввод/вывод для типов, определенных пользователем
Чтобы использовать операции обмена >> и << с данными
производных типов, определяемых пользователем, необходимо
расширить действие указанных операций, введя новые операции
функции. Каждая из операций обмена << и >> бинарная, причем левым
операндом служит объект, связанный с потоком, а правый операнд
должен быть желаемый тип.
Основая форма всех пользовательских функций вывода:
ostream &operator << (ostream &stream, имя_класса объект)
{
// тело пользовательской функции вывода
return stream;
}
Первый параметр является ссылкой на объект типа ostream. Это
означает, что поток stream должен быть потоком вывода. (Класс ostream
является производным от класса ios.) Второй параметр получает
выводимый объект. (Он, если для Вашего приложения это нужно, тоже
может быть параметром-ссылкой.) Пользовательская функция вывода
возвращает ссылку на поток stream, который имеет тип ostream. Это
необходимо, если перегруженный оператор << должен использоваться в
ряде последовательных выражений ввода/вывода:
cout << ob1 << ob2 << ob3;
Внутри пользовательской функции вывода можно выполнить
любую процедуру.
Основая форма всех пользовательских функций ввода:
istream &operator >> (istream &stream, имя_класса &объект)
{
// тело пользовательской функции ввода
return stream;
}
Пользовательские функции ввода возвращают ссылку на поток
istream, который является потоком ввода. Первый параметр тоже является
ссылкой на поток ввода. Второй параметр – это ссылка на объект,
получающий вводимую информацию.
Перегруженные функции ввода и вывода могут использоваться без
каких-либо изменений и для файлов. Однако вывод на экран и в файл
может отличаться (например, при выводе в файл в качестве символа-
разделителя между данными используется пробел, а вывод на экран
необходимо представить в виде таблице с каким-то другим символом-
разделителем). В таких ситуациях в программе предусматривается
операция-функция для вывода на экран и операция-функция для вывода в
файл. Основные формы операций-функций ввода и вывода для файлов
аналогичны, только вместо потока istream указывается поток ifstream, а
поток ostream заменяется ofstream.
Литература
1. Нейбауэр. А. Моя первая программа на C/C++./ Пер. с англ. – СПб.:
Питер, 1996.
2. Шилдт. Г. Самоучитель С++ 3-е изд./ Пер. с англ. – СПб.: BHV-Санкт-
Петербург, 1998.
3. Подбельский В.В., Фомин С.С. Программирование на языке Си. -
М.:Финансы и статистика, 1999.
4. Подбельский В.В. Язык Си++. - М.:Финансы и статистика, 1999.
5. Касаткин А.И., Вальвачев А.Н. От Turbo C к Borland C++/ Под ред.
А.И.Касаткина. – Минск:Вышейшая школа, 1992.
6. Березин Б.И., Березин С.Б. Начальный курс С и С++. –М.: Диалог-
Мифи, 1996.
Приложение 1
Образец оформления титульного листа курсовой работы
Министерство образования Российской Федерации
Северо-Западный государственный заочный технический университет
Факультет информатики и систем управления
Кафедра системотехники и ЭВМ
Курсовая работа
по дисциплине
Программирование на языке высокого уровня
Студента ________________________________
Шифр ____________ Группа ______________
Дата защиты _____________________________
Оценка ________________
Санкт-Петербург
Приложение 2
Пример текста программы с минимальным набором функций
#include <iostream.h>
#include <fstream.h>
#include <string.h>
#include <conio.h>
#include <iomanip.h>
#include <stdlib.h>
#include <io.h>
#define FIO 20
#define NAME 26
#define GOD 6
#define IZD 12
#define KOL 6
ofstream fprot; // для протокола работы программы
struct BOOK
{
char fio[FIO]; // Ф.И.О. автора
char name[NAME]; // наименование книги
char god[GOD]; // Год издания
char izd[IZD]; // Издательство
char tirag[KOL]; // Тираж
};
// прототипы функций
void begtabl();
void endtabl();
void sozdanie(char);
void prosmotr();
void vibor();
void del();
// Опеpация-функция ввода в стpуктуpу с клавиатуpыistream &operator >> (istream &in, BOOK &x){ int v; cout << "\nФамилия автора:"; in.seekg(0,ios::end); in.get(x.fio,FIO-1,'\n'); cout << "\nНазвание книги:"; in.seekg(0,ios::end); in.get(x.name,NAME-1,'\n'); cout<<"\nГод издания:"; in.seekg(0,ios::end); in >> v; itoa(v,x.god,10); // преобразование целого числа в строку cout<<"\nИздательство:"; in.seekg(0,ios::end); in.get(x.izd,IZD-1,'\n'); cout<<"\nТираж:"; in.seekg(0,ios::end); in >> v; itoa(v,x.tirag,10); return in;} // Опеpация-функция вывода стpуктуpы на дисплейostream &operator << (ostream &out, BOOK x){ out.setf(ios::left); out << "¦" << setw(FIO) << x.fio << "¦" << setw(NAME) << x.name << "¦" << setw(4) << x.god << "¦" << setw(IZD) << x.izd << "¦" << setw(5) << x.tirag << "¦\n"; fprot.setf(ios::left); fprot << "¦" << setw(FIO) << x.fio << "¦" << setw(NAME) << x.name << "¦" << setw(4) << x.god << "¦" << setw(IZD) << x.izd << "¦" << setw(5) << x.tirag << "¦\n"; return out;} 22 // Опеpация-функция ввода стpуктуpы c МДifstream &operator >> (ifstream &in, BOOK &x){ in.getline(x.fio,FIO,'\n'); in.getline(x.name,NAME,'\n'); in.getline(x.god,GOD,'\n'); in.getline(x.izd,IZD,'\n'); in.getline(x.tirag,KOL,'\n'); return in;} // Опеpация-функция вывода стpуктуpы на МДofstream &operator << (ofstream &out, BOOK &x){ out << x.fio << '\n'; out << x.name << '\n'; out << x.god << '\n'; out << x.izd << '\n'; out << x.tirag << '\n'; return out;} void main(){ char c;// ofstream fprot; textbackground(BLUE); textcolor(15); fprot.open("protokol.txt"); // открытие файла для записи протокола if (!fprot) { cerr << "Не удалось открыть файл для записи протокола\n"; return; } 23 while (1){ clrscr(); gotoxy(25,7); cout << " ╔═════════════════════════╗\n"; gotoxy(25,8); cout << " ║ ГЛАВНОЕ МЕНЮ ║\n"; gotoxy(25,9); cout << " ║ ║\n"; gotoxy(25,10); cout << " ║ 1. Создание картотеки книг ║\n"; gotoxy(25,11); cout << " ║ 2. Добавление в картотеку ║\n"; gotoxy(25,12); cout << " ║ 3. Просмотр картотеки книг ║\n"; gotoxy(25,13); cout << " ║ 4. Выборка информации ║\n"; gotoxy(25,14); cout << " ║5. Удаление ║\n"; gotoxy(25,15); cout << " ║6. Выход ║ \n"; gotoxy(25,16); cout << " ╚═════════════════════════╝\n"; gotoxy(25,18); cout << "Ваш выбор -> "; cin.seekg(0,ios::end); c = cin.get(); switch(c){ case '1': case '2': sozdanie(c); break; case '3': prosmotr(); break; 24 case '4': vibor(); break; case '5': del(); break; case '6': fprot.close(); // закрыли файл с протоколом работы return; default: cout << "Вводите только цифры от 1 до 4" << endl; cout << "Продолжение - клавиша Enter\n"; cin.seekg(0,ios::end); cin.get(); } }} // функция создания и добавления информации в файлvoid sozdanie(char reg){ char c; // поток ff для вывода файла book.txt ofstream ff; BOOK s; if (reg == '1') { // открываем файл для создания ff.open("book.txt", ios::binary); fprot << "СОЗДАНИЕ НОВОГО ФАЙЛА\n\n"; } else { // открываем файл для пополнения ff.open("book.txt", ios::app | ios::binary); fprot << "ДОБАВЛЕНИЕ ИНФОРМАЦИИ В ФАЙЛ\n\n"; } 25 if (!ff) { cerr << "Не удалось открыть файл book.txt для записи\n"; return; } // Цикл записи элементов в файлdo { clrscr(); if (reg == '1') cout << "СОЗДАНИЕ НОВОГО ФАЙЛА\n\n"; else cout << "ДОБАВЛЕНИЕ ИНФОРМАЦИИ В ФАЙЛ\n\n"; cin >> s; // ввод с клавиатуpы ff << s; // вывод в файл cout<<"\nПpодолжить ввод?(Y/N или Д/H)"; cin.seekg(0,ios::end); cin.get(c); } while (c =='y' || c=='Y' || c=='д' || c=='Д'); ff.close(); // закpытие файла} // функция просмотра содержимого картотеки книг в табличной формеvoid prosmotr(){ ifstream finp; BOOK s; // поток fi для ввода из файла kniga.txt finp.open("book.txt", ios::binary); if (!finp) { cerr << "Не удалось открыть файл book.txt для чтения\n"; return; } 26 clrscr(); gotoxy(30,1); cout<<"Просмотр информации\n"; fprot<< "\n\n\nПросмотр информации\n"; begtabl(); while (!finp.eof()) // пока не конец файла { finp >> s; // чтение из файла if (strlen(s.fio) == 0) break; cout << s; // вывод на дисплей } finp.close(); // закpытие файла endtabl(); cout << "Продолжение - любая клавиша"; cin.seekg(0,ios::end); cin.get();} // функция поиска информации по различным полямvoid vibor(){ char c,fio[FIO], nazv[NAME], izd[IZD]; int god; ifstream fi; BOOK z; long l; fi.open("book.txt", ios::binary); if (!fi) { cerr << "Не удалось открыть файл book.txt для чтения\n"; return; } 27 while (1){ clrscr(); gotoxy(25,7); cout << "╔═════════════════════╗\n"; gotoxy(25,8); cout << "║ ПОИСК ИНФОРМАЦИИ ║\n"; gotoxy(25,9); cout << "║ ║\n"; gotoxy(25,10); cout << "║ 1. Ф.И.О. автора ║\n"; gotoxy(25,11); cout << "║ 2. Названию книги ║\n"; gotoxy(25,12); cout << "║3. Издательству ║\n"; gotoxy(25,13); cout << "║4. Году издания ║\n"; gotoxy(25,14); cout << "║5. Возврат в главное меню ║\n"; gotoxy(25,15); cout << "╚═════════════════════╝\n"; gotoxy(25,18); fi.seekg(0L); //,ios::beg); fi.clear(!ios::eofbit); // сброс флага достижения конца файла cout << "Ваш выбор -> "; cin.seekg(0,ios::end); cin.get(c); clrscr(); cout << "Поиск информации\n "; fprot << "\n\nПоиск информации\n "; switch(c) { case '5': return; 28 case '1': cout << " Введите Ф.И.О автора:"; cin.seekg(0,ios::end); cin.get(fio,FIO-1,'\n'); fprot << " Фамилия:" << fio << endl; break; case '2': cout << " Введите название книги:"; cin.seekg(0,ios::end); cin.get(nazv,NAME-1,'\n'); fprot << " Название книги:" << nazv << endl; break; case '3': cout << " Введите издательство:"; cin.seekg(0,ios::end); cin.get(izd,IZD-1,'\n'); fprot << " Издательство:" << izd << endl; break; case '4': cout << " Введите год издания:"; cin.seekg(0,ios::end); cin >> god; fprot << " Год издания:" << god << endl; break;}begtabl();while (fi){ fi >> z; if ((c=='1' && strcmp(fio,z.fio) == 0) || (c=='2' && strcmp(nazv,z.name) == 0) || (c=='3' && strcmp(izd,z.izd) == 0) || (c=='4' && atoi(z.god)==god)) cout << z; // вывод на экран} 29 endtabl(); cout << "Продолжение - любая клавиша\n"; cin.seekg(0,ios::end); cin.get(); }} // функция удаления информации из файлаvoid del(){ ofstream fo; // вспомогательный файл ifstream fi; char fam[FIO]; int flag = 0; BOOK z; long dl; clrscr(); cout << "Удаление информации по фамилии автора\n"; fprot << "\n\nУдаление информации по фамилии автора\n"; cout << "\nВведите фамилию автора для удаления"; cin.seekg(0,ios::end); cin.get(fam,FIO,'\n'); fprot << "\nФамилию автора для удаления " << fam << endl; fi.open("book.txt", ios::binary); if (!fi) { cerr << "Ошибка открытия файла для чтения"; exit(1); } fi.seekg(0,ios::beg); fo.open("tmp.txt", ios::binary); if (!fo) { cerr << "Ошибка открытия файла для записи"; exit(1); } 30 fo.seekp(0,ios::beg); while (!fi.eof()) { fi >> z; if (strlen(z.fio) == 0) break; if (strcmp(z.fio, fam) == 0) { flag = 1; cout << "\nИнформация удалена\n"; fprot << "Информация удалена\n"; cout << " Продолжение - Enter\n"; cin.seekg(0,ios::end); cin.get(); } else fo << z; // если информация не подлежит удалению // запись в вспомогательный файл } fi.close(); fo.close(); if (flag == 0) { cout << "Нет информации для удаления" << endl; fprot << "Нет информации для удаления" << endl; } else { remove("book.txt"); rename("tmp.txt","book.txt"); } return;} // вывод шапки таблицы на экран и в файл протоколаvoid begtabl(){ // вывод на экран cout << "╔═════════╤═════════════════╤═══╤" << "═════════╤═════╗\n"; cout << "║ Ф.И.О. автора │ Название книги │ Год │" << " Издательство │ Тираж ║\n"; cout << "╟──────────┼────────────────┼───┼ " << "──────────┼─────╢\n"; // вывод в файл протокола fprot << "╔═════════╤═════════════════╤═══╤" << "═════════╤═════╗\n"; fprot << "║ Ф.И.О. автора │ Название книги │ Год │" << " Издательство │ Тираж ║\n"; fprot << "╟──────────┼────────────────┼───┼ " << "──────────┼─────╢\n"; return;} // вывод окончания таблицы на экран и в файл протоколаvoid endtabl(){cout << "╚═════════╧═════════════════╧═══╧" << "═════════╧═════╣\n";fprot << "╚═════════╧═════════════════╧═══╧" << "═════════╧═════╣\n"; return;} 32 Приложение 3 Пример протокола работы программы СОЗДАНИЕ НОВОГО ФАЙЛА Просмотр информацииФ.И.О. автора Название книги Год Издательство ТиражШилдт Г. Самоучитель С++ 1998 BHV 5000Касаткин А.И. Программирование 1990 Минск 1000Подбельский В.В. Язык С++ 1999 Финансы 3000Брябрин В.М. ПО ПЭВМ 1988 Наука 1000Кормен Т. Алгоритмы 2000 Москва 2000Хансен Г. Базы данных 1998 Бином 3000Нейбауэр Программирование 1998 BHV 4000 ДОБАВЛЕНИЕ ИНФОРМАЦИИ В ФАЙЛ Просмотр информации Ф.И.О. автора Название книги Год Издательство ТиражШилдт Г. Самоучитель С++ 1998 BHV 5000Касаткин А.И. Программирование 1990 Минск 1000Подбельский В.В. Язык С++ 1999 Финансы 3000Брябрин В.М. ПО ПЭВМ 1988 Наука 1000Кормен Т. Алгоритмы 2000 Москва 2000Хансен Г. Базы данных 1998 Бином 3000Нейбауэр Программирование 1998 BHV 4000Шилдт Г. Программирование 1996 BHV 5000 Поиск информации Название книги:ПрограммированиеФ.И.О. автора Название книги Год Издательство ТиражКасаткин А.И. Программирование 1990 Минск 1000Нейбауэр Программирование 1998 BHV 4000Шилдт Г. Программирование 1996 BHV 5000 33 Поиск информации Введите Ф.И.О автора: Фамилия:Шилдт Г.Ф.И.О. автора Название книги Год Издательство ТиражШилдт Г. Самоучитель С++ 1998 BHV 5000Шилдт Г. Программирование 1996 BHV 5000 Поиск информации Введите Ф.И.О автора: Фамилия:КасаткинФ.И.О. автора Название книги Год Издательство Тираж Поиск информации Просмотр информации Ф.И.О. автора Название книги Год Издательство ТиражШилдт Г. Самоучитель С++ 1998 BHV 5000Касаткин А.И. Программирование 1990 Минск 1000Подбельский В.В. Язык С++ 1999 Финансы 3000Брябрин В.М. ПО ПЭВМ 1988 Наука 1000Кормен Т. Алгоритмы 2000 Москва 2000Хансен Г. Базы данных 1998 Бином 3000Нейбауэр Программирование 1998 BHV 4000Шилдт Г. Программирование 1996 BHV 5000 Удаление информации по фамилии автора Фамилия автора для удаления Кормен Т.Информация удалена 34 Просмотр информации Ф.И.О. автора Название книги Год Издательство ТиражШилдт Г. Самоучитель С++ 1998 BHV 5000Касаткин А.И. Программирование 1990 Минск 1000Подбельский В.В. Язык С++ 1999 Финансы 3000Брябрин В.М. ПО ПЭВМ 1988 Наука 1000Хансен Г. Базы данных 1998 Бином 3000Нейбауэр Программирование 1998 BHV 4000Шилдт Г. Программирование 1996 BHV 5000 35 СодержаниеВведение………………………………………………………………….…. 31. Тематика курсовых работ…………………………………………….… 32. Задание на типовую курсовую работу……………………………….…. 33. Содержание пояснительной записки……………………………….…… 4 3.1. Перечень основных разделов…………………………………….. 4 3.2. Структура текста курсовой работы…………………………….… 5 3.2.1. Техническое задание…………………………………………… 5 3.2.2. Структура информационного обеспечения……………….…. 5 3.2.3. Структура программного обеспечения……………………….. 6 3.2.4. Алгоритмы по созданию функций……………………………. 6 3.2.5. Отладка программных модулей………………………………. 6 3.2.6. Тексты программных модулей……………………….……….. 7 3.2.7. Протоколы, подтверждающие работоспособность программного комплекса……………………………………… 7 3.2.8. Условия использования программного комплекса……..…… 8 3.2.9. Список используемой литературы…………………………… 84. Вспомогательный материал…………………………………..………… 8 4.1. Перечень вопросов, подлежащих изучению………..…………… 8 4.2. Создание и обработка файлов…………………………..………… 9 4.2.1. Основы файлового ввода/вывода……………………………… 9 4.2.2. Основные функции ввода…………………………..………… 12 4.2.3. Основные функции вывода…………………………………… 13 4.2.4. Произвольный доступ……………………………….………… 14 4.2.4.1. Функции управления указателем считывания………… 14 4.2.4.2. Функции управления указателем записи……………… 15 4.2.5. Контроль состояния ввода/вывода…………………………… 15 4.3. Ввод/вывод для типов, определенных пользователем………… 16Литература………………………………………………………….……… 18Приложение 1. Образец оформления титульного листа курсовой работы…………………………………..……… 19Приложение 2. Пример текста программы с минимальным набором функций………………………………………… 20Приложение 3. Пример протокола работы программы……………….… 32 36 Редактор Сводный темплан 2002 г. Лицензия ЛР N 020308 от 14.02.97 ____________________________________________________________ Подписано в печать Формат 60х84 1/16 Б.кн.-журн. П.л. Б.л. РПТ РИО СЗТУ Тираж Заказ____________________________________________________________ Северо-Западный государственный заочный технический университет РИО СЗТУ, член Издательско-полиграфической ассоциации вузов Санкт-Петербурга 191186, Санкт-Петербург, ул. Миллионная, 5