Список является структурой хранения данных. Если список – динамическая структура данных, то в простейшем случае – это линейный связный список, состоящий из элементов (узлов), каждый из которых содержит как собственные данные, так и одну (или две) ссылки на следующий (и предыдущий) узел. Принципиальным преимуществом перед массивом является структурная гибкость: порядок элементов связного списка может не совпадать с порядком расположения элементов данных в памяти компьютера, количество элементов не нужно задавать заранее, порядок обхода списка всегда явно задается его внутренними связями.
Существует несколько разновидностей связного списка. Однонаправленный список – каждый элемент содержит данные и указатель на следующий элемент. В кольцевом списке последний элемент содержит указатель на первый элемент. Двунаправленный связный список – в этом списке каждый элемент содержит указатели как на следующий, так и на предыдущий элементы. В таком списке, в отличие от однонаправленного списка, можно перемещаться в двух направлениях. В однородном списке все элементы имеют один и тот же тип. Неоднородный (гетерогенный) список имеет разнотипные элементы, причем однотипные элементы в нем объединяют в однородные подсписки.
Целью данной лабораторной работе является изучение приложения для работы с двунаправленным неоднородным списком с однородными подсписками, представленным на рис.7.1. Из структуры списка видно, что основной список состоит из взаимосвязанных первых элементов подсписков. Ссылка на начало списка находится в указателе first, а ссылка на конец списка – в указателе last.
Классы
Примем, что разнотипными элементами в списке являются объекты разных классов. Общее для них состоит в том, что они связаны друг с другом указателями. Поэтому введем базовый класс с указателями на этот же класс:
class link
{
public:
link* prev; // указатель на предыдущий элемент основного списка
link* next; // указатель на следующий элемент основного списка
link* down; // указатель на следующий элемент подсписка
types type;
link(){prev=next=down=0;}//конструктор с умолчанием
};
Рис.7.1 – структура двунаправленного неоднородного списка
с n однородными подсписками
Примем также, что список предназначен для контроля товаров в спортивноммагазине, группируемых в подсписки по наименованию и фирме-производителю. Пусть товарами будут «велосипеды» и «роликовые коньки». Тогда в списке они должны быть представлены элементами подсписков - объектами соответствующих классов. Эти классы будут производными классами от базового класса. Для определения объекта производного класса в базовый класс введен элемент type типа-перечисление: enum types{Roll, Bike}.
При создании объектов классов TRoll и TBike – элементов подсписков – в конструкторах этих классов в данное-элемент базового класса type подставляется значение (Roll, Bike), позволяющее идентифицировать создаваемые объекты. Доступ к type – через указатель на базовый класс link.
Теперь создадим класс, объединяющий созданные выше классы для элементов подсписков и предназначенный для создания объекта «список».
Комментарии в объявлении последнего класса содержат перечень большинства операций при работе со списком. Следует отметить, что все элементы списка имеют по три указателя (prev, next, down), но только в элементах основной части списка, т.е. в первых элементах подсписков, используются все три указателя, а в остальных элементах подсписков – один указатель (down). При удалении первого элемента подсписка на его место ставится второй, что потребует в нем инициализации указателей prev и next адресами предыдущего и последующего элементов соответственно в основной части списка.
Проектирование приложения.
Выбор, размещение и задание свойств компонентов.
Коды классов, функций и обработчиков событий
Сохраните модуль главной формы под именем LR_7, а проект – под именем PR_LR_7.
Для размещения классов в проекте использован модуль, не связанный с формой. Чтобы создать такой модуль, нужно выполнить команду Файл/Новый/Другое… и открывшемся окне Новые элементы на странице Новый щелкнуть на пиктограмме Модуль. Модулю дано имя f_7. В заголовочном файле этого модуля f_7.h находятся приведенные выше объявления типа-перечисление и классов, а в файле реализации модуля f_7.cpp – реализации классов (определения функций-элементов классов). Чтобы получить возможность отладки модуля, перенесем на форму со страницы Дополнительно компонент StringGrid1 и директивой #include "LR_7.h" подключим модуль формы к файлу f_7.cpp.
Достаточно полную информацию для размещения остальных компонентов на форме и задания их свойств можно получить из представленных ниже рис.7.2, рис.7.3 и заголовочного файла модуля LR_7.
Перенесем на форму остальные компоненты и зададим их свойствам значения. Со страницы Стандарт - контрольный индикатор с флажком CheckBox1 (Caption – добавлять и удалять с выводом в таблицу, Checked – false), две радиокнопки – RadioButton1 (Caption - Велосипед, Checked – true, Enabled - true) и RadioButton2 (Caption - Ролик. коньки, Checked – false, Enabled - true), GroupBox1 (Caption – Велосипед), Label1 (Caption – Дата поступления), Label2 (Caption – Кол-во скоростей), Button1 (Caption – Добавить элемент), со страницы Win32 – окно ввода дат и времени DateTimePicker1, StatusBar1, ImageList1, со страницы Дополнительно – LabeledEdit1 (EditLabel->Caption – Производитель:), LabeledEdit2 (EditLabel->Caption – Колеса (мм):), LabeledEdit3 (EditLabel->Caption – Вес (кг):), диспетчер действий ActionManager1 и полосу главного меню ActionMainMenuBar1, со страницы Примеры – CSpinEdit1, со страницы Диалоги – SaveDialog1.
По умолчанию полоса главного меню расположится вверху, на всю ширину формы. Задайте её свойство Align = alNone, чтобы придать ей нужные размеры и расположить в нужном месте.
Диспетчеризация действий на основе компонентов ActionManager, ActionMainMenuBar, ActionToolBar
Диспетчер действий ActionManager не только создает и хранит набор действий, как и ActionList, но и управляет полосами действий – визуальными компонентами, на которых располагаются элементы пользовательского интерфейса. К таким компонентам относятся ActionMainMenuBar – полоса главного меню и ActionToolBar – инструментальная панель. Во время проектирования эти компоненты могут вводиться в приложение непосредственно из палитры компонентов, или создаваться простым перетаскиванием на них необходимых действий из окна Редактора Действий ActionManager. Компонент ActionManager запоминает информацию о составе набора действий и конфигурации полос действий в текстовом или двоичном файле на диске.
Рассмотрим основной компонент всей этой системы – ActionManager. Свойство Images компонента ActionManager указывает на компонент ImageList, содержащий пиктограммы, используемые для обозначения действий.
Загрузим в компонент ImageList1 пиктограммы из файлов fldropen, filesave, floppy, insert, show, delete, arrow1u, erase, dooropen. В компоненте ActionManager1 установим свойство Images равным ImageList1, связав тем самым диспетчер действий со списком изображений.
Свойство State определяет реакцию на действия пользователя. Значение asNormal соответствует нормальной рабочей реакции: при щелчке пользователя на доступных интерфейсных компонентах действий выполняются соответствующие действия.
Свойство FileName задает имя файла, в котором ActionManager хранит информацию о составе связанных с ним полос действий. В начале выполнения приложения ActionManager читает информацию из этого файла и в соответствии с ней формирует полосы действий. А при любых изменениях настройки в процессе выполнения ActionManager записывает в этот файл проведенные изменения. Так что при следующем сеансе работы состав полос действий будет таким, каким сделал его пользователь в предыдущем сеансе.
Примечание. При изменении полос действий в процессе проектирования нужно задавать значение FileName по окончании проектирования, так как в противном случае в файле будет сохранено состояние полос действий предыдущего сеанса. Если же потребовалось изменить полосы действий после того, как было задано значение FileName, то нужно предварительно удалить с диска файл, в котором запоминается состояние. В этом случае при очередном выполнении приложения этот файл создастся заново.
Если в процессе проектирования впервые задается значение FileName, надо просто записать в этом свойстве имя файла с путем к нему. При отсутствии пути файл будет создан в том каталоге, в котором расположен проект. Если же нужно задать в качестве значения FileName имя уже существующего файла, то можно воспользоваться для его выбора кнопкой с многоточием около свойства FileName в окне Инспектора Объектов.
Перейдем к рассмотрению и использованию основного инструмента проектирования – Редактора Действий компонента ActionManager1. Двойным щелчком на компоненте вызывается окно Редактора Действий (Редактирование Form1->ActionManager1) на странице Действия с пустыми панелями Категории: и Действия:. Щелкнем правой кнопкой мыши и в появившемся контекстном меню выберем команду Новое действие. Повторим команду Новое действие еще два раза. После этого в панели Действия: появятся имена Action1, Action2, Action3 объектов этих действий, а в панели Категории: – их категории. Выделим Action1. В Инспекторе Объектов будут видны свойства, которые можно изменить: Caption, Hint, ShortCut и другие. Строка свойства Hint отображается в окне Редактора Действий в панели Описание. Можно изменить также категории действий – их свойства Category. Если в компоненте ActionList понятия категорий лишены определенного смысла, то здесь – при создании меню названия категорий станут надписями головных разделов меню.
Зададим свойства объектов действий. Для Action1: Caption – Сохранить, Category - Файл, Hint – сохранить список в файле, Name - FileSave1, ShortCat - F2. Для Action2: Caption – Сохранить как, Category - Файл, Hint – сохранить список в файле как…, Name - FileSaveAs1, ShortCat – Ctrl+K. Для Action3: Caption – Открыть, Category - Файл, Hint – вывести список из файла, Name - FileOpen1, ShortCat - Ctrl+O. В свойство ImageIndex заносим соответствующие значения.
В дальнейшем действия будут связаны с соответствующими компонентами, например, разделами меню. Щелчок пользователя на разделе будущего меню инициализирует соответствующее действие, что вызывает событие OnExecute. Для перехода в обработчик этого события действия Сохранить сделайте на нем двойной щелчок. Занесите в обработчик соответствующий код (см. файл реализации модуля LR_7). Подобным же образом заполните обработчики для действий Сохранить как и Открыть. Затем для всех действий задайте свойство Enabled = true.
Описанным выше образом командой Новое действие создайте действия Action1, Action2, Action3, Action4, Action5, Action6. Для всех этих действий в свойство Category внесите Действия. Задайте остальные свойства новых объектов действий. Для Action1: Caption – Добавить элемент, Hint – добавить элемент в список, Name - Add, ShortCat - Ctrl+A. Для Action2: Caption – Вывести список, Hint – вывести список в таблицу, Name - Out, ShortCat – Ctrl+T. Для Action3: Caption – Удалить элемент, Hint – удалить элемент из списка, Name - Del, ShortCat - Ctrl+B. Для Action4: Caption – Удалить подсписок, Hint – удалить подсписок из списка, Name - Clear_down, ShortCat - Ctrl+C. Для Action5: Caption – Уничтожить список, Hint – уничтожить список, Name - Clear, ShortCat – Ctrl+D. Для Action6: Caption – Выход, Hint – Выход/Завершение работы, Name - A_exit, ShortCat - Ctrl+E. В свойство ImageIndex заносите соответствующие значения.
В обработчики события OnExecute этих шести действий внесите коды из файла реализации модуля LR_7. Убедитесь, что для всех шести действий свойство Enabled = true.
Теперь выбор категории (Файл, Действия) означает выбор соответствующего списка действий. Порядок действий можно изменить перетаскиванием мышью.
Поочередно перетащите мышью категории на полосу главного меню. При этом все действия перенесутся в меню, а названия категорий станут надписями головных разделов меню (см. рис.7.4). Действия также можно перетаскивать в меню поодиночке и там изменять порядок их следования.
Перейдите на страницу Панели окна Редактора Действий. Кнопкой Новый…добавьте на форму первую инструментальную панель ActionToolBar1. (Отметим, что компонент ActionToolBar можно также добавлять на форму переносом из палитры компонентов.) По умолчанию панель расположится вверху, на всю ширину формы. Задайте её свойство Align = alNone, чтобы придать ей нужные размеры и расположить в нужном месте. Здесь и в дальнейшем может оказаться полезным задание свойству Orientation значения boTopToBottom или boBottomToTop. Полезно также воспользоваться свойством Constraints. В свойство Hint занесите инструментальная панель 1, в ShowHint – true.
Перейдите на страницу Действия окна Редактора Действий. Перетащите из Редактора Действий на панель категорию Файл. При этом все действия категории перенесутся на панель. Действия также можно перетаскивать на панель поодиночке и там изменять порядок их следования.
Описанным выше образом добавьте на форму вторую инструментальную панель ActionToolBar2, задайте в ней свойства и перетащите на неё категорию Действия.
Выделите одну из полос действий на странице Панели окна Редактора Действий и просмотрите в Инспекторе Объектов ее свойства. В свойствах Caption (надпись) измените значения полос действий соответственно на Главное меню, Инструментальная панель 1, Инструментальная панель 2.
Выделите компонент ActionManager1 и задайте значение свойства FileName в окне Инспектора Объектов, т.е. имя файла, в котором ActionManager1 хранит информацию о составе связанных с ним полос действий.
Выделите кнопку Добавить элемент и в её свойство Action занесите Add, чтобы связать кнопку с одноименным действием.
Дополните файл реализации модуля LR_7 обработчиками событий: создания формы, где размещается код для создания заголовка таблицы, и щелчков на компонентах RadioButton1 и RadioButton2, в которых реализуется подготовка компонентов для ввода данных элементов списка.
Удаление элемента и подсписка из списка осуществляется по ячейке, выделенной в таблице вывода списка. При этом используется событие OnSelectCell компонента StringGrid1. В обработчик этого события передаются целые параметры ACol и ARow – столбец и строка выделенной ячейки и булев параметр CanSelect – допустимость выбора.
int r; //переменная для номера строки выделенной ячейки в таблице
bool flag=true; //флаг - нет выделенной ячейки в таблице
void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol,
int ARow, bool &CanSelect)
{
r=ARow; //номер строки выделенной ячейки сохранен в переменной r
flag=false; //ячейка в таблице выделена
}
Для удаления элемента и подсписка из списка используется параметр ARow – номер строки выделенной ячейки.
На этом проектирование приложения завершается.
Рис.7.4 – меню
Тестирование и использование приложения
1.Запустите приложение на выполнение, нажав быстрые кнопки Сохранить все и Запуск.
2.Выполните тестирование по рис.7.5. Рекомендуется добавлять и удалять элементы с включенным индикатором. Команда Вывести список необходима при отладке и тестировании приложения.
3.Составьте и выполните тесты, которые проверят правильность всех случаев добавления и удаления элементов подсписков (см. комментарии в файлах f_7.cpp и LR_7.cpp).
4.Убедитесь в правильности сохранения списка в файле.
5.Модифицируйте код, переместив данные-элементы классов TRollи TBike в закрытые части классов. Выполните отладку. Результаты продемонстрируйте преподавателю.
2.Объясните содержание класса link, TBike, TRoll, list.
3.Как выполняется конструктор класса link, TBike, TRoll, list?
4.Как выполняется деструктор класса link, TBike, TRoll, list?
5.Укажите в коде точки, где вызывается конструктор класса link, TBike, TRoll, list.
6.Укажите в коде точки, где вызывается деструктор класса link, TBike, TRoll, list.
7.Как нужно изменить остальное содержание класса link, TBike, TRoll, list, если данные-элементы класса из открытой части класса перенести в закрытую часть класса?
8.Объясните, как в список заносится первый элемент.
9.Объясните, как в список добавляется второй и последующие элементы с разными типами, отличающимися от типа первого элемента.
10.Объясните, как добавляется элемент в подсписок.
11.Как добавляется в список новый подсписок?
12.Когда и как переназначаются указатели на начало и конец списка?
13.Как удалить элемент из первого подсписка (элемент – единственный в подсписке, первый в подсписке, последний в подсписке, находится внутри подсписка)?
14.Как удалить элемент из последнего подсписка (элемент – единственный в подсписке, первый в подсписке, последний в подсписке, находится внутри подсписка)?
15.Как удалить элемент из внутреннего подсписка (элемент – единственный в подсписке, первый в подсписке, последний в подсписке, находится внутри подсписка)?
16.Как удалить подсписок (первый, последний, внутренний, из одного элемента, из нескольких элементов)?
17.Как уничтожить список?
18.Как вывести список из ОП в таблицу?
19.Расскажите, как список сохранить в файле.
20.Как вывести список из файла в таблицу?
21.Как ввести список в ОП из таблицы? из файла, минуя таблицу?
22.Как по выделенной в таблице ячейке определить положение удаляемого элемента? подсписка?
23.Расскажите о назначении и возможностях диспетчера действий ActionManager. Что относится к полосам дествий ActionManager?
24.Расскажите об использовании Редактора Действий ActionManager.
25.Как создать меню, инструментальную панель с помощью ActionManager?
26.Как связать меню, инструментальную панель с ImageList?
27.Как сохранить настройки полос действий ActionManager?
Задания
1.Используя двунаправленный список, написать и протестировать функции, реализующие отдельные действия при игре в “новое домино”, в котором кроме традиционных правил игрок может на каждом ходу заменить любую конечную кость на свою. Необходимы следующие функции: а)проверить, можно ли сделать ход; б)сделать ход; в)проверить, можно ли сделать замену, г)заменить кость; д)определить, закончена ли игра.
2.Написать программу сложения двух длинных целых чисел, представленных в виде строк, используя круговой список.
3.Автоматизированная информационная система на железнодорожном вокзале содержит сведения об отправлении поездов дальнего следования. Для каждого поезда указывается: номер поезда, станция назначения, время отправления. Данные в информационной системе организованы в виде линейного списка. Составить программу, которая: 1)обеспечивает первоначальный ввод данных в информационную систему и формирование линейного списка; 2)производит вывод всего списка; 3)вводит номер поезда и выводит все данные об этом поезде; 4)вводит название станции назначения и выводит данные обо всех поездах, следующих до этой станции. Программа должна обеспечивать диалог с помощью меню и контроль ошибок при вводе.
4.На междугородной телефонной станции картотека абонентов, содержащая сведения о телефонах и их владельцах, организована как линейный список. Составить программу, которая: 1)обеспечивает начальное формирование картотеки в виде линейного списка; 2)производит вывод всей картотеки; 3)вводит номер телефона и время разговора; 4)выводит извещение на оплату телефонного разговора. Программа должна обеспечивать диалог с помощью меню и контроль ошибок при вводе.
5.Сложить два многочлена, используя представление многочлена в виде списка, в котором элементы расположены в порядке убывания степеней x, а поля элемента содержат соответственно коэффициент при x, степень x, указатель на следующий элемент. Нулевые слагаемые исключить из результирующего списка.
6.Составить программу, которая содержит текущую информацию о книгах в библиотеке. Сведения о книгах содержат: номер УДК, фамилию и инициалы автора, название, год издания, количество экземпляров данной книги в библиотеке. Программа должна обеспечивать: а)начальное формирование данных о всех книгах в библиотеке в виде списка; б)добавление данных о книгах, вновь поступающих в библиотеку; в)удаление данных о списываемых книгах; г)по запросу выдавать сведения о наличии книг в библиотеке, упорядоченные по годам издания.
7.Используя представление многочлена в виде списка в порядке убывания степеней x, по многочлену S(x) построить его производную - многочлен P(x).
8.Картотека в бюро обмена квартир организована как линейный список. Сведения о каждой квартире содержат: количество комнат, этаж, площадь, адрес. Составить программу, которая обеспечивает: а)начальное формирование картотеки; б)ввод заявки на обмен; в)поиск в картотеке подходящего варианта: при равенстве количества комнат и этажа и различии площадей в пределах 10% выводится соответствующая карточка и удаляется из списка, в противном случае поступившая заявка включается в список; г)вывод всего списка. Программа должна обеспечивать диалог с помощью меню и контроль ошибок при вводе.
9.Перемножить два многочлена, задав их в виде списков.
10.Анкета для опроса населения содержит две группы вопросов. Первая группа содержит сведения о респонденте: возраст, пол, образование (начальное, среднее, высшее). Вторая группа содержит собственно вопрос анкеты, ответ на который либо ДА, либо НЕТ. Составить программу, которая: 1)обеспечивает начальный ввод анкет и формирует из них линейный список; 2)на основе анализа анкет выдает ответы на следующие вопросы: а)сколько мужчин старше 40 лет, имеющих высшее образование, ответили ДА на вопрос анкеты; б)сколько женщин моложе 30 лет, имеющих среднее образование, ответили НЕТ на вопрос анкеты; в)сколько мужчин моложе 25 лет, имеющих начальное образование, ответили ДА на вопрос анкеты; 3)производит вывод всех анкет и ответов на вопросы. Программа должна обеспечивать диалог с помощью меню и контроль ошибок при вводе.
11.Представить в виде списка распорядок рабочего дня. Написать функции для справок, изменения распорядка.
12.Написать и протестировать функции для включения, исключения и поиска элемента кругового списка для: а)списка без заголовка; б)списка с заголовком (заголовок может содержать некоторую информацию о списке, например, число элементов списка).
13.Написать программу, которая а)сцепляет два списка данных символьного типа; б)объединяет упорядоченные списки данных целого типа в единый упорядоченный список.
14.Написать программу, которая помещает заданное количество случайных целых чисел в диапазоне от 0 до 100 в упорядоченный список. Вычислить сумму элементов и среднее арифметическое.
15.Написать программу, которая создает связный список из заданного количества символов, а затем создаёт второй список - копию, но в обратной последовательности.
16.Написать программу, беспорядочно смешивающую буквы слова для создания слова-путаницы. Каждый символ в строке произвольно помещается либо в начало, либо в конец списка. Например, с вводом jumble последовательность случайных чисел 011001 создаёт lbjume.
17.Написать программу, которая содержит динамическую информацию о наличии автобусов в автобусном парке. Сведения о каждом автобусе содержат: номер автобуса, фамилию водителя, номер маршрута. Программа должна обеспечивать: а)начальное формирование данных о всех автобусах в парке в виде списка; б)при выезде каждого автобуса из парка вводится номер автобуса, и программа удаляет данные об этом автобусе из списка автобусов, находящихся в парке, и записывает эти данные в список автобусов, находящихся на маршруте; в)при въезде каждого автобуса в парк вводится номер автобуса, и программа удаляет данные об этом автобусе из списка автобусов, находящихся на маршруте, и записывает эти данные в список автобусов, находящихся в парке; г)по запросу выдаются сведения об автобусах, находящихся в парке, или об автобусах, находящихся на маршруте.
18.Составить программу, которая содержит текущую информацию о заявках на авиабилеты. Каждая заявка содержит: пункт назначения, номер рейса, фамилию и инициалы пассажира, желаемую дату вылета. Программа должна обеспечивать: а)хранение всех заявок в виде списка; б)добавление заявок в список; в)удаление заявок; г)вывод заявок по заданному номеру рейса и дате вылета; д)вывод всех заявок.
19.Составить программу, которая содержит текущую информацию о книгах в библиотеке. Сведения о книгах содержат: номер УДК, фамилию и инициалы автора, название, год издания, количество имеющихся экземпляров. Программа должна обеспечивать: а)начальное формирование данных о всех книгах в библиотеке в виде списка; б)при взятии каждой книги вводится номер УДК, и программа уменьшает значение количества книг на единицу или выдает сообщение о том, что требуемой книги в библиотеке нет или требуемая книга находится на руках; в)при возвращении каждой книги вводится номер УДК, и программа увеличивает значение количества книг на единицу; г)по запросу выдаются сведения о наличии книг в библиотеке.
20.Написать программу, которая содержит динамическую информацию о наличии автобусов в автобусном парке. Сведения о каждом автобусе содержат: номер автобуса, фамилию и инициалы водителя, номер маршрута, признак того, где находится автобус – на маршруте или а парке. Программа должна обеспечивать: а)начальное формирование данных о всех автобусах в виде списка; б)при выезде каждого автобуса из парка вводится номер автобуса, и программа устанавливает значение признака “автобус на маршруте”; в)при въезде каждого автобуса в парк вводится номер автобуса, и программа устанавливает значение признака “автобус в парке”; г)по запросу выдаются сведения об автобусах, находящихся в парке, или об автобусах, находящихся на маршруте.
21.Составить программу, моделирующую заполнение гибкого диска. Общий объём памяти на диске 1,44 Мбайта. Файлы имеют произвольную длину от 72 байт до 128 Кбайт. В процессе работы файлы либо записываются на диск, либо удаляются с него. В начале работы файлы записываются подряд друг за другом. После удаления файла на диске образуется свободный участок памяти, и вновь записываемый файл размещается на свободном участке, либо, если файл не вмещается в свободный участок, размещается после последнего записанного файла. В случае, когда файл превосходит длину самого большого свободного участка, выдается аварийное сообщение. Требование на запись или удаление файла задается в командной строке, которая содержит имя файла, его длину в байтах, признак записи или удаления. Программа должна выдавать по запросу сведения о занятых и свободных участках памяти на диске. Указание: следует создать список занятых участков и список свободных участков памяти на диске.
22.В файловой системе каталог файлов организован как линейный список. Для каждого файла в каталоге содержатся следующие сведения: имя файла, дата создания, количество обращений к файлу. Составить программу, которая обеспечивает: а)начальное формирование каталога файлов; б)вывод каталога файлов; в)удаление файлов, дата создания которых меньше заданной; г)выборку файла с наибольшим количеством обращений. Программа должна обеспечивать диалог с помощью меню и контроль ошибок при вводе.
23.Предметный указатель организован как линейный список. Каждая компонента указателя содержит слово и номера страниц, на которых это слово встречается. Количество номеров страниц, относящихся к одному слову, от одного до десяти. Составить программу, которая обеспечивает: а)начальное формирование предметного указателя; б)вывод предметного указателя; в)вывод номеров страниц для заданного слова. Программа должна обеспечивать диалог с помощью меню и контроль ошибок при вводе.
24.Текст помощи для некоторой программы организован как линейный список. Каждая компонента текста помощи содержит термин (слово) и текст, содержащий пояснения к этому термину. Количество строк текста, относящихся к одному термину, от одной до пяти. Составить программу, которая обеспечивает: а)начальное формирование текста помощи; б)вывод текста помощи; в)вывод поясняющего текста для заданного термина. Программа должна обеспечивать диалог с помощью меню и контроль ошибок при вводе.
25.Используя двунаправленный список, написать программу сложения двух длинных целых чисел.
26.По введенной безошибочной записи многочлена от x построить его представление в виде списка, элемент которого содержит поля: коэффициент при x, степень x, указатель на следующий элемент ( в последнем - NULL).
27.Проверить на равенство два многочлена, представив каждый из многочленов в виде списка, в котором элементы расположены в порядке убывания степеней x.
28.В целочисленной точке x вычислить значение многочлена S(x), представленного в виде списка в порядке убывания степеней x..
29.Распечатать многочлен, заданный в виде списка, в обычном виде (например, так: 52y^3-6y^2+y).
30.Используя представление многочлена в виде списка, привести подобные члены в многочлене и расположить их по убыванию степеней x.