Группа 1201. II семестр. Терминальное задание №4 (архивация, разбор выражений) Для сдачи задания необходимо выполнить 2 задачи. Все задачи из этого раздела должны решаться за приемлемое время для тестов, что прилагаются к заданию. Тесты можно найти на странице http://ccfit.nsu.ru/~den Дополнительную информацию можно найти на странице http://iclub.nsu.ru/~andy/ 4-1. Калькулятор Необходимо написать калькулятор, позволяющий производить следующие арифметические действия: +,-,/,* () sin, cos, exp ^ (возведение в степень) Программа должна получать на вход файл input.txt, содержащий набор арифметических выражений (каждое выражение на новой строке). На выходе программы выдает результат вычисления заданного арифметического выражения (вещественные числа - с точностью до 2й цифры) и выражение, записанное в польской записи (через 3 пробела). Токены польской записи выводятся через пробел, все числа выводятся в вещественном формате (до 2-го знака). Пример: input.txt 2-3*3 4*(2-9) sin(2)+2 output.txt -7 2.00 3.00 3.00 * -28 4.00 2.00 9.00 - * 2.03 2.00 sin 2.00 + Если не задан входной файл, то программа переходи в консольный режим и позволяет вводить выражения из консоли. После ввода выражения и нажатия «Enter» программа показывает результат и выражение в формате обратной польской записи. 4-2. Телефонная база данных Реализовать телефонную базу данных с операциями: 1. Вставки в БД. int Insert(Card _person); 2. Удаления из БД. int Delete(char * _name) или int Delete(char * _phone) в зависимости от индекса. 3. Поиск. Поиск осуществлять по ключу для конкретного значения (одно выходное значение), а также для значений в промежутке (несколько значений с возможностью последовательного выбора записей. Card Search(char * _name) или Card Search(char * _phone) CardArray Search(char * _StartName, char * _StopName). Здесь возможна реализация такой абстракции как курсоры: Cursor Search(char * _name) Cursor Search(char * _startName, char * _stopName); с дополнительными функциями: Cursor Next(Cursor _cursor) Card GetValue(Cursor _cursor). В данном задании необходимо учитывать, что добавление и поиск данных осуществляется прямо в файле, т.к. база должна сохранять большое кол-во записей (сотни тысяч). Нельзя вытаскивать всю базу в оперативную память и производить поиск внутри нее. Для быстрого поиска необходимо корректно создавать и поддерживать файл (файлы) индексов, нельзя организовывать последовательный поиск данных в файле. Индексы создаются на основе B-tree или расширяемого хэширования (что давалось на лекции). Все записи имеют уникальные ключи (нельзя завести 2 человек с одинаковым именем или одинаковым номером телофона). Реализация курсоров остается на усмотрение выполняющего задание. Замечания: 1. Реализация страниц базы данных, очевидно через сегментированный файл, т.е. файл условно разделённый на странички. 2. Желательна реализация операций чтения-записи-добавления страниц с возможностью кеширования. 3. Желательна поддержка нескольких индексов (по именам и телефонам). 4-3. Архивация по методу Хаффмана Необходимо реализовать возможность архивации бинарных/текстовых данных по методу Хаффмана. Набор команд, обрабатываемых программой, перечислен в таблице: Команда myarchiver.exe с myfile.txt myarchiver.exe с myfile1.txt myfile2.txt myfile3.txt myarchiver.exe x myfile.txt.haf Действие Заархивировать файл myfile.txt в файл myfile.txt.haf, созданный в текущей (рабочей) директории. Файл myfile.txt не удалять. Заархивировать файлы myfile1.txt, myfile2.txt, myfile3.txt в файл myfile.txt.haf, созданный в текущей (рабочей) директории. Файл myfile.txt не удалять. Т.е. архиватор должен поддерживать возможность архивирования нескольких файлов. Разархивировать файл myfile.txt.haf. Разархивированные файлы (файл) создавать в текущей (рабочей) директории. Файл myfile.txt.haf удалить. Необходимо добиться максимальной скорости сжатия, чтобы файлы в 2-5 мегабайт могли архивироваться/разархивироваться без задержек. Дополнительную информацию о методе Хаффмана можно найти на странице: http://ccfit.nsu.ru/~den/help/other/Haffman.htm