Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.09.2010, 09:56   #1
StudentofSUSU
Пользователь
 
Регистрация: 07.01.2010
Сообщений: 11
По умолчанию

Суть задачи такова. Надо реализовать класс-вектор и перегрузить операторы: +, -, * (скалярное для двух векторов и для матрицы и числа), оператор индексирования [] для доступа к элементу вектора, =, +=, -=, *= (правым операндом может быть как вектор, так и число), ==, !=, << (вывод в поток типа ostream). Для проверки работоспособности класса нужно проверить его на следующем коде.
Код:
int main() 
{
	Vector a;
	Vector b(2);
	Vector c(3);

	for (int i = 0; i < 2; i++)
		b[i] = i;

	b *= 2;
	b = a = b + b; 

	if (a != b) cout << "Something wrong\n"; 
	else cout << "As expected\n";

	b += c;   // эта строчка работать не должна, потому что векторы
		  // разной размерности складывать нельзя.         

	cout << a << endl
	     << c << endl
	     << b << endl;

	return 0;
}
Код:
#include <iostream>
class Vektor {
public:
	Vektor();//конструктор "по умолчанию"
	~Vektor();//деструктор
	Vektor(int x);//конструктор "по размеру вектора"
	Vektor(const Vektor& v);//копирующий конструктор
	Vektor operator+ (const Vektor v);//перегрузка оператора +
	Vektor operator- (const Vektor v);//перегрузка оператора -
	Vektor operator* (const Vektor v);//перегрузка оператора *
	Vektor operator* (const int x);//перегрузка оператора *
	int& operator [] (int x);//перегрузка оператора индексирования
    bool operator== (const Vektor v);//перегрузка оператора сравнения
	Vektor operator+= (Vektor v);//перегрузка оператора +=
	Vektor operator-= (Vektor v);//перегрузка оператора -=
	Vektor operator*= (Vektor v);//перегрузка оператора *=
	Vektor operator*= (int x);//перегрузка оператора *=
	Vektor operator= (const Vektor v);//перегрузка оператора =
	bool operator!= (Vektor v);//перегрузка оператора !=
	friend std:: ostream& operator<< (std:: ostream& s, const Vektor v);//метод вывода
private:
	int* vek;
	int length;
};
Описание методов и класса.

Последний раз редактировалось Stilet; 30.09.2010 в 10:09.
StudentofSUSU вне форума Ответить с цитированием
Старый 30.09.2010, 10:02   #2
StudentofSUSU
Пользователь
 
Регистрация: 07.01.2010
Сообщений: 11
По умолчанию

Код:
#include "Vektor.h"
#include <iostream>
Vektor::Vektor(){//реализация конструктора "по умолчанию"
	length=10;
	vek = new int[length];
}
Vektor:: ~Vektor(){//реализация деструктора
	using namespace std;
	cout<<"Destructor";
	delete[] vek;
}
Vektor:: Vektor(int x){//реализация конструктора с заданным размером
	length=x;
	vek=new int[length];
}
Vektor:: Vektor(const Vektor& v){//реализация копируещего конструктора
	this->length=v.length;
    vek = new int[length];
}
Vektor Vektor:: operator +(const Vektor v){//реализация перегрузки оператора +
	using namespace std;
	Vektor result;
	result.length=this->length;
	for (int i=0; i<this->length; i++){
		result.vek[i]=this->vek[i];
	}
	if (!(this->length=v.length)){
		cout<<"Wrong operation";
		return 0;
	}
	else
	{
		for (int i=0; i<this->length; i++){
			result.vek[i]+=v.vek[i];
		}	
	return result;	
	}
}
Vektor Vektor:: operator -(const Vektor v){//реализация перегрузки оператора -
	using namespace std;
	Vektor result;
	if (!(this->length=v.length)){
		cout<<"Wrong operation";
		return 0;
	}
	else
	{
		for (int i=0; i<this->length; i++){
			result.vek[i]-=v.vek[i];
		}	
	return result;	
	}
}
Vektor Vektor:: operator* (const Vektor v){//реализация оператора *
	using namespace std;
	Vektor result;
	if (!(this->length=v.length)){
		cout<<"Wrong operation";
		return 0;
	}
	else
	{
		for (int i=0; i<this->length; i++){
			result.vek[i]*=v.vek[i];
		}	
	return result;	
	}
}
int& Vektor:: operator [] (int x)
{
	return this->vek[x];
}
Vektor Vektor:: operator* (const int x){//реализация оператора *
	Vektor result;
		for (int i=0; i<this->length; i++){
			result.vek[i]*=x;
	return result;	
	}
}
bool Vektor:: operator ==(const Vektor v){//реализация оператора сравнения
	bool tmp=true;
	if (!(this->length==v.length)) {
		tmp=false;
	}
	else {
		for (int i=0; i<this->length; i++){
			if (!(this->vek[i]==v.vek[i])){
				tmp=false;
			}
		}
	}
	if (tmp=false) {
		return false;
	}
	else{return true;}
}
Vektor Vektor:: operator+= (Vektor v){//реализация перегрузки оператора +=
using namespace std;
	if (!(this->length==v.length)){
		cout<<"Wrong operation";
		return 0;
	}
	else
	{
		for (int i=0; i<this->length; i++){
			this->vek[i]+=v.vek[i];
		}	
	return *this;	
	}
}
Vektor Vektor:: operator-= (Vektor v){//реализация перегрузки оператора -=
	using namespace std;
	if (!(this->length==v.length)){
		cout<<"Wrong operation";
		return 0;
	}
	else
	{
		for (int i=0; i<this->length; i++){
			this->vek[i]-=v.vek[i];
		}	
	return *this;	
	}
}
Vektor Vektor:: operator *=(Vektor v){//реализация оператора *=
using namespace std;
	if (!(this->length==v.length)){
		cout<<"Wrong operation";
		return 0;
	}
	else
	{
		for (int i=0; i<this->length; i++){
			this->vek[i]*=v.vek[i];
		}	
	return *this;	
	}
}
Vektor Vektor:: operator*= (int x){//реализация оператора *
	for (int i=0; i<this->length; i++){
			this->vek[i]*=x;
		}
	return *this;	

}
Vektor Vektor:: operator= (const Vektor v){//реализация оператора =
if (!(this==&v)){
	this->length=v.length;
	if (vek) delete[] vek;
	vek = new int[v.length];
	for (int i=0; i<this->length; i++){
		this->vek[i]=v.vek[i];	
	}}
	return *this;
	}

bool Vektor:: operator!= (Vektor v){//реализация оператора !=
    bool tmp=false;
	if (!(this->length==v.length)) {
		return true;
	}
	else {
		for (int i=0; i<this->length; i++){
			if (!(this->vek[i]==v.vek[i])){
				tmp=true;
			}
		}
			if (tmp==true){return true;}
	        else {return false;}
	}

}
std:: ostream& operator<<(std:: ostream& s, const Vektor v)//реализация метода вывода
{
	s<<v.length<<"-length"<<std::endl;
	for (int i=0; i<v.length; i++){
		s<<v.vek[i]<<"-element of vektor number "<<i<<std::endl;
	}
	return s;
}
From Stilet: Что оформить код в посте читабельно религия не позволяет?

Последний раз редактировалось Stilet; 30.09.2010 в 10:10.
StudentofSUSU вне форума Ответить с цитированием
Старый 30.09.2010, 10:04   #3
StudentofSUSU
Пользователь
 
Регистрация: 07.01.2010
Сообщений: 11
По умолчанию

Судя по дебаггеру до строчки b = a = b + b;
Все окей, затем данные становятся неверными. Не могу понять, в чем ошибка.
StudentofSUSU вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
c++ перегрузка операторов pavel282 Помощь студентам 6 11.09.2010 20:35
Проблема с перегрузкой операторов, не могу разобраться mrLee Помощь студентам 1 30.01.2010 00:23
Проблема с перегрузкой операторов, не могу разобраться mrLee Общие вопросы C/C++ 0 29.01.2010 18:45
В конструкторе выделяется память под массив. Как быть с перегрузкой оператора = ? TwiX Общие вопросы C/C++ 6 15.12.2009 12:18
Перегрузка операторов, Организация перегрузки операторов chagin_yav Помощь студентам 2 12.05.2008 09:15