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

Структуры

Тип данных структура

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

При использовании структурных переменных вначале нужно описать тип (или шаблон) структуры, а затем структурные переменные. Тип структуры задает порядок следования отдельных элементов (полей) в структуре и их типы. Описание структурного типа имеет вид:

struct имя_типа

{ Описание элементов

};

Точка с запятой в конце описания обязательна. Например:

struct

 

ANKETA

/* фамилия и инициалы */

{

char

 

fio[20];

 

int

 

gr;

/* год рождения */

};

char

adr[40];

/* адрес */

 

 

 

 

struct

 

BOOK

/* автор книги */

{

char

 

author[40];

 

char

 

name [50];

/* название */

 

int

year;

/* год издания */

};

int

pages;

/* число страниц */

 

 

 

 

Здесь ANKETA и BOOK - это имена типов структур, а не переменных. При описании типов память под структуры не выделяется.

Описание структурной переменной на языке C имеет вид:

struct

имя_типа

имя_переменной;

 

Например:

 

 

 

 

struct ANKETA a1;

 

 

 

struct BOOK

b1,b2;

 

массив из 100 структур типа BOOK*/

struct BOOK

mb[100]; /*

struct ANKETA

*p1;

/*

указатель на

структуру типа ANKETA */

struct BOOK *p2 = &b2;

 

/* указатель

на структуру типа BOOK,

 

 

 

 

ссылающийся

на переменную b2 */

106

При объявлении структурных переменных на языке C++ ключевое слово struct обычно опускается, например:

ANKETA

a1;

 

 

 

 

BOOK

b1,b2;

 

 

 

 

Каждая структурная переменная будет состоять из полей,

перечисленных при описании типа структуры.

 

 

a1

 

b1

b2

 

fio

 

author

 

author

 

gr

 

name

 

name

 

adr

 

year

 

year

 

 

 

 

 

 

pages

 

pages

 

 

 

 

 

 

 

 

 

 

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

struct BOOK b3 = { “Толстой Л.Н.”, ”Война и мир”, 1995, 1650};

Для однотипных структур определена операция присваивания:

b1=b3;

mb[0]=b3;

Другие операции целиком над структурами выполнять нельзя. Например, сравнение структур или ввод/вывод нужно выполнять

поэлементно.

 

Для обращения к отдельным элементам

(полям) структурных

переменных используется операция выбора “.” или “->” :

<имя

переменной>.<имя элемента>

 

<имя

указателя> -> <имя элемента>

 

Пример

/* ввод значения структурной переменной b2 типа BOOK*/ gets(b2.author);

gets (b2.name);

scanf(“%d%d”, &b2.year, &b2.pages);

Пример

struct ANKETA a2; strcpy(a2.fio, “Иванов А.В.”); а2.gr = 1980;

107

strcpy(a2.adr, “ул.Пушкина, д.10, кв.5”);

Пример

struct BOOK *p3 = &b3;

printf (“%s, %s, %d г., %d с.\n”, p3->author, p3->name, p3->year, p3->pages);

Результат на экране:

Толстой Л.Н., Война и мир, 1995 г., 1650 с.

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

struct

{ char fio[20]; int gr;

char adr[40];

}a1, a2, *p1;

Память под структурную переменную может быть выделена динамически, при выполнении программы, например:

struct BOOK *p4;

p4 = (struct BOOK *) malloc (sizeof (struct BOOK));

Такая структура имени не имеет; обращаются к ней с помощью указателя p4, например:

gets (p4->name);

Пример

/* Программа определения числа дней, прошедших с начала года до указанного месяца */

#include <stdio.h> #include <string.h>

struct

MONTH

/* название месяца */

{

char *name;

};

int

days;

/* число дней */

 

 

 

int

main()

 

{

struct MONTH

year[12] =

 

 

{

{“январь”, 31},

108

 

{“февраль”, 28},

 

 

{“март”, 31},

 

 

 

 

 

 

{“декабрь”, 31}

 

 

};

m[9];

/* название заданного месяца */

 

 

char

*/

int

int

n = 0;

/* число дней до зад. месяца

i;

 

/* индекс очер. эл-та массива year */

puts (“\nВведите название месяца”);

 

gets (m);

 

 

 

for (i=0; i<12 && strcmp (m, year[i].name)); i++)

 

n += year[i].days;

 

if (i==12)

puts (“Неверное название”);

 

else

printf (“Число прошедших дней: %d”, n );

 

return 0;

 

 

 

}

 

 

 

 

Контрольные вопросы

1. Определите результат выполнения фрагмента программы:

struct A { int a,b; };

struct A s = {10, 20}; printf (“%d”, s.a + s.b);

2.

Определите результат выполнения фрагмента программы:

struct

int

b;

{

char a[10];

}

s = {“Москва”,

155};

printf (“%d, %s”,

s.b,

s.a);

3.

Объявлены переменные:

struct

A

 

{ int x;

 

 

float

y;

 

} s, *p = &s;

 

Как можно полям x, y объявленной структурной переменной присвоить

значения 10 и 5.5?

4.

Определите результат выполнения фрагмента программы:

struct

A

char y[10];

{

int

x;

}

s,

*t

= &s;

t –>x = 2006;

strcpy

(t –>y, “май”);

printf

(“%s

%d”, s.y, s.x);

109

5.Опишите структуру из 4-х полей:

признак того, можно ли изменять другие поля (равен 1 или 0);

массив из 100 пятибуквенных слов;

целое число;

вещественное число.

Опишите структурную переменную и указатель на эту переменную.

6.Опишите массив из 30 записей (структур). Каждая запись состоит из 4-х полей, описывающих часть анкетных данных спортсмена:

фамилия, имя и отчество;

год рождения;

рост в метрах (например, 1.85);

вес в кг.

7.Определите результат выполнения фрагмента программы:

int

F (int a,

int

b)

{

if (a<b) return

a+b;

 

return a-b;

 

 

}

void main()

{struct

{ int n1, n2;

}s = {30, 20};

printf (“%d”, F(s.n1, s.n2));

}

110