В общем случае перечислимые константы имеют тип int, но перечислимые переменные не так жестко привязаны к целочисленному типу данных, поскольку он может содержать перечислимые константы. Например, перечислимые константы переменной spectrum имеют диапазон [0; 5] (как в массиве), поэтому компилятор может выбрать тип unsigned char для представления переменной color.

В языке программирования С к перечислимой переменной можно применять операции инкрементирования ++ и декрементирования ––. Например,

for (color = red; color <= violet; ++color)

{

¼;

}

По умолчанию константам в перечислимом списке присваиваются целые значения – 0, 1, 2 и т. д. В то же время возможны присваиваемые значения, например

enum levels {low = 100, medium = 500, high = 2000};

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

enum feline {cat, lynx = 10, puma, tiger};

В этом случае cat (кошка) получает значение 0 по умолчанию, lynx (рысь), puma (пума), tiger (тигр) – соответственно 10, 11, 12.

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

Пример 11. Для переменной типа объединения предусмотреть ввод и вывод элементов ее полей.

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

#include <stdio. h>

#include <conio. h>

#include <string. h>

#define N 79

union hold

{

char str[N+1];

double bigf;

char ch;

int digit;

};

int main (void) {

double D2;

int i = 0,

digit2;

char str2[80], ch2;

union hold fit, *PTR = &fit;

//PTR = &fit; // вариант взятия адреса

printf("\n\t Fields of the \"union\":\n \

1) string, 2) double, 3) character, 4) integer\n");

do {

printf("\n Enter %d field of the \"union\": ", i+1);

_flushall();

if (i == 0)

{

gets_s(str2, N);

strcpy_s(PTR->str, strlen(str2) + 1, str2);

printf(" The first field: %s\n", PTR->str);

i++;

}

else if (i == 1)

{

scanf_s("%lf", &D2);

printf(" The second field: %1.4f\n", PTR->bigf = D2);

i++;

}

else if (i == 2)

{

scanf_s("%c", &ch2);

printf(" The third field: %c\n", PTR->ch = ch2);

i++;

}

else

{

scanf_s("%d", &digit2);

printf(" The fourth field: %d\n", PTR->digit = digit2);

i++;

}

} while (i < 4);

printf("\n 1 field: %s\n 2 field: %1.4f\n \

3 field: %c\n 4 field: %d\n", \

PTR->str, PTR->bigf, PTR->ch, PTR->digit);

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

_getch();

return 0;

}

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


Рис. 11.1. Результат заполнения полей объединения

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

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

12. Структуры и функции языка С

Разрешенными операциями над структурами являются копирование или присваивание структуры как целого, взятие ее адреса операцией &, а также обращение к ее элементам. Копирование и присваивание включают также передачу аргументов в функции и возвращение значений из функций.

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

struct fred

{

char x;

int y;

float z;

char str[10]; // с учетом символа окончания строки

} mike;

Тогда каждый член этой структуры можно передать функции:

func(mike.x); // передается символьное значение х

func2(mike.y); // передается целое значение y

func3(mike.z); // передается значение с плавающей точкой z

func4(mike.str); // передается адрес строки str[10]

func(mike.str[2]);// передается символьное значение str[2]

Если же нужно передать адрес отдельного члена структуры, то перед именем структуры должен находиться оператор &. Для рассмотренных примеров получим

func(&mike.x); // передается адрес символа х

func2(&mike.y);// передается адрес целого y

func3(&mike.z);// передается адрес члена z с плавающей точкой

func4(mike.str);// передается адрес строки str

func(&mike.str[2]);// передается адрес символа в str[2]

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

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

#include <stdio. h>

#include <conio. h>

// Определение глобального типа структуры

struct struct_type {

int a, b;

char ch;

};

// Прототип функции

void fun(struct struct_type parm);

int main (void) {

struct struct_type arg;

arg. a = 1000;

fun(arg);

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

_getch();

return 0;

}

// Определение функции

void fun(struct struct_type parm)

{

printf("\n %d\n", parm. a);

}

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

Когда используется указатель на структуру, вместо оператора точки применяют оператор «стрелка». Видоизменим рассмотренную программу, введя в нее указатель на структуру:

#include <stdio. h>

#include <conio. h>

// Определение глобального типа структуры

struct struct_type { int a, b; char ch; };

// Прототип функции

void fun(struct struct_type *parm);

int main (void)

{

struct struct_type arg,*PTR;

PTR = &arg;

PTR->a = 999;

fun(PTR);

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

_getch();

return 0;

}

// Определение функции

void fun(struct struct_type *parm)

{

printf("\n %d\n", parm->a);

}

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

#include <stdio. h>

#include <conio. h>

// Определение глобального типа структуры

struct struct_type {int a, b; char ch; };

// Прототип функции

void fun(struct struct_type STRUCT3);

int main (void)

{

struct struct_type struct2 = {2, 3, 'Z' };

fun(struct2);

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

_getch();

return 0;

}

// Определение функции

void fun(struct struct_type STRUCT3)

{

printf("\n %c: %d + %d = %d\n", \

STRUCT3.ch, STRUCT3.a, STRUCT3.b, STRUCT3.a + STRUCT3.b);

}

В современных версиях языка С, в том числе в ANSI C, структуры не только можно передавать функции в качестве аргументов, но и возвращать их из функции. При использовании функций для возврата структур становится возможным отправлять информацию из вызываемой функции в вызывающую. Указатели на структуры допускают также двусторонний обмен данными.

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

Из за большого объема этот материал размещен на нескольких страницах:
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 год
Документы в финансовой сферев инвестиционнойФинансовые документы - программы

Техника

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

Общество

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

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

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

Мир

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

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

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