
- •Введение в системное программирование Основные понятия и определения Программы и программное обеспечение
- •Системное программирование
- •Этапы подготовки программы
- •Системное программирование
- •Лекция 1
- •1. Язык Си: Общая характеристика, историческая справкаи основные достоинства
- •2. Подготовка к выполнению и выполнение программ
- •3. Элементы языка с
- •Лекция 2
- •1. Понятие типа данных. Переменные и константы. Операция присваивания
- •2.Типы данных в языке си. Описание данных в программе
- •3. Константы в языке Си
- •4. Арифметические операции и арифметические выражения
- •5. Операции отношения, логические операции и логические выражения
- •6. Автоматическое преобразрвание типов и операция приведения
- •7. Простейшие операторы языка си. Составной оператор
- •Лекция 3
- •3. Инициализация переменных и массивов
- •4. Управляющие конструкции языка си
- •Лекция 4
- •1. Адреса и указатели
- •2. Отождествление массивов и указателей.Адресная арифметика
- •3. Указатели на массивы. Массивы указателей и многомерные массивы
- •4. Динамическое выделение памяти под массивы
- •5. Инициализация указателей
- •Лекция 5
- •1. Функции в языке си. Формальные и фактические параметры. Механизм передачи параметров. Возвращаемые значения
- •2. Использование указателей в качестве аргументов функций
- •3. Предварительное описание функций
- •4. Аргументы командной строки
- •Лекция 6
- •1. Ввод и вывод в языке си: Общие концепции
- •2. Файлы данных и каталоги. Внутренняя организация и типы файлов
- •3. Стандартные функции для работы с файлами и каталогами
- •4. Внешние устройства как специальные файлы. Организация обмена со стандартными внешними устройствами
- •5. Операции ввода/вывода через порты микропроцессоров intel 8086/80286
- •Лекция 7
- •1. Общая структура программы на языке си. Время существования и видимость переменных. Блоки
- •2. Классы памяти
- •3. Рекурсивные вызовы функций. Реализация рекурсивных алгоритмов
- •4. Препроцессор языка Си
- •5. Модели памяти, поддерживаемые компилятором ibm c/2
- •Лекция 8
- •1. Структуры в языке си: основные понятия
- •2. Массивы структур
- •3. Указатели на структуры
- •4. Вложение структур
- •5. Структуры и функции
- •6. Объединения
- •7. Перечисления
- •8. Определение и использование новых типов данных
- •9. Классы имен
4. Вложение структур
Продолжая далее рассмотрение вопроса об использовании структур для построения сложных логических агрегатов данных и вспоминая замечание предыдущего параграфа о полноправности типа struct, следует допустить возможность включения одних структур в качестве элементов шаблона других. Такая схема определения структуры по существу есть ни что иное, как вложение структур и ее достаточно полно иллюстрирует следующий пример:
struct { int pointer;
struct { int length;
float array[MAX}; } vector[DEPTH];
} stack;
в котором массив структур vector является внутренним по отношению к структуре stack. С точки зрения общей теории баз данных приведенное описание может определять стек динамических ограниченных векторов элементов типа float. В этом случае элемент pointer структуры stack следует рассматривать как указатель вершины стека глубины DEPTH, реализованного на базе массива структур vector. Каждая же структура этого массива определяет динамический вектор, текущая длина которого равна length и ограничена сверху константой MAX. Для ссылки на отдельные элементы вложенных структур необходимо руководствоваться общим правилом доступа к полям структуры,
последовательно применяя операцию получения элемента. Так, например, оператор вида
stack.vector[stack.pointer].length++;
увеличивает на единицу текущую длину динамического вектора, расположенного на вершине стека. Несколько более сложным примером вложения структур является их рекурсивное определение, построенное таким образом, что в качестве шаблона внутренней структуры используется шаблон внешней структуры. Подобные агрегаты данных могут применяться, например, для представления бинарных деревьев, алгоритмы поиска для которых носят ярко выраженный рекурсивный характер. Действительно, структура со следующим шаблоном
struct TNODE { char word[30];
struct TNODE *left;
struct TNODE *right; };
может определять узел бинарного дерева, в котором располагается символьный массив word и из которого можно спуститься вниз по дереву в двух возможных направлениях left и right.
5. Структуры и функции
Совершенно очевидно, что отдельные элементы структур, являющиеся простыми переменными или указателями произвольного типа, могут быть использованы в качестве аргументов при обращении к функциям. Однако более важным является вопрос о возможности передачи через аппарат формальных/фактических параметров структур в целом. Эту операцию наиболее естественно осуществить, используя понятие указателя на структуру. Для иллюстрации технических деталей, связанных с передачей и обработкой структур, рассмотрим фрагмент программы, отыскивающей в сводном каталоге книгу, имеющую наиболее ранний год издания. Общая организация данных, необходимая для решения этой задачи, может быть представлена при помощи структурного шаблона BOOK, описанного в $ 2 настоящей лекции.
#include <stdio.h>
#define MAX 300
struct BOOK { char author[30]; /* Автор книги */
char title[256]; /* Название книги */
int year; /* Год издания */
int pages; /* Количество страниц */
};
main()
{ int min_year;
struct BOOK catalog[MAX];
..........................................................
..........................................................
..........................................................
min_year = find(catalog);
printf("\nСамая старая книга издана в %d году", min_year);
}
int find(book)
struct BOOK *book; /* Указатель на структуру */
{ int cnt; /* Параметр цикла */
int min; /* Текущее значение минимума */
min = book->year;
for (cnt = 0; cnt < MAX; cnt++, book++)
if (book->year < min)
min = book->year;
return (min);
}
В этом примере формальный параметр book функции find определен как указатель на структуру с шаблоном BOOK. При обращении к данной функции ей передается адрес нулевого элемента массива структур catalog. Далее при каждой очередной итерации цикла в теле функции find() значение указателя book увеличивается на единицу, после чего он ссылается на следующую структуру в массиве catalog.
Замечание. Некоторые реализации языка Си, в частности компилятор IBM C/2, допускают использование структур как единого целого в качестве аргументов функций, передавая по значению отдельные элементы таких структур.