Форум кафедры Техники и Электрофизики Высоких Напряжений

Онлайн-сообщество ТВНщиков
Гостям форума:

Добро пожаловать на форум по технике высоких напряжений!
Для получения доступа ко всем разделам необходимо зарегистрироваться


Текущее время: 21 ноя 2017, 09:22

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: Домашнее задание №4
СообщениеДобавлено: 28 окт 2017, 04:18 
Не в сети
Site Admin

Зарегистрирован: 03 сен 2008, 16:09
Сообщения: 4146
Откуда: Д-3
В очередной раз немного меняю свои планы (слишком мало рассказал на прошлом занятии). Задание, в итоге, не очень сложное, и послужит нам для закрепления пройденного и в качестве отправной точки для начала следующего занятия.

Реализуйте класс полинома произвольной степени. Класс должен содержать:
– конструктор по умолчанию;
– конструктор, создающий полином требуемой степени с указанными значениями коэффициентов;
– конструктор копирования;
– копирующий оператор присваивания;
– перемещающий конструктор;
– перемещающий оператор присваивания;
– деструктор;
– метод, сообщающий степень полинома;
– метод, изменяющий коэффициент полинома;
– метод, возвращающий заданный коэффициент полинома;
– метод, вычисляющий значение полинома;
– перегруженный оператор + для сложения двух полиномов;
– перегруженный оператор - для вычитания двух полиномов;
– перегруженный оператор - для изменения знака полинома;
– метод, вычисляющий производную полинома и возвращающий соответствующий новый полином;
– метод, проверяющий идентичность двух полиномов;
– перегруженный оператор, умножающий полином на число;
– перегруженный оператор >> для вывода полинома в объект типа ostream;
– перегруженный оператор << для ввода полинома из объекта типа istream.

Реализуйте класс на основе std::vector для хранения коэффициентов и оперирования ими. В конструкторах и операторах = сделайте вывод диагностической строчки в cout, чтобы можно было отслеживать, что и когда вызывается. Напишите для отладки класса функцию main(), работающую с ним.

На следующем занятии я не буду долго разбирать это домашнее задание, остановимся только на различиях между конструкторами и операторами присваивания, реализующими семантику перемещения и копирования, а также добавим список инициализации для конструирования полинома. Ну и разберемся со спецификаторами delete, explicit, const, constexpr. После этого перейдем к рассмотрению стандартной библиотеки: string, stream и т.д.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Домашнее задание №4
СообщениеДобавлено: 29 окт 2017, 22:40 
Не в сети

Зарегистрирован: 12 окт 2016, 20:08
Сообщения: 9
Здравствуйте, а в чем различия конструктора копирования и копирующего оператора присваивания?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Домашнее задание №4
СообщениеДобавлено: 29 окт 2017, 23:48 
Не в сети

Зарегистрирован: 08 сен 2009, 22:02
Сообщения: 92
Здравствуйте, я думаю, речь идет о перегрузке оператора "=".


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Домашнее задание №4
СообщениеДобавлено: 29 окт 2017, 23:58 
Не в сети
Site Admin

Зарегистрирован: 03 сен 2008, 16:09
Сообщения: 4146
Откуда: Д-3
Да, именно так.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Домашнее задание №4
СообщениеДобавлено: 30 окт 2017, 07:13 
Не в сети

Зарегистрирован: 12 окт 2016, 20:08
Сообщения: 9
Я правильно понял, что различий нет? Это по сути одно и то же - перегрузка оператора ‘=‘?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Домашнее задание №4
СообщениеДобавлено: 30 окт 2017, 11:30 
Не в сети
Site Admin

Зарегистрирован: 03 сен 2008, 16:09
Сообщения: 4146
Откуда: Д-3
Стоп, нет. Конструктор копирования - это конструктор, который принимает полином и создает на его основе новый объект - копию. Оператор копирования - это перегруженный оператор, который принимает полином и создает на его основе копию в уже существующем объекте.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Домашнее задание №4
СообщениеДобавлено: 06 ноя 2017, 01:26 
Не в сети

Зарегистрирован: 28 авг 2015, 14:13
Сообщения: 7
Откуда: Москва
Здравствуйте.
Должен быть реализован полином от одной переменной, или более?
Как считывать вектор при задании его пользователем?
Можно ли реализовать степень полинома без задания её отдельной переменной, т.е. если некоторые степени не представлены, то коэффициенты при них будут вводиться, но будут равны нулю?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Домашнее задание №4
СообщениеДобавлено: 06 ноя 2017, 13:08 
Не в сети
Site Admin

Зарегистрирован: 03 сен 2008, 16:09
Сообщения: 4146
Откуда: Д-3
Михаил_Анфимов писал(а):
Здравствуйте.
Bonjour, Michou!

Михаил_Анфимов писал(а):
Должен быть реализован полином от одной переменной, или более?
От одной, спаси господи.

Михаил_Анфимов писал(а):
Как считывать вектор при задании его пользователем?
C++11 поддерживает списки инициализации, поэтому проще всего задать вектор так:
Код:
std::vector<double> K { коэффициенты полинома через запятую }
Возможно, я не понимаю, что значит "считывать". У одной моей близкой родственницы это может означать, например, ввод пароля или открытие браузера.

Михаил_Анфимов писал(а):
Можно ли реализовать степень полинома без задания её отдельной переменной, т.е. если некоторые степени не представлены, то коэффициенты при них будут вводиться, но будут равны нулю?
Да-да, конечно (с) Шканов, так можно (и нужно). Степень полинома при этом на единицу меньше размера вектора.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Домашнее задание №4
СообщениеДобавлено: 06 ноя 2017, 13:31 
Не в сети

Зарегистрирован: 28 авг 2015, 14:13
Сообщения: 7
Откуда: Москва
dmatveev писал(а):
Михаил_Анфимов писал(а):
Как считывать вектор при задании его пользователем?
C++11 поддерживает списки инициализации, поэтому проще всего задать вектор так:
Код:
std::vector<double> K { коэффициенты полинома через запятую }
Возможно, я не понимаю, что значит "считывать". У одной моей близкой родственницы это может означать, например, ввод пароля или открытие браузера.


В данном случае ввод с клавиатуры в процессе взаимодействия с пользователем.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Домашнее задание №4
СообщениеДобавлено: 06 ноя 2017, 14:14 
Не в сети

Зарегистрирован: 28 авг 2015, 14:13
Сообщения: 7
Откуда: Москва
И снова здравствуйте.
При попытке перегрузить бинарный оператор + возник ряд проблем и вопросов:
1) Заявить перегрузку оператора не получается вне пределов области public в .h файле, пишет что функция член не может быть объявлена вне соответствующего класса, несмотря на то что при работе с классом complex это было возможно. Пробовал обоими способами из нижеописанных.

2) В чём различие между заявлениями о перегрузке оператора ( не только в .h файле)?:
Код:
Poly operator + (const Poly &p1, const Poly &p2)
Poly & Poly::operator +(const Poly &p1, const Poly &p2);

В обоих случаях в .h файле компилятор утверждает, что "Слишком много параметров для этой функции оператора".
В .cpp файле класса
Код:
Poly operator + (const Poly &p1, const Poly &p2)

Не вызывает у компилятора никакой негативной реакции

При использовании
Код:
Poly & Poly::operator +(const Poly &p1, const Poly &p2);

Компилятор утверждает, что "class "Poly" не содержит члена "operator+"", но я подозреваю что это из - за операции расширения области видимости (::).
Что я сделал неправильно в данном случае?

P.S.
К перегруженному оператору =, реализованному нижеописанным образом у компилятора вопросов не возникает.
В .h в public
Код:
Poly & Poly::operator = (const Poly &p1);

В .cpp
Код:
Poly & Poly::operator = (const Poly &p1)
{
   return Poly(this->c0 = p1.c0);
}


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Домашнее задание №4
СообщениеДобавлено: 06 ноя 2017, 14:29 
Не в сети
Site Admin

Зарегистрирован: 03 сен 2008, 16:09
Сообщения: 4146
Откуда: Д-3
Бинарный оператор + не может быть членом класса в такой форме как у тебя (каждый метод класса скрытым параметром получает this). Его вообще лучше определить за пределами класса. Не надо в классе делать для него никаких определений.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Домашнее задание №4
СообщениеДобавлено: 06 ноя 2017, 14:35 
Не в сети
Site Admin

Зарегистрирован: 03 сен 2008, 16:09
Сообщения: 4146
Откуда: Д-3
Михаил_Анфимов писал(а):
В данном случае ввод с клавиатуры в процессе взаимодействия с пользователем.

Я как чувствовал, что за этим "считывать" кроется что-то особенное.

Вот такой код можно использовать (объясню его на занятиях):

#include <sstream>
#include <iostream>
#include <vector>
#include <string>
#include <iterator>

using namespace std;

void main()
{
     vector<double> K;
     string line;
     getline(cin, line);
     istringstream iss(line);
     copy(istream_iterator<double>(iss), istream_iterator<double>(), back_inserter(K));
}


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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB