Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Декларация переменных структурного типа

Поиск

Доступ к элементам структурной переменной

Массивы структур

Оператор sizeof

Декларация typedef

Понятие структуры в языке Си

Структура - это одна или несколько переменных, возможно, различных типов данных, которые сгруппированы под одним именем.

В языке Си термин "структура" соответствует понятию "запись" в языках программирования.

Пример 1: строка таблицы журнала студенческой группы.

 

Пример 2: точка в пространстве.

 

Пример 3: круг на плоскости.

 

Для того, чтобы работать со структурой, необходимо:

1. объявить структурный тип;

2. декларировать переменные этого типа.

Объявление типа структуры

Синтаксис:

struct [<имя = тег>]

{<Декларация_члена 1>;

<Декларация_члена 2>;

...

<Декларация_члена n>;

};

Декларация структуры - это описание типа данных.
Если указано имя, то это и есть имя типа.
Имена тегов и имен членов структуры могут совпадать с именами других переменных программы.
Такое описание только описывает образец (шаблон) структуры данного типа, но ремонт, товары НЕ вiдiляе.

Пример 4: точка А в пространстве.

struct struct point

{Int xa {int xa;

int ya; int ya;

int za; int za;

};};

/ * Без тега * / / * с тегом * /

/ * Новый тип - struct point * /

Пример 5: круг на плоскости.

struct struct circle

{Float x0 {float x0;

float y0; float y0;

float r; float r;

};};

/ * Без тега * / / * с тегом * /

/ * Новый тип - struct circle * /

Декларация переменных структурного типа

Синтаксис:

I. <Декларация типа структуры> <список переменных>;

Это сочетание способов, в котором в одной декларации описывается структурный тип и переменные этого структурного типа.

II. struct <тег> <список переменных>

В этом случае описание структурного типа с тегом выполняется предварительно, а затем используется для описания переменных.

Пример 6: описать прямую, проходящую через точки А i В,

Используя ранее введенный тип для представления точки в пространстве.

struct struct point

{Int xa {int xa;

int ya; int ya;

int za; int za;

} A, b;};

struct point a, b;

Инициализации структурных переменных можно выполнить при ее объявлении (по аналогии с массивами):

Пример 7: круг с центром (2, 3) и радиусом 5,5.

/ * Без тега * / / * с тегом * /

struct circle pr = {2.0, 3.0, 5.5}

{Float x0;

float y0;

float r;

} Pr = {2.0, 3.0, 5.5};

Доступ к элементам структурной переменной

Синтаксис:

<Имья_структуры>. <имья_члена>


Оператор. - Бинарный, iнфiксний, лiвоасоцiативний, наивысший приоритет.

Пример 8: расстояние от (0,0) до точки pt.

struct

{Float x;

float y;

} Pr = {20,15}

double dist;

dist = sqrt ((double) pt.x * pt.x + (double) pt.y * pt.y);

printf («От начала координат");

printf ("до точки (% f,% f)", pt.x, pt.y);

printf ("расстояние% f", dist);

Структуры можно вкладывать друг в друга (нет ограничения на глубину вложения).

Прямоугольник на плоскости образуется в результате пересечения двух прямых углов, в которых стороны Параллельные осям координаты, первый из этих углов образуется точкой pt1, второй угол - точкой pt2.
Объявления на языке Си геометрического объекта типа прямоугольник, со сторонами паралельным осям координат:

Пример 9: задания прямоугольника координатами точек двух углов.

struct rectange

{

struct point pt1;

struct point pt2;

};

srtuct rectange poly;

float a; / * длина стороны а * /

a = poly.pt2.x - poly.pt1.x;

printf ("Длина стороны a =% f \ n", a);

 

Массивы структур

Структуры можно объединять в массивы (получаем таблицу):

Пример 10: список студентов с результатами экзаменов.

# Define KST 35

struct list

{Char * fio;

int math;

int phys;

int r_l;

};

struct list group [KST];

Пример 11: Объявление таблицы с инициализацией.

struct list gr [] =

{

{"Андреев", 5, 5, 5},

{"Борисенко", 5, 4, 4},

..........

{"Якименко", 4, 4, 4}

};

 

Оператор sizeof

В декларации списка студентов мы определили размер этого списка (массива структур) с помощью поименованной константы KST:

# Define KST 35

Еще один вариант определения размера этого массива такой. Размер этого массива полностью определен во время компляцiи I дорвнюе произведения количества элементов массива на размер его отдельного элемента, поэтому число элементов массива вычисляется:

число элементов массива = <размер> group / <размер> struct list

В языке Си есть оператор sizeof (унарный, префiксний, правоасоцiативний, высший приоритет). Он работает во время компляцiи. Он применяется для исчисления размера любого объекта:

· sizeof <обкт>

· sizeof (<имя типа данных>)

Результат этого оператора целое, равной размеру (в байтах) объекта или типа данных.

Объектом может быть:

· переменная;

· массив;

· структура.

Именем типа данных может быть:

· имя базового типа (int, long, float,...);

· имя производной типа (структуры или указателя).

Поэтому в операторi препроцессору define возможные записи:

# Define KST (sizeof group / sizeof (struct list))

# Define KST (sizeof group / sizeof group [0])

Второй оператор содержит не <имя типа данных>, а объект (первый элемент массива group).

 

Декларация typedef

Эта декларация позволяет давать новые имена типам данных.

Синтаксис:

typedef <старое имя типа> <новое имя типа>;

Семантика:

<Старое имя> i <новое имя> становятся синонимами.

Пример 12: объявление таблицы с результами экзаменов студентов.

typedef INT Ekz;

typedef CHAR * String;

typedef Struct List

{String fio;

Ekz math;

Ekz phys;

Ekz r_l;

} Liststud;

Liststud Group [KST];

Этот пример iлюстуе использования того имени типа данных, который был декларирован в typedef.

Синтаксис:

<Тип, объявленный typedef> <список змнних>

Принято имя типа-синоньма, объявление в typedef, начинать с большой буквы, чтобы отличать его от базовых типов.

Причины использования typedef:

1. эстетическая: одним именем заменяется сложная декларация типа данных;

2. стремление сделать текст программы более ясным. Например, вместо

3. struct list * pstr; / * указатель на структуру типа list * /

можно объявить:

typedef struct list * Plist;

/ * указатель (P List) на структуру типа list * /

Plist pstr;

4. typedef використують для обеспечения машинной независимости программы на языке Си. Например, зависят от реализации величины цiлочисельних типов данных (int, short, long) i действительных (double, long double). При переносi на другую платформу меняют только декларации typedef, а не декларации всех переменных (целых i действительных).

typedef не создает новый тип данных, а создает только синоним для существующего типа данных.

 

 



Поделиться:


Последнее изменение этой страницы: 2017-01-27; просмотров: 475; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.119.124.24 (0.005 с.)