Объединения
Объединение - поименованная совокупность данных разных типов, размещаемых с учетом выравнивания в одной и той же области памяти, размер которой достаточен для хранения наибольшего элемента. Объединенный тип данных декларируется подобно структурному типу: union ID_объединения { описание полей }; Пример описания объединенного типа: union word { int nom; char str[20]; }; Пример объявления объектов объединенного типа: union word *p_w, mas_w[100]; Объединения применяют для экономии памяти в случае, когда объединяемые элементы логически существуют в разные моменты времени либо требуется разнотипная интерпретация поля данных. Например, поток сообщений по каналу связи пусть содержит сообщения трех видов: struct m1 { char code; float data[100]; }; struct m2 { char code; int mode; }; struct m3 { char code, note[80]; }; Элемент code - признак вида сообщения. Удобно описать буфер для хранения сообщений в виде struct m123 { char code; union { float data[100]; int mode; char note[80]; }; }; Практически все вышесказанное для структур имеет место и для объединений. Декларация данных типа union, создание переменных этого типа и обращение к полям объединений производится аналогично структурам. Пример использования переменных типа union: ... typedef union q { int a; float b; char s[5]; } W; void main(void) { W s, *p = &s; s. a = 4; printf(“\n Integer a = %d, Sizeof(s.a) = %d”, s.a, sizeof(s.a)); p -> b = 1.5; printf(“\n Float b = %f, Sizeof(s.b) = %d”, s.b, sizeof(s.b)); strcpy(p->s, “Minsk”); printf(“\n String a = %s, Sizeof(s.s) = %d”, s.s, sizeof(s.s)); printf(“\n Sizeof(s) = %d”, sizeof(s)); getch(); } Результат работы программы: Integer a = 4, Sizeof(s.a) = 2 Float b = 1.500000, Sizeof(s.b) = 4 String a = Minsk, Sizeof(s.s) = 5 Sizeof(s) = 5
Перечисления Перечисления - средство создания типа данных посредством задания ограниченного множества значений. Определение перечислимого типа данных имеет вид enum ID_перечислимого_типа { список_значений }; Значения данных перечислимого типа указываются идентификаторами. Например: enum marks { zero, two, three, four, five }; Транслятор последовательно присваивает идентификаторам списка значений целочисленные величины 0,1,...,. При необходимости можно явно задать значение идентификатора, тогда очередные элементы списка будут получать последующие возрастающие значения. Например: enum level { low=100, medium=500, high=1000, limit }; Примеры объявления переменных перечислимого типа: enum marks Est; enum level state; Переменная типа marks может принимать только значения из множества {zero, two, three, four, five}. Основные операции с данными перечислимого типа: - присваивание переменных и констант одного типа; - сравнение для выявления равенства либо неравенства. Практическое назначение перечисления - определение множества различающихся символических констант целого типа. Пример использования переменных перечислимого типа: ... typedef enum { mo=1, tu, we, th, fr, sa, su } days; void main(void) { days w_day; // Переменная перечислимого типа int cur_day, _end, _start; // Текущий день недели, начало и конец недели, соответственно clrscr(); puts(“ Введите день недели (от 1 до 7): ”); scanf(“%d”, &cur_day); w_day = su; _start = mo; _end = w_day - cur_day; printf(“\n Понедельник - %d день недели, \ сейчас %d - й день и \n\ до конца недели %d дней (дня)”, _start, cur_day, _end); getch(); } Результат работы программы: Введите день недели (от 1 до 7): 5 Понедельник - 1 день недели, сейчас 5 - й день и до конца недели 2 дней (дня)
18. Файлы в языке С
Файл – это набор данных, размещенный на внешнем носителе и рассматриваемый в процессе обработки и пересылке как единое целое. В файлах размещаются данные, предназначенные для длительного хранения. Различают два вида файлов: текстовые и бинарные. Текстовые файлы представляют собой последовательность ASCII символов и могут быть просмотрены и отредактированы с помощью любого текстового редактора. Бинарные (двоичные) файлы представляют собой последовательность данных, структура которых определяется программно. В языке Си имеется большой набор функций для работы с файлами, большинство которых находятся в библиотеках stdio.h и io.h.
|