Структура – составной объект, состоящий из компонентов любых типов, за исключением компонентов функционального типа.
Структуру можно рассматривать как одну или несколько переменных, которые для удобства работы с ними сгруппированы под одним именем.
В языке Си структура определяется следующим образом:
struct [имя_структуры]
{
тип_1 элемент_1;
тип_1 элемент_1;
…
тип_N элемент_N;
}
[список описателей];
Объявление структуры является оператором, поэтому в конце должна стоять точка с запятой. Элементы структуры называются полями структуры и могут иметь любой тип, кроме типа этой же структуры, но могут быть указателями на него. Если отсутствует имя структуры, должен быть указан список переменных, указателей или массивов. В этом случае описание структуры служит определением элементов этого списка:
struct
{
char surname[15];
char name[15];
int course;
double mate;
};
stud1, *ps;
Если список отсутствует, описание структуры определяет новый тип, имя которого можно использовать в дальнейшем наряду со стандартными типами, например:
|
|
struct STUDENT /* описание нового типа*/
{
char surname[15];
char name[15];
int course;
double mate;
}
Определим переменную типа STUDENT и указатель на этот тип:
struct STUDENT stud1, *ps.
Для инициализации структуры значения ее элементов перечисляют в фигурных скобках в порядке их описания:
STUDENT stud2={“Иванов”, ”Иван”, 3, 4.2};
Для переменных одного и того же структурного типа определена операция присваивания, при этом происходит поэлементное копирование. Структуру можно передавать в функцию и возвращать в качестве значения функции. Размер структуры не обязательно равен сумме размеров ее элементов, поскольку они могут быть выровнены по границам слов.
Доступ к полям структуры выполняется с помощью операции выбора. (точка) при обращении к полю через имя структуры и → при обращении через указатель, например:
struct STUDENT stud1, *ps;
…
stud1.mate =3.4;
cin>>stud1.surname;
*ps→ course=1;
cout<<stud1.surname;
Если элементом структуры является другая структура, то доступ к ее элементам выполняется через две операции выбора:
struct A {int a; double x;};
struct B {struct A b; double x;} s, x;
s.b.a=1;
s.b.x=0.5;
s.x=0.125;
x.b.a=2;
x.b.x=-0.5;
x.x=2.5;
Как видно из примера, поля разных структур могут иметь одинаковые имена, поскольку у них разная область видимости. По той же причине одинаковые имена могут иметь поле структуры и имя переменной из списка описателей.
Структуры нельзя сравнивать. В языке Си реализован очень ограниченный набор операций над структурами как единым целым: передача функции в качестве аргумента, возврат в качестве значения функции, получение адреса, присваивание структур.
а) Можно присваивать одну структуру другой, если они имеют одинаковый тип (шаблон). При этом происходит поэлементное копирование.
|
|
struct STUDENT stud1, stud2, *ps;
…
stud1=stud2;
(*ps)=stud1;
б) Функция может в качестве значения возвращать структуру:
struct complex {float real, im;};
struct complex make (float x, float y)
{
struct complex z;
z.real = x;
z.im y;
return z;
}
в) Можно получать адрес структуры с помощью операции взятия адреса.
student stud1, *ps;
struct ps=& stud1;
г) Можно передавать структуры в качестве аргумента функции:
struct complex add1 (struct complex a, struct complex b)
{
struct complex c;
c.real = a.real + b.real;
c.im = a.im + b.im;
return c;}
В этом случае структурные переменные передаются по значению. При вызове функциив качестве фактических аргументов указываются имена структурных переменных:
struct complex x,y,z;
…
z = add1(x, y);
д) Структуры можно передавать в функции и по адресу.
struct complex add2 (struct complex *pa, struct complex *pb)
{
struct complex c;
c.real = pa→real + pb→real;
c.im = pa→im + pb→im;
return c;
}
При вызове функции в этом случае в качестве фактических аргументов указываются адреса структур.
struct complex x,y,z;
…
z = add2(&x, &y);
В отличие от массива, имя структуры не имеет никакого значения.
Структуры, как и переменные других типов могут объединяться в массивы структур.Чтобы объявить массив структур, надо сначала задать шаблон структуры, а затем объявить массив.
struct STUDENT st[200];
Этот оператор создает в памяти 200 переменных типа структуры с шаблоном STUDENTи именами st[0], st[1],…st[199].
Для доступа к полю course 25-го элемента массива используем st[24].course.
При инициализации массивов структур следует заключать в фигурные скобки каждый элемент массива.
Пример:
Структура: студенты, поля – фамилия, имя, курс, средний балл. Поиск студентов по среднему баллу.
#include <iostream.h>
#include <conio.h>
#include <string.h>
//описание структуры
struct student
{char surname[15];
char name[15];
int course;
double mate;};
int main()
{const n=3;
int i,j;
//описание массива структур s и переменной t типа структуры
student s[n],t;
//установка флага "выравнивание по левому краю"
cout.setf(ios::left);
clrscr();
//ввод данных
for (i=0; i<=n-1; i++)
{cout<<" Vvedite familiu\n"; cin>>s[i].surname;
cout<<" Vvedite imya\n"; cin>>s[i].name;
cout<<" Vvedite kurs\n"; cin>>s[i].course;
cout<<" Vvedite sr ball\n"; cin>>s[i].mate;
clrscr();}
//вывод данных
cout<<"\nFamiliya Imya Kurs Sr. ball\n\n";
for (i=0; i<=n-1; i++)
{cout.width(18);cout<<s[i].surname;
cout.width(18);cout<<s[i].name;
cout.width(8);cout<<s[i].course;
cout.width(8);cout<<s[i].mate<<"\n";}//Поиск студентов по среднему баллу
double mate;
cout<<"\n\n Vvedite sr ball\n";
cin>>mate;
for (i=0; i<=n-1; i++)
if (s[i].mate>mate)
{
cout.width(18);cout<<s[i].surname;
cout.width(18);cout<<s[i].name;
cout.width(8);cout<<s[i].course;
cout.width(8);cout<<s[i].mate<<"\n";}
//Сортировка по фамилии в алфавитном порядке
for (i=0; i<=n-1; i++)
for (j=i+1; j<=n-1; j++)
if (strcmp(s[i].surname,s[j].surname)>0)
{t=s[i];
s[i]=s[j];
s[j]=t; }
//Вывод отсортированного массива
cout<<"\n\nOtsortirovannyi massiv\n\n";
cout<<"Familiya Imya Kurs Sr. ball\n\n";
for (i=0; i<=n-1; i++)
{cout.width(18);cout<<s[i].surname;
cout.width(18);cout<<s[i].name;
cout.width(8);cout<<s[i].course;
cout.width(8);cout<<s[i].mate<<"\n";}
getch();return 0;}
Задания для лабораторной работы:
Описать структуру в соответствии с вариантом задания. Заполнить данными массив из n элементов. В полученной базе данных осуществить поиск по критерию, указанному преподавателем. Отсортировать данные по ключевому полю. Таким образом, программа должна содержать следующие функции:
- создание и заполнение базы данных;
- поиск информации;
- сортировка данных.
1. Структура: FLOWER, поля: название, количество цветов в продаже, стоимость одного цветка. Ключевые поля: название цветка. Собрать букет из нескольких цветов в пределах заданной суммы.
2. Структура: TRAIN, поля: название пункта назначения, время отправления, номер поезда. Ключевые поля: время отправления. Поиск ближайшего поезда по пункту назначения.
3. Структура: EXPORT, поля: наименование товара, страна, импортирующая товар, и объем поставляемой партии. Ключевые поля: наименование товара. Поиск общего объема импорта страны.
|
|
4. Структура: CAR, поля: гос. номер автомобиля, марка, дата выпуска и общий пробег. Ключевые поля: марка. Поиск автомобиля, выпущенного не ранее указанного года и с пробегом, меньшим заданного пользователем.
5. Структура: FLAT, поля: адрес, количество комнат, общая площадь, стоимость квадратного метра. Ключевые поля: количество комнат. Поиск двухкомнатной квартиры в пределах заданной суммы.
6. Структура: MARSHRUT, поля: название начального пункта, название конечного пункта, длина маршрута. Ключевые поля: название начального пункта. Поиск маршрута, длина которого не более заданного пользователем значения.
7. Структура: JUMPER, поля: фамилия прыгуна, страна, которую он представляет, результат прыжков каждой попытки (три попытки). Ключевые поля: фамилия прыгуна. Поиск лучшего прыгуна.
8. Структура: ZOO, поля: название животного, номер вольера, количество. Ключевые поля: номер вольера. Поиск животных, численность которых менее критической (вводится с клавиатуры).
9. Структура: BAGGAGE, поля: фамилия пассажира, количество вещей, общий вес. Ключевые поля: фамилия пассажира. Поиск пассажиров, у которых вес багажа превышает норму.
10. Структура: DETAIL, поля: наименование, материал, масса. Ключевые поля: наименование. Найти среднюю массу детали.
11. Структура: JOURNAL, поля: название журнала, год издания, номер журнала, направление (вязание, шитье). Ключевые поля: год. Поиск журналов по направлению.
12. Структура: NOTE, поля: фамилия, имя, номер телефона, адрес. Ключевые поля: фамилия и имя. Поиск адреса и телефона по фамилии.
13. Структура: SUBSTANCE, поля: название вещества, плотность, проводимость (проводник, полупроводник, изолятор). Ключевые поля: название вещества. Поиск самого легкого вещества заданной проводимости.
14. Структура: PRICE, поля: название товара, стоимость товара, название магазина, в котором продается товар. Ключевые поля: название товара. Поиск магазина, в котором продается товар, указанный пользователем, по минимальной цене.
15. Структура: COUNTRY, поля: название, площадь, население. Ключевые поля: название. Поиск страны, в которой наибольшая плотность населения.
|
|
16. Структура: BOOK, поля: автор, название книги, год выпуска, количество страниц. Ключевые поля: автор. Поиск книг, выпущенных в указанном году.
17. Структура: RESERVOIR, поля: название водоема, загрязнитель, содержание загрязнителя (концентрация) и ПДК. Ключевые поля: название водоема. Найти водоемы, в которых превышена норма ПДК.
18. Структура: CHEMISTRY, поля: название, обозначение, номер в таблице. Ключевые поля: номер в таблице. Поиск всех щелочноземельных металлов и элементов подгруппы цинка (вторая группа периодической таблицы).
19. Структура: ORDER, поля: фамилия и инициалы плательщика, расчетный счет плательщика, расчетный счет получателя, перечисляемая сумма. Ключевые поля: фамилия и инициалы плательщика. Поиск общей суммы, перечисленной на данный расчетный счет
20. Структура: DATE, поля: событие, дата (год, месяц, число). Ключевые поля: дата. Поиск события, которое произойдет раньше остальных.
21. Структура: PLANT, поля: род, вид, название растения. Ключевые поля: название растения. Поиск растений одного вида или рода (по запросу пользователя).
22. Структура: POLYCLINIC, поля: фамилия и инициалы жителя, адрес, дата последнего прохождения флюорографического осмотра. Ключевые поля: фамилия и инициалы жителя. Поиск жителей, у которых просрочена дата флюорографии.
23. Структура: TOY, поля: название игрушки, страна производитель, возраст детей, для которых предназначена игрушка (нижняя и верхняя границы). Ключевые поля: название игрушки. Поиск некитайской игрушки для ребенка заданного возраста.
24. Структура: MACHINE, поля: гос. номер автомобиля, фамилия и инициалы владельца, дата последнего техосмотра. Ключевые поля: фамилия и инициалы владельца. Поиск автомобилей, не прошедших на данный момент техосмотр.
25. Структура: STOREHOUSE, поля: номер склада, вид продукции, количество продукции на данном складе. Ключевые поля: номер склада. Определить, достаточно ли запасов данной продукции на всех складах, если заказчику необходимо N -ое количество.
26. Структура: WORKER, поля: фамилия и инициалы работника, название занимаемой должности, год поступления на работу. Ключевые поля: фамилия и инициалы. Поиск работников, чей стаж превышает значение, введенное с клавиатуры.
27. Структура: HARVEST, поля: номер участка, площадь, вид культуры, урожайность. Ключевые поля: номер участка. Определить валовый сбор каждого вида культуры.
28. Структура: SPORTSMAN, поля: фамилия и инициалы, время на 100 м, время на 800 м, время на 5000 м. Ключевые поля: фамилия и инициалы. Поиск лучших спортсменов в каждом виде спорта.
29. Структура: STUDENT, поля: фамилия и инициалы, номер группы, оценки за сессию (массив из трех целых чисел). Ключевые поля: фамилия и инициалы. Поиск студентов, у которых средний балл за сессию выше 4.0.
30. Структура: STAR, поля: название звезды, созвездие, яркость. Ключевые поля: название звезды. Поиск звезд указанной яркости.
31. Структура: LIBRARY, поля: автор, название книги, издательство, год издания. Ключевые поля: год издания. Найти все книги автора, указанного читателем.
32. Структура: DRAFTEE, поля: фамилия, адрес, год рождения, признак годности к военной службе. Ключевые поля: фамилия. Вывести всех призывников на указанный год.
33. Структура: GAME, поля: название игры, системные требования (частота, ОЗУ, ПЗУ). Ключевые поля: название игры. Определить, можно ли установить игру на данный компьютер.
34. Структура: DOG, поля: кличка собаки, порода, возраст, количество наград. Ключевые поля: кличка собаки. Поиск собак определенной породы – победителей выставок.
Контрольные вопросы:
1. Как определить структуру?
2. Где может быть использован структурный тип данных?
3. В чем заключается различие между типом записи структуры и структурной переменной?
4. Как обратиться к элементу структуры?
5. Может ли структура содержать элементы одного типа?