· при построении родословного дерева;
· как организационная структура предприятия
· при распределении текста по главам, разделам, абзацам и т.д.
Дерево определяется следующим образом:
· Древовидные структуры имеют разветвления, которые могут исходить из начального элемента структуры и из самих разветвлений до тех пор, пока конечных точек не достигнут.
· Элементы дерева называют узлами, причем начальный элемент называется корневым узлом, а конечные точки - листами.
· Линии соединения двух узлов называется ребрами. Последовательность ребер от корня до любого узла называется путем.
· Узлы, которые одинаково удалены от корня образуют уровень дерева. Общее число уровней указывает глубину дерева.
· Максимальное количество наследников, которые имеет узел, определяют степень дерева. Дерево степени 2 - это бинарное дерево, наиболее важный случай.
Древовидная структура имеет рекурсивную природу, так как наследники узла соответственно могут пониматься как корни деревьев. Бинарное дерево можно изобразить следующим образом:
Таким образом, динамические структуры данных, как показывает автор, являются наиболее эффективным способом распределения оперативной памяти и соответственно необходимо их использовать в программе, применяя указатели.
8. Избранные алгоритмы
В этой главе Юрген Плате рассматривает наиболее распространенные и типичные виды алгоритмов, реализованные на Си.
islower(c)
Строчная буква
isupper(c)
Прописная буква
isalpha(c)
Строчная или прописная буква
isdigit(c)
Десятичное число
isalnum(c)
Строчная или прописная буква или десятичное число
1. pid_t getpid(void) - возвращает PID
2. pid_t getppid(void) - возвращает родителей PID-процесса.
Следующий важный элемент для операционных систем - сигналы, которые предоставляют возможность запускать новые процессы или заменять процесс другим процессом. Сигналы - это сообщения, которые посылаются операционной системой в текущую программу для каких-либо действий. Некоторые сигналы вызываются в результате ошибки в программе, другие вызываются по требованию пользователя.
В таблице автор приводит список чаще всего подаваемых Unix сигналов.
Имя
Значение
Функция
SIGHUP
1
Выход из системы
SIGINT
2
Прерывание пользователя (клавиши Ctrl+C)
SIGQUIT
3
Запрос пользователя на окончание (клавиша CTRL + \)
SIGFPE
8
Ошибка с плавающей запятой
SIGKILL
9
Принудительное завершение процесса
§ Чтобы избежать ошибок memory fault(недостаток памяти) необходимо в программе проверять границы получаемых строковых величин.
§ Одна из частых ошибок - постановка точки с запятой в конце команды. Компилятор C замечает это только в следующей строке и указывает затем на эту ошибку.
§ При написании условной структуры часто не ясно, к какому IF принадлежит ELSE. Например,
if (i > j)
if (k < 100)
tuwas();
else
tuwasanderes();
При этом получается, что ELSE принадлежит первому IF. На самом деле она принадлежит всегда ближайшему IF.
§ Если объявляется переменная double d=3/4, то в результате получается 0, так как 3 и 4 - целые числа. Для того, чтобы получить результат необходимо записать 3.0 и 4.0
§ NULL определяется только #define NULL. Указатели не могут быть никакими целыми значениями. Указатель должен быть инициализирован допустимым адресом памяти.
Страницы: 1, 2, 3