Главная страница
Навигация по странице:

  • 1. Задание для работы Реализовать абстрактный тип данных «Правильная дробь»

  • На основе функций-членов класса реализовать перегруженные операторы

  • Код программы на языке C++

  • Результат работы программы на языке C ++

  • итоговый отчет 1. Лабораторная работа 2 Классы. Основы 12 Лабораторная работа 3 Классы. Инкапсуляция 16


    Скачать 129.17 Kb.
    НазваниеЛабораторная работа 2 Классы. Основы 12 Лабораторная работа 3 Классы. Инкапсуляция 16
    Дата14.01.2022
    Размер129.17 Kb.
    Формат файлаdocx
    Имя файлаитоговый отчет 1.docx
    ТипЛабораторная работа
    #331247
    страница3 из 5
    1   2   3   4   5

    Лабораторная работа №3
    Классы. Инкапсуляция



    Цель работы:приобретение практических навыков применения инкапсуляции как одного из основных принципов объектно-ориентированного программировании при разработке программ на языке C++ и знакомство со следующими понятиями:

    1. Константные функции-члены класса, селекторы и модификаторы.

    2. Ссылка на себя (указатель this).

    3. Друзья класса (ключевое слово friend).

    4. Вложенные классы.

    5. Операторы преобразования.

    6. Перегрузка операторов.

    1. Задание для работы

    Реализовать абстрактный тип данных «Правильная дробь», содержащий переменные-члены:

    - числитель (numerator) и знаменатель (denominator)

    функции-члены:

    - конструкторы (по умолчанию, полный, копирования) и деструктор;

    - получение числителя и знаменателя как элементов массива с номером i (i = 0 – числитель, а i = 1 – знаменатель);

    - изменение значения числителя и знаменателя как элементов массива с номером i (i = 0 – числитель, а i = 1 – знаменатель);

    - получение числителя и знаменателя;

    - преобразование правильной дроби в вещественное число и обратно;

    - умножение и деление правильной дроби на вещественное число и на правильную дробь с учетом порядка следования аргументов;

    - сложение и вычитание правильной дроби с вещественным числом и правильной дроби с учетом порядка следования аргументов;

    - копирование правильной дроби;

    - ввод правильной дроби с экрана и вывод комплексного числа на экран.

    На основе функций-членов класса реализовать перегруженные операторы:

    - умножение правильной дроби на вещественное число и на правильную дробь – операторы "*", "*=";

    - деление правильной дроби на вещественное число и на правильную дробь – операторы "/", "/=";

    - сложение правильной дроби с вещественным числом и с правильной дробью – операторы "+", "+=";

    - вычитание правильной дроби из вещественного числа и из правильной дроби – операторы "-", "-=";

    - копирование правильной дроби – оператор "=";

    - преобразование правильной дроби в вещественное число и обратно – оператор "=";

    - индексированный доступ к числителю и знаменателю как элементов массива с номером i (i = 0 – числитель, а i = 1 – знаменатель) – оператор[];

    - ввод с экрана и вывод на экран – операторы ">>" "<<".

    Код программы на языке C++

    В результате выполнения задания была разработана программа на  языке  C++. Она представлена в виде проекта, состоящего из двух файлов с расширением *.cpp и одного заголовочного файла (с расширением *.h), код которых приведен ниже:

    // файл Fract.h

    #pragma once

    #include

    #include
    std::string toString(double d);
    class PD

    {

    private:

    int numenator;

    int denominator;
    PD plus(PD pd, double d);

    PD plus(double d, PD pd);

    PD plus(PD pd1, PD pd2);
    PD minus(PD pd, double d);

    PD minus(double d, PD pd);

    PD minus(PD pd1, PD pd2);
    PD multi(PD pd, double d);

    PD multi(double d, PD pd);

    PD multi(PD pd1, PD pd2);
    PD divi(PD pd, double d);

    PD divi(double d, PD pd);

    PD divi(PD pd1, PD pd2);
    public:

    PD();

    PD(int a, int b);

    PD fromDouble(double d);
    const int& operator[](const int i) const;

    int& operator[](const int i);
    int getNum();

    int getDen();
    double toDouble();

    std::string toString();
    friend PD operator+(const PD& pd1, const PD& pd2);

    friend PD operator+(const PD& pd, const double& d);

    friend PD operator+(const double& d, const PD& pd);
    friend PD operator-(const PD& pd1, const PD& pd2);

    friend PD operator-(const PD& pd, const double& d);

    friend PD operator-(const double& d, const PD& pd);
    friend PD operator/(const PD& pd1, const PD& pd2);

    friend PD operator/(const PD& pd, const double& d);

    friend PD operator/(const double& d, const PD& pd);
    friend PD operator*(const PD& pd1, const PD& pd2);

    friend PD operator*(const PD& pd, const double& d);

    friend PD operator*(const double& d, const PD& pd);
    friend std::ostream& operator<<(std::ostream& os, const PD& obj);

    friend std::istream& operator>>(std::istream& i, PD& pd);

    };
    std::string int2str(int i);
    // файл Fract.cpp

    #include "StdAfx.h"

    #include "Fract.h"
    PD::PD() {

    this->numenator = 2;

    this->denominator = 2;
    }
    PD::PD(int a, int b) {

    this->numenator = a;

    this->denominator = b;

    }
    const int& PD::operator[](const int i) const {

    if (i == 0) return this->numenator;

    if (i == 1) return this->denominator;

    };
    int& PD::operator[](const int i) {

    if (i == 0) return this->numenator;

    if (i == 1) return this->denominator;

    };
    int PD::getNum() {

    return this->numenator;

    };
    int PD::getDen() {

    return this->denominator;

    };
    double PD::toDouble(){

    return (float)this->numenator / (float)this->denominator;

    }
    std::string int2str(int i) {

    std::stringstream ss;

    ss << i;

    return ss.str();

    }
    std::string PD::toString() {

    return int2str(this->numenator) + "/" + int2str(this->denominator);

    }
    PD getFromDouble(double d) {

    std::string s = toString(d);

    s = s.substr(2, s.length() - 2);
    int a = std::stoi(s);

    int b = 1;

    for (int i = 0; i < s.length(); i++) b *= 10;

    return PD(a,b);

    }
    PD getFromString(std::string s) {
    int pos = s.find('/');

    std::string s2 = s.substr(pos+1, s.length() - pos);

    std::string s1 = s.substr(0, pos);

    PD pd = PD(std::stoi(s1), std::stoi(s2));

    return pd;

    }
    PD PD::fromDouble(double d) {
    PD pd = getFromDouble(d);

    return pd;

    }
    PD PD::plus(PD pd1, PD pd2) {

    int a, b;

    a = pd1[0] * pd2[1] + pd2[0] * pd1[1];

    b = pd1[1] * pd2[1];

    PD pd = PD(a, b);

    pd[0] = a;

    pd[1] = b;

    return pd;

    }
    PD PD::plus(PD pd, double d) {

    return PD::plus(pd, getFromDouble(d));

    }
    PD PD::plus(double d, PD pd) {

    return PD::plus(pd, d);

    }

    PD PD::minus(PD pd1, PD pd2) {

    int a, b;

    a = pd1[0] * pd2[1] - pd2[0] * pd1[1];

    b = pd1[1] * pd2[1];

    return PD(a, b);

    }
    PD PD::minus(PD pd, double d) {

    return minus(pd, getFromDouble(d));

    }
    PD PD::minus(double d, PD pd) {

    return minus(getFromDouble(d),pd);

    }

    PD PD::multi(PD pd1, PD pd2) {

    int a, b;

    a = pd1[0] * pd2[0];

    b = pd1[1] * pd2[1];

    return PD(a, b);

    }
    PD PD::multi(PD pd, double d) {

    return PD::multi(pd, getFromDouble(d));

    }
    PD PD::multi(double d, PD pd) {

    return PD::multi(pd, d);

    }

    PD PD::divi(PD pd1, PD pd2) {

    int a, b;

    a = pd1[0] * pd2[1];

    b = pd1[1] * pd2[0];

    return PD(a, b);

    }
    PD PD::divi(PD pd, double d) {

    return PD::divi(pd, getFromDouble(d));

    }
    PD PD::divi(double d, PD pd) {

    return PD::divi(getFromDouble(d), pd);

    }

    PD operator+(const PD& pd1, const PD& pd2) {

    PD pd0;

    return pd0.plus(pd1,pd2);

    };

    PD operator+(const PD& pd, const double& d) {

    PD pd0;

    return pd0.plus(pd, d);

    };
    PD operator+(const double& d, const PD& pd) {

    PD pd0;

    return pd0.plus(pd, d);

    };
    PD operator-(const PD& pd1, const PD& pd2) {

    PD pd0;

    return pd0.minus(pd1, pd2);

    };

    PD operator-(const PD& pd, const double& d) {

    PD pd0;

    return pd0.minus(pd, d);
    };
    PD operator-(const double& d, const PD& pd) {

    PD pd0;

    return pd0.minus(d,pd);

    };
    PD operator/(const PD& pd1, const PD& pd2) {

    PD pd0;

    return pd0.divi(pd1, pd2);

    };

    PD operator/(const PD& pd, const double& d) {

    PD pd0;

    return pd0.divi(pd, d);
    };
    PD operator/(const double& d, const PD& pd) {

    PD pd0;

    return pd0.divi(d, pd);

    };
    PD operator*(const PD& pd1, const PD& pd2) {

    PD pd0;

    return pd0.multi(pd1, pd2);

    };
    PD operator*(const double& d, const PD& pd) {

    PD pd0;

    return pd0.multi(pd, d);

    };
    PD operator*(const PD& pd,const double& d) {

    PD pd0;

    return pd0.multi(pd, d);

    };
    std::ostream& operator<<(std::ostream& os, const PD& pd) {
    os << pd[0] << "/" << pd[1];

    return os;
    }
    std::istream& operator>>(std::istream& i, PD& pd)

    {

    std::string s;

    i >> s;

    PD pd1;

    pd1 = getFromString(s);

    pd = pd1;

    return i;

    }
    std::string toString(double d) {

    std::ostringstream strs;

    strs << d;

    std::string str = strs.str();
    return str;

    }

    // файл PropFract.cpp

    #include "StdAfx.h"

    #include

    #include

    #include "Fract.h"
    int main()

    {

    setlocale(LC_ALL,"Russian");

    PD pd, pd1 = PD(1,2), pd2 = PD (1,7);

    double d1 = 0.3; double d2 = 0.4;
    std::cout << "Исходная первая дробь: " + pd1.toString();

    std::cout << "\nПолучение числителя первой дроби через индекс массива: " << pd1[0];

    std::cout << "\nПолучение знаменателя первой дроби через индекс массива: " << pd1[1];
    pd1[0] = 2; pd1[1] = 5;

    std::cout << "\nИзменённая первая дробь: " + pd1.toString();
    std::cout << "\nПолучение числителя первой дроби через функцию: " << pd1.getNum();

    std::cout << "\nПолучение знаменателя первой дроби через функцию: " << pd1.getDen();
    std::cout << "\nПреобразование в вещественное число: " << pd1.toDouble();

    pd1 = pd1.fromDouble(d1);

    std::cout << "\nПреобразование из числа " << d1 << ": " << pd1;// .toString();
    std::cout << "\n\n"; system("pause");
    std::cout << "\n\nИсходная первая дробь: " + pd1.toString();

    std::cout << "\nИсходная вторая дробь: " + pd2.toString();
    std::cout << "\n\nИсходное первое вещественное число: " << d1;

    std::cout << "\nИсходное второе вещественное число: " << d2;
    pd = pd1 + pd2;

    std::cout << "\n\nСумма двух дробей: " + pd.toString();
    pd = pd1 + d2;

    std::cout << "\nСумма первой дроби и второго вещественного числа: " + pd.toString();
    pd = d1 + pd2;

    std::cout << "\nСумма второй дроби и первого вещественного числа: " + pd.toString();
    pd = pd1 - pd2;

    std::cout << "\n\nРазница двух дробей: " + pd.toString();

    pd = pd1 - d2;

    std::cout << "\nРазница первой дроби и второго вещественного числа: " + pd.toString();
    pd = d1 - pd2;

    std::cout << "\nРазница второй дроби и первого вещественного числа: " + pd.toString();
    pd = pd1 * pd2;

    std::cout << "\n\nПроизведение двух дробей: " + pd.toString();
    pd = pd1 * d2;

    std::cout << "\nПроизведение первой дроби и второго вещественного числа: " + pd.toString();
    pd = d1 * pd2;

    std::cout << "\nПроизведение второй дроби и первого вещественного числа: " + pd.toString();
    pd = pd1 / pd2;

    std::cout << "\n\nЧастное двух дробей: " + pd.toString();
    pd = pd1 / d2;

    std::cout << "\nЧастное первой дроби и второго вещественного числа: " + pd.toString();
    pd = d1 / pd2;

    std::cout << "\nЧастное второй дроби и первого вещественного числа: " + pd.toString();
    std::cout << "\n\nА теперь введите дробь в формате a/b: "; std::cin >> pd;
    std::cout << "\nВозвращаем значение: " << pd;
    std::cout << "\n\n"; system("pause");

    }


    1. Результат работы программы на языке C++

    Исходная первая дробь: 1/2

    Получение числителя первой дроби через индекс массива: 1

    Получение знаменателя первой дроби через индекс массива: 2

    Изменённая первая дробь: 2/5

    Получение числителя первой дроби через функцию: 2

    Получение знаменателя первой дроби через функцию: 5

    Преобразование в вещественное число: 0.4

    Преобразование из числа 0.3: 3/10
    Для продолжения нажмите любую клавишу . . .
    Исходная первая дробь: 3/10

    Исходная вторая дробь: 1/7
    Исходное первое вещественное число: 0.3

    Исходное второе вещественное число: 0.4
    Сумма двух дробей: 31/70

    Сумма первой дроби и второго вещественного числа: 70/100

    Сумма второй дроби и первого вещественного числа: 31/70
    Разница двух дробей: 11/70

    Разница первой дроби и второго вещественного числа: -10/100

    Разница второй дроби и первого вещественного числа: 11/70
    Произведение двух дробей: 3/70

    Произведение первой дроби и второго вещественного числа: 12/100

    Произведение второй дроби и первого вещественного числа: 3/70
    Частное двух дробей: 21/10

    Частное первой дроби и второго вещественного числа: 30/40

    Частное второй дроби и первого вещественного числа: 21/10
    А теперь введите дробь в формате a/b: 2/3
    Возвращаем значение: 2/3
    Для продолжения нажмите любую клавишу . . .

    1   2   3   4   5


    написать администратору сайта