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

strcpy(new_employee . name, "Stephen");

При этом должен быть предусмотрен заголовочный файл <string.h>. для функции strcpy().

Когда объявлен массив структур, например stack[120], это означает, что создано 120 наборов переменных, каждый из которых организован так, как определено в структуре с дескриптором employee. Чтобы получить доступ к определенной структуре stack[120], следует указать имя массива с индексом, который изменяется от 0 до 119. Например, для пятой структуры можно сделать изменения в почасовом окладе:

stack[4].hourlysalary = 121.5;

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

Рассмотрим пример:

struct X = {

int A[7][8];

float b;

char ch;

struct employee Emp2;

} Y;

Инициализация элементов двухмерного массива А может быть такой:

Y.A[2][5] = 99;

Инициализация вложенной структуры может быть следующей:

Y.Emp2.hourlysalary = 12.75;

В соответствии со стандартом С89 структуры могут быть вложенными вплоть до 15-го уровня, стандарт С99 допускает уровень вложенности до 63-го включительно.

Пример 10. Написать программу структурного описания каталога одной книги.

Программный код решения примера:

#include <stdio. h>

#include <conio. h>

#include <string. h>

#define N 40

struct book { // определение структуры

char title[N+1]; // название книги

char author[N+1]; // автор

int year; // год издания

int page; // количество страниц

float price; // цена в у. е.

} Library;

int main (void)

{

// Инициализация полей структуры

Library. year = 2007;

Library. page = 496;

Library. price = 12.78F;

strcpy_s(Library. title, N, "Programming in C");

strcpy_s(Library. author, N, "Stephen G. Kochan");

// Вывод на консоль

printf("\n\t Title: %s\n", Library. title);

printf("\t Author: %s\n", Library. author);

printf("\t Year: %d\n", Library. year );

printf("\t Number of pages: %d p.\n", Library. page );

printf("\t Price: %1.2f y. e.\n", Library. price);

printf("\n\n Press any key: ");

_getch();

return 0;

}

В программе использованы функции strcpy_s() вместо стандартных функций strcpy(), что позволило избавиться от предупреждений в системе Visual Studio 2010.

НЕ нашли? Не то? Что вы ищете?


Результат выполнения программы показан на рис. 10.1.

Рис. 10.1. Пример инициализированных полей структуры

11. Объединения и перечислимые типы в языке С

Объединение (union) – это тип, который позволяет хранить различные типы данных в одном пространстве памяти (но не одновременно).

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

Пример шаблона объединения с дескриптором hold:

union hold {

int digit;

double bigf;

char letter;

};

Объединение может хранить значение типов int, double, char. Структура с такими же полями способна хранить все типы одновременно.

Пример определения трех переменных объединения:

union hold fit; // переменная объединения типа hold

union hold save[10]; // массив из 10 переменных объединения

union hold *ptr; // указатель на переменную типа hold

Первое объявление определяет единственную переменную fit. Компилятор выделяет пространство памяти, достаточное для того, чтобы хранить наибольший из описанных вариантов, а именно тип double, который требует обычно 8 байт. Второе объявление save[10] создает массив с 10 элементами, каждый из которых имеет размер в 8 байт. В третьем объявлении указатель может содержать адрес объединения hold.

Рассмотрим варианты инициализации объединения:

union hold valA;// создали переменную valA по шаблону union hold

valA.letter = 'R';

union hold valB = valB;// инициализация одного объединения другим

union hold valC = {88};// инициализация числового элемента

Рассмотрим варианты использования объединения:

union hold fit;

fit.digit = 23; // число 23 хранится в переменной fit, 2 байта

fit.bigf = 6.78; // число 23 затерто, хранится 6.78, 8 байтов

fit.letter = 'h';// число 6.78 затерто, хранится символ h,1 байт

Операция точки показывает, какой тип данных используется в текущий момент [1]. За один раз запоминается только одно значение. Нельзя одновременно хранить значение типа char и значение типа int, даже если для этого имеется достаточно пространства (памяти для 8 байт). Следить за тем, какие значения на текущий момент хранятся в объединении, входит в обязанности программиста. Бывает, что на различных этапах выполнения программы одни переменные могут быть не нужны, в то время как другие, наоборот, используются только в текущей части программы, поэтому объединения экономят пространство, вместо того чтобы тратить память на не использующиеся в данный момент переменные.

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

int x;

ptr = &fit;

x = ptr -> digit;

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

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

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

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

К объединениям может быть применен оператор typedef, после чего можно вводить обозначения объединяющих типов, не требующие служебного слова union. Рассмотрим пример:

typedef union data

{

char str[80];

int a;

double x;

} new_data;

Определения новых переменных (например, student1, student2) объединений будут выглядеть таким образом:

new_data student1, student2;

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

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

Перечислимый тип (enumerated type) служит для объявления символических имен, представляющих целочисленные константы. Можно сказать, что это тип данных, заданных списком принадлежащих ему значений.

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

Примеры объявления перечислимого типа:

enum spectrum {red, orange, yellow, green, blue, violet};

enum spectrum color;

Первое объявление устанавливает spectrum как имя дескриптора, который позволяет использовать enum spectrum в качестве имени типа. Второе объявление делает color переменной этого типа. Идентификаторы, заключенные в фигурные скобки, перечисляют возможные значения, которые может принимать переменная spectrum. Соответственно возможными значениями color выступают red, orange, yellow и т. д. Но эти возможные значения являются целочисленными, т. е. 0, 1, 2, 3, 4, 5. Другими словами, значения в enum начинаются с 0, если не задано иное число, и всегда увеличиваются на 1.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

Основные порталы (построено редакторами)

Домашний очаг

ДомДачаСадоводствоДетиАктивность ребенкаИгрыКрасотаЖенщины(Беременность)СемьяХобби
Здоровье: • АнатомияБолезниВредные привычкиДиагностикаНародная медицинаПервая помощьПитаниеФармацевтика
История: СССРИстория РоссииРоссийская Империя
Окружающий мир: Животный мирДомашние животныеНасекомыеРастенияПриродаКатаклизмыКосмосКлиматСтихийные бедствия

Справочная информация

ДокументыЗаконыИзвещенияУтверждения документовДоговораЗапросы предложенийТехнические заданияПланы развитияДокументоведениеАналитикаМероприятияКонкурсыИтогиАдминистрации городовПриказыКонтрактыВыполнение работПротоколы рассмотрения заявокАукционыПроектыПротоколыБюджетные организации
МуниципалитетыРайоныОбразованияПрограммы
Отчеты: • по упоминаниямДокументная базаЦенные бумаги
Положения: • Финансовые документы
Постановления: • Рубрикатор по темамФинансыгорода Российской Федерациирегионыпо точным датам
Регламенты
Термины: • Научная терминологияФинансоваяЭкономическая
Время: • Даты2015 год2016 год
Документы в финансовой сферев инвестиционнойФинансовые документы - программы

Техника

АвиацияАвтоВычислительная техникаОборудование(Электрооборудование)РадиоТехнологии(Аудио-видео)(Компьютеры)

Общество

БезопасностьГражданские права и свободыИскусство(Музыка)Культура(Этика)Мировые именаПолитика(Геополитика)(Идеологические конфликты)ВластьЗаговоры и переворотыГражданская позицияМиграцияРелигии и верования(Конфессии)ХристианствоМифологияРазвлеченияМасс МедиаСпорт (Боевые искусства)ТранспортТуризм
Войны и конфликты: АрмияВоенная техникаЗвания и награды

Образование и наука

Наука: Контрольные работыНаучно-технический прогрессПедагогикаРабочие программыФакультетыМетодические рекомендацииШколаПрофессиональное образованиеМотивация учащихся
Предметы: БиологияГеографияГеологияИсторияЛитератураЛитературные жанрыЛитературные героиМатематикаМедицинаМузыкаПравоЖилищное правоЗемельное правоУголовное правоКодексыПсихология (Логика) • Русский языкСоциологияФизикаФилологияФилософияХимияЮриспруденция

Мир

Регионы: АзияАмерикаАфрикаЕвропаПрибалтикаЕвропейская политикаОкеанияГорода мира
Россия: • МоскваКавказ
Регионы РоссииПрограммы регионовЭкономика

Бизнес и финансы

Бизнес: • БанкиБогатство и благосостояниеКоррупция(Преступность)МаркетингМенеджментИнвестицииЦенные бумаги: • УправлениеОткрытые акционерные обществаПроектыДокументыЦенные бумаги - контрольЦенные бумаги - оценкиОблигацииДолгиВалютаНедвижимость(Аренда)ПрофессииРаботаТорговляУслугиФинансыСтрахованиеБюджетФинансовые услугиКредитыКомпанииГосударственные предприятияЭкономикаМакроэкономикаМикроэкономикаНалогиАудит
Промышленность: • МеталлургияНефтьСельское хозяйствоЭнергетика
СтроительствоАрхитектураИнтерьерПолы и перекрытияПроцесс строительстваСтроительные материалыТеплоизоляцияЭкстерьерОрганизация и управление производством