сится в корень дерева с помощью функции f i rst, затем организуется цикл по всем остальным нарушениям данной автомашины, если они есть. Нарушения добавляются в список с помощью функции search insert.
Далее аналогичные действия производятся для всех остальных автомашин. Конечно, можно было бы не искать требуемый узел и конец списка нарушений заново для каждого нарушения из списка, а хранить соответствующие указатели, но это потребовало бы дополнительного кода и не дало бы существенного выигрыша во времени, так как база считывается всего один раз до начала работы.
Наверно, вы обратили внимание на то, что в меню четыре пзкта, а в операторе switch главной функции пять вариантов выбора. Последний вариант не входит в интерфейс пользователя, он может понадобиться программисту при отладке или сопровождении программы. Для удобства отладки была написана рекурсивная функция вывода всей базы printdbase. Она аналогична функции вывода базы в файл.
Функция поиска с включением searchinsert исчерпывающе, на наш взгляд, документирована в программе. Кроме того, описание аналогичной функции приведено в Учебнике на с. 125, поэтому мы не будем рассматривать ее подробно.
70 книг по IT, которые надо прочесть. Как писать хорошо, языки, тесты, БД, безопасность, soft skills
Лучше обратим наше внимание на более интересную функцию rerovenode, которая удаляет узел из дерева.
Процесс удаления можно разбить на этапы:
□ найти узел, который будет поставлен на место удаляемого;
□ реорганизовать дерево так, чтобы не нарушились его свойства;
□ присоединить новый узел к узлу-предку удаляемого узла;
□ освободить память из-под удаляемого узла.
Удаление узла происходит по-разному в зависимости от его расположения в дереве. Если узел является листом, то есть не имеет потомков, достаточно обнулить соответствующий указатель узла-предка (рис. 9.1). Если узел имеет только одного потомка, то этот потомок ставится на место удаляемого узла, а в остальном дерево не изменяется (рис. 9.2).
Хуже всего, когда у узла есть оба потомка, но и здесь есть простой особый случай: если у его правого потомка нет левого потомка, удаляемый узел заменяется своим правым потомком, а левый потомок удаляемого узла подключается вместо отсутствующего левого потомка. Согласимся, что звучит не очень понятно, поэтому рассмотрите этот случай на рис. 9.3.
В общем же случае на место удаляемого узла помещается самый левый лист его правого поддерева (или наоборот — самый правый лист его левого поддерева). Это не нарушает свойств дерева поиска. Этот случай иллюстрируется на рис. 9.4.
Рис. 9.2. Удаление узла с одним потомком
Рис. 9.3. Удаление узла с двумя потомками
Нельзя читать книги суфиев!
Рис. 9.1. Удаление узла, не имеющего потомков
Рис. 9.4. Удаление узла (общий случай)
Корень дерева удаляется аналогичным образом за исключением того, что заменяющий его узел не требуется подсоединять к узлу-предку. Вместо этого обновляется указатель на корень дерева.
Рассмотрим реализацию этого алгоритма в программе remove node. В функцию передается указатель на удаляемый узел р. Сначала находим указатель на узел у, который должен заменить удаляемый.
Если у узла р нет левого поддерева, на его место будет поставлена вершина (возможно, пустая) его правого поддерева (оператор И).
Иначе, если у узла р нет правого поддерева, на его место будет поставлена вершина его левого поддерева (оператор 12).
В противном случае оба поддерева узла существуют, и для определения заменяющего узла вызывается вспомогательная функция descent, выполняющая спуск по дереву.
В этой функции прежде всего проверяется особый случай, описанный выше (оператор 1). Если же условие отсутствия левого потомка у правого потомка удаляемого узла не выполняется, организуется цикл (оператор 2), на каждой итерации ко1Х)рого указатель на текущий узел запоминается в переменной prev, а указатель у смещается вниз и влево по дереву до того момента, пока не станет ссылаться на узел, не имеющий левого потомка, — он-то нам и нужен!
В операторе 3 к этой пустующей ссылке присоединяется левое поддерево удаляемого узла. Перед тем как присоединять к этому узлу правое поддерево удаляемого узла (оператор 5), требуется пристроить его собственное правое поддерево. Мы присоединяем его к левому поддереву предка заменяющего узла у (оператор 4), поскольку этот узел перейдет на новое место.
Функция descent возвращает указатель на узел, заменяющий удаляемый. Если мы удаляем корень дерева, надо обновить указатель на корень (оператор 14), иначе — присоединить этот указатель к соответствующему поддереву предка удаляемого узла (оператор 15).
После того как узел удален из дерева, освобождается занимаемая им память (опе- ратор 16).
Для дерева большой размерности глубина рекурсии может быть весьма значительной, что может привести к переполнению стека. Более безопасно, хотя и более сложно, реализовы-вать рекурсию самостоятельно с помощью структуры данных *стек .
Как вы могли убедиться, работа с динамическими структурами данных требует внимания и тщательности. Однако можно заметить, что в различных задачах изменяется только информационная часть компонент, а принципы работы со стеком, очередью или списком остаются неизменными, поэтому фактически функции для работы с каждой из этих структур пишутся и отлаживаются один раз. Разработчики языка тоже заметили этот факт и включили в стандартную библиотеку С++ так называемые шаблоны, реализующие основные динамические структуры данных. Во второй части практикума мы рассмотрим применение этих шаблонов. Для их понимания вам придется изучить многие средства и возможности С++, но предпринятые усилия быстро себя окупят.
Давайте повторим наиболее важные моменты этого семинара.
1. Динамическими структурами данных называются блоки в динамической памяти, связанные друг с другом с помощью указателей.
2. Динамические структуры различаются способами связи отдельных элементов и допустимыми операциями над ними.
3. Элемент любой динамической структуры данных состоит из информационных полей и полей указателей.
4. Наиболее распространенными структурами являются линейный список (од-носвязный или двусвязный), стек, очередь и бинарное дерево.
5. Для стека определены операции помещения элемента в вершину и выборки элемента из вершины.
6. Для очереди определены операции помещения элемента в конец очереди и выборка элемента из ее начала.
7. Допускается вставлять и удалять элементы в произвольное место линейного списка.
8. Бинарное дерево состоит из узлов, каждый из которых содержит, кроме данных, не более двух ссылок на различные бинарные деревья. На каждый узел имеется ровно одна ссылка.
9. Каждый узел дерева характеризуется уникальным ключом.
10. Допускается вставлять и удалять элементы в произвольное место дерева.
И. Если для каждого узла все ключи его левого поддерева меньше ключа этого узла, а все ключи его правого поддерева — больше, то такое дерево называется деревом поиска. В дереве поиска можно найти элемент по ключу, двигаясь от корня и переходя на левое или правое поддерево в зависимости от значения ключа в каждом узле, что гораздо эффективнее поиска в списке.
12. Динамические структуры в некоторых случаях более эффективно реализовы-вать с помощью массивов (см. Учебник, с. 126).
Задания этого семинара соответствуют приведенным в Учебнике на с. 165.
Составить программу, которая содержит динамическую информацию о наличии автобусов в автобусном парке.
Сведения о каждом автобусе включают:
□ фамилию и инициалы подателя;
□ номер маршрута. Программа должна обеспечивать:
□ начальное формирование данных обо всех автобусах в парке в виде списка;
□ при выезде каждого автобуса из парка вводится номер автобуса, и программа удаляет данные об этом автобусе из списка автобусов, находящихся в парке, и записывает эти данные в список автобусов, находящихся на маршруте;
□ при въезде каждого автобуса в парк вводится номер автобуса, и программа удаляет данные об этом автобусе из списка автобусов, находящихся на маршруте, и записывает эти данные в список автобусов, находящихся в парке;
□ по запросу выдаются сведения об автобусах, находящихся в парке, или об автобусах, находящихся на маршруте.
Составить программу, которая содержит текущую информацию о книгах в библиотеке.
Сведения о книгах включают:
□ фамилию и инициалы автора;
□ количество экземпляров данной книги в библиотеке. Программа должна обеспечивать:
□ начальное формирование данных обо всех книгах в библиотеке в виде двоичного дерева;
□ добавление данных о книгах, вновь поступающих в библиотеку;
□ удаление данных о списываемых книгах;
□ по запросу выдаются сведения о наличии книг в библиотеке, упорядоченные по годам издания.
Составить программу, которая содержит текущую информацию о заявках на авиабилеты.
Каждая заявка включает:
□ фамилию и инициалы пассажира;
□ желаемую дату вылета. Программа должна обеспечивать:
□ хранение всех заявок в виде списка;
□ добавление заявок в список;
□ вывод заявок по заданному номеру рейса и дате вылета;
□ вывод всех заявок.
Составить программу, которая содержит текущую информацию о заявках на авиабилеты.
Каждая заявка включает:
□ фамилию и инициалы пассажира;
□ желаемую дату вылета; Программа должна обеспечивать:
□ хранение всех заявок в виде двоичного дерева;
□ добавление и удаление заявок;
□ по заданному номеру рейса и дате вылета вывод заявок с их последующим удалением;
□ вывод всех заявок.
Составить программу, которая содержит текущую информацию о книгах в библиотеке.
Сведения о книгах включают:
□ фамилию и инициалы автора;
□ количество экземпляров данной книги в библиотеке. Программа должна обеспечивать:
□ начальное формирование данных обо всех книгах в библиотеке в виде списка;
□ при выдаче каждой книги на руки вводится номер УДК, и программа уменьшает значение количества книг на единицу или выдает сообщение о том, что требуемой книги в библиотеке нет или требуемая книга находится на руках;
□ при возвращении каждой книги ввод1тся номер УДК, и программа увеличивает значение количества книг на единицу;
□ по запросу выдаются сведения о наличии книг в библиотеке.
Составить программу, которая содержит динамическую информацию о наличии автобусов в автобусном парке.
Сведения о каждом автобусе включают:
Источник: www.pmbk.ru
Динамические структуры данных
Составить программу, которая содержит динамическую информацию о наличии автобусов в автобусном парке.
Сведения о каждом автобусе содержат:
- номер автобуса;
- фамилию и инициалы водителя;
- номер маршрута.
Программа должна обеспечивать:
- начальное формирование данных о всех автобусах в парке в виде списка;
- при выезде каждого автобуса из парка вводится номер автобуса, и программа удаляет данные об этом автобусе из списка автобусов, находящихся в парке, и записывает эти данные в список автобусов, находящихся на маршруте;
- при въезде каждого автобуса в парк вводится номер автобуса, и программа удаляет данные об этом автобусе из списка автобусов, находящихся на маршруте, и записывает эти данные в список автобусов, находящихся в парке;
- по запросу выдаются сведения об автобусах, находящихся в парке, или об автобусах, находящихся на маршруте.
Составить программу, которая содержит текущую информацию о книгах в библиотеке.
Сведения о книгах содержат:
- номер УДК;
- фамилию и инициалы автора;
- название;
- год издания;
- количество экземпляров данной книги в библиотеке.
Программа должна обеспечивать:
- начальное формирование данных о всех книгах в библиотеке в виде двоичного дерева;
- добавление данных о книгах, вновь поступающих в библиотеку;
- удаление данных о списываемых книгах;
- по запросу выдаются сведения о наличии книг в библиотеке, упорядоченные по годам издания.
Составить программу, которая содержит текущую информацию о заявках на авиабилеты.
Каждая заявка содержит:
- пункт назначения;
- номер рейса;
- фамилию и инициалы пассажира;
- желаемую дату вылета.
Программа должна обеспечивать:
Составить программу, которая содержит текущую информацию о заявках на авиабилеты.
Каждая заявка содержит:
- пункт назначения;
- номер рейса;
- фамилию и инициалы пассажира;
- желаемую дату вылета.
Программа должна обеспечивать:
Составить программу, которая содержит текущую информацию о книгах в библиотеке.
Сведения о книгах содержат:
- номер УДК;
- фамилию и инициалы автора;
- название;
- год издания;
- количество экземпляров данной книги в библиотеке.
Программа должна обеспечивать:
- начальное формирование данных о всех книгах в библиотеке в виде списка;
- при взятии каждой книги вводится номер УДК, и программа уменьшает значение количества книг на единицу или выдает сообщение о том, что требуемой книги в библиотеке нет, или требуемая книга находится на руках;
- при возвращении каждой книги вводится номер УДК, и программа увеличивает значение количества книг на единицу;
- по запросу выдаются сведения о наличии книг в библиотеке.
Составить программу, которая содержит динамическую информацию о наличии автобусов в автобусном парке.
Сведения о каждом автобусе содержат:
- номер автобуса;
- фамилию и инициалы водителя;
- номер маршрута;
- признак того, где находится автобус — на маршруте или в парке.
Программа должна обеспечивать:
- начальное формирование данных о всех автобусах в виде списка;
- при выезде каждого автобуса из парка вводится номер автобуса, и программа устанавливает значение признака «автобус на маршруте»;
- при въезде каждого автобуса в парк вводится номер автобуса, и программа устанавливает значение признака «автобус в парке»;
- по запросу выдаются сведения об автобусах, находящихся в парке, или об автобусах, находящихся на маршруте.
Составить программу, отыскивающую проход по лабиринту.
Лабиринт представляется в виде матрицы, состоящей из квадратов. Каждый квадрат либо открыт, либо закрыт. Вход в закрытый квадрат запрещен. Если квадрат открыт, то вход в него возможен со стороны, но не с угла. Каждый квадрат определяется его координатами в матрице.
Программа находит проход через лабиринт, двигаясь от заданного входа. После отыскания прохода программа выводит найденный путь в виде координат квадратов. Для хранения пути использовать стек.
Гаражная стоянка имеет одну стояночную полосу, причем въезд и выезд находятся на одном конце полосы. Если владелец автомашины приходит забрать свой автомобиль, который не является ближайшим к выходу, то все автомашины, загораживающие проезд, удаляются, машина данного владельца выводится со стоянки, а другие машины возвращаются на стоянку в исходном порядке.
Написать программу, которая моделирует процесс прибытия и отъезда машин. Прибытие или отъезд автомашины задается командной строкой, которая содержит признак прибытия или отъезда и номер машины. Программа должна выводить сообщение при прибытии или выезде любой машины. При выезде автомашины со стоянки сообщение должно содержать число раз, которое машина удалялась со стоянки для обеспечения выезда других автомобилей.
Составить программу, моделирующую заполнение гибкого магнитного диска.
Общий объем памяти на диске $360$ Кбайт. Файлы имеют произвольную длину от $18$ байт до $32$ Кбайт. В процессе работы файлы либо записываются на диск, либо удаляются с него.
В начале работы файлы записываются подряд друг за другом. После удаления файла на диске образуется свободный участок памяти, и вновь записываемый файл либо размещается на свободном участке, либо, если файл не вмещается в свободный участок, размещается после последнего записанного файла.
В случае, когда файл превосходит длину самого большого свободного участка, выдается аварийное сообщение. Требование на запись или удаление файла задается в командной строке, которая содержит имя файла, его длину в байтах, признак записи или удаления. Программа должна выдавать по запросу сведения о занятых и свободных участках памяти на диске.
Указание: следует создать список занятых участков и список свободных участков памяти на диске.
В файловой системе каталог файлов организован как линейный список.
Для каждого файла в каталоге содержатся следующие сведения:
- имя файла;
- дата создания;
- количество обращений к файлу.
Составить программу, которая обеспечивает:
- начальное формирование каталога файлов;
- вывод каталога файлов;
- удаление файлов, дата создания которых меньше заданной;
- выборку файла с наибольшим количеством обращений.
Программа должна обеспечивать диалог с помощью меню и контроль ошибок при вводе.
Предметный указатель организован как линейный список.
Каждая компонента указателя содержит слово и номера страниц, на которых это слово встречается. Количество номеров страниц, относящихся к одному слову, от одного до десяти.
Составить программу, которая обеспечивает:
- начальное формирование предметного указателя;
- вывод предметного указателя;
- вывод номеров страниц для заданного слова.
Программа должна обеспечивать диалог с помощью меню и контроль ошибок при вводе.
Текст помощи для некоторой программы организован как линейный список.
Каждая компонента текста помощи содержит термин (слово) и текст, содержащий пояснения к этому термину. Количество строк текста, относящихся к одному термину, от одной до пяти.
Составить программу, которая обеспечивает:
- начальное формирование текста помощи;
- вывод текста помощи;
- вывод поясняющего текста для заданного термина.
Программа должна обеспечивать диалог с помощью меню и контроль ошибок при вводе.
Картотека в бюро обмена квартир организована как линейный список.
Сведения о каждой квартире содержат:
- количество комнат;
- этаж;
- площадь;
- адрес.
Составить программу, которая обеспечивает:
- начальное формирование картотеки;
- ввод заявки на обмен;
- поиск в картотеке подходящего варианта: при равенстве количества комнат и этажа и различий площадей в пределах $10%$ выводится соответствующая карточка и удаляется из списка, в противном случае поступившая заявка включается в список;
- вывод всего списка.
Программа должна обеспечивать диалог с помощью меню и контроль ошибок при вводе.
Англо-русский словарь построен как двоичное дерево.
Каждая компонента содержит английское слово, соответствующее ему русское слово и счетчик количества обращений к данной компоненте.
Первоначально дерево формируется согласно английскому алфавиту. В процессе эксплуатации словаря при каждом обращении к компоненте в счетчик обращений добавляется единица.
Составить программу, которая:
- обеспечивает начальный ввод словаря с конкретными значениями счетчиков обращений;
- формирует новое представление словаря в виде двоичного дерева по следующему алгоритму: а) в старом словаре ищется компонента с наибольшим значением счетчика обращений; б) найденная компонента заносится в новый словарь и удаляется из старого; в) переход к п. а) до исчерпания исходного словаря;
- производит вывод исходного и нового словарей.
Программа должна обеспечивать диалог с помощью меню и контроль ошибок при вводе.
Анкета для опроса населения содержит две группы вопросов.
Первая группа содержит сведения о респонденте:
- возраст;
- пол;
- образование (начальное, среднее, высшее).
Вторая группа содержит собственно вопрос анкеты, ответ на который либо ДА, либо НЕТ.
Составить программу, которая:
- обеспечивает начальный ввод анкет и формирует из них линейный список;
- на основе анализа анкет выдает ответы на следующие вопросы: а) сколько мужчин старше $40$ лет, имеющих высшее образование, ответили ДА на вопрос анкеты; а) сколько женщин моложе $30$ лет, имеющих среднее образование, ответили НЕТ на вопрос анкеты; а) сколько мужчин моложе $25$ лет, имеющих начальное образование, ответили ДА на вопрос анкеты;
- производит вывод всех анкет и ответов на вопросы.
Программа должна обеспечивать диалог с помощью меню и контроль ошибок при вводе.
Составить программу, которая содержит текущую информацию о книгах в библиотеке.
Сведения о книгах содержат:
- номер УДК;
- фамилию и инициалы автора;
- название;
- год издания;
- количество экземпляров данной книги в библиотеке.
Программа должна обеспечивать:
- начальное формирование данных о всех книгах в библиотеке в виде списка;
- добавление данных о книгах, вновь поступающих в библиотеку;
- удаление данных о списываемых книгах;
- по запросу выдаются сведения о наличии книг в библиотеке, упорядоченные по годам издания.
На междугородней телефонной станции картотека абонентов, содержащая сведения о телефонах и их владельцах, организована как линейный список.
Составить программу, которая:
- обеспечивает начальное формирование картотеки в виде линейного списка;
- производит вывод всей картотеки;
- вводит номер телефона и время разговора;
- выводит извещение на оплату телефонного разговора.
Программа должна обеспечивать диалог с помощью меню и контроль ошибок при вводе.
На междугородней телефонной станции картотека абонентов, содержащая сведения о телефонах и их владельцах, организована как двоичное дерево.
Составить программу, которая:
- обеспечивает начальное формирование картотеки в виде двоичного дерева;
- производит вывод всей картотеки;
- вводит номер телефона и время разговора;
- выводит извещение на оплату телефонного разговора.
Программа должна обеспечивать диалог с помощью меню и контроль ошибок при вводе.
Автоматизированная информационная система на железнодорожном вокзале содержит сведения об отправлении поездов дальнего следования. Для каждого поезда указывается:
- номер поезда;
- станция назначения;
- время отправления.
Данные в информационной системе организованы в виде линейного списка.
Составить программу, которая:
- обеспечивает первоначальный ввод данных в информационную систему и формирование линейного списка;
- вводит номер поезда и выводит все данные об этом поезде;
- вводит название станции назначения и выводит данные обо всех поездах, следующих до этой станции.
Программа должна обеспечивать диалог с помощью меню и контроль ошибок при вводе.
Автоматизированная информационная система на железнодорожном вокзале содержит сведения об отправлении поездов дальнего следования.
Для каждого поезда указывается:
- номер поезда;
- станция назначения;
- время отправления.
Данные в информационной системе организованы в виде двоичного дерева.
Составить программу, которая:
- обеспечивает первоначальный ввод данных в информационную систему и формирование двоичного дерева;
- вводит номер поезда и выводит все данные об этом поезде;
- вводит название станции назначения и выводит данные о всех поездах, следующих до этой станции.
Программа должна обеспечивать диалог с помощью меню и контроль ошибок при вводе.
Образец выполнения (вариант №5)
Условие задачи
Составить программу, которая содержит текущую информацию о книгах в библиотеке.
Сведения о книгах содержат:
- номер УДК;
- фамилию и инициалы автора;
- название;
- год издания;
- количество экземпляров данной книги в библиотеке.
Программа должна обеспечивать:
- начальное формирование данных о всех книгах в библиотеке в виде списка;
- при взятии каждой книги вводится номер УДК, и программа уменьшает значение количества книг на единицу или выдает сообщение о том, что требуемой книги в библиотеке нет, или требуемая книга находится на руках;
- при возвращении каждой книги вводится номер УДК, и программа увеличивает значение количества книг на единицу;
- по запросу выдаются сведения о наличии книг в библиотеке.
Источник: www.proglabs.ru
Составить программу которая содержит текущую информацию о книгах
← →
Ник11111111 ( 2005-12-19 18:39 ) [0]
Привет всем! У меня такая проблема, осталась одна лабораторная по Pascal:
Составить программу, которая содержит текущую информацию о книгах в библиотеке. Сведения о книгах содержат:
номер УДК;
фамилию и инициалы автора;
название;
год издания;
количество экземпляров данной книги в библиотеке.
Программа должна обеспечивать следующие функциональные возможности:
-начальное формирование данных обо всех книгах в библиотеке в виде списка;
-при взятии каждой книги вводится номер УДК, и программа уменьшает значение количества книг на единицу
или выдает сообщение о том, что требуемой книги в библиотеке нет или она находится на руках;
-при возвращении каждой книги вводится номер УДК, и программа увеличивает значение количества книг на единицу;
по запросу выдаются сведения о наличии книг в библиотеке.
а если и не так, то смысл тот. )))
← →
Санёк ( 2005-12-19 21:42 ) [9]
хех.
это не лаба, это курсач!
код готовый никто за так давать не будет.
тут либо утром деньги, днем стулья, днем деньги вечером стулья, либо вопросы по делу — как реализовать ту или иную фичу.
если приложение не консольное — используй ini файлы — очень удобно.
иначе — работа с файлами.
Если это действительно лаба, то кто-нить из группы уже точно сдал её. Просто подходишь к нему, и за бабосы предлагаешь ему, чтобы он сделал за тебя эту лабу. И всё прокомментировал, чтобы тебе преподу легче объяснить было.
Санёк (19.12.05 21:42) [9]
Это лаба. даже у вечерников
Представляй. Файл храню в виде UDK всё остальное.
Чем он прост?
Реализацией?
Возьмём конкретную задачу: подвальная библиотека, 2 000 книг.
Я читаю файл TStringList»ом, вовсю использую Values[. ].
Источник: delphimaster.net