Лабораторная работа 8. Структуры и перечисления
struct имя{ тип1 поле1; тип2 поле2; ... типN полеN; };
Описание структуры - это некий шаблон, по которому впоследствии создаются переменные. С точки зрения использования в программе имеет смысл говорить лишь о переменных структуры. Фактически переменная структуры - это объект, который имеет имя (имя переменной структуры) и поля, тип и названия которых определяются описанием структуры. Чтобы в программе создать переменную структуры, необходимо указать имя структуры, в соответствии с описанием которой создается переменная, и имя этой переменной. Другими словами, переменная структуры в программе создается точно так же, как и переменная любого базового типа, только вместо названия типа переменной указывается название структуры. Сама по себе переменная структуры интерес представляет больше спортивный, чем практический. Все данные, которые могут понадобиться в процессе выполнения программы, записаны в поля переменной. Обращение к полю переменной структуры осуществляется через так называемый точечный синтаксис (стандартный синтаксис для объектно-ориентированного программирования) - указывается имя переменной структуры, и через точку имя поля, к которому выполняется обращение, т.е. в формате структура.поле. Примеры объявления и использования структур приведены в листинге 8.1.
// Листинг 8_1 Объявление и использование структуры // demoStruct1.cpp: Defines the entry point for the console application. //
#include "stdafx.h" #include <iostream> #include <cstring> using namespace std; #include <conio.h>
struct Marks { char name[80]; int phys; int chem; int maths; };
struct Exams { double phys; double chem; double maths; };
int main() { Marks ivanov,petrov,sidorov; strcpy(ivanov.name,"Sergei Ivanov"); ivanov.phys=4; ivanov.chem=3; ivanov.maths=3;
strcpy(petrov.name,"Igor Petrov"); petrov.phys=5; petrov.chem=4; petrov.maths=4;
strcpy(sidorov.name,"Ivan Sidorov"); sidorov.phys=5; sidorov.chem=4; sidorov.maths=3;
Exams LastYear,ThisYear; LastYear.chem=4.33333; LastYear.phys=3.66667; LastYear.maths=3.33333;
ThisYear.chem=(double)(ivanov. chem+petrov. chem+sidorov.chem)/3; ThisYear.phys=(double)(ivanov.phys+petrov.phys+sidorov.phys)/3; ThisYear.maths= (double) (ivanov. maths+petrov. maths+sidorov. maths) /3;
cout<<"Last year marks: "<< endl; cout<<"Physics " << LastYear.phys<<endl; cout<<"Chemistry "<<LastYear.chem<<endl; cout<<"Mathematics "<<LastYear.maths<<endl; cout<<endl;
cout<<"This year marks: "<<endl; cout<<"Physics "<<ThisYear.phys<<endl; cout<<"Chemistry "<<ThisYear. chem<<endl; cout<<"Mathematics "<<ThisYear.maths<<endl;
getch(); return 0; }
В программе объявлены две структуры: Marks и Exams. В структуру Marks входят четыре поля: символьный массив name типа char и целочисленные поля (тип int) phys, chem и maths. Структура Marks создается в программе для хранения информации об успеваемости учащихся. Оценки по трем предметам (физика, химия и математика) заносятся в целочисленные поля phys, chem и maths соответственно. Поле-массив name предназначено для записи имени и фамилии учащегося. Назначение структуры Exams состоит в хранении средних оценок по каждому из предметов в разные годы. Каждому году соответствует переменная структуры. Переменные структуры создаются непосредственно в главном методе программы. У структуры три поля, которые имеют такие же названия (phys, chem и maths), однако теперь поля объявлены как имеющие тип double. Дело в том, что средняя оценка, в отличие от оценки учащегося по предмету, в общем случае не является целым числом. Напомним, что описание структуры является лишь общим шаблоном, в соответствии с которым формируются переменные структуры. Чтобы было куда записать оценки, а также имя и фамилию, необходимо создать переменную структуры. В главном методе программы сначала выполняется объявление переменных структуры Marks с именами ivanov, petrov и sidorov. Далее выполняется инициализация полей этих переменных структуры. В частности, заполнение массива name для переменной ivanov выполняется командой strcpy (ivanov. name, " Sergei Ivanov") (копирование строки "Sergei Ivanov" в поле-массив name). Обращаем внимание на способ ссылки на поле name переменной структуры ivanov: ссылка выполнена в виде ivanov. name. Аналогично выполняются ссылки на прочие поля переменных структуры: ivanov.phys=4; ivanov.chem=3; ivanov.maths=3; Точно так же заполняются поля двух других переменных (petrov и sidorov) структуры Marks. Командой Exams LastYear, This Year в главном методе программы объявляются две переменные LastYear и ThisYear структуры Exams. Переменная LastYear предназначена для записи средних оценок прошлого года. Оценки (средние) за текущий год записываются в переменную ThisYear структуры Exams. Значения полям переменной структуры LastYear присваиваются командами LastYear.chem=4.33333; LastYear.phys=3.66667; LastYear.maths=3.33333; Соответствующие поля переменной структуры определяются как средние арифметические по набору учащихся (их в данном случае всего три): ThisYear.chem=(double)(ivanov.chem+petrov.chem+sidorov.chem)/3; ThisYear.phys=(double)(ivanov.phys+petrov.phys+sidorov.phys)/3; ThisYear.maths=(double)(ivanov.maths+petrov.maths+sidorov.maths)/3;
Инструкция (double) использована для явного приведения типов, поскольку по умолчанию для целочисленных операндов операция деления выполняется как деление с отбрасыванием дробной части (целочисленное деление). Далее полученные значения для полей переменных LastYear и ThisYear структуры Exams выводятся на экран. Результат имеет следующий вид:
Last year marks: Physics 3.66667 Chemistry 4.33333 Mathematics 3.33333 This year marks: Physics 4.66667 Chemistry 3.66667 Mathematics 3.33333 По отношению к структурам можно применять операцию присваивания. Для этого две переменные должны относиться к одной структуре. В результате такого присваивания из одной переменной в другую копируются значения всех полей структуры.
|