отчет 6
.docxМИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ,
СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»
(СПбГУТ)
Факультет «Кибербезопасности»
Кафедра «Информационная безопасность компьютерных систем»
Направление подготовки: |
10.05.02 - Информационная безопасность телекоммуникационных систем |
Кафедра: |
ИБКС |
ЛАБОРАТОРНАЯ РАБОТА № 6
по дисциплине:
Технология программирование |
на тему:
Конструирование классов на основе принципа наследования
|
Вариант № 17
|
|
Выполнил студент группы |
|
|
|
|
|
||
|
|
Фамилия И. О. |
||
|
|
Руководитель |
Ассистент кафедры ПИиВТ |
|
оценка |
|
|
уч. степень, уч. звание |
|
27.09.2024 |
|
Дятлов Д.А. |
||
дата, подпись |
|
Фамилия И. О. |
||
Цель работы: изучить механизм открытого (public) наследования в C++, познакомиться с понятием «виртуальная функция», освоить технологию конструирования и способы документирования программы, включающей в себя класс-наследники, изучить возможности инструментальных сред разработки по автоматической генерации кода.
1.1.Задание
В соответствии с вариантом задания разработать базовый класс. В базовый класс следует включить свойства и методы, общие для заданных классов-наследников. Базовый класс должен включать в себя не менее двух свойств и двух методов, один из которых – виртуальная функция.
Разработать классы, производные от базового класса (наследники). Классы-наследники должны наследовать от базового класса хотя бы одно свойство, а также должны иметь хотя бы одно собственное свойство. В классы-наследники должны быть включены следующие методы:
Метод, наследуемый от базового класса.
Виртуальная функция базового класса, переопределённая в производном классе.
Собственные методы производного класса. В состав производного класса должен быть включён хотя бы один метод, изменяющий какое-либо свойство класса.
Разработать программу, выполняющую следующие действия:
Создание нескольких объектов на основе классов–наследников.
Объединение объектов в массив (массив указателей на базовый класс).
Отображение значений свойств объектов на экране в цикле.
Изменение свойств объектов по номеру элемента массива.
Вычисление заданного параметра.
Выход из программы.
Объявление и реализацию каждого класса поместить в отдельном модуле.
Действия из группы 2. и 3. должны быть доступны через меню; последовательность выполнения действий – произвольная, в цикле.
Представить отчёт следующего содержания:
Постановка задачи;
Текст программы;
Диаграмма классов с указанием свойств и методов класса;
Диаграмма компонентов (см. Лабораторная работа № 3).
Вариант задания
Ход работы
Разработка алгоритма
1. Изучение справочного материала по работе с языком программирования Си
2. Создание нового проекта
3. Написание кода приложения
4. Тестирование
Листинг программы
Базовый класс (автомобили)
#ifndef AUTOMOBILE_H
#define AUTOMOBILE_H
#include <string>
#include <iostream>
class Automobile {
protected:
std::string brand;
int year;
public:
Automobile(std::string b, int y) : brand(b), year(y) {}
virtual void displayInfo() const {
std::cout << "Бренд: " << brand << ", год выпуска: " << year << std::endl;
}
int getYear() const { return year; }
virtual ~Automobile() = default;
};
Класс легковых автомобилей
#pragma once
#ifndef LIKHACH_H
#define LIKHACH_H
#include "Automobile.h"
class Likhach : public Automobile {
private:
int passengers;
public:
Likhach(std::string b, int y, int p) : Automobile(b, y), passengers(p) {}
void displayInfo() const override {
Automobile::displayInfo();
std::cout << "Пассажиры: " << passengers << std::endl;
}
void setPassengers(int p) {
passengers = p;
}
int getPassengers() const { return passengers; }
};
#endif
Класс грузовых автомобилей
#pragma once
#ifndef GRUZOVIK_H
#define GRUZOVIK_H
#include "Automobile.h"
class Gruzovik : public Automobile {
private:
double loadCapacity;
public:
Gruzovik(std::string b, int y, double load) : Automobile(b, y), loadCapacity(load) {}
void displayInfo() const override {
Automobile::displayInfo();
std::cout << "Грузоподъемность: " << loadCapacity << " тон" << std::endl;
}
void setLoadCapacity(double load) {
loadCapacity = load;
}
double getLoadCapacity() const { return loadCapacity; }
};
#endif
Основная программа
#include <iostream>
#include <vector>
#include <memory>
#include "Likhach.h"
#include "Gruzovik.h"
#include <Windows.h>
using namespace std;
void displayMenu() {
cout << "\nМеню:\n";
cout << "1. Создать новый автомобиль\n";
cout << "2. Показать все автомобили\n";
cout << "3. Изменить свойства автомобиля\n";
cout << "4. Подсчитать количество автомобилей после определенного года\n";
cout << "5. Выход\n";
}
int main() {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
vector<shared_ptr<Automobile>> cars;
int choice;
while (true) {
displayMenu();
cin >> choice;
if (choice == 1) {
short type;
cout << "Выберите тип (1 - Легковой, 2 - Грузовик): ";
cin >> type;
string brand;
int year;
cout << "Введите марку: ";
cin >> brand;
cout << "Введите год выпуска: ";
cin >> year;
if (type == 1) {
int passengers;
cout << "Введите количество пассажиров: ";
cin >> passengers;
cars.push_back(make_shared<Likhach>(std::string(brand), year, passengers));
}
else if (type == 2) {
double load;
cout << "Введите грузоподъемность (тонн): ";
cin >> load;
cars.push_back(make_shared<Gruzovik>(std::string(brand), year, load));
}
else {
cout << "Неверно выбран тип автомобиля.\n";
}
}
else if (choice == 2) {
for (const auto& car : cars) {
car->displayInfo();
}
}
else if (choice == 3) {
int index;
cout << "Введите индекс автомобиля для изменения (0-" << cars.size() - 1 << "): ";
cin >> index;
if (index >= 0 && index < cars.size()) {
int type;
cout << "Выберите тип изменения (1 - Легковой, 2 - Грузовик): ";
cin >> type;
if (type == 1) {
int newPassengers;
cout << "Введите новое количество пассажиров: ";
cin >> newPassengers;
dynamic_cast<Likhach*>(cars[index].get())->setPassengers(newPassengers);
}
else if (type == 2) {
double newLoad;
cout << "Введите новую грузоподъемность: ";
cin >> newLoad;
dynamic_cast<Gruzovik*>(cars[index].get())->setLoadCapacity(newLoad);
}
else {
cout << "Неверно выбран тип автомобиля.\n";
}
}
else {
cout << "Неверный индекс.\n";
}
}
else if (choice == 4) {
int year;
cout << "Введите год: ";
cin >> year;
int count = 0;
for (const auto& car : cars) {
if (car->getYear() > year) {
count++;
}
}
cout << "Количество автомобилей, выпущенных после " << year << ": " << count << endl;
}
else if (choice == 5) {
cout << "Выход из программы...\n";
break;
}
else {
cout << "Неверный выбор.\n";
}
}
return 0;
}
Скриншоты работы программы.
Вывод программы
Вывод: Поставленная задача была выполнена. В результате выполнения лабораторной работы была создана программа для создания объектов с помощью базового и 2 производных классов.
