Разработка программы, реализующей алгоритм бинарного дерева
Файловый менеджер (англ. file manager) — компьютерная программа, которая предоставляет интерфейс пользователя для работы с файлами и файловой системой. Как правило данные программы позволяют выполнять следящие операции над файлами — создание, копирование, удаление, открытие/ просмотр/ проигрывание, редактирование, переименование, изменение свойств и атрибутов, назначение прав, перемещение… Читать ещё >
Разработка программы, реализующей алгоритм бинарного дерева (реферат, курсовая, диплом, контрольная)
- ВВЕДЕНИЕ
- ТЕОРЕТИЧЕСКИЙ ВОПРОС
- Directory Opus
- DOS Navigator
- FAR Manager
- FreeCommander
- Nomad
- Nomad.NET
- Total Commander
- Unreal Commander
- ViewFD
- ViewFD — очень легкий и компактный файловый менеджер
- Проводник Windows
- Q-Dir
- ПОСТАНОВКА ЗАДАЧИ
- ОПИСАНИЕ ПРОГРАММЫ
- РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ
- ТЕСТИРОВАНИЕ
- ВЫВОДЫ
- ЛИТЕРАТУРА
- ПРИЛОЖЕНИЕ
- ВВЕДЕНИЕ
- Теоретический вопрос — Обзор файловых менеджеров для Windows.
- Следует рассмотреть: что представляет собой файловый менеджер, какие бывают файловые менеджеры, и основные файловые менеджеры разработанные под ОС Windows.
- Практический вопрос — Разработать программу, реализующую алгоритм бинарного дерева (20 элементов). При заполнении дерева элементы должны располагаться в отсортированном порядке согласно ключу.
- Для выполнения задачи понадобится структура для бинарного дерева, а также функции для добавления, удаления, поиска и вывода на экран.
- ТЕОРЕТИЧЕСКИЙ ВОПРОС
- Файловый менеджер (англ. file manager) — компьютерная программа, которая предоставляет интерфейс пользователя для работы с файлами и файловой системой. Как правило данные программы позволяют выполнять следящие операции над файлами — создание, копирование, удаление, открытие/ просмотр/ проигрывание, редактирование, переименование, изменение свойств и атрибутов, назначение прав, перемещение и поиск. Помимо этих, так называемых, основных функций, многие файловые менеджеры также включают ряд дополнительных возможностей, таких как резервное копирование, работа с сетью (через NFS, FTP и т. п.), управление принтерами и пр.
- Файловые менеджеры делятся на:
- · Двупанельные
- · Пространственные и навигационные
Наиболее известные двупанельные файловые менеджеры
· Directory Opus
· DOS Navigator
· FAR Manager
· FreeCommander
· Nomad и Nomad.NET
· Total Commander
· Unreal Commander
· ViewFD
Навигационные файловые менеджеры
· Проводник Windows
· Q-Dir
Directory Opus
Directory Opus был впервые выпущен для компьютеров Commodore AMIGA в 1990 году. Разработчик программы — компания GPSoftware. Последняя версия программы совместима со всеми версиями Windows .
Рисунок 1 — Directory Opus
Данный файловый менеджер сочетает в себе простую работу с файлами и гибкостью настроек. Он также обладает полностью настраиваемым интерфейсом, встроенным ftp-клиентом с поддержкой SSL и SSH/SFTP, встроенный SMTP-клиентом, внутренней поддержкой архивов, просмотром мультимедиа, конвертацией графических файлов, встроенным командным языком, расширенными функциями поиска и переименования файлов, настраиваемыми горячими клавишами для управления.
Directory Opus может встраиваться в систему, в том числе полностью заменять собой Проводник…
DOS Navigator
DOS Navigator — консольный файловый менеджер для OS/2 и DOS. Разработчик программы — молдавская компания RITLabs. Основная идея заимствована у Norton Commander. Программа имеет две панели с директориями, верхнее меню с набором всех команд и нижнее меню, где располагаются наиболее часто используемые команды.
Среди преимуществ — при удалении файлов в «корзину» используется EMS-память, создание ссылок на объекты файловой системы, неограниченное количество панелей, поддержка большого числа архиваторов, а также встроенные приложения.
В числе встроенных приложений можно отметить редактор электронных таблиц, дисков, терминал, калькулятор, просмотр баз данных, расширенная утилита форматирования дисков.
UU-кодер/декодер, а также телефонную книжку.
Отдельно стоит отметить реализацию подобия многозадачности — можно свободно переключаться между встроенными приложениями выполняя при этом, например, операции форматирования и копирования в «фоновом» режиме.
Рисунок 2 — DOS Navigator
На сегодняшний день распространяется в открытых исходных кодах. Имеет несколько веток развития. Портирован под платформы Windows и Linux.
FAR Manager
Первая общедоступная версия FAR Manager была выпущена 10 сентября 1996 года и ориентирована на платформу Windows. На данный момент распространяется под лицензией BSD (модифицированной). Автор программы — Евгений Рошал.
Рисунок 3 — FAR Manager
FAR Manager как и многие другие менеджеры также наследует две панели, стандартную расцветку и систему команд (управление с клавиатуры) у известного файлового менеджера Norton Commander.
Программа может работать как в полноэкранном, так и в оконном режиме. Однако имеет недостатки интерфейса оконном режиме, схожие с DOS-программами (проблемы с закрытием при выключении системы, невозможность произвольного изменения текстового разрешения окон), которые проявляются в Windows 9x, но отсутствуют в семействе
Windows NT.
FAR поддерживает различные кодировки текстов, атрибуты файлов файловой системы NTFS, длинные имена файлов, может использовать системные функции для копирования файлов, имеет систему помощи и многоязычный интерфейс.
Рисунок 4 — Редактор FAR с плагином Colorer
Возможности FAR существенно расширяются благодаря плагинам различного назначения, например: подсветка синтаксиса в исходных текстах программ, управление принтерами, работа с FTPи SFTP-серверами, поиск и замена символов во множестве файлов одновременно, редактирование системного реестра
Windows, симметричное и асимметричное шифрование файлов, подготовка каталога сменных накопителей и многое другое.
Некоторые важные плагины (например, для работы с FTP, печати, сравнения файлов, работы с архивами, сетью) входят в поставку FAR, а остальные доступны для скачивания в интернете. Большинство плагинов написаны на Си/С++ и Паскале с использованием оригинального FAR API.
FreeCommander
FreeCommander обладает всеми необходимыми функциями для управления данными: удаление, перемещение, копирование, переименование папок и файлов, работа с архивами (ZIP, CAB, RAR), а также просматривание файлов в текстовом, бинарном и шестнадцатеричном виде. Интерфейс FreeCommander представляет собой двухпанельное окно (горизонтальное или вертикальное), программа полностью настраивается, а также поддерживает технологию Drag&Drop.
Рисунок 5 — FreeCommander
К основным возможности FreeCommander можно отнести опциональное дерево папок для каждой панели, вкладочный интерфейс, встроенный FTP клиент, легкий доступ к рабочему столу, системным папкам, панели управления и меню Пуск, затирание файлов, пакетное переименование, создание и проверка контрольных сумм MD5, а также мультиязычная поддержка.
Из дополнительных функций можно отметить поиск файлов внутри архивов, соединение и разделение больших файлов, синхронизацию и сравнение папок, просмотр и редактирование свойств файлов, подключение к удалённым серверам и работу с командной строкой.
Nomad
Nomad это мощный файловый менеджер написанный на языке Delphi. Впервые выпущен в 1998 году.
Рисунок 6 — Nomad
Программа имеет мощную систему фильтрации файлов, поддерживает поиск файла по множеству параметров, функцию Drag and Drop, копирование и вставку файлов из буфера обмена. Обладает полной настройкой клавиатурной раскладки и цветовой схемы, а также возможностью создавать свои панели инструментов. Nomad имеет мощный встроенный просмотрщик файлов и редактор текстовых файлов, который поддерживает различные кодовые таблицы (включая Unicode и UTF-8), и легко конфигурируемое меню утилит.
Достоинством Nomad является то, что все операции над файлами, открытие архивов, а также поиск в панели выполняются в отдельных потоках и не мешают работать с программой. На момент выхода Nomad был первым менеджером, в котором был реализован подобный функционал.
Nomad.NET
Работа над проектом началась 2008 году. Программа была полностью переписана (не включает в себя строк кода из предыдущего Nomad) и как следствие реализована совершенно по новому.
Рисунок 7 — Nomad.NET
Новый Nomad разработан изначально многопоточным, а значит почти все долгие операции выигрывают время при использовании многоядерного процессора.
Среди достоинств: полная поддержка Unicod, поддержка вкладок (которые в отличие от других менеджеров, не привязаны к панели), мощные системы закладок, поиска и фильтрации, многофункциональная панель управления, поддержка большого количества форматов архивов, FTP папок и плагинов Total Commander.
Total Commander
Первая версия программы стала доступна 25 сентября 1993 года и до 29 октября 2002 года называлась Windows Commander.
Рисунок 8 — Total Commander
К возможностям программы относятся многоязычный двухпанельный вкладочный графический интерфейс, полностью настраиваемые сочетания клавиш, меню и панель инструментов. Поддержка Drag&Drop, встроенный FTP-клиент, с поддержкой SSL/TLS, работа с архивами, как с подкаталогами, групповое переименование файлов, подсчёт и проверка контрольных сумм файлов (SHA1, MD5, CRC32), встроенный просмотрщик файлов, расширенный поиск, поддержка параллельного фонового выполнения и последовательной очереди операций над файлами.
Функциональность программы можно расширить с помощью следующих групп плагинов: архиваторные плагины (Packer Plugins, WCX), плагины внутренней программы просмотра (Lister Plugins, WLX), информационные плагины (Content plugins, WDX) и плагины быстрого поиска.
Unreal Commander
Внешним видом, функциональными возможностями и внутренней работой похож на Total Commander.
Рисунок 9 — Unreal Commander
Файловый менеджер имеет встроенный FTP-клиент, медиа-проигрыватель и просмотрщик графических файлов, отображает системные и скрытые файлы, может изменять их атрибуты, умеет разбирать/собирать файлы на части. Поддерживает работу с популярными архивами, drag-and-drop, юникод, табы, плагины (написанные, например, для Total Commander), настройку внутренних и внешних редакторов, синхронизацию каталогов, хранитель паролей и игнор-список. А также настройку горячих клавиш меню, цветовые схемы и темы оформления, интерфейс командной строки и интернациональную поддержку.
ViewFD
ViewFD — очень легкий и компактный файловый менеджер.
Рисунок 10 — ViewFD
Он содержит аудиои видеопроигрыватели (DirectShow, MCI), которые работают со своими списками (M3U, PLS), быстрый просмотр и слайд-шоу для файлов графики, редактирование изображений (с использованием геометрических эффектов, цветовых эффектов и настройки освещенности), группы изображений. Создание AVI файлов и HTML альбомов, калькулятор формул (с возможность построения графиков), просмотр и редактирование таблиц баз данных, выбор окон и заголовков, нажатия клавиш и содержимого экрана. Управление автозагрузкой и контроль запуска процессов, резервное копирование просмотр реестра (с возможностью расширенного поиска). Очистка дисков, директорий и файлов, предотвращающая накопление мусора и обеспечивающая конфиденциальность данных. Кодирование файлов, без контрольной суммы и заголовка (что значительно затрудняет несанкционированное обнаружение и декодирование). Просмотр дисков с возможностью создания образов и копирования фрагментов.
Проводник Windows
Проводник Windows — это приложение, реализующее графический интерфейс доступа пользователя к папкам и файлам в ОС Microsoft Windows. Проводник в настоящее время является фактически основой графической оболочки пользователя Windows.
Проводник впервые появился в Windows 95, в качестве замены диспетчера файлов и диспетчера программ Windows 3.x. Всё, что после загрузки Windows видит пользователь (пиктограммы рабочего стола, меню «Пуск», панель задач, — кроме «обоев») — это Проводник Windows.
В проводнике для Windows 95 каждый каталог открывался в новом окне, в следующих версиях предпочтение было отдано однооконному режиму. В версии Windows 98 появились стрелочки навигации, панель ввода адреса, возможность добавлять дополнительные панели в панель задач, «активный рабочий стол» (фон рабочего стола, как интернет-страница) и возможность запускать приложения по одним щелчком. В Windows NT 4 появилась функция работы проводника в разных процессах. В Windows 2000 и Windows MЕ был добавлен поиск документов и файлов.
В Windows XP Проводник подвергся значительным изменениям, как визуального представления, так и функциональности. В левой части окна появилась панель список задач, для предпросмотра изображений ввёден режим Диафильм и Плитка, для поиска появился анимированный персонаж Microsoft Agent. Для пользователя стало возможным загрузить выбранные папки или изображения в Интернет, без использования FTP и других интернет-интерфейсов, после подключения интернет сайта к Проводнику. Проводник стал способен понимать метаданные многих типов файлов и может записывать DVD-RAM и CD-R диски без помощи сторонних программ.
Панель списка задач и помощник поиска в Windows Server 2003 по умолчанию выключены. В Windows Vista правом верхнем углу появилась панель поиска (вместо Меню «Поиск»), а также стало возможным просматривать эскизы документов Microsoft Office Word, презентаций Microsoft Office PowerPoint, таблиц Microsoft Office Excel и документов PDF.
В Windows 7 произошли кардинальные изменения с панелью задач. Панель быстрого запуска скрыта по умолчанию (программы можно закреплять на панели задач, как в меню пуск). В правом конце панели появилась кнопка, которой можно мвернуть все окна. Меню пуск собирает информацию о доступных действиях для каждой программы и последних открытых файлах. Классический вид меню Пуск не предусмотрен. Изменилась структура дерева проводника.
Q-Dir
Q-Dir — файловый менеджер, с уникальным четырехпанельным интерфейсом.
Рисунок 11 — Q-Dir
Первый Q-Dir был тесно интегрирован с Проводником. Например, в нём использовались стандартные варианты просмотра панелей. Миниатюры, таблицы, списки, — все было взято из Проводника Windows.
Главными особенностями являются четырехпанельный интерфейс (есть возможность выбора другого количества панелей), мощный файловый фильтр, цветной фильтр (позволяет выбрать различные цвета для разных типов файлов), поддержка технологии Drag-and-drop, встроенная экранная лупа и размер исполняемого файла (около 1 МБ).
ПОСТАНОВКА ЗАДАЧИ
Разработать программу, реализующую алгоритм бинарного дерева (20 элементов). Элементом дерева служит структура факультет. При заполнении дерева элементы должны располагаться в отсортированном порядке согласно ключу. Предусмотреть заполнение дерева из файла (подготовить файл на 20 элементов).
Предусмотреть многоуровневое меню:
1) Заполнение дерева с начала
a) с консоли (циклически)
b) из файла (выбор файла, тек. папка, любая папка)
2) Вставка элемента (с консоли) в дерево вслед за указанным элементом
3) Удаление элемента по ключу
4) Очистка дерева (с выводом удаляемых элементов)
a) безвозвратно
b) с сохранением в файл
5) Вывод дерева
a) на экран
b) в файл
6) Вывод количества элементов
7) Выход
Реализовать алгоритм обработки исключений.
Продемонстрировать работу всех пунктов меню. Продемонстрировать обработку ошибочных ситуаций (ввод данных другого типа, ввод пустых данных, пустое дерево).
Структура «Факультет» имеет следующие поля: «Код факультета» (ключ), «Название факультета», «Фамилия декана», «Количество кафедр» и «Количество преподавателей».
Бинарное дерево в отсортированном состоянии позволяет достаточно быстро выполнить вставку, удаление и поиск. Каждый элемент бинарного дерева состоит из информационной части и указателей на левый и правый элементы.
Для выполнения задачи понадобится структура для бинарного дерева, основная функция-меню, которая будет вызывать соответствующие функции в зависимости от выбора пользователя, и собственно сами функции для добавления, удаления, поиска и вывода.
бинарный файловый графический интерфейс
ОПИСАНИЕ ПРОГРАММЫ
На рисунке 1 представлен алгоритм работы функции-меню.
Рисунок 1 — Алгоритм работы функции menu ().
Функция menu () представляет собой бесконечный цикл, в котором пользователь производит вызов нужной ему функции. При вводе пользователем символа `A' - будет вызвана функция а (), предназначенная для заполнения дерева; `F' - функция f (), предназначенная для поиска; `L' - функция l (), предназначенная для вывода; `D' - функция d (), предназначенная для удаления; `K' - функция k (), предназначенная для отображения количества введённых элементов; при нажатии `Q' происходит выход из программы; при чего-либо иного на экран выведется сообщение об ошибке и цикл повторится.
При вводе пользователем в любом из пунктов меню некорректной строки учитывается только первый введённый символ (Например, если пользователь вместо символа ввёл слово начинающееся с символа `a' будет вызвана функция a ().).
Функции используемые в программе:
void main (); void menu (); void a (); void f (); void l (); void d (); void k (); tree*add (tree*, tree*, int); tree*find (tree*, int); tree*del (tree*, int, bool); void view (tree*, bool); int mist (bool); void inorder (tree*); void preorder (tree*); void postorder (tree*); void print (tree*, int); void finorder (tree*); | — функция «main»: вызывает функцию «menu» — функция «menu» может вызывать функции a (), f (), l (), d () и k () — функция «a» — предназначена для заполнения дерева, может использовать функции «add», «find» и «mist» — функция «f» — предназначена для поиска узла дерева, может использовать функции «find», «view» и «mist» — функция «l» — предназначена для вывода дерева, может использовать функции «print», «inorder», «preorder», «postorder» и «finorder» — функция «d» — предназначена для удаления, может использовать функции «find», «del», «finorder» и «mist» — функция «k» — вывод колличества элементов дерева — функция «add» — добавление элемента — функция «find» — поиск элемента по ключу — функция «del» — удаление узла дерева, может использовать функцию «view» — функция «view» — вывод на экран содержимого узла дерева — функция «mist» — проверка ввода на корректность — функция «inorder» — предназначена для вывода дерева в симметричном порядке (на экран), использует функцию «view» — функция «preorder» — предназначена для вывода дерева в прямом порядке (на экран), использует функцию «view» — функция «postorder» — предназначена для вывода дерева в обратном порядке (на экран), использует функцию «view» — функция «print» — предназначена для вывода дерева боком (на экран) — функция «finorder» — предназначена для записи в файл всего дерева либо его узла | |
РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ
При выборе пользователем в любого из пунктов меню, при вводе некорректной строки учитывается только первый введённый символ, при вводе имени файла первые сто символов, при вводе полей дерева — первые десять.
ТЕСТИРОВАНИЕ
На рисунках 12 — 14 представлена обработка, при вводе ошибочных данных.
Рисунок 12
Рисунок 13
Рисунок 14
На рисунке 15 показан вывод дерева на экран «боком». На рисунке 16 — ввод элементов из файла и удаление с сохранением в файл, а также отбражение количества элементов. На рисунке 17 — функция поиска и удаление элемента с выводом на экран.
Рисунок 15
Рисунок 16
Рисунок 17
ВЫВОДЫ
В результате тестирования программы ошибок не обнаружено, программа работает корректно. Для программы разработаны и показаны функция меню и специализированные функции, а также продумана обработка ошибочных данных. Поставленная цель достигнута.
1. Уолтер Сэвитч. С++ в примерах. Москва: Эком, 1997.
2. В. А. Скляров. Язык С++ и объектно-ориентированное программирование. -Мн.: Выш. шк., 1997.
3. Язык программирования Си. Москва: Производственно-внедренческий кооператив «И Н Т Е Р Ф Е Й С», 1988.
4. Б. В. Керниган, Д. М. Ричи. ЯЗЫК С.
5. В. А. Скляров. Программирование на языках Си и Си++. Мн.: Выш. шк., 1997.
6. Страуструп Бьерн. Язык программирования Си++. М.: Софт, 1999. (10 шт.).
7. Шилд Герберт. — Самоучитель C++ / Герберт Шилдт. — СПб: BHV — Санкт-Петербург, 1997. — 511 с.
8. Как программировать на С++. Дж. Дейтел. Пер. В. Кузьменко. — М.: ЗАО «Издательство БИНОМ», 1998. — 1021 с.: ил.
9. Visual C++ 6 Новые возможности для программистов. Ю. Тихомиров.- СПб.:БХВ-Санкт-Петербург, 1998.-496 с.
10. Основы алгоритмизации и программирования. Язык СИ. Е. М. Демидович.Мн.: «Бестпринт» 2003 г.
11.Использование Visual C++ 6. Специальное издание. Грегори К.: Пер. с англ.-М.;СПб.;К.: Издательский дом «Вильямс», 2001.-864 с.
ПРИЛОЖЕНИЕ
#include
#include
#include
#include
#include
#include
char buf[256];
char *rus (char *s) {CharToOem (s, buf); return buf;}
struct tree//структура: содержание полей
{
int info;//код факультета (ключ)
int kaf;//количество кафедр
int pre;// количество преподавателей
char name[10]; //название факультета
char fam[10]; // фамилия декана
tree *left;// указатель на левого потомка
tree *right;// указатель на правого потомка
};
//глобальные переменныые:
tree *rt=NULL; //указатель на корень дерева
int count=0; //счётчик элементов
char ss[100]; //строка имени файла вывода для функций
char sss[10]; //строка для функции «mist» (проверки корректности ввода)
int zn; //переменная для функции «mist»
char nam[10], fa[10]; //переменные для передачи данных в функцию «add»
int ka, pr; //
tree *add (tree *root, tree *r, int c) //функция «add» — добавление
//элемента
{if (!r)
{r=new tree;
if (!r){printf (rus («Нет памятиn»)); exit (100);}
r->left=NULL;
r->right=NULL;
r->info=c;
strcpy (r->name, nam);
strcpy (r->fam, fa);
r->kaf=ka;
r->pre=pr;
if (!root) return r;
if (cinfo) root->left=r;
else root->right=r;
return r;
}
if (cinfo) add (r, r->left, c);
else add (r, r->right, c);
return root;
}
tree *find (tree *root, int key) //функция «find» — поиск элемента по ключу
{if (root==NULL) return root;
while (root->info≠key)
{if (keyinfo) root=root->left;
else root=root->right;
if (root==NULL) break;
}
return root;
}
void view (tree *r, bool b) //функция «view» — вывод на экран
//содержимого узла дерева
{if (b)
{printf (rus («номер факультета: %dn»), r->info);
printf (rus («название факультета: %sn»), r->name);
printf (rus («фамилия декана: %sn»), r->fam);
printf (rus («количество кафедр: %dn»), r->kaf);
printf (rus («количество преподавателей: %dn»), r->pre);
}
}
tree *del (tree *root, int key, bool b) //функция «del» — удаление узла дерева,
// может использовать функцию «view»
{tree *p,*p2;
if (!root) return root;
if (root->info==key)
{if (root->left==root->right)
{printf (rus («Этот элемент удалёнn»));
view (root, b);
count—;
delete root;
return NULL;
}
if (root->left==NULL)
{p=root->right;
printf (rus («Этот элемент удалёнn»));
view (root, b);
count—;
delete root;
return p;
}
if (root->right==NULL)
{p=root->left;
printf (rus («Этот элемент удалёнn»));
view (root, b);
count—;
delete root;
return p;
}
//else
{p2=root->right;
p=p2;
while (p->left) p=p->left;
p->left=root->left;
printf (rus («Этот элемент удалёнn»));
view (root, b);
count—;
delete root;
return p2;
}
}
if (root->inforight=del (root->right, key, b);
else root->left=del (root->left, key, b);
return root;
}
int mist (bool b) //функция «mist» — проверка ввода на корректность
{zn=0;
int le=strlen (sss);
int k=0;
if (b)
{for (int i=0;i
{
if (!isdigit (sss[i])) k++;
else zn+=(sss[i]-48)*pow (10,le-i-1);
}
return k;
}
else
for (int i=0;i
{
if (!isalpha (sss[i])) k++;
}
return k;
}
void a () //функция «a» — предназначена для заполнения дерева, может
// использовать функции «add», «find» и «mist»
{int inf;
int c;
int z;
int v=1;
do
{z=2;
printf (rus («Вводn1 — с клавиатурыn0 — из файлаn»));
scanf («%s» ,&sss);
sss[1]='';
v=mist (1);
if (v) printf (rus («Ошибка вводаn»));
else z=zn;
}while ((v)&&((z<0)||(z>1)));
if (z)
{while (1)
{
int v=1;
do
{c=2;
printf (rus («Выбериn1 — вводn0 — стопn»));
scanf («%s» ,&sss);
sss[1]='';
v=mist (1);
if (v) printf (rus («Ошибка вводаn»));
else c=zn;
}while ((v)&&((c<0)||(c>1)));
if (c)
{
int v;
tree *r=NULL;
do
{do
{v=1;
printf (rus («Введите nномер факультета n»));
scanf («%s» ,&sss);
sss[9]='';
v=mist (1);
if (v) printf (rus («Ошибка вводаn»));
else inf=zn;
}while (v);
r=find (rt, inf);
if® printf (rus («Такой элемент уже естьn»));
else break;
}while (1);
do
{v=1;
printf (rus («название факультета n»));
scanf (rus («%s»),&sss);
sss[9]='';
v=mist (0);
if (v) printf (rus («Ошибка вводаn»));
else strcpy (nam, sss);
}while (v);
do
{v=1;
printf (rus («фамилия декана n»));
scanf (rus («%s»),&sss);
sss[9]='';
v=mist (0);
if (v) printf (rus («Ошибка вводаn»));
else strcpy (fa, sss);
}while (v);
do
{v=1;
printf (rus («количество кафедр n»));
scanf («%s» ,&sss);
sss[9]='';
v=mist (1);
if (v) printf (rus («Ошибка вводаn»));
else ka=zn;
}while (v);
do
{v=1;
printf (rus («количество преподавателей n»));
scanf («%s» ,&sss);
sss[9]='';
v=mist (1);
if (v) printf (rus («Ошибка вводаn»));
else pr=zn;
}while (v);
rt=add (rt, rt, inf);
if (rt)count++; return;
}
else return;
}
}
else
{
FILE*f;
while (true)
{char s[100];
printf (rus («Введите имя файлаn»));
scanf («%s» ,&s);
s[99]='';
f=fopen (s," r");
if (!f) {printf (rus («Ошибка чтения файла, введите другое имяn»));return;}
else break;
}
do
{fscanf (f," %d" ,&inf);
fscanf (f, rus («%s»),&nam);
fscanf (f, rus («%s»),&fa);
fscanf (f," %d" ,&ka);
fscanf (f," %d" ,&pr);
rt=add (rt, rt, inf);
if (rt)count++;
}while (!feof (f));
fclose (f);
}
}
void f () //функция «f» — предназначена для поиска узла дерева, может
// использовать функции «find», «view» и «mist»
{if (!rt){printf (rus («Пустоn»)); return;}
tree *r;
int key;
int v=1;
do
{printf (rus («Введите число (номер факультета) n»));
scanf («%s» ,&sss);
sss[9]='';
v=mist (1);
if (v) printf (rus («Ошибка вводаn»));
else key=zn;
}while (v);
r=find (rt, key);
if®
{
view (r, 1);
}
else printf (rus («Элемент не найденn»));
}
void inorder (tree *root) //функция «inorder» — предназначена для вывода //дерева в симметричном порядке (на экран),
//использует функцию «view»
{if (!root)return;
inorder (root->left);
if (root->info)
{
view (root, 1);
printf (rus («n»));
}
inorder (root->right);
}
void preorder (tree *root) //функция «preorder» — предназначена для вывода//дерева в прямом порядке (на экран),//использует функцию «view»
{if (!root)return;
if (root->info)
{
view (root, 1);
printf (rus («n»));
}
preorder (root->left);
preorder (root->right);
}
void postorder (tree *root) //функция «postorder» — предназначена для вывода //дерева в обратном порядке (на экран),
//использует функцию «view»
{if (!root)return;
postorder (root->left);
postorder (root->right);
if (root->info)
{
view (root, 1);
printf (rus («n»));
}
}
void print (tree *root, int level) //функция «print» — предназначена для
//вывода дерева боком (на экран)
{
if (root->right≠NULL) print (root->right, level+1);
for (int i=0;i
printf (rus («%dn»), root->info);
if (root->left≠NULL) print (root->left, level+1);
}
void finorder (tree *root) //функция «finorder» — предназначена для записи // в файл всего дерева либо его узла
{if (!root)return;
FILE*e;
e=fopen (ss," a");
finorder (root->left);
if (root->info)
{fprintf (e, rus («%dn»), root->info);
fprintf (e, rus («%sn»), root->name);
fprintf (e, rus («%sn»), root->fam);
fprintf (e, rus («%dn»), root->kaf);
fprintf (e, rus («%dn»), root->pre);
}
finorder (root->right);
fclose (e);
}
void l () //функция «l» — предназначена для вывода дерева, может использовать
// функции «print», «inorder», «preorder», «postorder» и «finorder»
{char s[2];
if (!rt){printf (rus («Пустоn»)); return;}
while (true)
{printf (rus («Введите nВывод на экранnB — боком, nS — симметрично, nW — сверху, nH — снизуnF — Вывод в файлn»));
fscanf (stdin," %s" ,&s);
s[1]='';
*s=toupper (*s);
switch (*s)
{case 'B':{printf (rus («n»)); print (rt, 0);
printf (rus («n»)); return;}
case 'S':{inorder (rt); printf (rus («n»)); return;}
case 'W':{preorder (rt); printf (rus («n»));return;}
case 'H':{postorder (rt);printf (rus («n»));return;}
case 'F':
{printf (rus («Введите имя файлаn»));
scanf («%s» ,&ss);
ss[99]='';
finorder (rt);
return;
}
default: printf (rus («Ошибка вводаn»));
}
}
}
void d () //функция «d» — предназначена для удаления, может
//использовать функции «find», «del», «finorder» и «mist»
{if (!rt){printf (rus («Пустоn»)); return;}
tree *r=NULL;
int z;
int v=1;
do
{z=2;
printf (rus («Выводn1 — на экранn0 — в файлn»));
scanf («%s» ,&sss);
sss[1]='';
v=mist (1);
if (v) printf (rus («Ошибка вводаn»));
else z=zn;
}while ((v)&&((z<0)||(z>1)));
if (z)
{int key;
int v=1;
do
{printf (rus («Введите число (номер факультета) n»));
scanf («%s» ,&sss);
sss[9]='';
v=mist (1);
if (v) printf (rus («Ошибка вводаn»));
else key=zn;
}while (v);
r=find (rt, key);
if (!r) {printf (rus («Элемент не найденn»));return;}
if (rt->info==key) { rt=NULL; count=0;
printf (rus («Все элементы удаленыn»)); }
else rt=del (rt, key, 1);
}
else
{
tree *r=NULL;
int key;
printf (rus («Введите имя файлаn»));
scanf («%s» ,&ss);
ss[99]='';
int v=1;
do
{printf (rus («Введите число (номер факультета) n»));
scanf («%s» ,&sss);
sss[9]='';
v=mist (1);
if (v) printf (rus («Ошибка вводаn»));
else key=zn;
}while (v);
r=find (rt, key);
if (!r) {printf (rus («Элемент не найденn»));return;}
if (rt->info==key)
{
finorder (rt);
rt=NULL; count=0;
printf (rus («Все элементы удаленыn»));
}
else
{
FILE*e;
e=fopen (ss," a");
fprintf (e, rus («%dn»), r->info);
fprintf (e, rus («%sn»), r->name);
fprintf (e, rus («%sn»), r->fam);
fprintf (e, rus («%dn»), r->kaf);
fprintf (e, rus («%dn»), r->pre);
rt=del (rt, key, 0);
fclose (e);
}
}
}
void k () //функция «k» — вывод колличества элементов дерева
{if (!count) printf (rus («Пустоn»));
else printf (rus («Количество элементов = %dn»), count);
}
void menu ()//функция «menu»
{
while (true)
{
char s[2];
printf (rus («Введите nA — добавить, nF — найти, nD — удалить, nL — вывод дерева, nK — количество элементов, nQ — выходn»));
fscanf (stdin," %s" ,&s);
s[1]='';
*s=toupper (*s);
switch (*s)
{case'A': a ();break;
case’F': f ();break;
case’L': l ();break;
case’D': d ();break;
case’K': k ();break;
case’Q': exit (100);
default: printf (rus («Ошибка вводаn»));break;
}
}
}
void main ()//функция «main»: вызывает функцию «menu»
{menu ();}