Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Основы разработки программ на языке С++ для систем информационной безопасности. Учебное пособие

.pdf
Скачиваний:
1
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
Структуры и объединения
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 км по убыванию
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]