ББК Методические рекомендации к выполнению курсовой работы по дисциплине «Технологии программирования». / сост. К.Р. Круподерова. – Н. Новгород: Изд-во НГПУ, 2015. – 33 с. Методические рекомендации по выполнению курсовых работ предназначены для студентов специальности 230400.62 Информационные системы и технологии. Методические указания включают основные требования к содержанию и оформлению пояснительной записки, перечень основных документов. УДК ББК © Миниский университет, 2015 ВВЕДЕНИЕ Целью курсовой работы является закрепление основ и углубление знаний приемов программирования на языке С++, получение практических навыков в создании программного продукта. При выполнении курсовой работы студент самостоятельно осваивает все этапы создания программного комплекса от постановки задачи до практической реализации, сопровождающейся документацией и инструкциями по его использованию. При выполнении курсовой работы необходимо обратить внимание на качество создаваемых программ. 1. ТЕМАТИКА КУРСОВЫХ РАБОТ Тематика подразделяется на типовую и выбираемую студентом самостоятельно. В типовой работе предлагается разработать комплекс программ по созданию и обработке файлов, используемых для долговременного хранения информации. При этом студенту необходимо самостоятельно определить структуру и характеристики значений вводимых данных, обосновать используемый способ обмена информацией, создать файл во внешней памяти, предусмотреть ряд функций по обработке информации. Каждое задание на курсовую работу уточняется с преподавателем. 2. ЗАДАНИЕ НА ТИПОВУЮ КУРСОВУЮ РАБОТУ Необходимо разработать программный комплекс по созданию и обработке файлов, используемых для хранения информации. Вводимые данные представляют следующую структуру: Элемент 1 Элемент 2 Элемент 3 … Элемент N где 5<=N<=12. 1. Студент должен самостоятельно выбрать предметную область (объект для информационно-поисковой системы). 2. Определить число информационных полей для выбранного объекта, предложить конкретную структуру записи. 3 3. Сформулировать техническое задание (ТЗ) для конкретной системы. Любая ИПС должна выполнять следующие функции: вывод содержимого файла; добавление новых данных в файл; выборка информации по любому элементу данных; удаление информации об объекте по заданному признаку; сортировка информации по выбранному признаку; использование динамических структур. 4. Проанализировать задачу с целью выявления отдельных подзадач, выделенные подзадачи (программные модули) рассмотреть на зависимость и независимость друг от друга. 5. Выполнить программную реализацию на языке С++, для проверки работоспособности ПК взять вариант исходных данных не менее 15-20 записей. 6. Результаты проверки работоспособности программы сохранить в файле-протоколе. 3. СОДЕРЖАНИЕ ПОЯСНИТЕЛЬНОЙ ЗАПИСКИ 3.1 Перечень основных разделов Пояснительная записка должна содержать все разделы, отражающие этапы создания программного комплекса, должны быть выполнены рубрикация текста (см. как это выполнено в данном пособии), пронумерованы страницы, сделаны ссылки на используемую литературу (для ссылок используются квадратные скобки, например [3]) и составлено оглавление. Основные разделы пояснительной записки: - техническое задание на разработку информационного и программного обеспечения; - структура информационного и программного обеспечения; 4 - описание алгоритмов и подпрограмм (функций и процедур), используемых для создания программного обеспечения; - тексты программных модулей; - протоколы работы программного обеспечения (ПО) по всем функциям, заложенным в техническом задании; - технические условия применения программного обеспечения, инструкция для пользователя ПО; - список используемой литературы. 3.2. Структура текста курсовой работы 3.2.1. Техническое задание В процессе разработки технического задания (ТЗ) студент получает первоначальные навыки в составлении ТЗ на программное обеспечение по выданному заданию на курсовую работу. В ТЗ должны быть проработаны следующие основные вопросы: введение (состояние поставленной задачи на момент получения задания), где должна быть указана цель разработки, область применения программного обеспечения (ПО), сформулировано авторское наименование программного комплекса (ПК), который соответствует заданию на курсовую работу; требования к ПО. Здесь должны быть перечислены все функции, которые необходимо реализовать в процессе создания ПО (ПК студент разрабатывает самостоятельно с учетом наличия готовых программных средств, которые можно включить в ПО). 3.2.2. Структура информационного обеспечения При получении задания на информационно-поисковую систему (ИПС), студент должен выбрать тип организации для хранения данных и способ доступа к ним. Применительно к языку С++ можно остановиться на последовательном файле. Структура записи должна иметь все поля, необходимые для реализации заказанных функций в ТЗ. Для каждого поля записи необходимо определиться с типом данных. 5 3.2.3. Структура программного обеспечения Структура ПК зависит от заданных функций в ТЗ и от выбора структуры информационного обеспечения. На языке С++ рекомендуется строить с использованием формы меню, где для каждого заказанного требования предусмотреть соответственно отдельную функцию. 3.2.4. Алгоритмы по созданию функций Алгоритмы могут быть приведены в словесной форме, в виде графических схем, либо в некоторых случаях можно привлечь математический аппарат. Простые алгоритмы реализации программных модулей можно не приводить, обеспечив необходимыми комментариями тексты процедур (тексты разместить в следующем разделе). В данном разделе необходимо привести полный перечень всех подпрограмм, входящих в состав ПО с указанием выполняемой функции, описать назначение формальных параметров, пояснив тип данных для каждого параметра. 3.2.5. Отладка программных модулей В этом разделе необходимо привести план тестирования ПК для контроля этапов алгоритмизации и программирования. Подготовить эталонные промежуточные и окончательные результаты, подтверждающие работу ПК по всем заложенным в ТЗ функциям. Привести необходимые данные для заполнения информационной базы и написать по каждому требованию ТЗ желаемый результат. Например: если организуется поиск информации, то в плане тестирования приводится контрольная информация (в обозримом объеме), по которой ведется поиск; признак поиска; желаемый результат. От качества предложенных тестов зависит время, затраченное на проверку ПК. Удачно подобранные промежуточные данные позволяют локализовать алгоритмические ошибки [8]. Контроль правильности текстов программ принято рассматривать: "ручной" (без вмешательства ЭВМ) и автоматизированный (трансляция, 6 тестирование на ЭВМ). Перед обращением к ЭВМ написанный текст программы рекомендуется просмотреть на предмет описок и смыслового расхождения с предложенным вариантом задачи. Путем сплошного просмотра текста выявляется правильность написания ключевых слов, операторов, организация циклов. Полезно сравнить текст с условиями задачи. "Ручная" проверка индивидуальна, но может быть эффективной, если программист способен мысленно представить во всех деталях алгоритм написанной программы. Автоматизированный контроль осуществляет транслятор. Трансляция выявляет синтаксические ошибки, но не более того. Правильность работы ПК проверяется на базе контрольных тестов путем многократного запуска ПК по всем функциям (требованиям) из ТЗ и сверкой результатов машинных протоколов и предложенных тестов. 3.2.6. Тексты программных модулей Тексты распечатываются после получения правильных результатов по всем запланированным функциям ПО. Тексты должны быть снабжены комментариями. Комментариями нельзя злоупотреблять, большое количество загромождает суть программы, ухудшает читабельность текста, как и их полное отсутствие. При размещении пояснений по тексту ПК следует придерживаться следующих рекомендаций: написать комментарии по разработанным функциям; выделить логически завершенные участки, важные по содержательному пониманию работы ПК. 3.2.7. Протоколы, подтверждающие работоспособность программного комплекса Для проверки работоспособности ПК необходимо: самостоятельно подготовить данные, подобрав конкретные значения таким образом, чтобы можно было убедиться в правильности работы каждой заданной функции в ТЗ; 7 в программе параллельно с выводом информации на экран обеспечить вывод в файл протокола; выполнить проверку конкретных значений контрольного примера по всем предусмотренным в ТЗ функциям; распечатать полученный файл с протоколом работы программы, включающий распечатку данных и, если требуется, пояснения результатов. 3.2.8. Условия использования программного комплекса В этом разделе должны быть приведены технические условия и состав программного обеспечения для работы вышеописанного ПК. Указать персональную ЭВМ, на которой был отлажен ПК, операционную систему, язык программирования, указав версию. Привести состав файлов, входящих в ПК в следующем виде: имя файла с расширением - размер в байтах - назначение. Размер ПК указать в исходном виде и в готовом к выполнению, т.е. привести размеры файлов с расширением ",срр",".ехе". Привести размеры файлов данных с указанием числа записей. 3.2.9. Список используемой литературы Список литературы приводится по общепринятым правилам для технической литературы. На приведенную литературу должны быть сделаны ссылки в тексте пояснительной записки. 4. ВСПОМОГАТЕЛЬНЫЙ МАТЕРИАЛ 4.1 Перечень вопросов, подлежащих изучению В процессе выполнения работы студент должен разобраться в следующих вопросах: основы файлового ввода/вывода информации; произвольный доступ к файлу; организация ввода/вывода для типов, определенных пользователем. В курсовой работе рассматриваются типизированные и текстовые файлы, прямой и последовательный доступы к данным. Необходимо, прежде всего 8 понимать как распространяется блок описания данных на текст программы, что такое файл, поток ввода и вывода, внешнее имя файла, объявление файла в программе, связь потока ввода- вывода с внешнем именем файла в среде операционной системы. 4.2. Создание и обработка файлов 4.2.1. Основы файлового ввода/вывода Файловый ввод/вывод поддерживается той же иерархией классов, что и консольный ввод/вывод. Для реализации файлового ввода/вывода, необходимо включить в программу заголовочный файл <fstream.h>, в котором определено несколько классов, включая ifstream, ofstream и fstream. В С++ файл открывается посредством его связывания с потоком. Имеется три типа потоков: ввода, вывода и ввода/вывода. Перед тем как открыть файл, нужно, во-первых, создать поток. Для создания потока ввода необходимо объявить объект типа ifstream. Для создания потока вывода - объект типа ofstream. Потоки, которые реализуют одновременно ввод и вывод должны объявляться как объекты типа fstream. Например: ifstream fin; // создание потока ввода ofstream fout; // создание потока вывода fstream fio; // создание потока ввода/вывода После создания потока, одним из способов связать его с файлом является использование функции ореп(). Эта функция является членом каждого из трех потоковых классов. Прототипы данной функции для каждого класса такие: 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); Здесь имя_файла – имя файла, в которое может входить и спецификатор пути. Значение режим задает режим открытия файла. Оно должно быть 9 значением типа openmode, которое является перечислением, определенным в классе ios. Значение режим может быть одним из следующих: 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 10 В этом примере параметр режим функции ореn() по умолчанию устанавливается в значение, соответствующее типу открываемого потока, поэтому нет необходимости указывать его явно. Как правило, перед тем как пытаться получить доступ к файлу, следует проверить результат выполнения функции ореn(). Для проверки правильности открытия файла используют операцию НЕ (!). Пример проверки открытия файла с помощью операции НЕ: if (!mystream) { cerr << "He удалось открыть файл\n"; // программа обработки ошибки открытия файла } Для открытия файлов помимо функции ореn() можно использовать конструкторы классов ifstream, ofstream и fstream, которые открывают файлы автоматически. Конструкторы имеют те же параметры, в том числе и задаваемые по умолчанию, что и функция ореn(). Пример открытия файла priml.txt для ввода (чтения из файла) с помощью конструктора: ifstream fi("priml.txt"); Для закрытия файла используется функция close(). Например, для закрытия файла, связанного с потоком fi используется инструкция: fi.close(); После того как файл открыт, в него можно записать или прочитать из него данные. Для этого можно использовать операторы « и » так же, как это делалось для консольного ввода/вывода, только следует заменить поток cin или cout тем потоком, который связан с файлом. Однако в С++ для работы с файлами поддерживается широкий диапазон функций ввода/вывода. 4.2.2. Основные функции ввода 11 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 символ); - возвращает последний считанный из потока символ обратно в поток. 12 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 задание); - устанавливает указатель считывания соответствующего файла в позицию, отстоящую на величину смещение от заданного места задание. 13 Тип seek_dir - это перечисление (enum), определенное в классе ios следующим образом: enum seek_dir { beg=0, cur=l, 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 Имеет место фатальная ошибка 14 перечислением, Получить информацию о текущем состоянии ввода/вывода можно с помощью следующих функций: 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.) Второй параметр получает выводимый объект. 15 (Он, если для Вашего приложения это нужно, тоже может быть параметромссылкой.) Пользовательская функция вывода возвращает ссылку на поток stream, который имеет тип ostream. Это необходимо, если перегруженный оператор << должен использоваться в ряде последовательных выражений ввода/вывода: cout << ob1 << ob2 << оb3; Внутри пользовательской функции вывода можно выполнить любую процедуру. Основая форма всех пользовательских функций ввода: istream &operator>>(istream &stream, имя класса &объект) { // тело пользовательской функции ввода return stream; } Пользовательские функции ввода возвращают ссылку на поток istream, который является потоком ввода. Первый параметр тоже является ссылкой на поток ввода. Второй параметр - это ссылка на объект, получающий вводимую информацию. Перегруженные функции ввода и вывода могут использоваться без каких-либо изменений и для файлов. Однако вывод на экран и в файл может отличаться (например, при выводе в файл в качестве символа разделителя между данными используется пробел, а вывод на экран необходимо представить в виде таблице с каким-то другим символом-разделителем). В таких ситуациях в программе предусматривается операция-функция для вывода на экран и операция-функция для вывода в файл. Основные формы операций-функций ввода и вывода для файлов аналогичны, только вместо потока istream указывается поток ifstream, а поток ostream заменяется ofstream. 16 Литература а) основная литература 1. Орленко Ю.Г., Соколов В.А., Ширшова Н.Г. Основы алгоритмизации и программирования: Объектно-ориентированное программирование. Введение в С++ Builder: Учебное пособие. – Н. Новгород: ВГИПУ, 2009. – 120 с. 2. Орленко Ю.Г., Соколов В.А., Ширшова Н.Г. Основы алгоритмизации и программирования на С/С++: Учебное пособие. – Н. Новгород: ВГИПУ, 2008. – 152 с. 3. Павловская Т.А. С/С++. Программирование на языке высокого уровня. – СПб.: Питер, 2009. - 461 с. 4. Павловская Т.А., Щупак Ю.А. С/С++. Структурное и объектноориентированное программирование: Практикум. – СПб.: Питер, 2011. б) дополнительная литература 1. Кнут А. Искусство программирования для ЭВМ. Том 3 Сортировка и поиск. - М.: Мир, 2007 2. Страуструп Б. Язык программирования C++, 3-е изд. -- СПб.: Невский диалект, 2008 3. Вирт Н. Систематическое программирование. Введение. - М.: Мир, 2008. 17 Приложение 1 Образец оформления титульного листа курсового проекта Министерство образования и науки РФ Государственное образовательное учреждение высшего профессионального образования «Волжский государственный инженерно-педагогический университет» Институт дизайна Кафедра «Математика и информатика» КУРСОВАЯ РРАБОТА по дисциплине «Технология программирования» на тему: «_____________________________________________» (название темы) Выполнил:____________________________ (Фамилия И.О.) Студент______курса______спец.___________ Группа:_______________№ зачетной книжки Подпись:_______________________________ Преподаватель:________________________ (Фамилия И.О.) Должность:_____________________________ (уч. степень, уч. звание) Оценка:_____________ Дата:______________ Подпись:_______________________________ Нижний Новгород 20__ г. 18 Приложение 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 tiragfKOl.], // Тираж }; // прототипы функций void begtabl(); void endtabl(); void sozdanie(char); 19 void prosmotr(); void vibor(); void del(); // Операция-функция ввода в структуру с клавиатуры istream &operator >> (istream &in, BOOK &x) { int v; cout<<"\n Фамилия автора:"; in.seekg(0,ios::end); in.get(x.fio,FIO-l,'\n'); cout<< "\n Название книги:"; in.seekg(0,ios: :end); in.get(x.name,NAME-l,'\n'); соut<<"\n Год издания:"; in.seekg(0,ios::end); in >> v; itoa(v,x.god,10); // преобразование целого числа в строку соut<<"\n Издательство:"; in.seekg(0,ios::end); in.get(x.izd,IZD-l,'\n'); соut<<"\nТираж", in.seckg(0,ios::end); in>>v; itoa(v,x.tirag,10); return in; } // Операция-функция вывода структуры на дисплей 20 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; } // Операция-функция ввода структуры с МД 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; } // Операция-функция вывода структуры на МД 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; } 21 void main() { char c; ofstream fprot; fprot.open("protokol.txt"); // открытие файла для записи протокола if (!fprot) { cerr « "He удалось открыть файл для записи протокола \n"; return; } while (1) { clrscr(); cout <<"ГЛАВНОЕ МЕНЮ \n"; cout<<"1. Создание картотеки книг \n"; cout<<"2. Добавление в картотеку \n"; cout<<"3. Просмотр картотеки книг \n"; cout<<"4. Выборка информации \n"; cout <<"5. Удаление \n"; cout<<"6. Выход \n"; cout<<"Ваш выбор -> "; cin.seekg(0,ios: :end); с = cin.get(); switch(c) { case ‘1’: case ‘2’: sozdanie(c); break; case '3': prosmotr(); break: case '4': vibor(); break; 22 case '5': del(); break; case '6': fprot.close(); // закрыли файл с протоколом работы return; default: cout<<"Вводите только цифры от 1 до 6" <<endl; cout<< "Продолжение - клавиша Enter \n"; cin.seekg(0,ios::end); cin.get(); } } } // функция создания и добавления информации в файл void sozdanie(char reg) { char с; // поток 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"; } 23 if (!ff) { cerr << "Не удалось открыть файл book txt для записи\n"; return; } // Цикл записи элементов в файл do { clrscr(); if (reg = '1') cout<<"СОЗДАНИЕ НОВОГО ФАЙЛА\n\n"; else cout<< "ДОБАВЛЕНИЕ ИНФОРМАЦИИ В ФАЙЛ\n\n"; cin >> s; // ввод с клавиатуры ff << s; // вывод в файл cout«"\nПродолжить ввод?(Y/N или Д/Н)"; cin.seekg(0,ios: end); cin.get(c); } while (с =='y' || c=='Y' || с=='д' || с==’Д'); ff.close(); // закрытие файла } // функция просмотра содержимого картотеки книг в табличной форме void prosmotr() { ifstream finp; BOOK s; // поток fi для ввода из файла kniga.txt finp.open("book.txt", ios::binary); if (!finp) 24 { cerr « "He удалось открыть файл book.txt для чтения\n"; return; } clrscr(); соut<<"Просмотр информации\n"; fprot<<"\n\n\nПросмотр информации\n"; begtabl(); while (!finp.eof()) // пока не конец файла { finp >> s ; // чтение из файла if (strlen(s.fio) == 0 ) break; cout<< s; // вывод на дисплей } finp.close(); // закрытие файла 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) 25 { cerr « "He удалось открыть файл book.txt для чтения\n"; return; } while (l) { clrscr(); cout<<" ПОИСК ИНФОРМАЦИИ ПО\n", cout<< “\n"; cout << "1. Ф.И.О. автора\n"; cout << "2. Названию книги\n"; cout << "3. Издательству\n"; cout << "4. Году издания\n"; cout<< "5 Возврат в главное меню\n"; fi.seekg(0,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; case '1': cout<< " Введите Ф И О автора:"; cin.seekg(0,ios::end); cin.get(fio,FIO-l,’\n’); fprot<< "Фамилия:" << fio << endl; break; case '2': cout<< " Введите название книги:"; cin.seekg(0,ios: :end); 26 cin.get(nazv,NAME-1 ,’\n'); fprot<<" Название книги:"<< nazv << endl; break; case '3': cout << " Введите издательство:"; cin.seekg(0,ios: :end); cin.get(izd,IZD-l,’\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; // вывод на экран } endtabl(); cout<<"Продолжение - любая клавиша\n"; cin.seekg(0,ios::end); cin.get(); } } 27 // функция удаления информации из файла 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) { сегт « "Ошибка открытия файла для чтения"; exit(l); } fi.seekg(0,ios::beg); fo.open("tmp.txt", ios::binary); if(!fo) { cerr <<“Ошибка открытия файла для записи"; exit(l); } 28 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"); } 29 return; } //вывод шапки таблицы на экран и в файл протокола void begtabl() { cout<< “Ф.И.О. автора Название книги Год Издательство Тираж \n”; fprot <<“Ф.И.О. автора Название книги Год Издательство Тираж \n”; return; } 30 Приложение 3 Пример протокола работы программы СОЗДАНИЕ НОВОГО ФАЙЛА Просмотр информации Ф.И.О. автора Название книги Год Издательство Тираж Шилдт Г. 1998 BHV 5000 Касаткин А.И. Программирование 1990 Минск 1000 Подбельский В В. 1999 Финансы 3000 Брябрин В.М. ПО ПЭВМ 1988 Наука 1000 Кормен Т. Алгоритмы 2000 Москва 2000 Хансен Г. Базы данных 1998 Бином 3000 Нейбауэр Программирование 1998 BHV 4000 Самоучитель С++ Язык С++ ДОБАВЛЕНИЕ ИНФОРМАЦИИ В ФАЙЛ Просмотр информации Ф.И.О. автора Название книги Год Издательство Тираж Шилдт Г. 998 5000 Самоучитель С++ BHV Касаткин А.И. Программирование 1990 Минск 1000 Подбельский В В. 1999 Финансы 3000 Брябрин В.М. ПО ПЭВМ 1988 Наука 1000 Кормен Т. Алгоритмы 2000 Москва 2000 Хансен Г. Базы данных 1998 Бином 3000 Нейбауэр Программирование 1998 BHV 4000 Шилдт Г. Программирование 1996 BHV 5000 Язык С++ Поиск информации Название книги: Программирование 31 Ф.И.О. автора Название книги Год Издательство Тираж Касаткин А.И. Программирование 1990 Минск 1000 Нейбауэр Программирование 1998 BHV 4000 Шилдт Г. Программирование 1996 BHV 5000 Ф.И.О. автора Название книги Год Издательство Тираж Шилдт Г. Самоучитель С++ 1998 BHV 5000 Шилдт Г. Программирование 1996 BHV 5000 Поиск информации Поиск информации Введите Ф.И.О. автора: Фамилия: Касаткин Ф.И.О. автора Название книги Год Издательство Тираж Удаление информации no фамилии автора Фамилия автора для удаления Кормен Т. Информация удалена Просмотр информации Ф.И.О. автора Название книги Год Издательство Тираж Шилдт Г. 1998 BHV 5000 Касаткин А.И. Программирование 1990 Минск 1000 Подбельский В В. 1999 Финансы 3000 Брябрин В.М. ПО ПЭВМ 1988 Наука 1000 Хансен Г. Базы данных 1998 Бином 3000 Нейбауэр Программирование 1998 BHV 4000 Шилдт Г. Программирование 1996 BHV 5000 Самоучитель С++ Язык С++ 32 Содержание Введение 3 1. Тематика курсовых работ 3 2.Задание на типовую курсовую работу 3 3. Содержание пояснительной записки 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. Список используемой литературы 8 4. Вспомогательный материал 8 4.1. Перечень вопросов, подлежащих изучению 8 4.2. Создание и обработка файлов 9 4.2.1. Основы файлового ввода/вывода 9 4.2.2. Основные функции ввода 11 4.2.3. Основные функции вывода 13 4.2.4. Произвольный доступ 13 4.2.4.1. Функции управления указателем считывания 13 4.2.4.2 Функции управления указателем записи 14 4.2.5. Контроль состояния ввода/вывода 1 4.3. Ввод/вывод для типов, определенных пользователем 14 15 Литература 16 Приложения 18 33