Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Перегрузка операций. Помогите пожалуйста дорешать задачу. 
:(
    Опции темы
SL1M
Дата 25.3.2008, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 25.3.2008

Репутация: нет
Всего: нет



Всем привет! Я новичок в изучении СИ, не могу разобраться как выполнить задачу.
Вариант следующий. Вектор в пятимерном евклидовом пространстве задается пятеркой своих координат. Реализовать:
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();
}




PM MAIL   Вверх
Dennnis
Дата 25.3.2008, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 23.3.2008

Репутация: нет
Всего: 4



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

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;
}
...

--------------------
Get Rich or Die Tryin'
PM   Вверх
SL1M
Дата 25.3.2008, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 25.3.2008

Репутация: нет
Всего: нет



Цитата

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


Ну так он мне считал скалярное произведение. Хотя и без этого считает smile
А насчет того что ты мне написал - не понял куда это. Вставил в код, описал в классе (вроде), а он мне кучу ошибок...
Можешь это в мою программу вписать? Куда и как правильно...
Я лом smile
PM MAIL   Вверх
archimed7592
Дата 25.3.2008, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: нет
Всего: 93



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

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


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
SL1M
Дата 26.3.2008, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 25.3.2008

Репутация: нет
Всего: нет



И тишина-ааа...
PM MAIL   Вверх
SL1M
Дата 12.4.2008, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 25.3.2008

Репутация: нет
Всего: нет



Разобрался и доделал. Всем спасибо. Закройте тему, пожалуйста...

Код

#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;
}


PM MAIL   Вверх
maverik
Дата 17.1.2009, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 17.1.2009

Репутация: нет
Всего: нет



на сколько я понимаю, результатом векторного произведения является вектор
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

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

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0481 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.