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

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра ИИСТ

отчет

по индивидуальному домашнему заданию №3

по дисциплине «Информатика»

Тема: «Классы-потомки и статические функции C++»

Студент гр.

Преподаватель

Беляев Ф.Я.

Санкт-Петербург

2020

Оглавление

Задания: 3

Протокол выполнения заданий 4

1. Дополнить класс гонка Race 4

Предусмотреть возможность хранения в статических данных членах общего числа машин во всех гонках. 4

Предусмотреть статическую функцию для вывода общего числа машин во всех гонках. 4

Создать конструктор, в котором создается количество машин в гонке передаваемое через параметр конструктора. 4

2. Создать класс потомок RaceLap для учета круга гонки 5

Предусмотреть конструктор класса, который вызывает конструктор Race () 5

Реализовать конструктор копирования 5

Реализовать функцию удаления машины из гонки с помощью дружественной функции 5

3. Реализовать следующий сценарий работы программы 6

Создание списка машин на старте. Ввод списка машин. 6

Время каждой машины на круге формируется случайным образом в пределах от 60 до 100 секунд 6

На первом круге выбывает 1 машина. Вывести количество машин. 6

Выводим результат как список машин после 2 кругов (от 1 до 3 машин). 7

Дополнительное задание: выбывать должны машины последние по времени круга. 7

Результат работы программы 7

Код 8

Выводы 11

Цель работы: изучение классов-потомков и статических функций C++

Задания:

1. Дополнить класс гонка Race следующим:

1.1. Предусмотреть возможность хранения в статических данных членах общего числа машин во всех гонках.

1.2. Предусмотреть статическую функцию для вывода общего числа машин во всех гонках.

1.3. Создать конструктор в котором создается количество машин в гонке передаваемое через параметр конструктора.

2. Создать класс потомок RaceLap для учета круга гонки:

2.1. Предусмотреть конструктор класса, который вызывает конструктор из пункта 1.3.

2.2. Реализовать конструктор копирования.

2.3. Реализовать функцию удаления машины из гонки с помощью дружественной функции.

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

3.1. Создание списка машин на старте. Ввод списка машин. (количество машин от 4 до 5 вводит пользователь).

3.2. Время каждой машины на круге формируется случайным образом в пределах от 60 до 100 секунд.

3.3. На первом круге выбывает 1 машина. Вывести количество машин.

3.4. На втором круге выбывает еще 2 машины. Вывести количество машин.

3.5. Выводим результат как список машин после 2 кругов (от 1 до 3 машин).

4. Дополнительное задание: выбывать должны машины последние по времени круга.

Протокол выполнения заданий

  1. Дополнить класс гонка Race

Предусмотреть возможность хранения в статических данных членах общего числа машин во всех гонках.

Для данной задачи ввёл требуемую переменную типа int, чтобы вести необходимый подсчёт (стр. 21)

Процесс подсчёта происходит при каждом вызове конструктора (стр. 24-47, конкретно - стр. 46).

Предусмотреть статическую функцию для вывода общего числа машин во всех гонках.

Как видим, эта статическая функция использует статическую переменную, объявленную в пункте выше.

Создать конструктор, в котором создается количество машин в гонке передаваемое через параметр конструктора.

Данный конструктор уже продемонстрирован на скриншоте выше (стр. 24-47). Принцип его действия продемонстрирован там же.

  1. Создать класс потомок RaceLap для учета круга гонки

Предусмотреть конструктор класса, который вызывает конструктор Race ()

Данный конструктор продемонстрирован на скриншоте выше. Принцип его действия полностью удовлетворяет заданию.

Реализовать конструктор копирования

Конструктор копирования реализован с помощью стандартной функции C++ «memcpy ()», принцип работы которой был продемонстрирован на дистанционном занятии и доработан под мою программу.

Реализовать функцию удаления машины из гонки с помощью дружественной функции

Принцип работы прост: по данной дружественной функции машины сортируются и переставляются местами в массиве list[], который задан изначально, по времени заезда (fast и slow – переменные, которые используются в функции вывода результатов заезда позже, где «fast» – машина, проехавшая быстрее всех и «slow» - медленнее соответственно). Такой перестановкой мы лишаем медленные машины возможности участия в дальнейших заездах, так как эти участники оказываются внизу, а массив с ними сокращается с каждым кругом по алгоритму в функции вывода машин (void OutputList ()).

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

Создание списка машин на старте. Ввод списка машин.

Запускаю функцию ввода машин на старте (163 строчка, в начале main ()), затем через несколько функций, которые были во 2 ИДЗ запускается знакомый процесс по вводу машин в массив, и их данных.

Время каждой машины на круге формируется случайным образом в пределах от 60 до 100 секунд

По тому же принципу – меняю лишь цифры в алгоритме на скриншоте, получая необходимый интервал.

На первом круге выбывает 1 машина. Вывести количество машин.

По функции на скриншоте, а также конструкторе Race () и дружественной функции по удалению машин из заездов, получаю алгоритм, позволяющий выполнить это задание и следующее соответственно.

На втором круге выбывает еще 2 машины. Вывести количество машин

См. прошлый пункт

Выводим результат как список машин после 2 кругов (от 1 до 3 машин).

См. прошлый пункт

Дополнительное задание: выбывать должны машины последние по времени круга.

Выполнено (см. код + пункт про дружественную функцию)

Результат работы программы

Код

#include <iostream>

include <cstdlib>

#include <ctime>

#include <cstring>

using namespace std;

struct Car {

char brand[30];

char model[30];

char color[30];

float time;

int min;

};

class Race {

protected:

int car_count;

Car* list;

public:

static int count_all;

static int ct;

Race(int count){

if (ct == 0) {

cout << "Сколько машин участвовало в заезде?" << endl;

cin >> car_count;

while (3 >= car_count || car_count > 5)

{

cout << "В гонке может участвовать от 4 до 5 машин." << endl;

cin >> car_count;

}

}

else if (count_all == 9 || count_all == 7)

{

ct -= 2;

car_count = ct;

}

else

{

ct--;

car_count = ct;

}

list = new Car[car_count];

Race::count_all += car_count;

};

void InputList();

void InputCar(Car*);

void OutputList();

void OutputCar(Car*);

static void outputCA() {

cout << "Общее число машин за 3 круга: " << Race::count_all << endl;

};

};

int fast = 0;

int slow = 0;

class RaceLap : public Race {

public:

RaceLap(int count) : Race::Race(car_count) {

count = car_count;

};

RaceLap(RaceLap* ptr) : Race::Race(ptr->car_count) {

memcpy(this->list, ptr->list, sizeof(Car) * this->car_count);

};

~RaceLap() {

RaceLap::count_all--;

delete this->list;

};

friend void DelCar(RaceLap* ptr) {

Car buf = ptr->list[slow];

ptr->list[slow] = ptr->list[ptr->car_count-1];

ptr->list[ptr->car_count-1] = buf;

buf = ptr->list[fast];

ptr->list[fast] = ptr->list[0];

ptr->list[0] = buf;

slow = fast = 0;

};

};

void Race::InputCar(Car* ptr)

{

cout << "Бренд машины?" << endl;

cin >> ptr->brand;

cout << "Модель:" << endl;

cin >> ptr->model;

cout << "Цвет:" << endl;

cin >> ptr->color;

}

void Race::InputList()

{

for (int i = 0; i < this->car_count; i++) {

cout << "Машина " << i+1 << ":" << endl;

this->InputCar(&this->list[i]);

}

}

void Race::OutputCar(Car* ptr)

{

float n = 60000 + (rand() % 40001);

ptr->time = n / 1000;

cout << ptr->brand << " " << ptr->model << " " << ptr->color << " ";

ptr->min = ptr->time / 60;

ptr->time -= ptr->min * 60;

if (ptr->time < 10)

{

printf("00:0%d:0%2.3f\n", ptr->min, ptr->time);

}

else

printf("00:0%d:%2.3f\n", ptr->min, ptr->time);

}

int lap = 0;

void Race::OutputList()

{

if (lap == 0)

this->ct = this->car_count;

cout << endl << "--------------------------------" << endl << "В заезде приняло участие " << this->ct << " машин. Результаты за круг следующие: " << endl;

for (int i = 0; i < this->car_count; i++)

{

cout << endl << i + 1 << ". ";

this->OutputCar(&this->list[i]);

if (this->list[i].time < this->list[fast].time)

fast = i;

else

if (this->list[i].time > this->list[slow].time)

slow = i;

}

cout << endl << "Лучший результат за круг показала " << this->list[fast].brand<< ": ";

if (this->list[fast].time < 10)

printf("00:0%d:0%2.3f\n", this->list[fast].min, this->list[fast].time);

else

printf("00:0%d:%2.3f\n", this->list[fast].min, this->list[fast].time);

if (lap != 2)

cout << "Худший результат: " << this->list[slow].brand << endl;

cout << "--------------------------------"<<endl;

lap++;

}

int Race::count_all = 0;

int Race::ct = 0;

int main(int argc, char** argv) {

system("chcp 1251 > nul");

RaceLap* ptrRaceLap1 = new RaceLap(5);

ptrRaceLap1->InputList();

ptrRaceLap1->OutputList();

DelCar(ptrRaceLap1);

RaceLap* ptrRaceLap2 = new RaceLap(ptrRaceLap1);

ptrRaceLap2->OutputList();

DelCar(ptrRaceLap2);

srand(time(0));

RaceLap* ptrRaceLap3 = new RaceLap(ptrRaceLap2);

ptrRaceLap3->OutputList();

Race::outputCA();

delete ptrRaceLap1;

delete ptrRaceLap2;

delete ptrRaceLap3;

return 0;

}

Выводы

  1. Дополнил класс гонка Race:

1.1. Предусмотрел возможность хранения в статических данных членах общего числа машин во всех гонках.

1.2. Предусмотрел статическую функцию для вывода общего числа машин во всех гонках.

1.3. Создал конструктор в котором создается количество машин в гонке передаваемое через параметр конструктора.

2. Создал класс потомок RaceLap для учета круга гонки:

2.1. Предусмотрел конструктор класса, который вызывает конструктор из пункта 1.3.

2.2. Реализовал конструктор копирования.

2.3. Реализовал функцию удаления машины из гонки с помощью дружественной функции.

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

3.1. Создание списка машин на старте. Ввод списка машин. (количество машин от 4 до 5 вводит пользователь).

3.2. Время каждой машины на круге формируется случайным образом в пределах от 60 до 100 секунд.

3.3. На первом круге выбывает 1 машина. Вывести количество машин.

3.4. На втором круге выбывает еще 2 машины. Вывести количество машин.

3.5. Выводим результат как список машин после 2 кругов (от 1 до 3 машин).

4. Дополнительное задание выполнено: машины, последние по времени круга, выбиваются.

Соседние файлы в папке ИДЗ Беляев