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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
LessSpam
0 / 0 / 0
Регистрация: 15.03.2009
Сообщений: 9
#1

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

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

Здравствуйте.

Задали вот задачку в универе, а знаний чтоб её решить нету ) Надо сделать класс, который вычислял бы расстояние между двумя векторами в 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2009, 15:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Задача на векторы в в н-мерном пространстве (C++):

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

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

Группировка точек в 3-мерном пространстве. Алгоритм - C++
В пространстве имеется множество точек (~700 000), необходимо разбить эти точки на n групп, в каждой из которых имеется что-то типа главной...

Найти в n-мерном пространстве min расстояние от начала координат до отрезка, заданного координатами концов - C++
Найти в n-мерном пространстве минимальное расстояние от начала координат до отрезка , заданного координатами своих концов. Минимальное...

Задача из книги Страуструпа 4 глава векторы - C++
Задача: Напишите программу, заглушающую нежелательные слова; иначе говоря, считайте слова из потока cin и выведите их в поток cout, заменив...

Задача на векторы, заменить все максимальные элементы нулями - C++
дана последовательность целых чисел. заменить все максимальные элементы нулями.

6
ISergey
Maniac
Эксперт С++
1375 / 886 / 52
Регистрация: 02.01.2009
Сообщений: 2,661
Записей в блоге: 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
LessSpam
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
ISergey
Maniac
Эксперт С++
1375 / 886 / 52
Регистрация: 02.01.2009
Сообщений: 2,661
Записей в блоге: 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
LessSpam
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
ISergey
Maniac
Эксперт С++
1375 / 886 / 52
Регистрация: 02.01.2009
Сообщений: 2,661
Записей в блоге: 1
15.03.2009, 22:20 #6
у тебя класс шаблон и разбить его на разные файлы нельзя.
0
LessSpam
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2009, 02:22
Привет! Вот еще темы с ответами:

В одно мерном массиве посчитать сумму элементов - C++
Помогите пожалуйста... Задача №8 Требования: 1. Подготовить текстовый файл с входными данными в редакторе. 2. Составить алгоритм...

как найти min в двух мерном массиве - C++
Помогите пожалуйста надо найти min в двух мерном массиве

С++ найти сумму каждой строки в 2 мерном массиве - C++
Только предмет появился хз как делать ничё необьясняют((( Помогите #include&lt;stdio.h&gt; #unclude&lt;math.h&gt; int main() } int mas; ...

Поменять местами строку и диагональ в 2-мерном массиве - C++
Задание - Имеется 2-мерный массив. Нужно поменять местами диагональ a(4,0) - a(0,4) на строку с самой большой суммой елементов. Помогите...


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

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

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