Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
146
Добавлен:
13.03.2016
Размер:
470.02 Кб
Скачать

3.2. Тип "структура" в Си

Пока мы рассматривали одну сложную структуру (сложный тип) - массив; одним из основных свойств массива является однотипность его компонент. Многие информационно-логические задачи связаны с обработкой документов, содержащих в себе информация разного типа (числовую, символьную и т. д.) Примеры таких документов: пла­тежные ведомости (фамилии и имена - символьная информация, де­нежные суммы - числовая), карточки больных в поликлинике, библио­течная информация. Для программирования алгоритмов обработки такой информации необходимо иметь сложный тип, объединяющий разнотипные компоненты. Таким типом является структурав Си ( в Паскале запись).

Структурная переменная, или просто структура, состоит из не­скольких переменных (называемых полями), возможно, разного типа.

Структура

тип "структура" (шаблон)

переменная типа "структура"

Описание шаблона:

Описание структурной переменной

typedef struct{ Тип1 Список1ИменПолей;

structИмяШаблона ИмяПеременной

Тип2 Список2ИменПолей;

. . . 

ТипN СписокNИменПолей;

ключевое structслово не нужно пpи

}  ИмяШаблона

использовании typedef

или struct ИмяШаблона

{ Тип1 Список1ИменПолей;¦

Тип2 Список2ИменПолей;

. . . 

ТипN СписокNИменПолей;

} ;

Пример. Характеристики книги: автор (author), название (title), год издания (year), цена (price), описываются шаблоном BOOK.

typedef struct {char author[20]; char title[44];/*описание*/

int year; float price} BOOK; /*шаблона BOOK*/

/*или можно описать тот же самый шаблон так:

struct BOOK {char author[20]; char title[44];

int year; float price} ;*/

struct BOOK b;/*описание структурной переменной b*/

Память, занимаемая структурой, равна сумме объемов памяти полей (если исключить из рассмотрения особенности, связанные с выравниванием). В любом случае для определения размера памяти структуры можно использовать операцию sizeof(). Шаблон ВООК, на­пример, описывает структуру размером памяти 70.

Обращение к полю структурной переменной:

ИмяСтруктуры.ИмяПоляили АдресСтруктуры->ИмяПоля

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

Например,

struct BOOK a,*pnta=&a;...

a.author="Byron"; pnta->author="Byron"; /*эквивалентные опера­торы*/

Пример.Задача примера 2 п.3.1.4 в нижеприведенной про­грамме выполнена с использованием структур (а не строк).

#include <stdio.h>

#include <conio.h>

#include <string.h>

void main()

{ /*структура сведений об игрушках*/

typedef struct {int nu;/*номер*/

char name[30];/*наименование*/

int minage,maxage;/*мин. и макс. возраст ребенка*/

double rub /*стоимость*/;}TOYS;

TOYS toy;/*переменная типа записьTOYS */

double max; /*максимальная стоимость*/

char namemax[30];/*название самого дорогого конструктора*/

int n /*число игрушек*/,i/*номер игрушки*/;

puts("Введите число наименований игpушек");

scanf("%d",&n);

max=0;

for (i=0; i<n;i++)

{toy.nu=i+1;

/*в цикле ввод сведений об игрушках и проверка условий*/

fflush(stdin); /*очистка буфера устройства ввода послеscanf */

printf(" Введите сведения об игpушке с номеpом %2d\n",toy.nu);

puts("наименование");

gets(toy.name);

puts("мин. и макс. возpаст и стоимость");

scanf("%d%d%lf",&toy.minage,&toy.maxage,&toy.rub);

if ((strstr(toy.name,"констpуктоp")!=NULL ||

strstr(toy.name,"Констpуктоp")!=NULL) &&

(toy.maxage <= 7) &&

(toy.rub>max))

{max=toy.rub;

strcpy(namemax,toy.name);

}

}

if (max==0)

puts(" Констpуктоpов для детей до семи лет нет");

else

{ printf("Cамый доpогой констpуктоp для детей до семи лет\n");

printf( " %s стоит %8.0f pублей\n",namemax,max);

}

}

В Си существует еще один сложный тип, описание которого формально похоже на структуру. Это тип ( и переменная) объедине­ние.

Объединение - это переменная, содержащая поля разного типа, помещаемые в одно и то же место памяти. По существу объедине­ние дает способ различной интерпретация содержимого памяти. Описание шаблона (типа) объединения и переменной этого типа выполняется также, как для структуры, только вместо ключевого слова structиспользуетсяunion. Размер памяти, занимаемой объе­динением, равен максимальному из размеров полей.