Реферат по предмету "Информатика, программирование"


Обработка динамических структур

Министерствообразования РФМосковскийавиационный институт
(государственныйтехнический университет)
филиал «Восход»
Кафедра МиПОИС
Отчет
по курсовойработе
«Обработкадинамических структур»
подисциплине: Программирование на языках высокого уровняСтудентагр. ДА 2-40ВоронцовО. В.
Байконур 2006г.

Аннотация
В данной курсовой работепредставлена реализация программы, для обработки динамической структуры данных,содержащей сведения об авторах книг. Программа, разработанная в среде Turbo C++ 3.0, моделирует работу со структурой как с базой данных.

Содержание
Введение
1. Постановка задачи
2. Метод решения
2.1 Общаясхема работы программы
2.2 Методсортировки
3. Разработка алгоритмов решения задачи
3.1 Общая схема алгоритма
3.2 Стандартныепроцедуры и функции, используемые в программе
3.3 Описание работы пользовательских подпрограмм
3.3.1 Описаниеработы подпрограммы vvodSp
3.3.2 Описание работы подпрограммы loadIT
3.3.3 Описание работы подпрограммы sort
3.3.4 Описание работы подпрограммы vivodSp
3.3.5 Описание работы подпрограммы dobEl
3.3.6 Описание работы подпрограммы delel
3.3.7 Описание работы подпрограммы vidacha
3.3.8 Описание работы подпрограммы vozvrat
3.3.9 Описание работы подпрограммы saveIT
3.3.10 Описаниеработы основной программы
4. Руководствопользователя
5. Анализрезультатов
Заключение
Список литературы
Приложения

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

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

2. Методы решения задачи
2.1 Общая схема работыпрограммы
Целесообразно для решениязадачи использовать два списка. Первый список будет хранить информацию окнигах, хранящихся в библиотеке, а второй – о выданных на руки. Для этого будетпроизведено присваивание информационных полей первого списка второму, а затемполе записи количества книг во втором списке будет обнулено (так как в началекниг на руках нет). Уменьшение количества книг в одном списке будетсопровождаться увеличением во втором и наоборот. Например, после выдачи книгина руки счётчик количества экземпляров во втором списке увеличится на единицу,а в первом уменьшится на единицу. При выводе на печать второго списка следуетоговорить, чтобы на экране появлялись только те книги, количество которых вэтом списке больше нуля.
При добавлении нового элементабудет осуществляться сортировка в обоих списках, следовательно, алфавитныйпорядок нарушен не будет.
Так как требуетсяпровести ряд действий со списком, то рационально организовать текстовое меню(его вид приведен в таблице 1.1). Меню будет представлено вертикальнорасположенными строками, каждая строка – отдельный пункт меню. Выбор пункта менюбудет осуществляться путём введения с клавиатуры его порядкового номера. Длясчитывания введенного символа требуется зарезервировать переменную n, хранящую код нажатой клавиши. Выборлюбого пункта меню будет активировать соответствующую функцию.
В процессе созданиясписка будут заполняться информационные поля каждого элемента. Информационныеполя будут включать данные об авторе книги, её названии, годе издания иколичестве экземпляров в библиотеке. Более подробно создание списка описано впункте 3.3.1.
Оба списка можно будетзаписать в файлы, которые будут храниться на диске. Это позволит не вводитьинформацию заново при каждом запуске программы, а просто считать её из файлов.Путь к файлам можно задать отдельно.Примервыполнения менюВведитеномер пункта для выполнения1.Заполнить список2.Загрузить списки из файлов3.Отсортировать текущий список4.Вывести текущий список5. Вывеститекущий список выданных на руки книг6.Добавить новый элемент
7. Удалить из спискакниги заданного автора8.Выдать книгу на руки9.Вернутькнигу в библиотеку10.Сохранить списки в файл
11. Выход из программы
Ваш выбор:
2.2 Метод сортировки
Сортировка методомпростого выбора – одиниз наиболее простых способов сортировки. Алгоритм состоит в повторяющихся проходахпо сортируемому списку. За каждый проход элементы последовательно будутсравниваться попарно и, в случае если последующий элемент меньше предыдущего (тоесть порядок в паре неверный), будет выполняться обмен элементов. Проходы по спискубудут повторяться до тех пор, пока на очередном проходе не окажется, что обменыбольше не нужны, что означает, что список отсортирован.
Обращение к функции,реализующей сортировку, будет производиться не только при непосредственномвыборе пункта меню сортировки созданного списка, но и при добавлении новогоэлемента в список. Это обеспечивает добавление новой записи при неизменном алфавитномпорядке.

3. Разработка алгоритмоврешения задачи
3.1 Схема работыпрограммы
Считать номер n пункта меню:
1. Если n=1, вызвать функцию vvodSp. Формирование списка.
2. Если n=2, вызвать функцию loadIT. Считывание списков из файлов.
3. Если n=3, вызвать функцию sort. Сортировка первого списка пофамилиям автора.
4. Если n=4, вызвать функцию vivodSp. Вывод первого (текущего) списка напечать.
5. Если n=5, вызвать функцию vivodSp. Вывод второго списка (выданных наруки книг) на печать.
6. Если n=6, вызвать функцию dobEl. Добавление нового элемента в конецсписка и последующая сортировка по имени автора.
7. Если n=7, вызвать функцию delel. Удаление всех записей с введённойфамилией автора.
8. Если n=8, вызвать функцию vidacha. Добавление книги во второй список,удаление из первого.
9. Если n=9, вызвать функцию vozvrat. Удаление книги из второго списка,добавление в первый.
10. Если n=10, вызвать функцию saveIT. Запись данных первого и второгосписков в файлы.
11. Если n=11, выполнить выход из программы.
Блок схемы основнойпрограммы и функций vvodSp, dobEl, delel представлены в приложениях соответственно А, Б, В, Г.

3.2 Стандартные процедурыи функции, используемые в программе
В процессе разработкипрограммы были использованы стандартные модули языка программирования С:stdio.h, alloc.h, conio.h, string.h,.
Модуль stdio.h позволяет работать с потоками (строки, файлы…). Данныймодуль включает такие необходимые функции как scanf(), printf(),gets(), puts(), и набор функций для работы с файлами.
Модуль alloc.h предназначен для работы с динамической памятью, в немсодержатся функции calloc(), malloc(), free() и константа NULL.
Модуль string.h предназначен для работы со строками, точнее строковым типомданных. В нем находятся функции для копирования, сравнения, склеивания, ипоиска подстроки. В программе используются две стандартные функции этогомодуля: strwr и strcmp. Первая преобразует строчные символы строки впрописные. Данная функция необходима для предотвращения ошибок ввода из-завосприимчивости программы к регистру. Функция strcmp(Строка1, Строка2) сравнивает строки Строка1 иСтрока2, возвращает 0, если строки равны; число меньше нуля, если первая строкаменьше второй; число больше нуля, если первая строка больше второй. Модуль conio.h предназначен для работы с экраном втекстовом режиме. В нем хранятся функции для очистки экрана, изменения цветатекста и фона, атрибутов текста, процедуры для буферизированного инебуферизированного ввода с клавиатуры.
3.3 Описание работыпользовательских подпрограмм
3.3.1 Описание работыподпрограммы vvodSp
Подпрограммапредназначена для формирования первого списка. Функция возвращает указатель наначало первого списка. Входной параметр – указатель на указатель на началовторого списка.
1. Обнулить указатели наначала и хвосты обоих списков.
2. Пока не будет введено «no» выполнять:
2.1 Динамически выделитьпамять под указатель на текущий элемент.
2.2 Обнулить указатель наследующий за текущим элемент.
2.3 Присвоить указателюна предшествующий текущему элемент адрес предыдущего элемента.
2.4 Если указатель наначало списка обнулён, то присвоить вершине списка адрес текущего элемента, тоесть текущий элемент становится вершиной.
2.5 Иначе, присвоить указателюна следующий за предыдущим элемент списка адрес текущего элемента.
2.6 Приравнять адрестекущего элемента к адресу предыдущего.
Аналогичные действияпроводятся со вторым списком. Далее:
2.7 Считатьинформационные поля элемента первого списка.
2.8 Приравнятьинформационные поля элементов первого списка к информационным полям второго.
2.9 Обнулить поле количествакниг.
2.10 Считать значение s.
3. Вернуть указатель наначало первого списка.
Таблица 3.3.1-Локальныеидентификаторы функции vvodSpИдентификатор Тип Назначение s char предназначена для ответа на вопрос: продолжать ли список cur, cur2 el* указатель на текущие элементы tail, tail2 el* указатель на хвосты списка top el* указатель на начало первого списка top2 el* указатель на начало второго списка
3.3.2 Описание работы подпрограммы loadIT
Подпрограммапредназначена для считывания данных первого и второго списков из файлов.
Входные параметры функции– указатель на указатель на начало первого и второго списков.
1. Обнулить ссылки нахвосты и вершины обоих списков.
2. Открыть файлы «Base.txt» и «Out.txt»для чтения.
3. В цикле «пока неконец файла» динамически выделять память под указатель на текущий элемент.
3.1 Обнулить указатель наэлемент, следующий за текущим.
3.2 Приравнять указательна конец списка к указателю на предшествующий.
3.3 Если указатель наначало списка пустой, то присвоить ему адрес текущего элемента, текущий элементстановится началом списка.
3.4 Иначе присвоить адрестекущего элемента указателю на следующий за предыдущим.
3.5 Указатель на текущийэлемент приравнять к последнему.
3.6 Произвести считываниесписков из файлов.
4. Закрыть все файлы.
Таблица 3.3.2-Локальныеидентификаторы функции loadIT Идентификатор Тип Назначение cur, cur2 el* указатели на текущие элементы pr el* указатель на предыдущий элемент списка tail, tail2 el* указатель на хвост первого и второго списков
3.3.3 Описание работы подпрограммы sort
Подпрограммапредназначена для сортировки списков по фамилии автора. Обращение к функциипроисходит и при добавлении нового элемента в список. Входной параметр функции– указатель на начало первого списка.
1. В цикле «пока неконец списка перейти к последующему элементу».
1.2 Если указатель наследующий элемент поля имени автора меньше текущего, то записать вдополнительную переменную dopадрес информационного поля текущего элемента.
1.3 Присвоить полю текущегоэлемента адрес поля следующего элемента, то есть переписать в текущий элементданные последующего.
1.4 Присвоить указателюна следующий элемент поля имени автора адрес вспомогательной переменной.
Таблица 3.3.3-Локальныеидентификаторы функции sortИдентификатор Тип Назначение k int результат обмена (есть/нет) cur el* указатель на текущий элемент dop book вспомогательная переменная
3.3.4 Описание работы подпрограммы vivodSp
Подпрограмма обеспечиваетвывод на печать текущего списка. При обращении к ней может вывести содержимоепервого или второго списка. Входной параметр – указатель на текущий элементсписка.
В цикле «пока неконец списка», если информационное поле количества книг больше нуля, тораспечатать текущий элемент и перейти к следующему.
3.3.5 Описание работы подпрограммы dobEl
Подпрограммапредназначена для добавления нового элемента в списки. Входные параметры –указатели на текущий элемент первого и второго списков.
1. В циклах «покауказатель на последующий элемент первого и второго списков не пустой»
1.2 Выделить динамическипамять под добавляемые элементы.
1.3 Считатьинформационные поля добавляемого элемента.
1.4 Приравнять информационные поляэлементов первого списка к информационным полям второго.
1.5 Обнулить поле количествакниг.
1.6 Для обоих списковобнулить указатель на следующий за добавляемым элемент.
1.7 Приравнятьдобавленный элемент в первом и втором списках к указателю на последний элемент.
1.8 Присвоить указателюна предыдущий элемент значение последнего элемента.
1.9 Присвоить адресдобавленного элемента последнему.
Таблица 3.3.4-Локальныеидентификаторы функции dobElИдентификатор Тип Назначение x, x2 el новый элемент
3.3.6 Описание работы подпрограммы delel
Подпрограммапредназначена для удаления всех записей с введённой фамилией автора. Входныепараметры – указатель на указатель на начало первого и второго списков.
1. В цикле «пока неконец файла»:
1.1 Если информационноеполе автора у элемента совпадает с введённым именем, то рассматриваются трислучая.
1.1.1 Если удаляемыйэлемент стоит в начале списка, то присвоить указателю на начало спискауказатель на следующий за ним элемент списка.
1.1.2 Обнулить ссылку напредыдущий элемент следующего элемента, то есть указатель новой вершины напредыдущий элемент.
1.1.3 Проделатьаналогичные действия над вторым списком.
1.2.1 Если следующийэлемент за текущим равен нулю, то удаляемый элемент находится в конце списка.
1.2.2 Для обоих списковобнулить ссылку предыдущего элемента на следующий.
1.3.1 Если удаляемыйэлемент находится в середине списка, то присвоить указатель на предыдущийэлемент ссылке на предыдущий элемент у следующего элемента.
1.3.2 Приравнять ссылкуна следующий элемент к ссылке на следующий элемент у предыдущего элемента.

Таблица 3.3.5-Локальныеидентификаторы функции delelИдентификатор Тип Назначение cur, cur2 el* указатели на текущий элемент списка n int результат поиска isk char строка с фамилией автора
3.3.7 Описание работы подпрограммы vidacha
Подпрограмма предназначенадля выдачи книги на руки, то есть для уменьшения количества книг в первомсписке и увеличения во втором.
Входные параметры функции– указатели на текущие элементы первого и второго списков.
1. Считать фамилию автораи название книги.
2. В цикле «пока неконец списка»
2.1 Если фамилия автора иназвание книги совпадает с введёнными и количество книг больше 0, то:
2.1.1 Уменьшить наединицу значение количества в информационном поле первого списка
2.1.2 Увеличить наединицу значение количества в поле второго списка
3. Перейти к следующемуэлементу
Таблица 3.3.6-Локальныеидентификаторы функции vidachaИдентификатор Тип Назначение iskA char строка с некоторым автором iskN char строка с некоторой книгой isk char записывает результат поиска n int записывает результат поиска
3.3.8 Описание работы подпрограммы vozvrat
Подпрограмма обратнаяфункции vidacha. Возвращает указанную книгу автора вбиблиотеку, то есть уменьшает количество книг во втором списке и увеличения впервом. Входные параметры функции – указатели на текущие элементы первого ивторого списков.
1. Считать фамилию автораи название книги.
2. В цикле «пока неконец списка»
2.1 Если фамилия автора иназвание книги совпадает с введёнными и количество книг больше 0, то:
2.1.1 Уменьшить наединицу значение количества в поле второго списка.
2.1.2 Увеличить наединицу значение количества в поле первого списка.
3. Перейти к следующемуэлементу.
Таблица 3.3.7-Локальныеидентификаторы функции vozvratИдентификатор Тип Назначение iskA char строка с некоторым автором iskN char строка с некоторой книгой isk char записывает результат поиска n int записывает результат поиска
3.3.9 Описание работы подпрограммы saveIT
Подпрограммапредназначена для записи данных первого и второго списков в файлы. Входныепараметры – указатели на текущий элемент первого и второго списков.
1. Открыть файлы длячтения.
2. В цикле «пока неконец списка» произвести запись данных текущего элемента в файл для обоихсписков.
3. Перейти к следующемуэлементу списка.
Таблица 3.3.8-Локальныеидентификаторы функции saveITИдентификатор Тип Назначение zap, zap2 book вспомогательная переменная f1, f2 FILE переменная связанная с файлами

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

4. Инструкция попользованию программой
При запуске программы наэкране появляется графический интерфейс (главное меню программы). Упользователя появляется выбор в формировании списка: либо загрузить списокавторов книг из файла (для чего выбирается пункт меню «2» – «Загрузитьсписки из файлов»), либо самостоятельно ввести его с клавиатуры (для чеговыбирается пункт «1» главного меню). В первом случае должен иметьсяпредварительный надел (заранее составленная база данных, записанная в файл). Вовтором случае пользователю будет предложено ввести фамилию и инициалы авторакниги, её название, год издания и количество в прокате. При завершениисоставления одной записи появляется строка, в которой пользователю предлагаетсязаполнить ещё один элемент списка или выйти в главное меню. Для этогопользователь должен ввести соответственно слова «yes» или «no».
После выполнения операцийсоздания списка пользователь может приступить к действиям над составленнымсписком.
Если пользователь выберетпункт «3» главного меню, то произойдёт сортировка базы данных поименам авторов в алфавитном порядке. В этом можно убедиться при выборе пункта «4»,после чего на экран выводится содержимое всей базы данных.
Также пользователь можетвыдать книгу определённого автора на руки, вследствие чего количество книг вобщей базе данных уменьшается на единицу. Это происходит при выборе пункта «8»главного меню. При выборе данной опции пользователю предлагается ввести фамилиюи инициалы автора, а также название его книги. Если данная книга по картотекене числится, то соответствующая строка упоминает об этом. При выборе пункта «5»на печать выводится список книг, которые были выписаны из картотеки. Книгуможно возвратить в библиотеку посредством пункта «9» главного меню.При выполнении данной операции пользователю предлагается ввести фамилию иинициалы автора, а также название книги. В случае неверного ввода программаизвещает пользователя об этом.
Кроме того, пользовательможет добавить новый элемент в список и записать полученные изменения восновную (файловую) базу данных. Достигается это посредством пунктов меню «6»и «10» соответственно. В первом случае будет предложено ввестифамилию и инициалы автора, наименование его книги, дату издания и количестводоступных экземпляров, после чего выводится главное меню. Во втором случаепоявляется строка, уведомляющая о том, что запись в файл проведена успешно илинет в противном случае.
Помимо этого,пользователь может удалить все книги автора. Достигается это путём выборапункта «7» главного меню. Предлагается ввести фамилию автора, а послеввода сообщается об удалении всех книг данного автора и приводится числотаковых.
В заключение стоитотметить, что если ввести новые данные, а затем вызвать пункт 2 главного меню,то последние введённые данные будут безвозмездно потеряны.
При выборе пункта «11»графический интерфейс исчезает, процесс компиляции завершается.
5. Анализ результатов
В результате работыпрограммы был сформирован список сведений о книгах картотеки, состоящий изфамилии автора, названия книги, года её выпуска и количества экземпляров вбиблиотеке. Полученный список был отсортирован методом простого выбора пофамилиям авторов.
Были добавлены новыеэлементы в основной список, при этом не был нарушен алфавитный порядок. Помимоосновного списка был сформирован список с книгами, выданными на руки. Привыдаче книги на руки количество книг в библиотеки сокращалось на 1. Оба этисписка были занесены в файлы. Кроме того, было реализовано решение задачи повозвращению взятой на руки книги.
Также была реализованавозможность удаления всех книг автора из картотеки по его фамилии.
Блок-схемы алгоритмовпрограммы и основных подпрограмм представлены в приложениях А, Б, В, Г. Листингпрограммы представлен в приложении Д, а результаты работы программы вприложении Е.

Заключение
В процессе выполненияиндивидуального задания и отчета по курсовой работе я ознакомился со способамиобработки динамических структур данных.
Анализируя полученное задание, я выбрал метод решенияпоставленной задачи, на основе которого получил алгоритмы в виде блок-схем(приложения А, Б, В, Г, Д). Преимущество блок-схем состоит в их наглядности.Кодирование алгоритмов осуществлено на языке программирования С. Листингпрограммы представлен в приложении Д.
Преимущество программы состоит в простой организации пользовательскогоинтерфейса, в удобстве ввода сведений авторах и книгах. Программа сортируетсписок по имени автора в алфавитном порядке, позволяет выдать книгу на руки,вернуть её назад в библиотеку и удалить все книги выбранного автора изкартотеки. Возможно, что применение даннойпрограммы на практике (в существенно более доработанной форме) можетоптимизировать работу персонала библиотек или учреждений, в которых требуетсяработа с большими базами данных.
Недостатки программы:
— на разных ЭВМ работа с файлами осуществляется по-разному.То есть при работе на одном ЭВМ задача может идеально реализовываться, а надругом выполняться, но с ошибками. Скорее всего, это вызвано разницей в версияхТС или недоработкой разработчиков.
— при вводе в командной строке меню некорректных данных, длякоторых не предусмотрены действия, программа работать не будет, а в некоторыхслучаях возможно зацикливание, что может привести как к выходу из процессакомпиляции, так и к полному выходу из интегрированной среды программирования спотерей текущих данных, что нежелательно.

Список литературы
1. Н. Б. Культин, С/С++ в задачах и примерах, СПб:БХВ-Петербург, 2001.
2. А. Б. Крупник, Изучаем С++, Спб: Питер, 2003.
3. С. Р. Дэвис, С++ для «чайников», М.: «Вильямс»,2004.
4. Т.А. Павловская, С/С++. Программирование на языке высокогоуровня, Спб: Питер, 2005.

Приложение А
Листинг программы
#include
#include
#include
#include
typedef struct AsFalonour //создание нового типа запись дляхранения информационных полей элемента списка
{
int kol; //количество книг в картотеке
char nazv[20]; //название книги
int god; //год издания
char avt[20]; //фамилия автора книги
} book; //имя созданного типа
typedef struct spisok //создание нового типа запись для хранения информацииэлемента списка
{
book inf; //информационные поля
struct spisok* next; //указательна следующий элемент списка
struct spisok* pred; //указательна предыдущий элемент списка
} el; //имя созданного нового типа
//-------------------------------------------------------------\\
el* vvodSp(el **top2) //создание списка
{
char s[3]={'y','e','s'}; //переменная для хранения ответа на вопрос о продолженииввода списка
el*cur,*pr,*top,*tail,*tail2,*cur2; //указатель
clrscr();
*top2=top=tail=tail2=NULL; //обнулениеуказателей на начало и хвост списков
printf(«Введите первую запись\n»);
while(strcmp(strlwr(s),«no»)!=0)//пока ответ не равен no
{
cur=(el*)malloc(sizeof(el)); //выделяем память под новый элемент (далее текущий)
cur->next=NULL; //обнулениеуказателя на следующий элемент текущего элемента
cur->pred=tail;//указатель на предыдущий элемент текущего элемента присваивается хвосту списка
if(top==NULL) top=cur; //если указатель на начало списка пуст то указателемна начало списка становится текущий элемент
else tail->next=cur; //если нет, то указателем на хвостсписка становится текущий элемент
tail=cur; //указатель на хвост приравнивается текущемуэлементу
cur2=(el*)malloc(sizeof(el)); //выделяется память под новый элемент второго списка,выполняются те же действия
cur2->next=NULL;
cur2->pred=tail2;
if((*top2)==NULL)(*top2)=cur2; // *top2это указатель на указатель
elsetail2->next=cur2;
tail2=cur2;
printf(«Введите фамилию и инициалыавтора:\n»); //ввод информационных полей
scanf("%s",cur->inf.avt);
printf(«Введите название книги:\n»);
scanf("%s",cur->inf.nazv);
printf(«Введите год издания книги:\n»);
scanf("%d",&cur->inf.god);
while(cur->inf.god
{
printf(«Год издания не может бытьотрицательным числом! Введите повторно!\n»); //проверяется, положителен ли год
scanf("%d",&cur->inf.god); //повторный ввод
}
printf(«Введите количество экземпляровкниги:\n»); //аналогичное с количеством
scanf("%d",&cur->inf.kol);
while(cur->inf.kol
{
printf(«Количество книг не может бытьотрицательным числом! Введите повторно!\n»);
scanf("%d",&cur->inf.kol);
}
cur2->inf=cur->inf; //копировние информационных полейэлемента первого списка в элемент второго списка
cur2->inf.kol=0;//количество выданных книг в начале равно 0
printf(«Введете еще одну запись?(длявыхода напишите no; дляпродолжения-yes)\n»);
scanf("%s",s);
while(strcmp(strlwr(s),«no»)!=0&&strcmp(strlwr(s),«yes»)!=0)//пока не введён правильный вариант
{
printf(«Вы неверно ввели свой выбор,введите, пожалуйста, его еще раз\n»);
scanf("%s",s); //повторныйввод
}
}
return top; //возвращение указателя на начало первого списка
}
//-----------------------------------------------------\\
void vivodSp(el *cur) //вывод списка
{
clrscr();
printf(«Текущий список:\n»);
if(cur==NULL) printf(«Перед тем, как выводитьсписок, необходимо его создать!»);
else
{
printf(«Фамилия автора\tНазвание книги\tГод издания\tКоличество экземпляров\n»);
while(cur!=NULL) //печатьсписка пока не достигнут конец списка, если количество книг больше нуля (нужнодля второго списка)
{
if(cur->inf.kol>0)printf(" %s\t\t\t%s\t %d\t\t\t %d\n",cur->inf.avt,cur->inf.nazv,cur->inf.god,cur->inf.kol);
cur=cur->next; //переходк следующему элементу
}
}
getch();
}
//--------------------------------------------------------------\\
voidvidacha(el *cur,el *cur2)
{
char iskA[10],iskN[10];
int n=0; //результат поиска
clrscr();
if(cur==NULL) printf(«Перед тем, как производитьвыдачу книг, необходимо создать список!»);
else
{
printf(«Введите интересующего Васавтора:\n»); //ввод искомого автора икниги
scanf("%s",iskA);
printf(«Введите интересующую Васкнигу:\n»);
scanf("%s",iskN);
while(cur!=NULL) //покане конец списка
{
if((strcmp(cur->inf.avt,iskA)==0)&&(strcmp(cur->inf.nazv,iskN)==0)&&cur->inf.kol>0) //если элемент содержитсведения о нужной книге и есть свободные в наличии
{
cur->inf.kol--;//уменьшаем количество в первом списке
cur2->inf.kol++;//и увеличиваем во втором
n++; //поиск успешен
printf(«Книга выдана на руки!»);
break; //конец поиска
}
else if((strcmp(cur->inf.avt,iskA)==0)&&(strcmp(cur->inf.nazv,iskN)==0)&&cur->inf.kol==0) //если свободных нет
{
printf(«Все книги находятся наруках!»);
n++; //поиск успешен
break; //конец поиска
}
cur=cur->next; //переходк следующем элементу
}
if(n==0) printf(«Такойкниги вообще нет!»);
}
getch();
}
//---------------------------------------------------------------------\\
void dobEl(el *cur, el *cur2) //добавлениенового элемента
{el *x,*x2;
clrscr();
if(cur==NULL) printf(«Перед тем, как добавлятьэлементы в список, необходимо его создать!»);
else
{
while(cur->next!=NULL)cur=cur->next; //поиск конца списка
while(cur2->next!=NULL)cur2=cur2->next; //аналогично со вторым
x=(el*)malloc(sizeof(el)); //выделение памяти под новый элемент
x2=(el*)malloc(sizeof(el)); //аналогичный действия для второго списка
printf(«Введите данные на новыйэлемент:\n»); //ввод информационных полей
printf(«Введите фамилию и инициалыавтора:\n»);
scanf("%s",x->inf.avt);
printf(«Введите название книги:\n»);
scanf("%s",x->inf.nazv);
printf(«Введите год издания книги:\n»);
scanf("%d",&x->inf.god);
while(x->inf.god
{
printf(«Год издания не может бытьотрицательным числом! Введите повторно!\n»);
scanf("%d",&x->inf.god);
}
printf(«Введите количество экземпляровкниги:\n»);
scanf("%d",&x->inf.kol);
while(x->inf.kol
{
printf(«Количество книг не может бытьотрицательным числом! Введите повторно!\n»);
scanf("%d",&x->inf.kol);
}
x2->inf=x->inf; //копирование информационных полей
x2->inf.kol=0;//в начале количество выданных книг-0
printf(«Новый элемент добавлен!\n»);
x->next=NULL; //обнулениеуказателя на следующий элемент добавляемого элемента
cur->next=x;//последний (пока что последний)элемент списка указывает на следующий элемент(добавляемый)
x->pred=cur; //указательна предыдущий элемент нового элемента равен последнему
cur=x; //теперь добавленный элемент-последний
x2->next=NULL; //аналогичнодля второго списка
cur2->next=x2;
x2->pred=cur2;
cur2=x2;
}
}
//---------------------------------------------------------------------\\
void delel(el**top,el **top2) //удаление элементов
{
el *cur=*top,*cur2=*top2; //текущие указатели списков равны указателям навершины списков
int n=0; //результат поиска
char isk[20]; //фамилия искомого автора
clrscr();
if(cur==NULL) printf(«Перед тем, как удалятьэлементы из списка, создайте его!\n»);
else
{
printf(«Введите фамилию автора, книгикоторого должны быть удалены:\n»);
scanf("%s",isk); //вводфамилии искомого автора(он же удаляемый)
while(cur!=NULL) //покане конец списка
{
if(strcmp(cur->inf.avt,isk)==0)//если фамилия автора у элемента совпадает с введенной
{
n++; //поиск успешен
if(cur==*top) //еслиудаляемый элемент-вершина
{
*top=(*top)->next; //вершиной становится следующийэлемент
cur->next->pred=NULL; и //обнуление указателя новойвершины на предыдущий элемент
free(cur); //освобождение памяти под старую вершину
*top2=(*top2)->next; //по аналогии для второго
cur2->next->pred=NULL;
free(cur2);
}
else if(cur->next==NULL) //если это-последний элемент списка
{
cur->pred->next=NULL; //ссылка предпоследнего элемента наследующий обнуляется
free(cur); //память под старый конец списка освобождается
cur2->pred->next=NULL; //аналогично для второго
free(cur2);
}
else {
cur->next->pred=cur->pred; //ссылка на следующий элемент у предыдущего элемента(относительно удаляемого) приравнивается следующем элементу
cur->pred->next=cur->next; //ссылка на предыдущий элемент у следующего элемента(относительно удаляемого) приравнивается предыдущему элементу
free(cur); //память освобождается
cur2->next->pred=cur2->pred; //то же для второго
cur2->pred->next=cur2->next;
free(cur2);
}
}
cur=cur->next; //переходк следующему элементу
cur2=cur2->next; //аналогично
}
printf(«Было удалено %d книг данного автора»,n);
}
getch();
}
//---------------------------------------------------------------------\\
void vozvrat(el *cur,el *cur2) //возвращениеэлемента
{
chariskA[10],iskN[10];
int n=0;
clrscr();
if(cur==NULL) printf(«Перед тем, как производить поискв списке, необходимо его создать!»);
else
{
printf(«Введите интересующего Васавтора:\n»);
scanf("%s",iskA);
printf(«Введите интересующую Васкнигу:\n»);
scanf("%s",iskN);
while(cur!=NULL)
{
if((strcmp(cur->inf.avt,iskA)==0)&&(strcmp(cur->inf.nazv,iskN)==0)&&cur2->inf.kol>0)//если есть книги на руках (кол-во>0)
{
cur->inf.kol++;//увеличивается в первом списке количество
cur2->inf.kol--;//уменьшается во втором
n++;
printf(«Книга возвращена!»);
break;
}
else if((strcmp(cur->inf.avt,iskA)==0)&&(strcmp(cur->inf.nazv,iskN)==0)&&cur2->inf.kol
{
printf(«Все свои книги дома! Чужих намне надо)))»);
n++;
break;
}
cur=cur->next;
cur2=cur2->next;
}
if(n==0) printf(«Ксожалению, ни одной такой книги не найдено!\n»);
}
getch();
}
//---------------------------------------------------------------------\\
void sort(el*top) //сортировка
{
int k=1; //вспомогательный элемент, показывает были липерестановки или нет
el* cur; //указатель на текущий элемент
book dop; //переменная для временного хранения данных(используется при сортировке)
clrscr();
if(top==NULL) printf(«Перед тем, как сортироватьсписок, необходимо его создать!»);
else
{
while(k!=0) //пока не будет перестановок
{
k=0; //перстановок нет
for(cur=top;cur->next!=NULL;cur=cur->next)//пока указатель на следующий элемент у текущего не равен NULL
if(strcmp(cur->inf.avt,cur->next->inf.avt)>0)//если следующий элемент меньше, чем текущий
{
dop=cur->inf; //занесениев буфер данных текущего элемента
cur->inf=cur->next->inf; //переписывание в текущий данные следующего
cur->next->inf=dop; //переписывание в следующий данныеиз буфера
k=1; //перестановки есть
}
}
}
}
//---------------------------------------------------------------------\\
void saveIT(el *cur,el *cur2) //сохранениев файл
{
FILE *f1,*f2; //файлы
f1=fopen(«Base.txt»,«wb»); //файл для первого списка
f2=fopen(«Out.txt»,«wb»); //для второго
if(f1==NULL||f2==NULL) printf(«Чтоё-тоне грузится: глюк)»);
else
{
while(cur!=NULL) //покане конец списка
{
fwrite(&cur->inf,sizeof(el),1,f1); //записьданных текущего элемента в файл
fwrite(&cur2->inf,sizeof(el),1,f2);//то же
cur=cur->next; //переходк следующему элементу
cur2=cur2->next;//то же
}
printf(«Списки сохраненыуспешно!»);
fcloseall(); //закрытие файлов
}
getch();
}
//---------------------------------------------------------------------\\
void loadIT(el **top,el **top2)//чтение файлов
{
el*cur,*pr,*tail,*tail2,*cur2; //указатели
FILE *f1,*f2; //файлы
clrscr();
*top2=*top=tail=tail2=NULL; //обнулениессылок на хвост и вершину
f1=fopen(«Base.txt»,«rb»); //открытие файла Base.txt
f2=fopen(«Out.txt»,«rb»); //открытие файла Out.txt
if(f1==NULL||f2==NULL) printf(«Чтоё-тоне грузится: глюк)»);//если файлов нет
else
{
while(!feof(f1)) //покане конец файла
{
cur=(el*)malloc(sizeof(el)); //выделение памяти под новый элемент (далее текущий)
cur->next=NULL; //обнулениеуказателя на следующий элемент текущего элемента
cur->pred=tail;//присваивание указателя на предыдущий элемент текущего элемента хвосту списка
if((*top)==NULL)(*top)=cur; //если указатель на начало списка пуст, тоуказателем на начало списка становится текущий элемент
else tail->next=cur; //если нет, то указателем на хвостсписка становится текущий элемент
tail=cur; //указатель на хвост становится приравниваетсятекущему элементу
cur2=(el*)malloc(sizeof(el)); //аналогично для второго элемента
cur2->next=NULL;
cur2->pred=tail2;
if((*top2)==NULL)(*top2)=cur2;
elsetail2->next=cur2;
tail2=cur2;
fread(&cur->inf,sizeof(el),1,f1);//считывание с файла
fread(&cur2->inf,sizeof(el),1,f2);
}
fcloseall(); //закрываем файлы
printf(«Списки успешно загружены изфайлов!»);
}
getch();
}
//---------------------------------------------------------------------\\
void main() //основная программа
{
int n=0;
el*top=NULL,*top2=NULL;
while(n!=11)
{
clrscr();
printf(«Введите номер пункта длявыполнения:\n»);
printf(«1.Заполнить список\n»);
printf(«2.Загрузить списки из файлов\n»);
printf(«3.Отсортировать текущий список\n»);
printf(«4.Вывести текущий список\n»);
printf(«5.Вывести текущий списоквыданных на руки книг\n»);
printf(«6.Добавить новый элемент\n»);
printf(«7.Удалить из списка книгизаданного автора\n»);
printf(«8.Выдать книгу на руки\n»);
printf(«9.Вернуть книгу в библиотеку\n»);
printf(«10.Сохранить списки в файл\n»);
printf(«11.Выход из программы\n»);
printf(«Вашвыбор:\n»);
scanf("%d",&n);
while(n>11||n
{
printf(«Такого пункта нет! Введитеповторно:\n»);
scanf("%d",&n);
}
if(n==1)top=vvodSp(&top2);
else if(n==2)loadIT(&top,&top2);
else if(n==3){sort(top); sort(top2);}
else if(n==4)vivodSp(top);
else if(n==5)vivodSp(top2);
else if(n==6){dobEl(top,top2); sort(top); sort(top2);}
else if(n==7)delel(&top,&top2);
else if(n==8)vidacha(top,top2);
else if(n==9)vozvrat(top,top2);
else if(n==10)saveIT(top,top2);
}
}

Приложение Б
Результаты работыпрограммы
/>

/>


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

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем реферат самостоятельно:
! Как писать рефераты
Практические рекомендации по написанию студенческих рефератов.
! План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом.
! Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач.
! Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты.
! Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ.

Читайте также:
Виды рефератов Какими бывают рефераты по своему назначению и структуре.