С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/18: Рейтинг темы: голосов - 18, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 15.03.2009
Сообщений: 9
1

Задача на векторы в в н-мерном пространстве

15.03.2009, 15:39. Показов 3432. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.

Задали вот задачку в универе, а знаний чтоб её решить нету ) Надо сделать класс, который вычислял бы расстояние между двумя векторами в n-мерном пространстве. Также есть некоторые условия... Должны использоваться следущие методы:

Vector<n> () даёт координатам нулевое значение
Vector<n> (vector<float> crds) задаёт координатам данные значения
distanceFrom(Vector<n> v) находит длину между двумя векторами (в
одинаковом пространстве)

Метод distanceFrom должен использовать итератор (мб не правильно перевёл, тк задание у меня не на русском, и не на англ =)) ). Координаты вектора должны храниться в std::vector, в переменной coords.

Сам пробовал сделать, вот что вышло

1) geometry.h
C++
1
2
3
4
5
6
7
8
9
10
11
#ifndef GEOMETRY_H
#define GEOMETRY_H
 
#include <iostream>
using namespace std;
 
#include <vector>
#include "vector2.h"
 
 
#endif // GEOMETRY_H
2)vector2.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
#ifndef VECTOR2_H
#define VECTOR2_H
 
 
 
#include "geometry.h"
 
template <unsigned short n>
 
class Vector {
 
public:
    std::vector<float> coords;
 
    Vector<n> ();
 
    Vector<n> (vector<float> crds);
    
    string toString();
 
 
};
 
#endif
3) vector2.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "geometry.h"
#include "math.h"
template <int n>
 
Vector<n>::Vector(){
    vector<float> coords(n,0);
}
 
template <int n>
Vector<n>::Vector(vector<float> crds) {
    for(int i =0; i<=n; i++) {
        coords.at(i) = crds.at(i); }
}
4) тестовый класс geometrytest.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <cstdlib>
#include "geometry.h"
 
 
 
int main (int argc, char* argv[]) {
 
    Vector<6> v1();
    std::vector<float, std::allocator<float> > c (5,0); 
    
    Vector<6> v2 = Vector<6>(c);
    
 
    return EXIT_SUCCESS;
}

Ошибка возникает уже в пунтке 2 (Vector<n> (vector<float> crds)), в тест классе пишет такую ошибку

g++ -c -o geometrytest.o geometrytest.cpp
g++ geometrytest.o vector2.o -o program
geometrytest.o:geometrytest.cpp.text+0x1a8): undefined reference to `Vector<6>::Vector(std::vector<float, std::allocator<float> >)'
collect2: ld returned 1 exit status
make: *** [program] Error 1


Раньше с Ц++ не работал, в основном изучал яву. Ничего похожего оттуда не припоминаю.

Возможно слишком много написал, но хотел чтоб задание выглядело как можно понятнее. Просьба помочь с этим заданием, или при возможности хотя бы скинуть примеры или литературу....

Заранее всем благодарен.
Артём.

Добавлено через 30 минут 17 секунд
Нашёл вот похожую темку Класс вектор в n-мерном пространстве . Но там, как я понял, координаты вводяться один за другим. А у меня в задание требуется чтоб вводились все сразу (или я опять чего то недопонял)?

Добавлено через 12 часов 3 минуты 44 секунды
C++
1
Vector<n>::Vector(vector<float> crds)
Какое вообще значение должно вводиться в скобках =\

Добавлено через 19 минут 51 секунду
Вот попробовал написать дальше (сразу говорю, что это бред, тк вообще ничего не понимаю в этой теме.... )

1) vector2.cpp
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
#include "geometry.h"
#include "math.h"
 
 
vector<float> coords;
template <int n>
Vector<n>::Vector(){
    for(int i =0; i<n;i++){
        coords.push_back(0);}
    
}
 
template <int n>
Vector<n>::Vector(vector<float> crds){
    for(int i =0; i<crds.size();i++){
        coords.push_back(crds.at(i));}
    }
 
 
template <int n>
float Vector<n>::distanceFrom (Vector<n> v) {
    float summa = 0;
    int i = 0;
    for (vector<int>::iterator it = v.coords.begin(); it!=v.coords.end(); it++)
    {
        summa = summa + pow((coords.at(i) + *it),2);
        i++;}
    return sqrt(summa) ; }
2) geometrytest.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <cstdlib>
#include "geometry.h"
 
 
 
int main (int argc, char* argv[]) {
 
    Vector<6> v1();
    vector<float> crds (6,3);
    
    Vector<6> v2(vector<float> crds);
    
        
cout<<v1.distanceFrom(v2)<<endl;
 
    return EXIT_SUCCESS;
}

Если кто нить видит явные ошибки, напишите хотя бы о них.

Добавлено через 23 минуты 55 секунд
Выдаёт такую ошибку:
C++
1
2
3
4
g++    -c -o geometrytest.o geometrytest.cpp
geometrytest.cpp: In function `int main(int, char**)':
geometrytest.cpp:15: error: request for member `distanceFrom' in `v1', which is of non-class type `Vector<6> ()()'
make: *** [geometrytest.o] Error 1
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.03.2009, 15:39
Ответы с готовыми решениями:

Задача в 3х-мерном пространстве
В 3х-мерном пространстве, равномерно и прямолинейно движутся 4 объекта - A, B, C и D их траектории...

Треугольники в 3х мерном пространстве
Помогите пожалуйса написать программу, Задание: Для вещественных чисел Х1, У1, Z1, Х2, У2, Z2,...

Две точки в n-мерном пространстве X=(х1, х2, ..., хn), Y=(y1, y2, ...,yn)
Даны две точки в n-мерном пространстве X=(х1, х2, ..., хn), Y=(y1, y2, ...,yn). Написать программу...

Класс вектор в n-мерном пространстве
Есть задача: Разработать класс “вектор в n-мерном пространстве”. Определить: • конструктор (или...

6
Maniac
Эксперт С++
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
15.03.2009, 16:15 2
что - то вы такого напутали с шаблонами, вот код для примера
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
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
 
template<typename T>
class xvector
{
public:
    xvector(){ /*.......*/}
    xvector(xvector<T> &rhs)
    {
        _iterator it;
        for(it = rhs.cords.begin(); it != rhs.cords.end(); ++it)
            cords.push_back(*it);
    }
    xvector(vector<T> &rhs)
    {
        _iterator it;
        for(it = rhs.begin(); it != rhs.end(); ++it)
            cords.push_back(*it);
    }
    ~xvector()
    {
        cords.clear();
    }
    float distanceFrom (/*const xvector &v*/) 
    {
        float summa = 0;
        cout<<"Count: "<<cords.size()<<endl;
        for (_iterator it = cords.begin(); it != cords.end(); ++it)
        {
            summa += pow(*it,2);
        }
        return sqrt(summa);
    }
private:
    std::vector<T> cords;
    typedef typename vector<T>::iterator _iterator;
};
 
int main()
{
    vector<float> v;
    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
 
    xvector<float> vec(v);
    cout<<vec.distanceFrom()<<endl;
    return 0;
}
1
0 / 0 / 0
Регистрация: 15.03.2009
Сообщений: 9
15.03.2009, 17:33  [ТС] 3
Тут, как я понял, он находит расстояние вектора от начала кооординат. А как сделать так, чтоб он находил расстояние от другого вектора?

Добавлено через 12 минут 55 секунд
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
........
float distanceFrom (vector<T> sss) 
 
        {
 
            float summa = 0;
            int i = 0;
            cout<<"Count: "<<cords.size()<<endl;
 
            for (_iterator it = cords.begin(); it != cords.end(); ++it)
 
            {_iterator itt = sss.begin();
 
 summa += pow((*itt - *it),2);
itt++;
            }
return sqrt(summa);
        }
 
 
};
 
int main()
 
 
      {
 
 
 
        vector<float> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
        vector<float> v1;
v1.push_back(10);
v1.push_back(20);
v1.push_back(30);
xvector<float> vec(v);
xvector<float> vec1(v1);
 
    cout<<vec.distanceFrom(v1)<<endl;
return 0;
 
 
 
      }
ответ почему то равен 22.... =) что опять не так?
0
Maniac
Эксперт С++
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
15.03.2009, 18:49 4
C++
1
2
3
4
5
//~~~~~~~~~~~~~
_iterator itt = sss.begin();//!* это вынеси за цыкл
summa += pow((*itt - *it),2); 
itt++;//от это толку мало. на след. проходе цыкла он опять будет указывать на первый елемент
//~~~~~~~~~~~~~
так сделай
C++
1
2
3
4
5
//~~~~~~~~~~~~~
_iterator itt = sss.begin();
for (_iterator it = cords.begin(); it != cords.end(); ++it)
 {
//~~~~~~~~~~~~~
1
0 / 0 / 0
Регистрация: 15.03.2009
Сообщений: 9
15.03.2009, 22:16  [ТС] 5
Тааакс, ошибку нашёл. Даже что то получаться стало )). Огромное спасибо ISergey Остался вот ток вопрос - зачем препод требует вот это Vector<n> ? Ведь и без него прекрасно обойтись можно =\

Добавлено через 33 минуты 26 секунд
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
      #include <iostream>
 
      #include <vector>
 
      #include <cmath>
  
      using namespace std;
 
     template<unsigned short n>
    
 
      class xvector
 
        {
        private:
 
        std::vector<float> cords;
 
        typedef typename vector<float>::iterator _iterator;
 
        public:
 
  
        xvector<n>()
        {
            _iterator it;
        it = cords.begin();
            for(int i = 0; i != n ; i++) {
                it++;
                cords.push_back(0);}
        }
 
        xvector<n>(vector<float> rhs)
 
        {
            _iterator it;
            it = rhs.begin();
            for( int i = 0;i =! n; i++){
                it++;
                cords.push_back(*it);}
        }
 
 
 
        
 
        float distanceFrom (xvector<n> sss) 
 
        {
 
            float summa = 0;
            int i = 0;
            cout<<"Count: "<<cords.size()<<endl;
            _iterator itt = sss.cords.begin();
            for (_iterator it = cords.begin(); it != cords.end(); ++it)
 
            {;
 
 summa += pow((*it - *itt),2);
++itt;
            }
return sqrt(summa);
        }
 
 
};
 
int main()
 
 
      {
 
 
 
 
 
 
 
vector<float> v;
        v.push_back(10);
        v.push_back(20);
        v.push_back(30);
vector<float> v1;
        v1.push_back(10);
        v1.push_back(50);
        v1.push_back(60);
        
        xvector<3> vec(v);
        xvector<3> vec1(v1);
        
cout<<vec.distanceFrom(vec1)<<endl;
return 0;
 
 
 
      }

После не большой переделки, программа снова выдаёт всегда результат 0 =)))

Добавлено через 1 час 24 минуты 47 секунд
Всё, ошибку нашёл ))
Код тоже на всякий скину, вдруг кому пригодиться.

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 <iostream>
 
      #include <vector>
 
      #include <cmath>
  
      using namespace std;
 
     template<unsigned short n>
    
 
      class xvector
 
        {
        private:
 
        std::vector<float> cords;
 
        typedef typename vector<float>::iterator _iterator;
 
        public:
 
  
        xvector<n>()
        {
            
            _iterator it = cords.begin();
            for(int i = 0; i < n  ; i++) {
                cords.push_back(0) ;}
        }
 
        xvector<n>(vector<float> rhs)
 
        {
            _iterator it = rhs.begin();
            for( int i = 0;i < n; i++){
            
                cords.push_back(*it);
                it++;       }
        }
 
 
 
        
 
        float distanceFrom (xvector<n> sss) {
            float summa = 0;
        
            int i = 0;
            cout<<"Count: "<<cords.size()<<endl;
            _iterator itt = sss.cords.begin();
            for (_iterator it = cords.begin(); it != cords.end(); ++it){
            summa += pow((*it - *itt),2);
                    ++itt;
            }
                return sqrt(summa);
        }
 
 
};
 
int main()
 
 
      {
 
 
 
 
 
 
 
vector<float> v;
        v.push_back(10);
        v.push_back(20);
        v.push_back(30);
vector<float> v1;
        v1.push_back(10);
        v1.push_back(20);
        v1.push_back(30);
        
        xvector<3> vsc(v1);
        xvector<3> vsc1(v);
        
cout<<vsc.distanceFrom(vsc1)<<endl;
return 0;
 
 
 
      }
Добавлено через 1 час 19 минут 52 секунды
И снова ошибки.... Не могу теперь этот код разбить на head.h и main класс (чтобы класс майн и xvector были в разных файлах).
0
Maniac
Эксперт С++
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
15.03.2009, 22:20 6
у тебя класс шаблон и разбить его на разные файлы нельзя.
0
0 / 0 / 0
Регистрация: 15.03.2009
Сообщений: 9
16.03.2009, 02:22  [ТС] 7
Неужели нельзя никак сделать код такого вида?

geometry.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef GEOMETRY_H
#define GEOMETRY_H
 
#include <iostream>
 
 
using namespace std;
 
#include <vector>
 
#include <cmath>
 
#include "vector2.h"
 
 
 
#endif // GEOMETRY_H
vector2.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
#ifndef VECTOR_H
#define VECTOR_H
 
 
 
 
 
template<unsigned short n>
    
 
class Vector {
        public:
 
        std::vector<float> coords;
            
        
        Vector<n> ();
        Vector<n> ( vector<float> crds);
        
        float distanceFrom (Vector<n> v); 
        
 
};
 
#endif
vector2.cpp
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
#include "geometry.h"
#include <cmath>
 
template<unsigned short n>
 
 
Vector<n>::Vector <n> ()
        {
            
        
            for(int i = 0; i < n  ; i++) {
                coords.push_back(0) ;}
        }
template<unsigned short n>
Vector<n>::Vector <n> (vector<float> crds)
 
{   typename vector<float>::iterator it;
            it = crds.begin();
            for( int i = 0;i < n; i++){
            
                coords.push_back(*it);
                it++;       }
        }
 
 
 
        
template<unsigned short n>
float Vector<n>::distanceFrom (Vector<n> v) { 
            float summa = 0;
        
            int i = 0;
            std::vector<float> coords;
            typename vector<float>::iterator it;
            typename vector<float>::iterator itt;
            itt = v.coords.begin();
            for (it = coords.begin(); it != coords.end(); ++it){
            summa += pow((*it - *itt),2);
                    ++itt;
            }
                return sqrt(summa);
        }
geometrytest.cpp
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
#include <iostream>
#include <cstdlib>
#include "geometry.h"
 
 
 
using namespace std;
 
 
int main (int argc, char* argv[])
 
      {
 
 
 
        vector<float> v1;
        v1.push_back(10);
        vector<float> v;
        v.push_back(10);
        Vector<3> vsc(vector<float> v);
        
        Vector<3> vsc1(vector<float> v1);
        
        cout<<vsc.distanceFrom(vsc1)<<endl;
 
return EXIT_SUCCESS;
 
 
 
      }
0
16.03.2009, 02:22
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.03.2009, 02:22
Помогаю со студенческими работами здесь

Построить окружности в 3-х мерном пространстве.
Как построить круги в трехмерной проекции, первый круг радиусом 10 сплошной линией, через 2 вверх...

Найти точку в к-мерном пространстве
Есть к-мерное дискретное (целочисленное) пространство. В нем отмечены некоторые точки. Нужно найти...

Две точки в n-мерном пространстве
Даны две точки в n-мерном пространстве X=(х1, х2, ..., хn), Y=(y1, y2, ...,yn). Написать программу...

Нормализация точки (вектора) в 2-мерном пространстве
как сделать нормализацию точки(вектора) в 2-мерном пространстве??


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Как работать с Git из Windows и Visual Studio
InfoMaster 10.01.2025
Работа с Git в Windows Работа с Git в операционной системе Windows может быть осуществлена с помощью различных инструментов, каждый из которых обладает своими уникальными возможностями и. . .
Аналог оператора switch case в Python
InfoMaster 10.01.2025
Оператор switch case используется в программировании для выбора одного из нескольких вариантов исполнения кода. Однако в языке Python этот оператор отсутствует. Понимание аналогов switch case в. . .
Отличия абстрактного класса от интерфейса
InfoMaster 10.01.2025
В современной разработке программного обеспечения существуют два основных механизма реализации абстракции: абстрактные классы и интерфейсы. Эти инструменты, хотя и схожи в своей основной цели -. . .
Как работать в Git
InfoMaster 10.01.2025
Git — это одна из наиболее популярных систем контроля версий, которая активно используется разработчиками по всему миру. Она позволяет эффективно управлять изменениями в коде, координировать работу. . .
Реализация передвижения персонажа в Unity3d на C#
InfoMaster 10.01.2025
Реализация передвижения персонажа в Unity3D начинается с правильной настройки проекта. Этот этап критически важен для создания отзывчивого и плавного управления. Рассмотрим основные шаги для создания. . .
Docker: руководство для начинающих
InfoMaster 10.01.2025
В современном мире разработки программного обеспечения контейнеризация стала неотъемлемой частью процесса создания и развертывания приложений. Docker, как ведущая платформа контейнеризации, произвела. . .
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
Что такое NullReferenceEx­­­ception и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
Telegram бот на C#
InfoMaster 08.01.2025
Разработка ботов для Telegram стала неотъемлемой частью современной экосистемы мессенджеров. C# предоставляет мощный и удобный инструментарий для создания разнообразных ботов, от простых. . .
Использование GraphQL в Go (Golang)
InfoMaster 08.01.2025
Go (Golang) является одним из наиболее популярных языков программирования, используемых для создания высокопроизводительных серверных приложений. Его архитектурные особенности и встроенные. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru