Скачиваний:
0
Добавлен:
18.09.2026
Размер:
324 Кб
Скачать

МИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ,

СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ РОССИЙСКОЙ ФЕДЕРАЦИИ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»

(СПбГУТ)

Факультет «Кибербезопасности»

Кафедра «Информационная безопасность компьютерных систем»

Направление подготовки:

10.05.02 - Информационная безопасность телекоммуникационных систем

Кафедра:

ИБКС

ЛАБОРАТОРНАЯ РАБОТА № 6

по дисциплине:

Технология программирование

на тему:

Конструирование классов на основе принципа наследования

Вариант № 17

Выполнил студент группы

Фамилия И. О.

Руководитель

Ассистент кафедры ПИиВТ

оценка

уч. степень, уч. звание

27.09.2024

Дятлов Д.А.

дата, подпись

Фамилия И. О.

Цель работы: изучить механизм открытого (public) наследования в C++, познакомиться с понятием «виртуальная функция», освоить технологию конструирования и способы документирования программы, включающей в себя класс-наследники, изучить возможности инструментальных сред разработки по автоматической генерации кода.

1.1.Задание

  1. В соответствии с вариантом задания разработать базовый класс. В базовый класс следует включить свойства и методы, общие для заданных классов-наследников. Базовый класс должен включать в себя не менее двух свойств и двух методов, один из которых – виртуальная функция.

  1. Разработать классы, производные от базового класса (наследники). Классы-наследники должны наследовать от базового класса хотя бы одно свойство, а также должны иметь хотя бы одно собственное свойство. В классы-наследники должны быть включены следующие методы:

    1. Метод, наследуемый от базового класса.

    2. Виртуальная функция базового класса, переопределённая в производном классе.

    3. Собственные методы производного класса. В состав производного класса должен быть включён хотя бы один метод, изменяющий какое-либо свойство класса.

  2. Разработать программу, выполняющую следующие действия:

    1. Создание нескольких объектов на основе классов–наследников.

    2. Объединение объектов в массив (массив указателей на базовый класс).

    3. Отображение значений свойств объектов на экране в цикле.

    4. Изменение свойств объектов по номеру элемента массива.

    5. Вычисление заданного параметра.

    6. Выход из программы.

  3. Объявление и реализацию каждого класса поместить в отдельном модуле.

  4. Действия из группы 2. и 3. должны быть доступны через меню; последовательность выполнения действий – произвольная, в цикле.

  5. Представить отчёт следующего содержания:

    1. Постановка задачи;

    2. Текст программы;

    3. Диаграмма классов с указанием свойств и методов класса;

    4. Диаграмма компонентов (см. Лабораторная работа № 3).

Вариант задания

Ход работы

  1. Разработка алгоритма

1. Изучение справочного материала по работе с языком программирования Си

2. Создание нового проекта

3. Написание кода приложения

4. Тестирование

  1. Листинг программы

Базовый класс (автомобили)

#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;

}

  1. Скриншоты работы программы.

Вывод программы

Вывод: Поставленная задача была выполнена. В результате выполнения лабораторной работы была создана программа для создания объектов с помощью базового и 2 производных классов.

16

Соседние файлы в предмете Технологии и методы программирования