Имя_записи variable; // объявление переменной типа запись

Лабораторная работа № 13

«Создание пользовательских типов данных. Структуры»

 

Цель работы: ознакомиться с пользовательскими типами данных, рассмотреть понятие структуры в языке С++ и уметь оперировать с данными в структурах.

.

Теоретические сведения

Типы, определяемые пользователем

Кроме известных нам типов данных язык Си позволяет создавать еще пять типов данных: структуры (structure), объединения (union), перечислимый тип (enumeration), поля битов (bitfields). Пятая возможность - с помощью оператора typedef создавать новое имя (псевдоним) для уже существующего типа.

Структура – это совокупность взаимосвязанных элементов одного, либо разных типов. Взаимосвязь определяет порядок размещения элементов структуры. Элементы структуры объединены под одним именем. Поэтому структура трактуется не как множество отдельных элементов, а как единое целое.

Примеры структур: библиографические данные о книге; строка платежной ведомости; данные о некотором товаре; координаты точек на плоскости и т. п.;

Над структурами в языке Си стандартом ANSI определены следующие операции:

1. операции присваивания между структурами, имеющими одно и то же имя типа;

2. операции копирования;

3. передача структур в качестве параметров функциям и возврат их в качестве результата;

Кроме этих операций, к структурным переменным применимы следующие:

4. адресная операция &; (кроме битовых полей);

5. операции доступа к элементам структуры “.” и –> ;

6. инициализация структурных переменных, имеющих класс auto.

В то же время к структурам нельзя применять операции отношения (т.е. нельзя сравнивать структуры).

Элементом структуры могут быть переменные базового типа, массивы, указатели, объединения, другие структуры. Однако элементом структуры не может быть структура того же типа, в которой он содержится. В то же время этот элемент может быть указателем на тип структуры, в которую он входит. Это позволяет создавать связанные списки структур.

Количество и состав переменных объединяемых в записи ограничен только объемами памяти ЭВМ. Однако обычно в записи объединяются переменные соответствующие некоторому объекту или процессу. Например, данные о человеке, характеристики товара, текущее состояние некоторого технологического процесса или динамика ставок на бирже на некоторый товар и т.д.

Структура записи определяется следующим форматом:

Struct имя_записи

{

Тип переменной_1 имя переменной_1;// объявление переменных, объединяемых в записи

. . .

Тип переменной_N имя переменной_N;

};

Имя_записи variable; // объявление переменной типа запись

 

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

struct имя_записи

{

Тип переменной_1 имя переменной_1; // объявление переменных

. . .

Тип переменной_N имя переменной_N; // объединяемых в записи

} variable; // объявление переменной типа запись

 

Имя_записи – обычный идентификатор, соответствующий типу записи.

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

struct stydent

{

char name[20],cvet_gl[15];

int rost,ves, god_roj;

float raz_ob;

};

student styd;

 

В данном примере объявлена одна переменная типа запись (stud1) и шесть переменных разного типа, соответствующих полям записи:

stуd. name – строковая переменная до 20 символов;

stуd. rost, ctуd.ves и stуd.god_roj – переменные целого типа;

stуd.raz_ob – одна переменная вещественного типа и

stуd.cvet_gl – строковая переменная до 15 символов.

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

Например, при присваивании им некоторых значений:

strcpy(stуd. Name, “Иванов”);

stуd. rost = 173;

stуd.ves = 68;

stуd.raz_ob = 23,5;

strcpy(stуd.cvet_gl,”зеленый”);

stуd.god_roj = 1986;

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

Рассмотрим чисто учебный пример определения одной записи типа студент, ввода некоторых значений и распечатки информации о студенте.

Исходный код программы:

 

#include <stdlib.h>

#include <iostream.h>

#include <string.h>

typedef char stringa[20];

struct stydent

{

stringa name,cvet_gl;

int rost,ves, god_roj;

float raz_ob;

};

stydent styd;

 

int main()

{

strcpy(styd.name,"IBAHOB");

styd. rost = 173;

styd.ves = 68;

styd.raz_ob = 27;

strcpy(styd.cvet_gl,"KARIE");

styd.god_roj = 1986;

system("echo Были введены следующие данные о студенте:");

cout<<"Name "<<styd.name<<endl;

cout<<"GLAZA "<<styd.cvet_gl<<endl;

cout<<"POCT "<<styd.rost<<endl;

cout<<"BEC "<<styd.ves<<endl;

cout<<"GOD POJDEHIJ "<<styd.god_roj<<endl;

cout<<"PAZMEP OBYBI "<<styd.raz_ob<<endl;

system("PAUSE");

return 0;

}

 

Работа программы:

Были введены следующие данные о студенте:

Name IBAHOB

GLAZA KARIE

POCT 173

BEC 68

GOD POJDEHIJ 1986

PAZMEP OBYBI 27

Для продолжения нажмите любую клавишу . . .

 

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

 

Задание: напишите программу согласно своему варианту

Вариант Задание
1. Опишите запись 2_СЕМЕСТР и поместите в нее следующую информацию: Ф.И.О. студентов, оценки (математический анализ, физика, технология программирования, экология, казахский язык, иностранный язык). Определите, сколько студентов имеют неудовлетворительную оценку по математическому анализу.
2. Воспользовавшись записью 2_СЕМЕСТР из варианта № 1, определите, сколько студентов имеют неудовлетворительную оценку хотя бы по одному предмету.
3. Воспользовавшись записью 2_СЕМЕСТР из варианта № 1, определите средний балл группы по физике.
4. Воспользовавшись записью 2_СЕМЕСТР из варианта № 1, определите количество отличных оценок, полученных группой по всем предметам.
5. Воспользовавшись записью 2_СЕМЕСТР из варианта № 1, определите, сколько студентов имеют удовлетворительную оценку по физике.
6. Воспользовавшись записью 2_СЕМЕСТР из варианта № 1, определите, какое количество неудовлетворительных оценок получено по всем предметам.
7. Воспользовавшись записью 2_СЕМЕСТР из варианта № 1, определите, какой из предметов был сдан группой лучше всего.
8. Воспользовавшись записью 2_СЕМЕСТР из варианта № 1, определите, сколько студентов не имеют задолженностей.
9. Опишите запись АНКЕТА и поместите в нее следующую информацию: Ф.И.О. (фамилия, имя, отчество), адрес (улица, номер дома, номер квартиры), пол, возраст. Определите, сколько лиц женского и сколько мужского пола проживают в одном доме.
10. Воспользовавшись записью АНКЕТА из варианта № 9, определите, сколько лиц мужского пола в возрасте старше 18 лет и младше 60 проживают на одной улице.
11. Воспользовавшись записью АНКЕТА из варианта №9, определите, сколько лиц женского пола в возрасте старше 30 лет проживают в одном доме.
12. Воспользовавшись записью АНКЕТА из варианта № 9 определите, сколько детей до 7 лет проживают на одной улице.
13. Воспользовавшись записью АНКЕТА из варианта № 9 определите, сколько проживает мужчин в возрасте от 18 до 27 лет
14. Воспользовавшись записью АНКЕТА из варианта № 9, определите, сколько детей от 1 года до 5 проживают в одном доме.
15. Воспользовавшись записью АНКЕТА из варианта № 9, определите, сколько лиц мужского пола и женского в возрасте до 50 лет проживают на одной улице.