Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.95
SL1M
0 / 0 / 0
Регистрация: 25.03.2008
Сообщений: 22
#1

Помогите с задачей пожалуйста. Перегрузка операций. - C++

25.03.2008, 14:46. Просмотров 2356. Ответов 11
Метки нет (Все метки)

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



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




C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#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();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.03.2008, 14:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Помогите с задачей пожалуйста. Перегрузка операций. (C++):

Расставить приоритеты операций и вычислить значение заданного выражения (Помогите с задачей) - C++
Расставить приоритеты операций и вычислить значение заданного выражения, используя форматы машинного представления данных и правила...

Помогите пожалуйста с простой задачей - C++
&quot;Составить программу для упорядочения в порядке возрастания элементов однонаправленного списка&quot; Видела уже подобную тему на Паскале,...

Помогите с задачей, пожалуйста! (файлы Си++) - C++
Ну вот. Практикум по Си++. :read: Надо выполнить следующую задачу: Задание: Написать программу, которая читает текстовый файл и...

Помогите пожалуйста с задачей по BORLAND С++ - C++
Создать шаблон функции, выполгяющий сортировку слиянием (Метод Фон Неймана) в массиве. Протестировать шаблон для массивов с элементами...

Перегрузка операций - C++
Добрый день форумчане, помогите решить задачку Перегрузить 8 операторов для класса Вот пример класса class Money{ unsigned long...

перегрузка операций - C++
Напишите программу, в которой используется класс Int, имитирующий стандартный класс Int. Перегрузите четыре целочисленных арифметических...

11
Lord_Voodoo
Супер-модератор
8594 / 2209 / 61
Регистрация: 07.03.2007
Сообщений: 10,967
Завершенные тесты: 1
25.03.2008, 15:34 #2
а ты теоретически освежи-ка как делаются руками эти операции, тогда и думать будем, как тебе помочь...
0
SL1M
0 / 0 / 0
Регистрация: 25.03.2008
Сообщений: 22
25.03.2008, 19:26  [ТС] #3
Так. Ну начнем с того, что облазил все конспекты и учебники, нигде не нашел нахождение векторного произведения в 5-ти мерном пространстве. После недолгих поисков гугла нашел следующее:
Векторное произведение. Введем еще одну операцию над векторами. Эта операция существует только в трехмерном векторном пространстве, на плоскости она не определена.
Значит третий пункт отпадает.
0
SL1M
0 / 0 / 0
Регистрация: 25.03.2008
Сообщений: 22
25.03.2008, 19:31  [ТС] #4
Код
УУмножениевектора на скаляр.

λ-число (скаляр)

ā - вектор λā=с

Произведением λā называется вектор, длинна которого равна |ā|·|λ|, а направление такое же, как и у вектора ā если λ больше 0, и противоположное, если λ меньше 0.

Векторы называются коллиниарными, если они лежат на совпадающих прямых.

Если векторы ā и в коллиниарны (ā№0; в№0), то они пропорциональны, т.е. существует такое положительное или отрицательное число l, что а=lв.

Три вектора называются компланарными, если их можно уложить на одну плоскость.
0
Lord_Voodoo
Супер-модератор
8594 / 2209 / 61
Регистрация: 07.03.2007
Сообщений: 10,967
Завершенные тесты: 1
26.03.2008, 09:27 #5
тогда вопрос, когда это return стал возвращать значения через запятую...
0
SL1M
0 / 0 / 0
Регистрация: 25.03.2008
Сообщений: 22
26.03.2008, 14:09  [ТС] #6
))) Ну это я так... Это можно не писать в принципе И так S присваивается...
Нет никаких идей как 4-ый пункт выполнить и до ума довести программу?
0
Lord_Voodoo
Супер-модератор
8594 / 2209 / 61
Регистрация: 07.03.2007
Сообщений: 10,967
Завершенные тесты: 1
26.03.2008, 14:43 #7
ну если это скалярное умножение, то на входе должен быть int, который перемножается на каждый элемент вектора, и потом возвращается новый вектор... если я правильно теорию помню...
0
SL1M
0 / 0 / 0
Регистрация: 25.03.2008
Сообщений: 22
26.03.2008, 16:55  [ТС] #8
Скалярное произведение векторов A(x1,x2,x3,x4,x5...xn) и B(y1,y2,y3,y4,y5...xn) считается вроде
по формуле S=x1y1+x2y2+x3y3 + ... + xnyn

А ты описал вроде умножение скаляр на вектор (пункт 4), вот только каким это образом в моей программе описать и сделать чтоб работало? Че-то я уже много всего перебробывал, одни ошибочки
0
Lord_Voodoo
Супер-модератор
8594 / 2209 / 61
Регистрация: 07.03.2007
Сообщений: 10,967
Завершенные тесты: 1
27.03.2008, 10:34 #9
вот что у меня вышло, хотя твой код рабочий был... я просто одну операцию перегрузил... или я что-то не понял...
Код
#include <vcl.h>
#include <conio.h>
#include <iostream.h>
#pragma hdrstop
#pragma argsused
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 &); 
   vect operator*(const int &); 
   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;
   return proizv;
}
vect vect::operator*(const int &operand2)
{
   vect proizv;
   proizv.a = a * operand2;
   proizv.b = b * operand2;
   proizv.c = c * operand2;
   proizv.d = d * operand2;
   proizv.e = e * operand2;
   return proizv;
}
void vect::print() const
{
   cout<<'('<<a<<", "<<b<<", "<<c<<", "<<d<<", "<<e<<')';
}
int main(int argc, char* argv[])
{
   vect x(5,6,7,8,9),y(4,3,2,1,7);
   vect z;
   int scl = 8;
   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 Vector*Vector:   ";
   z.print();
   z = x * scl;
   cout<<"\n Scalar1:   ";
   z.print();
   z = y * scl;
   cout<<"\n Scalar1:   ";
   z.print();
   getch();
   return 0;
}
0
SL1M
0 / 0 / 0
Регистрация: 25.03.2008
Сообщений: 22
28.03.2008, 12:17  [ТС] #10
Спасибо!
0
Lord_Voodoo
Супер-модератор
8594 / 2209 / 61
Регистрация: 07.03.2007
Сообщений: 10,967
Завершенные тесты: 1
28.03.2008, 12:19 #11
так работает али как?
0
SL1M
0 / 0 / 0
Регистрация: 25.03.2008
Сообщений: 22
08.04.2008, 18:52  [ТС] #12
Да, идея эта работает, переписал под себя только, вот что получилось...
Большое спасибо!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#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;
  returns;
}
//Векторное произведение векторов:
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;
}
Только с свойствах окна шрифт на Lucida Console нужно поменять, чтоб русский шрифт нормально отображался.
ПС: Код для Билдера, на остальном пока не умею
0
08.04.2008, 18:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.04.2008, 18:52
Привет! Вот еще темы с ответами:

Перегрузка операций - C++
Здравствуйте, помогите с лабораторной. Я правильно сделал и как менять названия у перегрузки операций на + и - еще нормально но на...

Перегрузка операций - C++
Доброго времени суток. Очень нужна помощь программистов. Есть такое задание: Создать класс, который запоминает римские числа в виде...

Перегрузка операций - C++
Уважаемые программисты! Помогите новичку! Мне нужно написать программу, в которой реализуется разреженная матрица переменной размерности,...

Перегрузка операций - C++
Цитата из Р. Лафоре &quot;Объекто-ориентированное программирование в C++&quot;: Далее идет пример: #include &lt;iostream&gt; using namespace...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru