Лабораторная работа №6
“Работа со
структурами в языке программирования Си++”
Цель работы: познакомиться
с понятием структуры и структурной переменной. Научиться создавать массивы
структур и работать со вложенными структурами.
1.
Теоретические
сведения
Структура – это объединение одного
либо более объектов (переменных, массивов, указателей, других структур). Как и
массив, она представляет собой совокупность данных, но отличается от него тем,
что к ее элементам необходимо обращаться по имени, и ее различные элементы не
обязательно должны принадлежать одному типу.
Структуры удобно
использовать там, где разнообразные данные, относящиеся к одному и тому же
объекту, необходимо объединять. Например, ученика средней школы характеризуют
следующие данные: фамилия, имя, дата рождения, класс, возраст.
Объявление структуры
осуществляется с помощью ключевого слова struct, за которым следует ее тип,
список элементов, заключенных в фигурные скобки. Ее можно представить в
следующем общем виде:
struct тип {тип элемента
1 имя элемента 1;
тип элемента n имя
элемента n; };
Именем элемента может
быть любой идентификатор. В одной строке можно записывать через запятую
несколько идентификаторов одного типа.
Например:
struct date
{ int day;
int month;
int year;} ;
Русские буквы
использовать в идентификаторе в языке СИ нельзя.
Следом за фигурной
скобкой, заканчивающей список элементов, могут записываться переменные данного
типа, например:
struct date
{…} a, b, c;
При этом выделяется
соответствующая память.
Выведенное имя типа можно
использовать для объявления записи, например: struct date day;. Теперь
переменная day имеет тип date.
Разрешается вкладывать
структуры одна на другую. Для лучшего восприятия структуры используем русские
буквы в идентификаторах, в языке СИ этого делать нельзя.
Например:
struct УЧЕНИК { char
Фамилия [15];
имя [15];
struct DATA ДАТА
РОЖДЕНИЯ;
int класс, возраст;};
Определенный выше тип
DATA включает три элемента: День, Месяц, Год, содержащие целые значения (int).
Запись УЧЕНИК включает элементы: ФАМИЛИЯ [15]; ИМЯ[15]; ДАТА РОЖДЕНИЯ, КЛАСС,
ВОЗРАСТ. ФАМИЛИЯ [15] и ИМЯ [15] – это символьные массивы из 15 компонент
каждый. Переменная ДАТА РОЖДЕНИЯ представлена составным элементом (вложенной
структурой) ДАТА. Каждой дате рождения соответствуют день месяца, месяц и год.
Элементы КЛАСС и ВОЗРАСТ содержат значения целого типа (int). После введения
типов ДАТА и УЧЕНИК можно объявить переменные, значения которых принадлежат
этим типам.
Например:
struct УЧЕНИК УЧЕНИКИ
[50];
массив УЧЕНИКИ состоит из
50 элементов типа УЧЕНИК.
В языке СИ разрешено
использовать массивы структуры; записи могут состоять из массивов и других
записей.
Чтобы обратиться к
отдельному компоненту структуры, необходимо указать ее имя, поставить точку и
сразу за ней написать имя нужного элемента.
Например:
Ученики [1]. КЛАСС = 3;
Ученики [1]. ДАТА
РОЖДЕНИЯ. ДЕНЬ=5;
Ученики [1]. ДАТА РОЖДЕНИЯ.
МЕСЯЦ=4;
Ученики [1]. ДАТА
РОЖДЕНИЯ. ГОД=1979;
Первая строка указывает,
что 1-й ученик учится в третьем классе, а последующие строки – его дату
рождения: 5.04.79.
Каждый тип элемента
структуры определяется соответствующей строкой объявления в фигурных скобках.
Например, массив УЧЕНИКИ имеет тип УЧЕНИК, год является целым числом. Так как
каждый элемент записи относится к определенному типу, его составное имя может
появляться везде, где разрешено использовать значение этого типа. Рассмотрим
пример программы:
/* Демонстрация записи */
#include < stdio.h
>
struct computer { int
mem;
int sp;
char model [20]; };
/* Объявление записи типа
computer, состоящей из трех элементов: mem, sp, model */
struct
computer pibm =
{512, 1, “ПЭВМ ЕС
1840.05”}
/* Объявление и
инициализация переменной pibm типа computer */
main ( )
{ printf (“ персональная
ЭВМ % s\n\n “, pibm.model);
printf ( “объем
оперативной памяти - % d К байт \n”, pibm.mem);
printf
(“производительность - % d млн. операций в секунду \n”, pibm.sp);
/* вывод на экран
значений элементов структуры */
}
В данной программе
объявляется запись computer, которая состоит из трех элементов: mem (память
ЭВМ), sp (быстродействие), model [20] (модель ПЭВМ). Переменная pibm имеет тип
computer и является глобальной. Строки pibm.model, pibm.mem, pibm. sp в
операторе printf вызывают обращение к соответствующим элементам записи pibm
типа computer, которым ранее были присвоены определенные значения.
Результат работы
программы имеет вид:
персональная ЭВМ ПЭВМ
ЕС 1840.05
объем оперативной
памяти – 512 К байт
производительность – 1
млн. операций в секунду
Рассмотрим использование
в программе вложенных структур:
/* Демонстрация вложенных
структур*/
# include < stdio.h
>
struct date {
int day;
int month;
int year; };
/* Объявление записи типа
date*/
struct person
{ char fam [20];
char im [20];
char ot [20];
struct date
f1;};
/* Объявление структуры
типа person; одним из элементов записи person является запись f1
типа date */
main ( )
{ struct
person ind1;
/* обьявление переменной
ind1 типа person */
printf ( “Укажите
фамилию, имя, отчество, день, \n месяц”
“ и год рождения
гражданина ind1\n”);
scanf (“ % S
% S % S %d %d”, &ind1.fam, &ind1.im, &ind1.ot,
&
ind1.f1.day, &ind1.f1.month, &ind1.f1.year );
/* Ввод сведений о
гражданине ind1 */
printf (“ Фамилия, имя, отчество: % S % S % S \n”,
ind1.fam, ind1.im, ind1.ot);
printf (“ Год рождения
- % d \n”, ind1.f1.year);
printf (“ Месяц рождения - % d -й \n”,
ind1.f1.month);
printf (“ День рождения
- % d -й \n”, ind1.f1.day);
/* Вывод сведений о
гражданине ind1 */
}
Структура типа date (
дата) содержит три элемента: day (день), month (месяц), year (год). Структура
типа person (человек) содержит четыре элемента: fam[20] (фамилия), im[20] (имя)
, ot[20] (отчество), f1 (дата рождения). Последний из них (f1) – это вложенная
запись типа date.
Результаты работы
программы:
Укажите фамилию, имя,
отчество, день, месяц и год рождения гражданина ind1
Алексеев
Сергей
Петрович
3
5
1978
Подчеркнутая информация
вводится пользователем.
Сведения о гражданине
ind1
Фамилия, имя,
отчество: Алексеев Сергей Петрович
Месяц рождения – 5-й
День рождения – 3-й
В следующей программе
рассмотрим использование структуры в виде элементов массива pibm. Каждый
элемент состоит из следующих компонентов: mem (память), sp (объем винчестера),
model [20] (модель ПЭВМ):
/* Массивы записей */
#include < stdio.h
>
struct
computer { int mem, sp;
char model
[20];
pibm [10];};
/* объявление записи
типа computer;
объявление массива pibm
типа computer */
main ( )
{ int i, j, k,
priz;
for ( i=0; i<10; i++)
{ printf (“Введите
сведения о ПЭВМ %d и признак (0-конец;
\n другая цифра-
продолжение)\n”, i);
printf (“ модель ПЭВМ -
”);
scanf (“%S”,
&pibm [i].model );
printf ( “объем оперативной памяти -”);
scanf (“%d”,
&pibm[i].mem);
printf (“ объем винчестера - ”);
scanf ( “%d ,
&pibm[i].sp ”);
printf (“признак - ”);
scanf (“ %d ”,
&priz );
k=i;
if (!priz)
break; }
/* Здесь !priz – операция отрицания priz; break – выход из цикла for, если priz=0 */
for (i=0; i<10, i++);
{
printf ( “\n О какой ПЭВМ
Вы хотите получить сведения?\n (Введите номер от 0 до 9)\n” );
scanf ( “%d
”,&j );
if (j>k)
{ printf (“Нет сведений
об этой ПЭВМ \n”);
continue; }
printf (“ персональная ЭВМ %s\n ”, pibm[j].model);
printf (“объем
оперативной памяти - % d Мб \n ”, pibm[j].mem);
printf (“объем винчестера
- % d Мб \n ”, pibm[j].sp);
printf (“ признак – “ );
scanf ( “ %d
”, &priz);
if (!priz) break; }
/* Ввод сведений о ПЭВМ и
занесение в массив pibm записей типа computer (первый цикл for); вывод на экран
сведений о ПЭВМ (второй цикл for) */
}
Результаты работы
программы:
Введите сведения о
ПЭВМ и признак (0-конец; другая цифра – продолжение)
модель ПЭВМ – АТ 486
SX
объем оперативной
памяти – 32
объем винчестера – 4
Гбайта
признак – 1
Введите сведения о
ПЭВМ и признак (0-конец; другая цифра – продолжение)
модель ПЭВМ – АТ 386
DX
объем оперативной
памяти – 64
объем винчестера – 14
Гбайт
признак – 0
О какой ПЭВМ Вы хотите
получить сведения? (Введитн номер от 0 до 9)
1
модель ПЭВМ – АТ 386
DX
объем оперативной
памяти – 16 Мб
объем винчестера – 2,5
Гбайт
признак – 0
2.
Задание
Из таблицы взять задание
по варианту и написать программу.
3.
Содержание
отчета
Отчет должен содержать:
1)
задание к работе;
2)
программу;
3)
результаты
расчетов.
№ вар. | Задание |
1 | Опишите запись СТУДЕНТ и поместите в нее следующую информацию: Ф.И.О., оценки (математика, физика, черчение, химия, сопромат). Определите, сколько студентов имеют неудовлетворительную оценку по математике. |
2 | Воспользовавшись записью СТУДЕНТ из варианта №1, определите, сколько студентов имеют неудовлетворительную оценку хотя бы по одному предмету. |
3 | Воспользовавшись записью СТУДЕНТ из варианта №1, определите, сколько студентов сдали все экзамены на 5. |
4 | Воспользовавшись записью СТУДЕНТ из варианта №1, определите средний балл группы по физике. |
5 | Воспользовавшись записью СТУДЕНТ из варианта №1, определите количество отличных оценок, полученных группой по всем предметам. |
6 | Воспользовавшись записью СТУДЕНТ из варианта №1, определите, сколько студентов имеют средний балл от 4 до 5. |
7 | Воспользовавшись записью СТУДЕНТ из варианта №1, определите, какое количество неудовлетворительных оценок получено по всем предметам. |
8 | Воспользовавшись записью СТУДЕНТ из варианта №1, определите, какой из предметов был сдан группой лучше всего. |
9 | Воспользовавшись записью СТУДЕНТ из варианта №1, определите, сколько студентов не имеют задолженностей. |
10 | Опишите запись АНКЕТА и поместите в нее следующую информацию: Ф.И.О.(фамилия, имя, отчество), адрес (улица, номер дома, номер квартиры), пол, возраст. Определите, сколько лиц женского и сколько мужского пола проживают в одном доме. |
11 | Воспользовавшись записью АНКЕТА из варианта №10, определите, сколько лиц мужского пола в возрасте старше 18 лет и младше 60 проживают на одной улице. |
12 | Воспользовавшись записью АНКЕТА из варианта №10, определите, сколько лиц женского пола в возрасте старше 30 лет проживают в одном доме. |
13 | Воспользовавшись записью АНКЕТА из варианта №10, определите, сколько детей до 7 лет проживают на одной улице. |
14 | Воспользовавшись записью АНКЕТА из варианта №10, определите, сколько лиц мужского пола и женского в возрасте до 50 лет проживают на одной улице. |
15 | Воспользовавшись записью АНКЕТА из варианта №10, определите, сколько детей от 1 года до 5 проживают в одном доме. |
16 | Опишите запись ТРАНСПОРТ и поместите в нее следующую информацию: Ф.И.О. (фамилия, имя, отчество пассажира), багаж (количество вещей, вес в кг). Определить число пассажиров, вес багажа которых превышает 30 кг. |
17 | Воспользовавшись записью ТРАНСПОРТ из варианта №16, определите, имеется ли пассажир, багаж которого состоит из одной вещи весом в 20 кг. |
18 | Воспользовавшись записью ТРАНСПОРТ из варианта №16, определите средний вес багажа. |
19 | Воспользовавшись записью ТРАНСПОРТ из варианта №16, определите количество пассажиров, вес багажа которых превосходит средний. |
20 | Воспользовавшись записью ТРАНСПОРТ из варианта №16, определите количество пассажиров, имеющих более трех вещей. |
Литература
1. Подбельский В.В. Язык Cu ++: Учебное
пособие. - М.: Финансы и статистика,1995, - 560 с.
2. Страуструп Б. Язык программирования
Сг ++. - М.: Радио и связь, 1991. - 352 стр.
3. Собоцинский В.В. Практический курс
Turbo Cu ++. Основы объктно- ориентированного программирования. - М.: Свет,
1993. - 236 с.
4. Романов В.Ю. Программирование на
языке Cu ++. Практический подход. - М.: Компьтер, 1993. - 160 с.
5. Уинер Р. Язык турбо Cu . - М.: Мир,
1991. - 384 с.
6. Юлин В.А., Булатова И.Р. Приглашение
к Cu. - Мн.: Высш. Шк., 1990,- 224 с.
7. Котлинская Г.П., Галиновский О.И.
Программирование на языке Cu. -Мн.: Высш. Шк., 1991. - 156 с.
Контрольная работа | Концепция информатизации Российской Федерации |
Контрольная работа | Причины агрессивного поведения. Методы работы с агрессивными детьми |
Контрольная работа | Алгоритм выбора и реализации предпринимательской идеи |
Контрольная работа | Системы управления взаимоотношения с клиентами |
Контрольная работа | Учет материальных затрат в бухгалтерском учете |
Контрольная работа | Геополитическое положение России |
Контрольная работа | Особенности вознаграждения работников в организации |
Контрольная работа | Виды запасов |
Контрольная работа | Психоанализ |
Контрольная работа | Экономико-географическая характеристика Печорского угольного бассейна 2 |
Контрольная работа | Закон диалектического противоречия. |
Контрольная работа | Основные направления развития угольной промышленности |
Контрольная работа | Психические познавательные процессы |
Контрольная работа | Контрольная работа по Безопасность жизнедеятельности |
Контрольная работа | Речевой этикет в деловом общении |