Скачиваний:
31
Добавлен:
28.03.2021
Размер:
45.38 Кб
Скачать

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

Учреждение образования БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ

Инженерно-экономический факультет Кафедра экономической информатики

ОТЧЁТ

к лабораторной работе № 7 по предмету:

«Объектно-ориентированное программирование» на тему: «РЕАЛИЗАЦИЯ ШАБЛОНОВ КЛАССОВ И

ФУНКЦИЙ »

Вариант 12

Выполнил Хомякова А.А.

группы 972303

Проверил Григорьева Ю.Ю.

Минск 2020

Цель работы:

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

Теория:

Шаблон — это одно из самых сложных и мощных средств в языке C++.

Он не вошел в исходную спецификацию C++, и лишь относительно недавно

стал неотъемлемой частью программирования на C++. Шаблоны позволяют

достичь одну из самых трудных целей в программировании – создать многократно используемый код. Используя шаблоны, можно создавать обобщенные функции и классы. В обобщенной функции (классе)

обрабатываемый ею (им) тип данных задается как параметр. Таким образом,

одну функцию или класс можно использовать для разных типов данных, не

предоставляя явным образом конкретные версии для каждого типа данных.

Механизм шаблонов в языке С++ позволяет решать проблему унификации алгоритма для различных типов: нет необходимости писать различны функции для целочисленных, действительных или пользовательских типов – достаточно составить обобщенный алгоритм, не зависящий от типа данных, основывающийся только на общих свойствах.

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

Шаблоны классов – обобщенное описание пользовательского типа, в

котором могут быть параметризованы атрибуты и методы типа.

Представляют собой конструкции, по которым могут быть сгенерированы

действительные классы путём подстановки вместо параметров конкретных

аргументов.

Для создания обобщенного класса необходимо создать класс, в котором

определяются все используемые им алгоритмы; при этом реальный тип

обрабатываемых в нем данных будет задан как параметр при создании

объектов этого класса.

Индивидуальное задание:

Разработать шаблонный класс «Время», где имеется следующие

поля: часы, минуты, секунды. Предусмотреть наличие в классе методов

изменения значения полей, определения, является ли заданное время «до

полудня» или «после полудня», вывода в формате «чч:мм:сс». Перегрузить

операторы >> (ввод новых значений полей), += (добавить заданное

количество секунд).

Код программы:

#pragma once

#include<iomanip>

#include <iostream>

#include <string>

#include <fstream>

#include<conio.h>

#include <stdexcept>

using namespace std;

#define _CRT_SEСURE_NO_WARNINGS

template <class T>

class Time {

T hour;

T minute;

T second;

public:

Time() {

this->hour = 0;

this->minute = 0;

this->second = 0;

}

Time(T h,T m, T s) {

this->hour = h;

this->minute = m;

this->second = s;

}

T getHour() const {

return this->hour;

}

T getMinute() const {

return this->minute;

}

T getSecond() const {

return this->second;

}

void setHour(T h);

void setMinute(T m);

void setSecond(T s);

void print() const;

Time& nextSecond();

friend istream& operator>>(istream& input, Time<T>& T);

friend const Time<T> operator+(const Time<T>& rv) {

return Time<T>(second + rv.second);

}

Time<T>& operator+=(const Time<T>& rv) {

cout << "operator+=" << endl;

second += rv.second;

return *this;

}

};

template <class T>

void Time<T>::setHour(T h) {

if (h >= 0 && h <= 23) {

hour = h;

}

else {

cout << endl << "Некорректный ввод часов" << endl;

}

}

template <class T>

void Time<T>::setMinute(T m) {

if (m >= 0 && m <= 59) {

minute = m;

}

else {

cout<<endl<<"Некорректный ввод минут"<<endl;

}

}

template <class T>

void Time<T>::setSecond(T s) {

if (s >= 0 && s <= 59) {

second = s;

}

else {

cout << endl << "Некорректный ввод секунд" << endl;

}

}

istream& operator>>(istream& input, Time<int>& time) {

int flag = 0;

while (flag == 0) {

int ho = 0;

cout << "Введите часы:" << endl;

input >> time.hour;

ho=time.hour;

if (ho < 0 || ho > 23) {

cout << endl << "Неккоректный ввод часов" << endl;

cout <<"Повторите попытку:" << endl;

flag = 0;

}

else {

flag = 1;

}

}

int flag1 = 0;

while (flag1 == 0) {

int mi = 0;

cout << "Введите минуты:" << endl;

input >> time.minute;

mi = time.minute;

if (mi < 0 || mi > 59) {

cout << endl << "Неккоректный ввод минут" << endl;

cout << "Повторите попытку:" << endl;

flag1 = 0;

}

else {

flag1 = 1;

}

}

int flag2 = 0;

while (flag2 == 0) {

int sec = 0;

cout << "Введите секунды:" << endl;

input >> time.second;

sec = time.second;

if (sec < 0 || sec > 59) {

cout << endl << "Неккоректный ввод секунд" << endl;

cout << "Повторите попытку:" << endl;

flag2 = 0;

}

else {

flag2 = 1;

}

}

return input;

}

template <class T>

void Time<T>::print() const {

cout << setfill('0');

cout << setw(2) << hour

<< ":" << setw(2) << minute

<< ":" << setw(2) << second << endl;

}

template <class T>

Time<T>& Time<T>::nextSecond() {

if (second == 60) {

second = 0;

minute++;

if (minute == 60) {

minute = 0;

hour++;

if (hour == 24) {

hour = 0;

}

}

}

return *this;

}

Main.cpp

#include "../Choose/Menu.h"

using namespace std;

#include "Functions_7.h"

#include <iostream>

#include <fstream>

void Laba7() {

Time<int> t1(5, 0, 0);

int i = 0;

cout << "Время с использованием конструктора с параметрами:" << endl;

t1.print();

cout << "Введите количество секунд для добавления: ";

cin >> i;

Time<int> summator(0, 0, i);

t1 += summator;//добавление заданного количества секунд

t1.nextSecond();

cout << "Время после добавления" << i << " секунд:";

t1.print();

Time<int> t2;

cout << "Введите время!" << endl;

cin >> t2;

t2.print();

if (t2.getHour>=12) {

cout <<endl<< "Введено время после полудня!" << endl;

}

else {

cout << endl << "Введено время до полудня!" << endl;

}

system("pause");

}

Результат:

Вывод:

В ходе выполнения лабораторной работы был реализован шаблонный класс, преимуществом его является определение типа данных на этапе компиляции. Таким образом можно значительно уменьшить объем кода и упростить его восприимчивость. Также были перегружены такие операторы,как сложение объектов шаблонного класса, ввод через поток istream и определение периода времени суток.

Соседние файлы в папке лабы салапура