Московский Институт Электронной Техники
Кафедра «ИПОВС»
Лабораторная работа
Структурный тип данных на языке С++
Цель работы:
Получить практические навыки решения задач с использованием структурного типа данных.
Теоретические сведения
Иногда удобно иметь набор значение различного типа, с которыми можно обращаться как с элементом.
Рассмотрим, например, музыкальную коллекцию на компакт-дисках (CD). Также коллекция может включать в себя следующую информацию:
-
Название CD
-
Исполнитель
-
Число песен
-
Стоимость
-
Дата покупки
Эта структура имеет пять элементов (членов). Определим тип каждого их элементов структуры:
Имя элемента |
Тип данных |
Название |
Символьный массив из 25 символов |
Исполнитель |
Символьный массив из 20 символов |
Число песен |
Целый |
Стоимость |
С плавающей точкой |
Дата покупки |
Символьный массив из 8 символов |
Определение структуры
Для определения структуры используется ключевое слово struct. Struct указывает, что далее привидено имя структуры, как имя нового типа данных.
Синтаксис оператора struct:
Struct <имя структуры>
{
<определение члена структуры>;
<- - - - - - - - - - - - - - - - - - -- - ->;
… … …
<определение члена структуры>;
} [одна или более переменных];
Определение члена структуры представляет собой определение перепенной стандартного типа или типа, который определил пользователь.
Пример структуры с информацией о CD:
Struct cd_info
{
char title[25];
char artist[20];
int num_songs;
float price;
char date_bought[8];
} col1, col2, col3;
Переменные структурного типа можно объявлять также как и переменные стандартных типов.
Struct cd_info
{
char title[25];
char artist[20];
int num songs;
float price;
char date_bought[8];
};
cd_info cd1, cd2, cd3;/*определение переменных cd1, cd2, cd3*/
При определении структурной переменной С++ резервирует для нее место в памяти. Если же была описана только структура, а ни одной переменной данной структуры не было определено, то место в памяти не выделяется.
Инициализация структуры
Структуры можно инициализировать одновременно с объявлением. Инициализация структурного типа производится, если после ее имени следует знак «=» и список значений в фигурных скобках, разделенных запятой.
Инициализация структуры, содержащей информацию о музыкальной коллекции на CD.
Struct cd_info
{
char title[25];
char artist[20];
int num_songs;
float price;
char date_bought[8];
};
cd_info cd={“Red Moon Men”,
“Sam and the Snuds”,
12,
11.95,
“02/13/97”
};
Значения переменных (членов) присваивается в порядке их объявления при определении структуры.
Доступ к элементам структуры
Доступ к элементам структуры осуществляется с помощью операции «точка».
Синтаксис:
<имя переменной структурного типа>.<имя переменной члена структуры>
Пример:
#include <stdoi.h>
struct cd_info
{
…………………..
};
void main()
{
…………………..
//вывод содержимого переменной cd
printf(“Название: %s\n”, cd.title);
printf(“Исполнитель: %s\n”, cd.artist);
printf(“Количество песен: %d\n, cd.num_songs);
printf(“Стоимость: %5.2f\n”, cd.price);
printf(“Дата покупки: %s\n”, cd.date_bought);
}
Вложенные структуры
С++ позволяет определять одну структуру в рамках другой. Например, структура PersonInfo для записи роста, веса и даты рождения человека может быть определена следующим образом:
Sruct Date
{
int mounth;//месяц
int day;//число
int year;//год
};
struct PersonInfo
{
float height;//рост
float weight;//вес
Date birthday;//дата рождения
};
PersonInfo person // Объявление переменной типа PersonInfo
Чтобы получить доступ к переменной birthday – члену person нужно использовать операцию «точка»: person.birthday, но т.к. эта переменная в свою очередь является переменной структурного типа Date, то доступ, например, к году рождения будет добавлением операции «точка» к имени year: person.birthday. year.
Массивы структур
Массивы структур определяются также как и массивы с элементами стандартных типов.
Синтаксис:
<имя структуры><имя переменной структурного типа>[количество элементов массива];
Например: PersonInfo[20];
Нумерация элементов массива начинается с 0 и заканчивается индексом, равным количеству элементов массива –1.
Доступ к элементам массива структурного типа также осуществляется с использованием операции точка, например: personal[5].weight, personal[3].birthday.day и т.п.
Пример программирования
Задание: Сформировать массив, содержащий сведения о вкладах.
Каждая структура содержит поля:
-
Фамилия И. О. вкладчика,
-
Номер счета,
-
Тип вклада (срочный, депозит, обычный),
-
Сумма вклада,
-
Дата последнего обращения к вкладу.
Написать программу, которая выводит информацию о всех вкладчиках банка и о пяти вкладчиках банка, имеющих наибольший размер вклада, в алфавитном порядке имен.
Текст программы:
#include <conio.h>
#include <stdio.h>
struct banks // объялвение структуры
{
char name [10]; //Имя вкладчика
int namber; //Номер счета
char type[10];//Тип счета
int summa; //Сумма вклада
char date[10]; //Дата последнего обращения
};
banks bank[10],per;
int n,i;
//****************************************************//
void sort(int nn) /*Функция сортировки вкладчиков по наибольшей сумме вклада методом “пузырька”*/
{
int a,b;
for (a=0;a<nn-1;a++)
{
for (b=0;b<nn-1;b++)
{
if (bank[b+1].summa>bank[b].summa) //условие сортировки
{
per=bank[b]; //Тело сортировки
bank[b]=bank[b+1];
bank[b+1]=per;
}
}
}
}
//******************************************************//
void sorts(int nn) /*Функция сортировки вкладчиков по алфавиту методом “пузырька”*/
{
int a,b;
for (a=0;a<nn-1;a++)
{
for (b=0;b<nn-1;b++)
{
if (bank[b+1].name[0]<bank[b].name[0])
{
per=bank[b];
bank[b]=bank[b+1];
bank[b+1]=per;
}
}
}
}
//******************************************************//
void wwod (int nn) //Функция ввода информации о вкладчиках
{
for (i=0;i<nn;i++)
{
clrscr();
gotoxy(10,1);
printf(“%d”,i+1); printf(“ – Вкладчик \n\n\r”);
gotoxy(0,3);
printf(“Введите имя вкладчика: ”);
scanf(“%s”, bank[i].name);
printf(“Введите номер счета: ”);
scanf(“%d”, &bank[i].namber);
printf(“Введите тип счета: ”);
scanf(“%s”, bank[i].type);
printf(“Введите сумму: ”);
scanf(“%d”, &bank[i].summa);
printf(“Введите дату последнего обращения: ”);
scanf(“%s”, bank[i].date);
printf(”\n\n”);
}}
//******************************************************//
void wiwod (int nn) //Функция вывода информации
{
clrscr();
gotoxy(2,3);
printf(“имя вкладчика: номер счета: тип счета: сумма: дата последнего обращения: ”);
if (n<4) nn=n;
for (i=0;i<nn;i++)
{
gotoxy(2,i*2+5);
printf(“%s”, bank[i].name); //Вывод имени вкладчика
gotoxy(18,i*2+5);
printf(“%d”, &bank[i].namber); //Вывод номера счета
gotoxy(33,i*2+5);
printf(“%s”, bank[i].type); //Вывод типа счета
gotoxy(47,i*2+5);
printf(“%d”, &bank[i].summa); //Вывод суммы вклада
gotoxy(58,i*2+5);
printf(“%s”, bank[i].date); //Вывод даты последнего обращения
printf(”\n\n”);
}}
//******************************************************//
void main(void) //Основная программа
{
clrscr(); //Очистка всего экрана
printf(“Введите количество вкладчиков: ”);
scanf(“%d”,&n);
wwod(n); //Ввод информации
wiwod(n); //Полная информация о вкладчиках
getch();
sort(n); //Сортировка информации по сумме вкладов
wiwod(n);
getch();
sorts(n); //Сортировка информации по имени вкладчика
wiwod(4); // Четыре вкладчика с наибольшей суммой вклада
getch();
}
Контрольные вопросы
-
Какова область применения структур?
-
Каким образом определяется структура?
-
Как определяются переменные типа структура?
-
Как осуществляется доступ к структурным членам?
Лабораторное задание
Составить программу решения задачи для своего варианта (см. таблицу заданий). При составлении программы задать любой цвет экрана, ввод входных данных осуществите в диалоговом режиме, вывод выходных данных – на очищенный экран в виде таблицы.