2846

Типы данных, определяемые пользователем (агрегативные типы данных)

Контрольная

Информатика, кибернетика и программирование

Типы данных, определяемые пользователем (агрегативные типы данных) Язык C позволяет программисту создавать следующие типы данных: переименование типов перечислимый тип структура битовые поля объединение Переименование типов. Язык C позволяет дать но...

Русский

2012-10-20

51 KB

9 чел.

Типы данных, определяемые пользователем (агрегативные типы данных)

Язык C позволяет программисту создавать следующие типы данных:

переименование типов

перечислимый тип

структура

битовые поля

объединение

Переименование типов.

Язык C позволяет дать новое имя уже существующему типу данных. Форма записи:

typedef тип новый_тип;

Поле тип определяет уже существующий тип. Поле новый_тип определяет новое имя типа.

Пример 1

typedef unsigned int uint;

unsigned int i;

uint j;

Перечислимый тип.

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

Форма записи:

enum имя_типа {список_названий} список_переменных;

Поле имя_типа определяет имя нового перечислимого типа. Поле список_названий определяет имена констант перечислимого типа и их значения. Имена констант должны различаться. Значения могут отсутствовать, тогда константа получит значение по умолчанию. Правило присвоения константам значений:

  •  если константа инициализируется явно, то её значение равно значению инициализирующего константного выражения;
  •  если константа не инициализируется явно, то её значение равно значению предыдущей константы + 1;
  •  если первая константа не инициализируется явно, то её значение равно 0.

Поле список_переменных может быть пустым или определяет список объявлений переменных перечислимого типа.

Над переменными перечислимого типа возможны следующие операции:

  •  присвоение значения переменной перечислимого типа другой переменной перечислимого типа или переменной целого типа;
  •  сравнение;
  •  арифметические операции с константами перечислимого типа.

Пример 2

enum constants {zero, one, minus_one=-1, _zero, ten=10} c1=zero;

constants c2, c3=one-zero;

c2=2;

if(с2<ten)

printf("%d %d %d %d %d %d %d %d",zero, one, minus_one, _zero, ten, c1, c2, c3);

Программа напечатает: 0 1 -1 0 10 0 2 1

Некоторые компиляторы допускают присвоение переменным перечислимого типа значений, не входящих во множество значений констант данного типа, но делать это не рекомендуется. Также некоторые компиляторы допускают выполнение арифметических операций для переменных перечислимого типа.

Основная причина использования перечислимого типа – улучшение читаемости программ.

Структура.

Структура – это средство компоновки разнотипных объектов в один объект. Объекты, входящие в структуру, называются членами структуры. Форма объявления структуры:

struct имя_типа {список_объявлений_членов}список_переменных;

Поле имя_типа определяет имя нового типа структур. Поле список_объявлений_членов определяет имена и типы членов структуры. Членом структуры может быть объект любого типа, базового или агрегативного. Форма объявления члена структуры аналогична форме объявления объекта данного типа в тексте программы. Поле список_переменных может быть пустым или определяет объявления одной или нескольких структур, разделенных запятыми.

Форма объявления структуры в поле список_переменных:

имя=инициализатор

Поле имя задаёт идентификатор структуры и является обязательным. Поле инициализатор задает инициализатор структуры и является необязательным.

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

Можно объединять структуры в массивы или создавать указатели на структуры.

Образ структуры в памяти: по младшему адресу размещается первый член списка_объявлений_членов, затем второй и так далее. Внутри объявлений, содержащих более одной переменной, порядок размещения в памяти обратный.

Особенности размещения:

  •  размещение всегда начинается с чётного адреса;
  •  каждый следующий член выравнивается при записи в память на границу, соответствующую его типу;
  •  если размер структуры в памяти равен нечётному числу байтов, то к ней добавляется ещё один – пустой байт, чтобы следующий после структуры объект располагался с чётного адреса.

Пример 3

struct color_point

{

int x,y;

unsigned int color;

};

color_point triangle[3];

Не полностью определенный структурный тип.

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

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

Пример 4

struct s1{

 s1* p1;

 struct s2 *p2;

};

struct s2{

s1* p3;

 s2 *p4;

};

Так как в данном примере тип s2 объявляется ниже типа s1, то при объявлении указателя p2 необходимо указать ключевое слово struct, чтобы компилятор понял тип этого указателя.

Битовые поля.

Битовые поля позволяют организовать доступ к нескольким битам в байте. Это позволяет экономить память ЭВМ. Битовые поля – это специальный тип членов структуры, в котором определено, сколько бит отводится под каждый член.

Форма записи:

struct имя_типа {

тип1 имя1:длина_в_битах;

тип2 имя2:длина_в_битах;

}список_переменных;

Поле имя_типа определяет имя нового типа структур. Поля типi и имяi определяют тип и имена членов структуры. Допустимые значения типа: int, unsigned int, signed int. Поле длина_в_битах определяет длину в битах соответствующего члена структуры, длина не может превышать длину базового типа в битах. Поле список_переменных может быть пустым или определяет объявления одной или нескольких структур, разделенных запятыми.

Форма объявления структуры в поле список_переменных:

имя=инициализатор

Поле имя задаёт идентификатор структуры и является обязательным. Поле инициализатор задает инициализатор структуры и является необязательным.

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

Можно объединять битовые поля в массивы или создавать указатели на битовые поля.

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

Особенности размещения:

  •  неименованное битовое поле – пропуск указанного в нём количества битов памяти перед размещением следующего члена структуры;
  •  битовое поле нулевого размера – следующий член будет размещаться, начиная с границы машинного слова.

Длина структуры, содержащей битовые поля, в битах всегда кратна восьми, даже если задействуется меньшее число битов.

Пример 5

struct screen_point

{

unsigned int x:10;

unsigned int y:10;

unsigned int color:4;

};

screen_point screen[640][480];

Объединение.

Объединение – это объект, предназначенный для хранения в каждый момент времени только одного значения из набора возможных, в том числе и разнотипных. Объекты, входящие в объединение, называются членами объединения. Форма записи:

union имя_типа {список_объявлений_членов}список_переменных;

Поле имя_типа определяет имя нового типа объединения. Поле список_объявлений_членов определяет имена и типы членов объединения. Членом объединения может быть объект любого типа, базового или агрегативного. Форма объявления члена объединения аналогична форме объявления объекта данного типа в тексте программы. Поле список_переменных может быть пустым или определяет объявления одного или нескольких объединений, разделенных запятыми.

Форма объявления объединения в поле список_переменных:

имя=инициализатор

Поле имя задаёт идентификатор объединения и является обязательным. Поле инициализатор задает инициализатор объединения и является необязательным.

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

Можно объединять объединения в массивы или создавать указатели на объединения.

Образ объединения в памяти: память под объединение выделяется в объёме, необходимом для размещения члена объединения максимального размера, все члены записываются в память, начиная с одного и того же адреса памяти. Таким образом, текущее значение теряется всякий раз, как только производится новое присваивание какому-либо из членов объединения.

Пример 6

union value

{

int i;

float f;

unsigned int ui;

};

value x;

Безымянный тип структуры, объединения или битового поля.

Можно определять структуры, объединения и битовые поля, приведя внутреннее строение типа, но не вводя его названия.

Форма записи:

struct {список_объявлений_членов}список_переменных;

struct {

тип1 имя1:длина_в_битах;

тип2 имя2:длина_в_битах;

}список_переменных;

union {список_объявлений_членов}список_переменных;

После подобного объявления в программе можно использовать переменные данных типов, объявленные в поле список_переменных. Если в программе потребуется объявление других переменных с таким же составом членов, то придется полностью повторить приведенное выше объявление типа.

Доступ к членам структуры, объединения и битового поля.

Набор действий над структурой, объединением и битовым полем: передача в функцию в качестве аргумента или возврат из функции, получение адреса, обращение по адресу (для указателей на объекты), присваивание (для объектов одного типа), доступ к членам.

Для доступа существуют операции «обращение к члену структуры», позволяющие также получить доступ к членам объединения и битового поля.

Операция «обращение к члену структуры через переменную».

Форма записи:

операнд1.операнд2

Операнд1 – это идентификатор объекта типа структура, объединение или битовое поле, операнд2 – это идентификатор его члена.

Данная операция осуществляет доступ к члену операнд2 в объекте операнд1.

Операция «обращение к члену структуры через указатель».

Форма записи:

операнд1->операнд2

Операнд1 – это идентификатор указателя на объект типа структура, объединение или битовое поле, операнд2 – это идентификатор члена объекта, на который указывает указатель.

Данная операция осуществляет доступ к члену операнд2, сам объект хранится по адресу, на который указывает указатель операнд1.

Пример 7

color_point *pointer=&triangle[0];

for(int i=1;i<4;i++)

{

triangle[i].x=i;

triangle[i].y=i*i;

triangle[i].color=0;

printf("%d %d ",(pointer+i)->x,triangle[i].y);

}

value *p=&x;

x.f=10.5;

printf("%f ",p->f);

(*p).f-=0.4;

printf("%d ",x.i);

p->ui=5;

printf("%d ",x.ui);

Программа напечатает: 1 1 2 4 3 9 10.500000 1092721050 5

Инициализация и присваивание структур, объединений и битовых полей.

При инициализации структур и битовых полей задаются начальные значения членов структуры и битового поля.

Форма записи:

имя={список_инициализаторов}

Поле имя является идентификатором структуры или битового поля. Поле список_инициализаторов содержит список инициализаторов значений членов структуры или битового поля. Инициализаторы в списке инициализаторов должны идти в том же порядке, что и члены структуры или битового поля, которые они инициализируют. Число инициализаторов может быть меньше, чем число членов, тогда оставшаяся часть членов будет неинициализированной.

Пример 8

struct s1{

float f;

char c[5];

}d={12.5,”abc”};

При инициализации объединения задается начальное значение первого члена объединения.

Форма записи:

имя={инициализатор}

Поле имя является идентификатором объединения. Поле инициализатор содержит инициализатор, значение которого преобразуется к типу первого элемента объединения и копируется в область памяти, выделенную под объединение.

Пример 9

value v={12.5};

Объединение v будет инициализировано числом 12, хоть оно и может содержать в себе вещественные значения, так как первый член объединения имеет тип int.

Операция «присваивания» возможна только для структур, объединений и битовых полей одного типа. При присваивании производится копирование значений членов одного объекта в члены другого.


 

А также другие работы, которые могут Вас заинтересовать

23044. ПІДСИЛЮВАЧІ НА ТРАНЗИСТОРАХ 103 KB
  Він є лише керувальним пристроєм а збільшення потужності сигналу відбувається за рахунок зовнішнього джерела напруги струмом в колі якого й керує транзистор. Характер зміни вхідного сигналу повинен передаватися на вихід без помітних спотворень. Кажуть що має місце інверсія фази сигналу. Як випливає з рівняння ЕберсаМола [1] імпеданс для малого сигналу з боку емітера при фіксованій напрузі на базі дорівнює rе = kT еIк 5 де k стала Больцмана Т абсолютна температура е заряд електрона Iк струм колектора.
23045. Дешифратори та мультиплексори 1.3 MB
  Це здійснюється аналогічно заданню параметрів елементів схеми за допомогою редактора пробних сигналів Stimulus Editor. Це робиться аналогічно заданню мітки вузла схеми причому в описі шини слід перерахувати через кому мітки усіх вузлів що входять у шину Альтернативна можливість полягає у використанні конструкцій типу BUS[1n] де BUS імя шини BUS[1]BUS[n] відповідні мітки вузлів. Пакет OrCAD дозволяє провести суто цифрове моделювання для даного вузла схеми якщо до цього вузла підєднані лише цифрові входи та виходи. Зазначимо що...
23046. Тригери 1.45 MB
  1 зображено схему найпростішого RSтригера на елементах 2ІНЕ серії 74 із зворотнім звязком. Встановлення тригера в 10 відбувається при подачі нуля на NSNR при цьому протилежний вхід повинен бути встановлений в одиницю. Подача двох нулів є забороненою комбінацією при якій стан тригера буде невизначеним. Для даної схеми тригера доцільно у початковий момент встановити режим зберігання інформації потім у деякий момент подати імпульс встановлення 1 потім імпульс встановлення 0 після цього знову використати режим зберігання і нарешті...
23047. Регістри та лічильники 1.83 MB
  Виведіть графік залежності вхідних Reset Shift Info та вихідних Q0Q2 цифрових сигналів регістра від часу та поясніть ці залежності. Виведіть відповідні графіки для вхідних та вихідних сигналів та поясніть ці залежності. Джерела пробних сигналів підберіть таким чином щоб регістр послідовно виконав операції: а паралельного запису числа 0101; б перетворення цього числа на послідовний код; в послідовного запису числа 1010; Проведіть моделювання для цієї схеми. Виведіть відповідні графіки для вхідних та вихідних сигналів та поясніть ці...
23048. Імпульсні цифрові схеми 2.62 MB
  Формувачі імпульсів. 1 зображено схему формувача імпульсів на логічних елементах ІНЕ. 1 Недоліком цієї схеми є те що для формування імпульсів досить великої тривалості потрібно використати велику кількість логічних елементв. 2 Для формування імпульсів з синусоїдальної напруги часто застосовується тригер Шмітта рис.
23049. Схеми на операційних підсилювачах. Інвертуюче увімкнення ОП 2.04 MB
  Завдяки своєму високим коефіцієнту підсилення та вхідному опору а також низькому опору вихідному операційні підсилювачі ОП дуже широко застосовуються у схемотехніці особливо в мішаних аналоговоцифрових схемах. Додавши до ОП коло зворотнього звязку можна отримати підсилювач практично з будьяким коефіцієнтом підсилення. Коефіцієнт підсилення такої схеми у межах лінійності ОП рівний Rc Rin. Параметри ОП дозволяють добирати Rc та Rin у широкому діапазоні опорів отримуючи різні коефіцієнти підсилення.
23050. Цифро-аналогові перетворювачі 1.33 MB
  1 зображено схему 4розрядного ЦАП. 1 Лічильник U3A та пробні джерела складають тестову схему яка послідовно подає на вхід ЦАП цифрові коди від 0 0000 до 15 1111. Зростаючий код на виході ЦАП буде перетворюватися на лінійно зростаючу напругу. 2 зображено схему дослідження 8розрядного інтегрального ЦАП.
23051. Ознайомлення з основними можливостями пакета програм автоматизованого проектування електронних схем MicroSim PSPICE 8.0 1.35 MB
  Система автоматизованого проектування MicroSim PSPICE використовує один з найбільш вдалих кодів схемотехнічного моделювання SPICE Simulation Program with Integrated Circuit Emphasis який був розроблений на початку 70х років фахівцями Каліфорнійського університету США. Фактично зазначений код став стандартним для моделювання електронних схем і застосовується також у інших відомих системах моделювання схем зокрема MicroCap а вхідний формат мови завдань SPICE підтримується практично усіма пакетами автоматизованого проектування електронних...
23052. Електронний ключ на біполярному транзисторі 482 KB
  Каскад виконує логічну операцію заперечення оскільки високий рівень напруги на вході забезпечує введення транзистора у режим насичення коли напруга на навантаженні буде низькою. При введенні наведеної вище схеми дослідження ключового каскаду застосовуються джерела сталої напруги живлення VCC та імпульсної вхідної напруги VIN. Перелічимо основні параметри даних джерел: Як джерело сталої напруги живлення застосовується стандартна модель VSRC що міститься у бібліотеці source. Основними є такі її параметри: DC стала напруга що її виробляє...