Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Структуры

Wait, Proceed,

Error = -1 } Status;

 

Тогда Status будет полноценным именем перечислимого типа.

Status Stat1, Stat2;

 

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

struct имя_этикетка {список элементов} [переменные];

Список_элементов состоит из объявлений, аналогичных объявлениям переменных. Объявления элементов оканчиваются точкой с запятой.

struct Person {

char lastName[32]; // Фамилия.

char firstName[32]; // Имя.

short age; // Возраст.

long phoneNum; // Телефон как длинное целое.

} aPerson; // Объявляет переменную типа struct Person.

Структура группирует различные данные, относящиеся к конкретному человеку. Как и в случае перечислений, в определении структуры можно сразу объявить переменные структурного типа, указав их имена после закрывающей фигурной скобки. Аналогично именем типа является struct имя-этикетка, и его можно сразу переопределить с помощью ключевого слова typedef.

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

struct Person *pPerson, aPerson; // Указатель на структуру и переменная.

aPerson.age = atol(ageStr); //Записать в структуру возраст и т.д.

pPerson=(struct Person*)malloc(sizeof(struct Person));

pPerson->phoneNum = atol(phoneStr);

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

printf("%s %63s\n", pPerson->firstName, pPerson->lastName);

Битовые поля.

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

тип [имя поля]: ширина поля;

Тип поля может быть int или unsigned int. Доступ к битовым полям осуществляется так же, как и к регулярным элементам структуры. Если имя поля отсутствует, место под поле отводится, но оно остается недоступным. Это будут просто “заполняющие” биты.

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

Например, определим битовые поля переменной a.

struct bits

{ int i:2;

unsigned j:6;

int k:3;

unsigned l:5;

} a;

a.i=2; a,j=9; a.k=7; a.l=5;

printf(“\n a=%o\n”,a);

результат работы в восьмеричной системе: a = 2 7 4 4 6

результат работы в двоичной системе: 0 010 111 100 100 110

l k j i

Динамическим структурам или массивам структур ОП выделяется в процессе выполнения программы.

#define STUD struct stud

STUD { int nz;

char fio[20];

}st; //имя статической переменной.

STUD * p, * pm;

p – указатель на скалярную динамическую структуру

pm – указатель на динамический массив структур.

p=(STUD*)malloc(sizeof(STUD));

pm=(STUD*)malloc(20*sizeof(STUD));

Указателю на структуру можно присвоить значение адреса статической скалярной структуры.

p = &st;

p = & pm[i];

К адресам строковых элементов структур можно обращаться:

st.fio; pm[i].fio; т.к. имя массива является его адресом

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

st = pm[i]; pm[i] = pm[j]; pm[j] = st;

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

int i;

struct stud

{ char name[10];

int vozr;

} *s;

s=(stud*)malloc(5*sizeof(stud));

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

{ printf ("\n vv name - ");

scanf("%s",(s+i)->name);

printf ("\n vv vozr - ");

scanf("%d",&s[i].vozr);

}

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

{

if ((s[i].vozr) >= 20)

printf("\n %s %5d",(s+i)->name,s[i].vozr);

}

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

{clrscr();

char *c[4] =

{" students ",

"==========================================",

"|| name || vozr ||",

"==========================================" };

int i; char *n;

struct stud

{ char name[10];

int vozr;

} *s;

s=(stud*)malloc(5*sizeof(stud));

printf ("\n введите имя > ");

scanf("%s",n);

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

{ printf ("\n имя - ");

scanf("%s",(s+i)->name);

printf ("\n возраст - ");

scanf("%d",&s[i].vozr);

}

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

printf("%s\n",c[i]);

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

{

if (strcmp((s+i)->name, n)==0)

printf("||%10s ||%10d ||\n",(s+i)->name,s[i].vozr);

}

printf("=======================||=================\n");

}

<== предыдущая лекция | следующая лекция ==>
Перечислимые типы | Объединения
Поделиться с друзьями:


Дата добавления: 2014-01-06; Просмотров: 322; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.017 сек.