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

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

Войти
Регистрация
Восстановить пароль
 
 
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
#1

Как бы это декларировать? - C++

21.11.2012, 18:31. Просмотров 625. Ответов 16
Метки нет (Все метки)

Вектор должен поддерживать и скалярное, и векторное произведение.

Добавлено через 1 минуту
Реализация - не проблема, проблема в том, что символ умножения в c++ один, а в обоих случаях оба параметра имеют тип Vector. Нельзя же перегрузить на тип значения.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.11.2012, 18:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как бы это декларировать? (C++):

Как декларировать параметр из 8-ми сырых байт? - C++
Как декларировать параметр из 8-ми сырых байт? При вызове с фактическим параметром типа double приведение типа должно происходить без...

Как одновременно декларировать векторное и скалярное произведение векторов? - C++
В обоих случаях умножается вектор на вектор. Нельзя же перегрузить по типу значения.

как соединить b и с в число, если а это число, б это десятки перевернутого числа, с это единицы перевернутого числа вот в это строчке c=a+b,c; - C++
как соединить b и с в число, если а это число, б это десятки перевернутого числа, с это единицы перевернутого числа вот в это строчке...

Связанный список. Как это делается и зачем это нужно? - C++
Добрый день. Уже который день не могу понять эту тему. Гуглил, но понятнее от этого не стало. Кто-нибудь знает где найти понятный мануал?

нужно создать таблицу из 3 строк и 4 столбцов и заполнить её (любой информацией,это неважно) . Как это можно сделать ? - C++
Здравствуйте.У меня возникла проблема. Помогите пожалуйста!Модуль в понедельник , про таблицы ничего не рассказывали , а преподаватель...

Зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может больше 4 байт весить? - C++
Вот еще один вопрос зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
NEW_NAME
1 / 1 / 0
Регистрация: 04.10.2012
Сообщений: 45
21.11.2012, 18:56 #2
А зачем делать перегрузку *? Это же вобщем-то такие операции, которые не особо однозначны умножению в случае чисел. Вообще логично две функции отдельные завести.
0
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
21.11.2012, 21:23 #3
Цитата Сообщение от NEW_NAME Посмотреть сообщение
А зачем делать перегрузку *? Это же вобщем-то такие операции, которые не особо однозначны умножению в случае чисел. Вообще логично две функции отдельные завести.
this

Если уж совсем очень капец как хочется именно операторы, то сделайте, например, * для скалярного и % для векторного. Но это неочевидно.
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
22.11.2012, 08:27  [ТС] #4
И как лучше назвать эти методы?
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
22.11.2012, 09:21 #5
scalar_product, inner_product ?
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,529
Завершенные тесты: 1
22.11.2012, 09:54 #6
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
* для скалярного и %
"*" и "х"
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
22.11.2012, 10:00 #7
Цитата Сообщение от SatanaXIII Посмотреть сообщение
х
Нет же такого оператора, ^ уж тогда)
0
vxg
Модератор
3163 / 1966 / 221
Регистрация: 13.01.2012
Сообщений: 7,528
22.11.2012, 10:45 #8
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
//------------------------------------------------------------------------------
#ifndef vector_h
#define vector_h
//------------------------------------------------------------------------------
class vector
{
public:
    float x;
    float y;
    float z;
 
    vector(void);
    vector(const float &x, const float &y, const float &z);
    virtual ~vector();
 
    const vector &operator=(const vector &v);
 
    float &operator[](const unsigned index);
    const float &operator[](const unsigned index) const;
 
    bool operator==(const vector &v) const;
    bool operator!=(const vector &v) const;
 
    vector operator-(void) const;
 
    vector operator+(const vector &v) const;
    vector operator-(const vector &v) const;
    vector operator*(const float &c) const;
    float operator*(const vector &v) const; //скалярное умножение
    vector operator^(const vector &v) const; //векторное умножение
    vector operator&(const vector &v) const; //поэлементное умножение
    vector operator/(const float &c) const;
 
    const vector &operator+=(const vector &v);
    const vector &operator-=(const vector &v);
    const vector &operator*=(const float &c);
    const vector &operator^=(const vector &v); //векторное умножение
    const vector &operator&=(const vector &v); //поэлементное умножение
    const vector &operator/=(const float &c);
 
    float module() const;
    const vector &normalize(const float &c = 1);
};
//------------------------------------------------------------------------------
vector operator*(const float &c, const vector &v);
//------------------------------------------------------------------------------
#endif //vector_h
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
//------------------------------------------------------------------------------
#include "vector.h"
//------------------------------------------------------------------------------
#include <math.h>
#include <stdlib.h>
//------------------------------------------------------------------------------
vector::vector(void)
    : x(0),
      y(0),
      z(0)
{}
//------------------------------------------------------------------------------
vector::vector(const float &x, const float &y, const float &z)
    : x(x),
      y(y),
      z(z)
{}
//------------------------------------------------------------------------------
vector::~vector()
{}
//------------------------------------------------------------------------------
const vector &vector::operator=(const vector &v)
{
    if (this != &v)
    {
        x = v.x;
        y = v.y;
        z = v.z;
    }
 
    return *this;
}
//------------------------------------------------------------------------------
float &vector::operator[](const unsigned index)
{
    return *(&x + index);
}
//------------------------------------------------------------------------------
const float &vector::operator[](const unsigned index) const
{
    return *(&x + index);
}
//------------------------------------------------------------------------------
bool vector::operator==(const vector &v) const
{
    return x == v.x && y == v.y && z == v.z;
}
//------------------------------------------------------------------------------
bool vector::operator!=(const vector &v) const
{
    return x != v.x || y != v.y || z != v.z;
}
//------------------------------------------------------------------------------
vector vector::operator-(void) const
{
    return vector(-x, -y, -z);
}
//------------------------------------------------------------------------------
vector vector::operator+(const vector &v) const
{
    return vector(x + v.x, y + v.y, z + v.z);
}
//------------------------------------------------------------------------------
vector vector::operator-(const vector &v) const
{
    return vector(x - v.x, y - v.y, z - v.z);
}
//------------------------------------------------------------------------------
vector vector::operator*(const float &c) const
{
    return vector(x * c, y * c, z * c);
}
//------------------------------------------------------------------------------
float vector::operator*(const vector &v) const
{
    return x * v.x + y * v.y + z * v.z;
}
//------------------------------------------------------------------------------
vector vector::operator^(const vector &v) const
{
    return vector
    (
        y * v.z - z * v.y,
        z * v.x - x * v.z,
        x * v.y - y * v.x
    );
}
//------------------------------------------------------------------------------
vector vector::operator&(const vector &v) const
{
    return vector(x * v.x, y * v.y, z * v.z);
}
//------------------------------------------------------------------------------
vector vector::operator/(const float &c) const
{
    return vector(x / c, y / c, z / c);
}
//------------------------------------------------------------------------------
const vector &vector::operator+=(const vector &v)
{
    x += v.x;
    y += v.y;
    z += v.z;
 
    return *this;
}
//------------------------------------------------------------------------------
const vector &vector::operator-=(const vector &v)
{
    x -= v.x;
    y -= v.y;
    z -= v.z;
 
    return *this;
}
//------------------------------------------------------------------------------
const vector &vector::operator*=(const float &c)
{
    x *= c;
    y *= c;
    z *= c;
 
    return *this;
}
//------------------------------------------------------------------------------
const vector &vector::operator^=(const vector &v)
{
    return *this = vector
    (
        y * v.z - z * v.y,
        z * v.x - x * v.z,
        x * v.y - y * v.x
    );
}
//------------------------------------------------------------------------------
const vector &vector::operator&=(const vector &v)
{
    x *= v.x;
    y *= v.y;
    z *= v.z;
 
    return *this;
}
//------------------------------------------------------------------------------
const vector &vector::operator/=(const float &c)
{
    x /= c;
    y /= c;
    z /= c;
 
    return *this;
}
//------------------------------------------------------------------------------
float vector::module() const
{
    return sqrt(fabs(x * x + y * y + z * z));
}
//------------------------------------------------------------------------------
const vector &vector::normalize(const float &c)
{
    return *this /= module() / c;
}
//------------------------------------------------------------------------------
vector operator*(const float &c, const vector &v)
{
    return v * c;
}
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
22.11.2012, 11:01  [ТС] #9
Цитата Сообщение от vxg Посмотреть сообщение
float module() const;
Модуль принято обозначать функцией abs. Для векторов она определена иначе? Эйси. Ну так и сумма векторов определена иначе. Кроме того,
C++
1
2
3
4
double abs(double x)
{
 rerturn sqrt(x*x);
}
тоже вернёт модуль числа, как он определён для скаляров, но такой вариант есть прямое расширение модуля вектора на скаляры.

Добавлено через 1 минуту
Цитата Сообщение от vxg Посмотреть сообщение
const vector &vector::operator=(const vector &v)
{
* * if (this != &v)
* * {
* * * * x = v.x;
* * * * y = v.y;
* * * * z = v.z;
* * }
return *this;
}
Я реализацию не просил, а лишние строки снижают читабельность.
0
vxg
Модератор
3163 / 1966 / 221
Регистрация: 13.01.2012
Сообщений: 7,528
22.11.2012, 11:02 #10
Цитата Сообщение от taras atavin Посмотреть сообщение
Модуль принято обозначать функцией abs
на любителя. модуль вектора - это его длина. к модулю как к абсолютному значению числа отношения не имеет.

Добавлено через 30 секунд
Цитата Сообщение от taras atavin Посмотреть сообщение
Я реализацию не просил
удали. или пролистай.
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
22.11.2012, 11:04  [ТС] #11
Цитата Сообщение от vxg Посмотреть сообщение
float operator*(const vector &v) const; //скалярное умножение
Цитата Сообщение от vxg Посмотреть сообщение
vector operator&(const vector &v) const; //поэлементное умножение
. В чём семантическая разница?

Добавлено через 56 секунд
Цитата Сообщение от vxg Посмотреть сообщение
float operator*(const vector &v) const; //скалярное умножение
* * vector operator^(const vector &v) const; //векторное умножение
легко забыть, всё таки "^" - не знак умножения.
0
vxg
Модератор
3163 / 1966 / 221
Регистрация: 13.01.2012
Сообщений: 7,528
22.11.2012, 11:09 #12
Цитата Сообщение от taras atavin Посмотреть сообщение
В чём семантическая разница
разница в том что результат скалярного умножения векторов - число, а результат поэлементного умножения - вектор компоненты которого являются произведениями соответствующих компонентов множителей. в математике для поэлементного умножения нет аналога. во всяком случае я не встречал. или забыл. хз

Добавлено через 56 секунд
Цитата Сообщение от taras atavin Посмотреть сообщение
легко забыть
это можно сделать с любым знанием. здесь - просто соглашения об использовании. лучше, хуже... хз. работает. корни уходят к книжке "компьютерная графика"

Добавлено через 1 минуту
Цитата Сообщение от taras atavin Посмотреть сообщение
легко забыть
а в математике не легко забыть что квадратные скобки - векторное умножение)?
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
22.11.2012, 11:57  [ТС] #13
Цитата Сообщение от vxg Посмотреть сообщение
а в математике не легко забыть что квадратные скобки - векторное умножение)?
ни разу не видел такого обозначения умножения.
0
vxg
Модератор
3163 / 1966 / 221
Регистрация: 13.01.2012
Сообщений: 7,528
22.11.2012, 12:36 #14
Цитата Сообщение от taras atavin Посмотреть сообщение
ни разу не видел такого обозначения умножения
и это очень странно учитывая ваш интерес к вопросу
http://ru.wikipedia.org/wiki/%D0%92%...BD%D0%B8%D0%B5
0
NEW_NAME
1 / 1 / 0
Регистрация: 04.10.2012
Сообщений: 45
22.11.2012, 13:38 #15
Просто же:
Vector vectorMultiplication(Vector ass);
double scalarMultiplication(Vector ass);

Если бы кто-то начал пользоваться этим классом, то по перегрузке * он бы не понял какое конкретно это умножение без чтения комментариев, а про ^ он бы может и не догадался бы. А такое название функций говорит само за себя.

По модулю то же самое: модуль числа и вектора не то же самое, поэтому не зачем путаницу создавать.
Вот суммирование/вычитание перегружать смысл есть.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.11.2012, 13:38
Привет! Вот еще темы с ответами:

Как лучше это сделать?. а главное, как правильно? (Информационная система «Железнодорожный вокзал») - C++
Ситуация следующая... Есть задание курсовой работы: 11. Информационная система «Железнодорожный вокзал». Информация: рейсы — номер...

Как подключить функцию? Как это можно исправить? - C++
#include&lt;stdio.h&gt; #include&lt;math.h&gt; #include&lt;conio.h&gt; #include&lt;iostream&gt; #pragma warning(disable: 4996) //функция генерацции ...

Факториал! Для кого-то это легко, а кто-то вообще это не знает! - C++
Написать определение функции факториал которая возвращает факториал от полученного в качестве аргумента числа. Реализовать на С++ и...

this это адресс объекта, а *this это сам объект. я всё правельно понял? - C++
this это адресс объекта, а *this это сам объект. я всё правельно понял?


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
22.11.2012, 13:38
Ответ Создать тему
Опции темы

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