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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
Fintt
10 / 10 / 0
Регистрация: 13.02.2012
Сообщений: 94
#1

Класс вектор - C++

18.07.2013, 08:43. Просмотров 2307. Ответов 25
Метки нет (Все метки)

Не могу разобраться с этим классом, прошу помощи и в объяснении(задание очень объёмное ещё), проблема с самим вектором тоже есть.
Разработать класс вектор размерности n. Определить несколько конструкторов , в том числе и конструктор копирования. Реализовать методы для вычисления модуля вектора, скалярного произведения, сложения,вычитания, умножения на константу. Перегрузить операции сложения, вычитания, умножения, инкремента, декремента, индексирования, присваивания для данного класса. Написать программу, демонстрирующую работу с классом. Создать массив объектов. Написать функцию, которая для заданной пары векторов будет определять, явл ли они коллинеарными или ортогональными.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.07.2013, 08:43
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Класс вектор (C++):

Класс "вектор" с конструкторами, позволяющими создать нулевой вектор и вектор с произвольным числом элементов - C++
Привет! Задача следующая. Нужно реализовать класс "вектор" с конструкторами, которые позволяют создать нулевой вектор и вектор с...

Класс Вектор - C++
Здраствуйте! Может ли кто-нибудь помочь с объяснением проблемы , потому что я не знаю точно , что это берет. Это условие ....

Класс Вектор - C++
Решил написать свой класс вектор, приблизительно как в СТЛ. Сначала решил сделать каркас. Все функции без аллокатора и итератора. Сделал. И...

Класс вектор - C++
Создать абстрактный тип данных - класс вектор, который имеет указатель на float, число элементов и переменную состояния. Определить...

класс Вектор - C++
всем привет. Начинаю делать домашку :-) в классе вектор создаю метод: cVector.h class cVector { public: ...

Класс вектор С++ - C++
Вектор. Члены класса: 3 прямоугольные декартовые координаты. Методы: Конструктор, деструктор, метод вывода вектора, метод вычисления...

25
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
18.07.2013, 09:35 #2
Fintt, так чего же вы хотите? Что бы для вас полностью написали данный класс или подсказали в решении конкретного вопроса?
Если первое то вам лучше обратиться к фрилансерам, второе - задавайте конкретный вопрос.
Однако самому стало интересно написать данную программу, но это у меня потребует около часа времени плюс я сейчас на работе.
1
Fintt
10 / 10 / 0
Регистрация: 13.02.2012
Сообщений: 94
18.07.2013, 09:54  [ТС] #3
Это всего лишь моя 2 задача. Первую я с лёгкостью справился и понятно всё, а тут появились конструкторы, деструкторы и т.д. и много всего и сразу. Потом я не помню про вектора. Заного вспоминать школу как-то не хочется и я не прогр С++. Ну если всё вопрос закрыт, буду бодаться сам с ним)) У меня на это уйдёт явно не час а больше суток.
0
0x10
2482 / 1657 / 249
Регистрация: 24.11.2012
Сообщений: 4,126
18.07.2013, 09:57 #4
Цитата Сообщение от Fintt Посмотреть сообщение
Потом я не помню про вектора. Заного вспоминать школу как-то не хочется и я не прогр С++.
В этой постановке задачи под вектором понимается не направленный отрезок, а динамический массив.
Цитата Сообщение от Fintt Посмотреть сообщение
а тут появились конструкторы, деструкторы и т.д. и много всего и сразу
Хорошая задача для первой-второй лабы. Можно только отправить в книги, если нет конкретных вопросов.
1
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
18.07.2013, 09:59 #5
Почему все? Я же сказал уже пишу.

Первую я с лёгкостью справился и понятно всё, а тут появились конструкторы, деструкторы и т.д. и много всего и сразу. Потом я не помню про вектора.
А как же вы классы изучали без конструкторов и деструкторов?

Большенство операций делается дружественными ф-ми ну и перегрузка операторов. Как сказал 0x10 все это подробно описанно в книгах. Вопрос в том, что возможно вы пока до этого не дочитали.
1
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.07.2013, 10:14 #6
Цитата Сообщение от 0x10 Посмотреть сообщение
В этой постановке задачи под вектором понимается не направленный отрезок, а динамический массив.
Уверены? А это:
Цитата Сообщение от Fintt Посмотреть сообщение
Написать функцию, которая для заданной пары векторов будет определять, явл ли они коллинеарными или ортогональными.
0
0x10
2482 / 1657 / 249
Регистрация: 24.11.2012
Сообщений: 4,126
18.07.2013, 10:17 #7
Цитата Сообщение от alsav22 Посмотреть сообщение
Уверены? А это:
Мой косяк, несколько раз перечитывал, но последнего предложения не замечал.
Тогда... Все только проще.
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
18.07.2013, 11:58 #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
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
#include<iostream>
#include<math.h>
#include<windows.h>
using namespace std; 
//--------------------------------------------------------------
//----------- Определение класса -------------------------------
//--------------------------------------------------------------
class vektor
{
private:
    int n;                 //Размер вектора
    float* ptrArr;     //Указатель на массив элементов
public:
    vektor()
    {
        n = 3;
        ptrArr = new float [n]; 
    }
    vektor(int num)
    {
        n = num;
        ptrArr = new float [n];     
    }
    ~vektor()
    { delete [] ptrArr; }
    void GetVektor()        //Задать вектор
    {
        //cout << "Введите размерность вектора: "; cin >> n;
        for (int i=0; i < n; i++ )
        {
            cout << "Введите элемент вектора № " << i << ": ";
            cin >> *(ptrArr + i); 
        }
    }
    float ArrModul()        //Вычислить модуль
    {
        float modul = 0;
        for (int i=0; i < n; i++ )
            modul += *(ptrArr + i) *  *(ptrArr + i); 
        return sqrt (modul);
    }
    void ShowVektor()       //Показать вектор
    {
        cout << "Вектор [";
        for (int i=0; i < n; i++ )
            cout << *(ptrArr + i) << ", ";
        cout << " ]\n";
        
    }
    vektor operator= (vektor v)
    {
        for (int i=0; i < n; i++ )
            *(ptrArr + i) = *(v.ptrArr + i); 
        return *this;
    }
 
    friend float Skalar   (vektor* , vektor*);  //Склярное произведение
 
    friend bool Kolliniar(vektor* , vektor* );  //Проверка на коллинеарность
    friend bool Ortogonal(vektor* , vektor* );  //Проверка на ортогональность
 
    friend vektor Kommutativ(vektor* , vektor* );//Сложение векторов
    friend vektor Netativ   (vektor* , vektor* );//ВЫчитание векторов
};
//--------------------------------------------------------------
//----------- Определение дружественных функций ----------------
//--------------------------------------------------------------
vektor Kommutativ(vektor* vector1, vektor* vector2)
{
    vektor temp;
    for (int i=0; i < vector1->n; i++ )
        *(temp.ptrArr + i) = *(vector1->ptrArr + i) + *(vector2->ptrArr + i);
    return temp;        
}
vektor Netativ(vektor* vector1, vektor* vector2)
{
    vektor temp;
    for (int i=0; i < vector1->n; i++ )
        *(temp.ptrArr + i) = *(vector1->ptrArr + i) - *(vector2->ptrArr + i);
    return vektor(temp);        
}
float Skalar (vektor* vector1, vektor* vector2)         
{
    static float temp;
    temp = 0;
    for (int i=0; i < (*vector1).n; i++ )
        temp += *(vector1->ptrArr + i) * *(vector2->ptrArr + i);
    return temp;
}
bool Ortogonal (vektor* vector1, vektor* vector2)
{
    if ( (Skalar (vector1, vector2)) < 0.01 )
        return true;
    else
        return false;
}
bool Kolliniar (vektor* vector1, vektor* vector2)
{
    if ( (Skalar (vector1, vector2) - ((*vector1).ArrModul() * (*vector2).ArrModul())) < 0.01 )
        return true;
    else
        return false;
}
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    vektor v1(3), v2(3), v(3);
    v1.GetVektor();
    v2.GetVektor();
 
    cout << Skalar(&v1, &v2) << endl;
    
    v = Kommutativ(&v1, &v2);
    v.ShowVektor();
    
    cout << "Ортогональность: " << Ortogonal(&v1, &v2) << endl;
    cout << "Коллинеарность: "  << Kolliniar(&v1, &v2) << endl;
    system("pause");
    return 0;
}
Вылетает с ошибкой при использовании этой строки кода:
C++
1
    v = Kommutativ(&v1, &v2);
Может проблемма с деструктором?
Заодно вопрос как этой ф-и лучше возвратить значение? Пока должен возвращаться мусор так как temp локальная переменная.
*Проверки на равенство размеров векторов пока нет!
0
Wolkodav
605 / 458 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
18.07.2013, 13:00 #9
Ilot, а почему в конструкторе по умолчанию у вас n=3 именно? И я бы посоветовал сразу забубенить в конструкторах обнуление. И конструктор копирования надо бы создать( всётаки имеете дело с указателями). Лишнем точно не было бы. Да и присваивание допилить бы.
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
18.07.2013, 13:06 #10
Wolkodav, ну как бы до перегрузок пока не дошел. Пытался сперва разобраться с дружественными ф-ми.
Копирование перегружал, но и с ним программа на 116 строке вылетает.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
18.07.2013, 13:12 #11
Цитата Сообщение от Ilot Посмотреть сообщение
Вылетает с ошибкой при использовании этой строки кода:
Добавьте конструктор копий.

не подсматривать
C++
1
2
3
4
5
6
7
    vektor(const vektor & src)
    {
        n=src.n;
          ptrArr=new float[n];
          for(int i=0;i<src.n;++i)
              ptrArr[i]=src.ptrArr[i];
    }
1
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
18.07.2013, 13:18 #12
Croessmah, а можете объяснить в двух словах для чего он нужен?
Так как я тоже пытался написать подобный конструктор, но у меня почему-то ничего не получилось.

А хотя постойте... я кажется передавал в конструктор переменную по значению, а значит вызывался тот же конструктор и так до бесконечности. Эм.. я правильно это понимаю?
0
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
18.07.2013, 13:22 #13
Цитата Сообщение от Ilot Посмотреть сообщение
для чего он нужен?
Для правильного построения копии объекта.

Конструктор копий, который сгенерирует компилятор, сделает примерно следующее:
C++
1
2
n = src.n;
ptrArr = src.ptrArr;
теперь указатель в объекте и указатель в копии указывают на одну область памяти, что явно противопоказано, ибо после выполнения деструктора одного из объектов
C++
1
delete [] ptrArr;
указатель второго будет указывать на освобожденную память
1
Wolkodav
605 / 458 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
18.07.2013, 13:59 #14
Ilot, он нужен для передачи параметра в функцию, для возвращения параметра из функци. Ты как бы когда передаёшь в функцию параметр, срабатывает конструктор копирования, затем в функции ты работаешь с копией. Затем копия уничтожается и вот тут и подобные косяки.

Добавлено через 2 минуты
Ilot, а оператор присваивания типо такого:
C++
1
2
3
4
5
6
7
8
9
10
11
vector operator =(const vector& A)
{
    if (this == &A)
        return *this;
    delete[] ptrArr;
    ptrArr = new float[A.n];
    n = A.n;
    for (int i = 0; i < n; i++)
        ptrArr[i] = A.ptrArr[i];
    return *this;
}
Добавлено через 28 секунд
первое сравнение необходимо для само присваивания.
1
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
18.07.2013, 14:25 #15
Я недавно читал, что есть конструктор копирования и оператор присвоения. Как я понимаю сейчас речь идет о них самых. Хотелось бы разъяснить:
-когда мы передаем переменную по значению в функцию вызывается конструктор копирования. Если передаем по ссылке ничего не создается и мы работаем с объектом на который создается ссылка. Это правильно?
-когда и для чего вызывается конструктор vektor(const vektor & src) как указал Croessmah? Я этого не понимаю ведь по идее вот здесь:
C++
1
    v = Kommutativ(&v1, &v2);
должен вызываться перегруженный оператор =? И если даже передавать ему аргумент по ссылке все равно происходит вылет.
0
18.07.2013, 14:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2013, 14:25
Привет! Вот еще темы с ответами:

Класс-вектор в С++ - C++
Здраствуйте. Передо мной стоит задача реализовать произведение и сложение векторов. Информации, той, что я нашел, оказалось мало. Программу...

Класс вектор - C++
необходимо написать класс вектор (в геометрическом смысле в трёхмерном пространстве) реализовать : поворот вектора вокруг осей...

Класс вектор - C++
У меня есть задача: Разработать пользовательский тип “ вектор в n-мерном пространстве”. Для разрабатываемого типа обязательно определить:...

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


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

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

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