Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебно-практическое пособие ПРОГ.doc
Скачиваний:
38
Добавлен:
20.11.2019
Размер:
5.63 Mб
Скачать

3.4.6.Оператор цикла do...While

Цикл do...while является циклом с постусловием. Сначала выполняется тело цикла и только после этого проверяется условие продолжения цикла. В Си для определения цикла do...while используется следующаий оператор:

do

действие;

while (условие);

Вначале выполняется действие. Далее проверяется условие и если условие истинно, то снова выполняется действие и так до тех пор пока условие не станет ложным. Таким образом, действие будет выполнено 1 раз, даже если условие ложно с самого начала. Это является потенциальным источником ошибок. Лучше всегда использовать цикл с предусловием while.

3.5.Данные (более детальные сведения)

3.5.1.Структуры

Структура - это конструкция, которая позволяет объединить несколько переменных с разными типами и именами в один составной объект. Она позволяет строить новые типы данных языка Си. В других языках программирования структуры называют записями или кортежами.

Описание структуры выглядит следующим образом:

struct имя_структуры {

описание полей структуры

};

Здесь имя_структуры - это любое имя, соответствующее синтаксису языка Си, описания полей структуры - любая последовательность описаний переменных, имена и типы этих переменных могут быть произвольными. Эти переменные называются полями структуры. Заканчивается описание структуры закрывающей фигурной скобкой. За закрывающей фигурной скобкой в описании структуры обязательно следует точка с запятой.

В качестве примера опишем точку в трехмерном пространстве, который задается тремя вещественными координатами x, y, z:

struct R3Point {

double x;

double y;

double z;

};

Таким образом, вводится новый тип struct R3Point. После того как структура определена, можно описывать переменные такого типа, при этом в качестве имени типа следует использовать выражение struct R3Point. Например, две точки в трехмерном пространстве с именами u, v будут описаны следующим образом:

struct R3Point u, v;

Переменные u,v содержит внутри себя три вещественных поля с именами x, y, z. Для доступа к полям структуры используется операция точка ".". Например, u.x является полем x структуры u, с ним можно работать как с обычной переменной.

В приведенных примерах все поля структуры R3Point имеют один и тот же тип double, однако полями структуры могут быть другие структуры, никаких ограничений нет.

При определении структуры можно выполнить инициализации ее полей:

struct R3Point u={0.1, 0.1, 0.7};

3.5.2.Указатели и структуры

Указатель на структуру S описывается обычным образом, в качестве имени типа фигурирует struct S*. Например, в следующем фрагменте переменная p описана как указатель на структуру S:

struct S { . . . }; // Определение структуры S

struct S *p; // Описание указателя на структуру S

Описание структуры может содержать указатель на структуру того же типа в качестве одного из полей. Язык Си допускает использование указателей на структуры, определение которых еще не завершено. Например, рассмотрим структуру TreeNode (вершина дерева), которая используется при определении бинарного дерева. Она содержит указатели на родительский узел и на левого и правого сыновей, которые также имеют тип struct TreeNode:

struct TreeNode { // Вершина дерева

struct TreeNode *parent; // Указатель на отца,

struct TreeNode *left; // на левого сына,

struct TreeNode *right; // на правого сына

void *value; // Значение в вершине

};

Здесь при описании полей parent, left, right используется тип struct TreeNode * -указатель на структуру TreeNode, определение которой еще не завершено. Возможны и более сложные комбинации.

Для доступа к полям структуры через указатель на структуру служит операция стрелочка, которая обозначается двумя символами −> (минус и знак больше). Пусть S — имя структуры, f — некоторое поле структуры S, p — указатель на структуру S. Тогда выражение p−>f обозначает поле f структуры S. Это выражение можно записать, используя операцию звездочка (доступ к объекту через указатель), p−>f эквивалентно (*p).f. В записи (*p).f круглые скобки вокруг выражения *p обязательны, поскольку приоритет операции точка выше, чем операции звездочка.