Опубликован: 25.08.2010 | Доступ: свободный | Студентов: 6093 / 596 | Оценка: 3.91 / 3.44 | Длительность: 11:09:00
Лекция 3:

Управляющие операторы. Структуры данных языка С

< Лекция 2 || Лекция 3: 12345 || Лекция 4 >

Перечисления (enum)

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

enum [ имя_типа ] { список_констант };

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

Константы должны быть целочисленными и могут инициализироваться обычным образом. При отсутствии инициализатора первая константа обнуляется, а каждой следующей присваивается на 1 большее значение, чем предыдущей:

enum Err { ERR_READ, ERR_WRITE, ERR_CONVERT};
Err error;
...
switch (error)
{	case ERR_READ:		/* операторы */ break;
		case ERR_WRITE: 	/* операторы */ break;
		case ERR_CONVERT: 	/* операторы */ break;}

Константам ERR_READ, ERR_WRITE, ERR_CONVERT присваиваются значения 0, 1 и 2 соответственно.

Структуры (struct)

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

struct [ имя_типа ] {тип_1 элемент_1;тип_2 элемент_2;*тип_n элемент_n;} 
         [ список_описателей ];

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

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

struct 
{		
char fio[30];
int date, code;
float salary;
}stuff[100], *ps;	/*определение массива структур и указателя на структуру */

Если список отсутствует, описание структуры определяет новый тип, имя которого можно использовать в дальнейшем наряду со стандартными типами, например:

struct Worker
{  //описание нового типа Worker
char fio[30];
int date, code;
float salary;
};             //описание заканчивается точкой с запятой
Worker stuff[100], *ps;	/* определение массива типа Worker */
				/* и указателя на тип Worker */

Для инициализации структуры значения ее элементов перечисляют в фигурных скобках в порядке их описания:

Struct
{		
char fio[30];
int date, code;
float salary;
}worker = {"Страусенко", 31, 215, 3400.55};

Для переменных одного и того же структурного типа определена операция присваивания, при этом происходит поэлементное копирование.

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

Доступ к полям структуры выполняется с помощью операций выбора . (точка) при обращении к полю через имя структуры и -> при обращении через указатель, например:

Worker worker, stuff[100], *ps;
...
worker.fio = "Страусенко";
stuff[8].code = 215;
ps->salary = 0.12;

Битовые поля

Битовые поля - это особый вид полей структуры. Они используются для плотной упаковки данных, например, флажков типа "да/нет". При описании битового поля после имени через двоеточие указывается длина поля в битах (целая положительная константа):

struct Options {
	bool centerX:1;
	bool centerY:1;
	unsigned int shadow:2;
	unsigned int palette:4;};

Доступ к полю осуществляется по имени. Адрес поля получить нельзя.

Объединения (union)

Объединение ( union ) представляет собой частный случай структуры, все поля которой располагаются по одному и тому же адресу. Формат описания такой же, как у структуры, только вместо ключевого слова struct используется слово union.

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

Объединения применяют для экономии памяти, а также для разной интерпретации одного и того же битового представления:

struct Options {
	bool centerX:1;
	bool centerY:1;
	unsigned int shadow:2;
	unsigned int palette:4;
};
union {
unsigned char ch;
Options bit;
}option={0xC4};
cout << option.bit.palette;
option.ch &= 0xF0;	// наложение маски

По сравнению со структурами на объединения налагаются некоторые ограничения:

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

Переименование типов (typedef)

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

typedef тип новое_имя [ размерность ];

Размерность может отсутствовать. Примеры:

typedef unsigned int UINT;
typedef char Msg[100];
typedef struct{
	char fio[30];
	int date, code;
	float salary;} Worker;

Введенное таким образом имя можно использовать таким же образом, как и имена стандартных типов:

UINT i, j;		//две переменных типа unsigned int
Msg str[10];	     //массив из 10 строк по 100 символов
Worker stuff[100];	//массив из 100 структур
< Лекция 2 || Лекция 3: 12345 || Лекция 4 >
Dana Kanatkyzi
Dana Kanatkyzi
Здравствуйте.Помогите решить задачу минимум 4 чисел.Условие такое:"Напишите функцию int min (int a, int b, int c, int d) (C/C++)"находящую наименьшее из четырех данных чисел."Заранее спасибо!
Юрий Семевский
Юрий Семевский
Россия, Санкт-Петербург
Александр Богдашов
Александр Богдашов
Россия