Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Основы разработки программ на языке С++ для систем информационной безопасности. Учебное пособие
.pdf
Структуры и объединения
61
12. СТРУКТУРЫ И ОБЪЕДИНЕНИЯ
Структуры представляют собой сложный тип данных. В отличие от
массивов, переменная структурного типа может включать в себя данные различных типов. Из структуры переменных, в свою очередь, могут строиться
массивы и структуры, которые их используют как простые типы. Структуры
объявляются с помощью ключевого слова struct. В табл.38 приведен пример
программного кода, использующего структурную переменную.
Таблица 38
Использование структурной переменной
int _tmain(int argc, _TCHAR* argv[])
{
struct Student {
char Name[100];
char Group[100];
int Age;
};
Student x;
strcpy(&x.Name[0],”Иванов Иван Иванович”);
strcpy(&x.Group[0],”КТбо1-1”);
x.Age = 18;
return 0;
}
Рис. 12. Использование структурной переменной
Использование структурных переменных дает возможность приблизить абстракции программ к понятиям предметной области. Например, манипулирование переменной типа student в примере в табл. 38 во многих случаях

12. Структуры и объединения
62
не требует знания её внутренней структуры при выполнении копирования, передачи функции, включения в более сложные структуры данных.
При использовании указателей на структуры к элементам обраща-
ются не через точку (.), а через стрелку ( -> ). В табл. 39 показан пример
обращения к полям структуры по указателю.
Объединения (union) также относятся к сложным типам данных. Объ-
единения позволяют включать в себя разнотипные данные, но, в отличие от
структуры, для каждого простого типа память не выделяется. По сути одно
и то же значение представляется данными разного типа.
Таблица 39
Указатель на структурную переменную
int _tmain(int argc, _TCHAR* argv[])
{
struct Student {
char Name[100];
char Group[100];
int Age;
};
Student x;
strcpy(&x.Name[0],”Иванов Иван Иванович”);
strcpy(&x.Group[0],”КТбо1-1”);
x.Age = 18;
Student *pSt;
pSt =&x;
pSt->Age = pSt->Age+5;
return 0;
}
Рис. 13. Указатель на структурную переменную
Объединения используют для хранения значений в разнотипном
представлении.

12. Структуры и объединения
63
Практическое задание 6. Структуры
Задание: Использовать структуру-переменную
Создать два массива структур о студентах 2-х групп. О каждом
студенте записать: фамилию, имя, отчество, год рождения, группу, оценки
по пяти экзаменам.
Таблица 40
Варианты для практического задания 6
№
вар.
Входные данные
Представление
выходных данных
1
Сортировка по баллам
Определить средний балл за
дисциплину
2
Сортировка по фамилиям
Определить количество однофамильцев
3
Сортировка по фамилиям. Определить,
в какой группе больше студентов
4
Определить, в какой группе средний
возраст студентов ниже
Сортировка по фамилиям
5
Определить, какая дисциплина сложнее
Сортировка по баллам
6
Определить, какие студенты останутся
на пересдачу
Сортировка по баллам
7
Определить, в какой группе средний
возраст студентов выше
Сортировка по фамилиям
8
Вывести возраст старшего студента
Сортировка по фамилиям
9
Вывести возраст младшего студента
Сортировка по году рождения
10
Определить список лучших студентов
(набравших максимальный балл)
Сортировка по баллам
11
Вывести 10 лучших студентов (по максимальному баллу)
Сортировка по баллам
12
Определить группу, в которой студенты лучше учатся (средний балл)
Сортировка по баллам
13
Определить, в какой группе учится
младший студент
Сортировка по фамилиям
14
Определить, в какой группе все студенты успешно сдали сессию
Сортировка по баллам
15
Определить, какая дисциплина оказалась легче для студентов
Сортировка по баллам

12. Структуры и объединения
64
13. КЛАССЫ
Основное достоинство использования классов проявляется при решении сложных задач, и состоит в повышении качества программного продукта. Классы дают возможность скрывать детали программирования, повышать уровень абстракций прикладной задачи, более естественным и понятным образом строить программный код.
Таблица 41
Использование объединения
union PinCode {
char sPin[4];
int iPin;
short shPin[2];
lont int lPin;
};
PinCode y;
y.iPin=129124;
return 0;
}
Рис. 14. Использование объединения
Знание принципов организации классов необходимо при использовании стандартной библиотеки С++, которая организована в объектном стиле.
Использование классов при программировании представляет собой особый
стиль программирования – объектное программирование.

13. Классы
65
Класс – это сложная структура данных, которая включает в себя свой-
ства и методы. Свойства класса – это любые типы данных. Методы – это
функции, выполняющие обработку данных. Аналогичным образом функции
можно включать в структуры (struct). Основным отличием класса является
то, что в классах имеется возможность ограничить доступ к элементам
класса (ключевые слова public, private, protected).
Ключевое слово public определяет элементы, доступные пользовате-
лям класса. Пользователь класса – это программный код, создающий и использующий объекты данного класса.
Всякий объект является экземпляром данных, созданных по описа-
нию класса. Описание играет роль матрицы.
Ключевое слово private определяет закрытые свойства и методы. Эти
свойства и методы недоступны внешним пользователям, однако доступны
любым методам класса.
Ключевое слово protected определяет свойства и методы, закрытые
от внешних пользователей, но доступные в классах, связанных с данным
классом отношением наследования.
Закрытые данные класса размещаются после модификатора доступа
private. Если отсутствует модификатор public, то все функции и переменные
по умолчанию являются закрытыми (как в первом примере).
Обычно, приватными делают свойства класса, а публичными – его
методы.
Напрямую обращаться к закрытым данным класса нельзя. Для работы
с этими данными используют методы этого класса.
Таблица 42
Пример работы с классами
class Sport {
public:
// Установка среднего значения очков
void set_average_score(float score)
{
average_score = score;
}
// Получение среднего значения очков
float get_average_ score (

13. Классы
66
Окончание табл. 42
{
return average_ score;
}
std::string name;
std::string last_name;
int scores[5];
private:
float average_ score;
};
В примере выше используется функция get_average_score() для получения среднего значения очков, набранных спортсменом за этап, и
set_average_score() для выставления этих очков.
Функция set_average_score() принимает средний результат в качестве
параметра и присваивает его значение закрытой переменной average_score.
Функция get_average_score() просто возвращает значение этой переменной.
Любое описание класса состоит из двух частей: интерфейса и реализации.
Интерфейс – это перечисление типов и имен свойств, а также сигнатур методов. Реализация класса – это программный код методов класса.
В табл. 43 показан программный код, иллюстрирующий использование классов. Класс Students включает в себя ряд свойств и методов, целостным образом описывающие сущность «Студенты». Заметим, что свойством
класса могут быть сложные структуры данных. Например, структура Stu-
dentFields позволяет хранить информацию об имени, номере группы и возрасте студента.
Таблица 43
Интерфейс класса Students
class Students {
public:
Students();
bool AddStudent(string Name, string Group, int Age)
StudentField GetInfo(int Num);
private:
StudentField StudTable[20];

13. Классы
67
Окончание табл. 43
int TableCount;
protected:
int MaxAge;
int MinAge;
};
struct StudentField{
string Name;
string Group;
int Age;
};
Среди методов класса Students можно заметить одноименный метод
Students(). Этот метод называют конструктором класса. Он выполняет все
действия, необходимые при создании экземпляра объекта. Такие действия
будут выполнены в точке нахождения в программном коде строки
Students X;
где X – имя переменной-экземпляра класса. В табл. 44 показана реализация
класса, в которой метод «конструктор» инициализирует свойства класса
TablCount, MaxAge, MinAge нулевым значением.
Таблица 44
Реализация класса Students
Students::Students()
{
TableCount = 0;
MaxAge = 0;
MinAge = 100;
}
bool Students::AddStudent(string Name, string Gropu, int Age)
{
if (TableCount <20)
{
StudTable[TableCount].Name = Name;
StudTable[TableCount].Group = Group;
StudTable[TableCount].Age = Age;
TableCount++;
MaxAge = max(Age,MaxAge);

13. Классы
68
Окончание табл. 44
MinAge = min(Age,MinAge);
return true;
}
return false;
}
StudentField Students::GetInfo(int Num)
{
return StudTable[Num];
}
Хорошим стилем построения классов считается максимальное
скрытие (инкапсуляция) свойств и предоставление доступа к ним через
методы. Такой прием значительно повышает безопасность использования объектов: если свойства открыты, пользовательский код способен
любым образом изменить их значения. Последствия такого неконтролируемого изменения состояния объекта непредсказуемы. Если же значения свойств модифицируются методом класса, состояние объекта находится под контролем.
Таблица 45
Пример использования класса Students
int _tmain(int argc, _TCHAR* argv[])
{
Students StudGroup;
bool result;
StudGroup.AddStudent(“Петров П.П.”,”КТбо1-1”,17);
StudGroup.AddStudent(“Ианов И.И.”,”КТсо1-2”,17);
StudGroup.AddStudent(“Сидоров С.С.”,”КТбо1-3”,17);
StudentField AnyStudent;
AnyStudent = StudGroup.GetInfo(2);
return 0;
}
В коде в табл. 45 можно видеть, что массив StudTable из 20 элементов
недоступен внешнему пользователю напрямую. Для добавления нового элемента следует воспользоваться методом AddStudent(), который отслеживает количество элементов.

13. Классы
69
Если количество элементов превышает 20, добавление не произво-
дится, а возвращается значение false.
Рис. 15. Подсказка MS Visual Studio
Программный код на рис. 15 иллюстрирует использование объектного стиля программирования. Основа объектного стиля – создание экземпляров классов и манипулирование свойствами и методами классов.
Среда программирования MS Visual Studio оказывает поддержку в
программировании на основе использования классов. На рис. 15 показан
пример того, как система интеллектуальной подсказки при наборе на клавиатуре имени объекта строит окно с перечислением свойств и методов класса
Students. Таким образом, уже на этапе создания программного кода предпринимаются меры по снижению возможности появления ошибки.
Отметим также, что структура выводимой отладчиком информации соответствует структуре класса. На рис. 16 приведен соответствующий пример.
Рис. 16. Экземпляр класса Students в отладчике

13. Классы
70
Практическое задание 7. Таблицы
Задание: вывести данные о спортсменах в консольном приложении в
виде таблицы (фамилия, год рождения, рост, результат забега на 1 км в минутах, результат забега на 3 км в минутах).
В нечетных вариантах 1, 3, 5 и т.д. использовать функции из заголов-
ков <iomanip>. В четных вариантах 2, 4, 6 и т.д. использовать класс для отоб-
ражения таблицы.
Таблица 46
Варианты для практического задания 7
№
вар.
Входные данные
1
Упорядочить фамилии по возрастанию
2
Упорядочить рост по убыванию
3
Найти лучший результат (1 км)
4
Найти худший результат (3 км).
Выразить в секундах
5
Перевести результаты забега на 1 км в секунды
6
Вывести данные только по спортсменам среднего роста (до 170 см)
7
Вывести данные только по спортсменам с ростом выше среднего
8
Вывести общий средний результат по забегу на 3 км
9
Вывести лучший средний результат (1 км) и фамилию спортсмена
10
Упорядочить фамилии по убыванию
11
Вывести результаты спортсменов по году рождения (год вводится в диалоге)
12
Вывести результат выбранного спортсмена (фамилия вводится в диалоге)
13
Вывести низший средний балл (на 3 км)
Выразить в миллисекундах
14
Вывести только результаты спортсменов на определенную букву (вводится
в диалоге)
15
Упорядочить результаты забега на 3 км по убыванию
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
