Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Перегрузка операций.


Автор: SL1M 25.3.2008, 14:57
Всем привет! Я новичок в изучении СИ, не могу разобраться как выполнить задачу.
Вариант следующий. Вектор в пятимерном евклидовом пространстве задается пятеркой своих координат. Реализовать:
1. сложение (вычитание) векторов;
2. скалярное произведение векторов;
3. векторное произведение векторов (операция %);
4. умножение вектора на скаляр.



Первые два пунка я вроде еле как выполнил. Да и второй пункт выполнил как-то неправильно, кажется. Хотя в принципе работает... Как реализовать остальное?
Программа для Билдера...

Код


#include <vcl.h>
#include <conio.h>
#include <iostream.h>
int s;
class vect {
public:
   vect(int=0,int=0,int=0,int=0,int=0); //Конструктор
   vect operator+(const vect &) const;   //Сложение
   vect operator-(const vect &) const;//Вычитание
   vect operator*(const vect &); //Умножение
   void print() const;//Печать
   private:
   int a,b,c,d,e;
};

//Конструктор:
vect::vect(int a1,int b1,int c1,int d1,int e1)
{
   a = a1;
   b = b1;
   c = c1;
   d = d1;
   e = e1;
}

//Перегруженная операция сложения:
vect vect::operator+(const vect &operand2) const
{
   vect sum;
   sum.a = a + operand2.a;
   sum.b = b + operand2.b;
   sum.c = c + operand2.c;
   sum.d = d + operand2.d;
   sum.e = e + operand2.e;
   return sum;
}

//Перегруженная операция вычитания:
vect vect::operator-(const vect &operand2) const
{
   vect diff;
   diff.a = a - operand2.a;
   diff.b = b - operand2.b;
   diff.c = c - operand2.c;
   diff.d = d - operand2.d;
   diff.e = e - operand2.e;
   return diff;
}

//Перегруженная операция умножения:
vect vect::operator*(const vect &operand2)
{
   vect proizv;
   proizv.a = a * operand2.a;
   proizv.b = b * operand2.b;
   proizv.c = c * operand2.c;
   proizv.d = d * operand2.d;
   proizv.e = e * operand2.e;
   s = proizv.a + proizv.b + proizv.c + proizv.d + proizv.e;
   return proizv,s;
}

//Печать объекта в виде (a,b,c,d,e)
void vect::print() const
{
   cout<<'('<<a<<", "<<b<<", "<<c<<", "<<d<<", "<<e<<')';
}


void main()
{
   vect x(5,6,7,8,9),y(4,3,2,1,7);
   vect z;
   cout<<"\n Vector 1:   ";
   x.print();
   cout<<"\n Vector 2:   ";
   y.print();

   z = x + y;
   cout<<"\n Slozhenie:   ";
   z.print();

   z = x - y;
   cout<<"\n Vichitanie:  ";
   z.print();

   z = x * y;
   cout<<"\n Scalar:   "<<s;
   getch();
}




Автор: Dennnis 25.3.2008, 15:15
Для начала необходимо реализовать конструктор копирования:
Код

vect(const vect& vec)
: a(vec.a), b(vec.b), c(vec.c), d(vec.d), e(vec.e)
{
}


Скалярное произведение векторов ты точно сделал криво,
зачем нужна глобальная переменная s и вот это return proizv,s?

Умножение на скаляр помоему самое простое:
Код

...
//Перегруженная операция умножения на int:
vect vect::operator*(int i)
{
vect tmp(*this);
tmp.a *= i;
tmp.b *= i;
tmp.c *= i;
tmp.d *= i;
tmp.e *= i;
return tmp;
}
...

Автор: SL1M 25.3.2008, 16:09
Цитата

зачем нужна глобальная переменная s и вот это return proizv,s?


Ну так он мне считал скалярное произведение. Хотя и без этого считает smile
А насчет того что ты мне написал - не понял куда это. Вставил в код, описал в классе (вроде), а он мне кучу ошибок...
Можешь это в мою программу вписать? Куда и как правильно...
Я лом smile

Автор: archimed7592 25.3.2008, 17:55
Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 

Автор: SL1M 26.3.2008, 21:54
И тишина-ааа...

Автор: SL1M 12.4.2008, 13:24
Разобрался и доделал. Всем спасибо. Закройте тему, пожалуйста...

Код

#include <vcl.h>
#include <conio.h>
#include <iostream.h>
#include <math.h>
#pragma hdrstop
#pragma argsused
using namespace std;
class vect {
public:
   vect(int=0,int=0,int=0,int=0,int=0);
   vect operator+(const vect &);
   vect operator-(const vect &);
   vect operator*(const int &);
   int  operator*(const vect &);
   int  operator%(const vect & );
   void print();
private:
   int a,b,c,d,e;
};
//Конструктор:
vect::vect(int a1,int b1,int c1,int d1,int e1)
{
   a = a1;
   b = b1;
   c = c1;
   d = d1;
   e = e1;
}
//Предопределение операции сложения:
vect vect::operator+(const vect &opr2)
{
   vect sum;
   sum.a = a + opr2.a;
   sum.b = b + opr2.b;
   sum.c = c + opr2.c;
   sum.d = d + opr2.d;
   sum.e = e + opr2.e;
   return sum;
}
//Предопределение операции вычитания:
vect vect::operator-(const vect &opr2)
{
   vect diff;
   diff.a = a - opr2.a;
   diff.b = b - opr2.b;
   diff.c = c - opr2.c;
   diff.d = d - opr2.d;
   diff.e = e - opr2.e;
   return diff;
}
//Предопределение операции умножения:
vect vect::operator*(const int &opr2)
{
   vect proizv;
   proizv.a = a * opr2;
   proizv.b = b * opr2;
   proizv.c = c * opr2;
   proizv.d = d * opr2;
   proizv.e = e * opr2;
   return proizv;
}
//Скалярное произведение векторов:
int vect::operator*(const vect &opr2)
{
   int s=a*opr2.a+b*opr2.b+c*opr2.c+d*opr2.d+e*opr2.e;
   return s;
}
//Векторное произведение векторов:
int  vect::operator%(const vect &opr2 )
{
   float x,y,z,p;
   x=sqrt(a*a+b*b+c*c+d*d+e*e);
   y=sqrt(opr2.a*opr2.a+opr2.b*opr2.b+opr2.c*opr2.c+opr2.d*opr2.d+opr2.e*opr2.e);
   z=acos((a*opr2.a+b*opr2.b+c*opr2.c+d*opr2.d+e*opr2.e)/(x*y));
   p=x*y*z ;
   return p;
}
//Функция вывода:
void vect::print()
{
   cout<<'('<<a<<", "<<b<<", "<<c<<", "<<d<<", "<<e<<')';
}
//Основная программа:
int main()
{
   SetConsoleCP(1251);
   SetConsoleOutputCP(1251);
   cout<<"-------------------------\n A-27. Лаба 2. Вариант 1. \n-------------------------\n\n";
   vect x(5,6,7,8,9),y(4,3,2,1,7),z;
   int scl,t;
   float v;
   cout<<"\n Вектор А:   ";
   x.print();
   cout<<"\n Вектор В :   ";
   y.print();
   z = x + y;
   cout<<"\n Сложение:   ";
   z.print();
   z = x - y;
   cout<<"\n Вычитание:  ";
   z.print();
   t = x * y;
   cout<<"\n Скалярное произведение:   " <<t;
   v = x % y;
   cout<<"\n Векторное произведение:   " <<v;
   cout<<"\n Введите скаляр:  ";
   cin>>scl;
   z = x * scl;
   cout<<" Умножение вектора А на скаляр:   ";
   z.print();
   z = y * scl;
   cout<<"\n Умножение вектора В на скаляр:   ";
   z.print();
   getch();
   return 0;
}


Автор: maverik 17.1.2009, 17:51
на сколько я понимаю, результатом векторного произведения является вектор

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)