Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Подбельский Фомин_Программирование на языке СИ_...doc
Скачиваний:
234
Добавлен:
10.08.2019
Размер:
53.81 Mб
Скачать

Функция main( ).

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

Примечание. Имена всех переменных, встречающихся до void main(), являются внешними для остальных функций программы, и их не надо описывать в функциях еще раз, если главная функция, внешние переменные и остальные функции программы будут собраны в один файл (исходный модуль).

Функция init( ) - "Инициализировать базу данных".

Функция init( ) - "Инициализировать базу данных". Первое действие, которое должен выполнить пользователь при работе с базой данных, - это подготовить ее к работе (инициализировать). Функция init() связывает все элементы массива структур в "список свободных элементов" и устанавливает начальные значения управляющих переменных.

В тексте функции для доступа к элементам структуры использована операция '->' ("стрелка"). Напомним, что она изображается двумя символами: "-" ("минус") и ">" ("больше, чем") и называется операцией косвенного выбора элемента структуры, адресуемой указателем. Операция используется с указателем на структуру для доступа к элементу структуры.

Выражение point -> prior обеспечивает доступ к элементу prior той структуры, которую адресует указатель point. Иными словами, point -> prior эквивалентно st[i].prior, если ранее выполнен оператор point=&st[i]; Ниже приводится текст функции init( ):

int init(void)/* Инициализировать базу данных */

В этой функции для каждого элемента массива в цикле задаются значения указателей на предыдущий и следующий элементы. Для первого элемента указатель prior устанавливается равным NULL. Для последнего элемента указатель next устанавливается также равным NULL (для этих элементов нет соответственно предыдущего и следующего элементов).

Функция delete() - "Удалить все сведения о сотруднике из базы данных".

Функция delete() - "Удалить все сведения о сотруднике из базы данных". В работе функции delete( ) можно выделить два этапа:

• поиск нужного элемента в списке занятых элементов;

• удаление найденного элемента (возврат элемента в список свободных элементов).

Действия по поиску нужного элемента в списке целесообразно оформить в виде отдельной функции find( ), текст которой приводится ниже. Аргументом (ключом) поиска элемента является фамилия сотрудника. Для сравнения строк (фамилия, введенная с терминала, и фамилия в структуре) используется стандартная библиотечная функция strcmp( ), параметрами которой являются указатели на сравниваемые строки. Функция strcmp( ), описанная в заголовочном файле string.h, возвращает 0, если строки совпадают. Для сравнения строк можно было бы использовать функцию row( ), текст которой приведен в §5.3, где рассматриваются строки как параметры функций.

Функция поиска элемента в списке занятых find() должна возвращать указатель на найденный элемент либо NULL, если элемент в списке не обнаружен. Конструкция struct person * перед именем функции find( ) сообщает компилятору языка Си, что функция возвращает указатель именно на структуру типа person. Приведем текст функции find( ):

При выполнении функции delete( ) удаления элемента из списка занятых производятся следующие действия:

• запрос фамилии;

• поиск фамилии в списке занятых элементов;

• удаление найденного элемента из списка занятых;

• возврат освобожденного элемента в список свободных. Текст функции delete( ) может быть таким:

В функции delete( ) использовано обращение к функции fr( ), текст которой приведен ниже. Функция fr( ) "привязывает" освобожденный элемент к списку свободных элементов, делая его головным, и корректирует глобальные управляющие переменные и указатели. Встретившийся в функции delete( ) оператор

имеет следующий смысл (рис. 8.6 -н 8.9). Так как операция "стрелка" (->) выполняется слева направо, то оператор можно записать так:

Это означает, что в поле next элемента, стоящего слева от удаляемого, заносится адрес элемента, который находится справа от удаляемого (рис. 8.7  8.9). На рис. 8.7 изображено исходное состояние массива структур, а на рис. 8.8 и рис. 8.9 - изменение значений указателей после удаления элемента из списка занятых элементов и возврата его в список свободных элементов.

Рис. 8.6. Связи элемента, на который ссылается указатель ptr (N - next, P - prior)

Рис. 8.7. Исходное состояние массива структур (N - next, P - prior)

Рис. 8.8. Изменение значений указателей после удаления элемента

Рис. 8.9. Изменение значений указателей после возврата элемента в список свободных

Аналогично следует понимать и выражение