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

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

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

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

18.07.2013, 08:43. Просмотров 2220. Ответов 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
Croessmah
Эксперт CЭксперт С++
13514 / 7672 / 866
Регистрация: 27.09.2012
Сообщений: 18,888
Записей в блоге: 3
Завершенные тесты: 1
18.07.2013, 14:42 #16
Цитата Сообщение от Ilot Посмотреть сообщение
Это правильно?
Да.
Цитата Сообщение от Ilot Посмотреть сообщение
Я этого не понимаю ведь по идее вот здесь
конструктор копий будет вызван при возврате значения:
C++
1
2
3
4
5
6
7
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;//temp копируется в возвращаемое значение        
}
Добавлено через 55 секунд
Цитата Сообщение от Ilot Посмотреть сообщение
должен вызываться перегруженный оператор =?
а после того, как произведен выход из функции будет вызван перегруженный оператор присваивания

Добавлено через 4 минуты
Может так будет проще понять:
C++
1
v.operator=(Kommutativ(&v1, &v2));
1
Wolkodav
604 / 457 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
18.07.2013, 14:43 #17
Croessmah, разрешите дополнить:
Той копии которую сделал конструткор копирования. А потом копия уничтожется. И без конструктора копирования дырка получится.
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
18.07.2013, 14:59 #18
Цитата Сообщение от Wolkodav Посмотреть сообщение
Croessmah, разрешите дополнить:
Той копии которую сделал конструткор копирования. А потом копия уничтожется. И без конструктора копирования дырка получится.
Не совсем понял о чем идет речь.
0
Fintt
10 / 10 / 0
Регистрация: 13.02.2012
Сообщений: 94
18.07.2013, 15:07  [ТС] #19
Цитата Сообщение от Ilot Посмотреть сообщение
А как же вы классы изучали без конструкторов и деструкторов?
В первой задаче были они по умолчанию
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
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
 
class Book
     {
      char Avtor [20];
      char Nazvanie [20];
      char Izd [20];
      int god;
      int kol_str;
      public:
         Book();
         char *getavtor();
         char *getizd();
         int getgod();
         void show();
     };
 
Book::Book()
        {
         cout<<"Avtor: "; cin>>Avtor;
         cout<<"Nazvanie: "; cin>>Nazvanie;
         cout<<"Izdat: "; cin>>Izd;
         cout<<"God: "; cin>>god;
         cout<<"Kol str: "; cin>>kol_str; cout<<endl;
        }
 
void Book::show()
    {
     cout<<"Avtor: "<<Avtor<<"\t||\t"<<"Nazvanie: "<<Nazvanie<<endl;
     cout<<"Izdat: "<<Izd<<"\t||\t"<<"God: "<<god<<"\t||\t"<<"Kol str: "<<kol_str<<endl; cout<<endl;
    }
 
char *Book::getavtor() { return Avtor; }
 
char *Book::getizd() { return Izd; }
 
int Book::getgod() { return god; }
 
void spis_book_avtora(Book spis[],int n);
void spis_book_izd(Book spis[],int n);
void spis_book_po_godu(Book spis[],int n);
 
void main()
    {
     clrscr();
     Book *spis;
     int n,i;
     cout<<"Vvedite kol-vo: "; cin>>n;
     spis=new Book[n];
     for (i=0;i<n;i++)
    {
     cout<<"============================================================="<<endl;
     spis[i].show();
     cout<<"============================================================="<<endl;
    }
     cout<<"Cpisok knig po avtoru"<<endl;
     spis_book_avtora(spis,n);
     cout<<"Cpisok knig po izdat"<<endl;
     spis_book_izd(spis,n);
     cout<<"Sposok knig posle zadannogo goda"<<endl;
     spis_book_po_godu(spis,n);
     cout<<"\nPress any key!"<<endl;
     getch();
     delete[] spis;
    }
 
void spis_book_avtora(Book spis[],int n)
    {
     char Avtor[20];
     cout<<"Avtor: ";
     cin>>Avtor; cout<<endl;
     for (int i=0; i<n; i++)
    if (strcmp(spis[i].getavtor(),Avtor)==0) spis[i].show();
    }
 
void spis_book_izd(Book spis[],int n)
    {
     char Izd[20];
     cout<<"Izdat: ";
     cin>>Izd; cout<<endl;
     for (int i=0; i<n; i++)
    if (strcmp(spis[i].getizd(),Izd)==0) spis[i].show();
    }
 
void spis_book_po_godu(Book spis[],int n)
    {
     int g;
     cout<<"God: ";
     cin>>g; cout<<endl;
     for (int i=0; i<n; i++)
    if (spis[i].getgod()>=g) spis[i].show();
    }
Добавлено через 1 минуту
Спасибо за то что отклинулись, я сейчас уже разбираюсь в этой задаче, и сижу с тремя книгами.
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
18.07.2013, 15:15 #20
Fintt, НИ СЦЫ. Сейчас доведу до ума свой код и выложу. Как ни как тебе будет уже легче.
1
Wolkodav
604 / 457 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
18.07.2013, 15:24 #21
Цитата Сообщение от Croessmah Посмотреть сообщение
Сообщение от Ilot
должен вызываться перегруженный оператор =?
а после того, как произведен выход из функции будет вызван перегруженный оператор присваивания
вот к этому.
1
Fintt
10 / 10 / 0
Регистрация: 13.02.2012
Сообщений: 94
18.07.2013, 15:28  [ТС] #22
Ilot, спасибо, я сам заочник, а нам зав кафедры дал лабы и говорит, как хотите так и делайте, так вот и живём уже 5 год))
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
18.07.2013, 15:54 #23
Реализованно:
-конструктор, в том числе и копирования;
-методы для вычисления модуля вектора, скалярного произведения, сложения,вычитания, умножения на константу;
-перегружены операции сложения, вычитания, умножения на константу, присваивания;
-написанны функции, которые для заданной пары векторов определяют, явл. ли они коллинеарными или ортогональными;
Кликните здесь для просмотра всего текста

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
#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]; 
        for(int i=0;i < n;++i)
              ptrArr[i]=0;
    }
    vektor(vektor &src)   //Конструктор копирования
    {
        n=src.n;
          ptrArr=new float[n];
          for(int i=0;i<src.n;++i)
              ptrArr[i]=src.ptrArr[i];
    }
    ~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)
    {
        n = v.n;
        for (int i=0; i < n; i++ )
            *(ptrArr + i) = *(v.ptrArr + i); 
        return *this;
    }
    vektor operator+ (vektor& v)
    {
        for (int i=0; i < n; i++ )
            *(ptrArr + i) += *(v.ptrArr + i); 
        return *this;
    }
    vektor operator- (vektor& v)
    {
        for (int i=0; i < n; i++ )
            *(ptrArr + i) -= *(v.ptrArr + i); 
        return *this;
    }
 
    float Skalar       (vektor* );  //Склярное произведение
    vektor Kommutativ  (vektor* );  //Сложение векторов
    vektor Netativ     (vektor* );  //Вычитание векторов
    vektor Multi       (float   );  //Умножение на константу
 
    friend bool Kolliniar(vektor* , vektor* );  //Проверка на коллинеарность
    friend bool Ortogonal(vektor* , vektor* );  //Проверка на ортогональность
};
//--------------------------------------------------------------
//----------- Определение дружественных функций ----------------
//--------------------------------------------------------------
float vektor::Skalar (vektor* vector1)          
{
    static float temp;
    temp = 0;
    for (int i=0; i < n; i++ )
        temp += *(ptrArr + i) * *(vector1->ptrArr + i);
    return temp;
}
vektor vektor::Kommutativ(vektor* vector1)
{
    for (int i=0; i < n; i++ )
        *(ptrArr + i) += *(vector1->ptrArr + i);
    return *this;       
}
vektor vektor::Netativ(vektor* vector1)
{
    for (int i=0; i < n; i++ )
        *(ptrArr + i) -= *(vector1->ptrArr + i);
    return *this;       
}
vektor vektor::Multi(float c)
{
    for (int i=0; i < n; i++ )
        *(ptrArr + i) *= c;
    return *this;   
}
bool Ortogonal (vektor* vector1, vektor* vector2)
{
    if ( (vector1->Skalar (vector2)) < 0.01 )
        return true;
    else
        return false;
}
bool Kolliniar (vektor* vector1, vektor* vector2)
{
    if ( abs( vector1->Skalar (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 << "Модуль первого вектора: " << v1.ArrModul() << endl;
    
    cout << v1.Skalar(&v2) << endl;
    
    v = v1.Kommutativ(&v2);
    v.ShowVektor();
    v = v1 + v2;
    v.ShowVektor();
    
    v = v1.Netativ(&v2);
    v.ShowVektor();
    v = v1 - v2;
    v.ShowVektor();
 
    cout << "Ортогональность: " << Ortogonal(&v1, &v2) << endl;
    cout << "Коллинеарность: "  << Kolliniar(&v1, &v2) << endl;
    system("pause");
    return 0;
}

Совсем не понятно о чем здесь идет речь если применять это к векторам:
Перегрузить операции инкремента, декремента.
Не сделанно:
-перегрузить операцию индексирования;
ВАЖНО!
Конструктор по умолчанию создает трехмерный вектор.
Нет проверки на соответствие размерностей во всех ф-ях.
Думаю вам это не составит труда исправить.
0
Wolkodav
604 / 457 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
18.07.2013, 16:05 #24
Ilot, а индексирование не сложно:
C++
1
2
3
4
5
6
7
float operator[](int index)
{
    if (index < n)
        return ptrArr[index];
    else
    // тут вообще по идее исключение бросить надо.
}
А инкремент и декримент, как тут реализовать с массивами?
1
Croessmah
Эксперт CЭксперт С++
13514 / 7672 / 866
Регистрация: 27.09.2012
Сообщений: 18,888
Записей в блоге: 3
Завершенные тесты: 1
18.07.2013, 16:10 #25
Цитата Сообщение от Wolkodav Посмотреть сообщение
if (index < n)
а может просто size_t index?
0
Wolkodav
604 / 457 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
18.07.2013, 16:18 #26
Croessmah, я что бы было соответствие типо int-int. По хорошему и поле в классе надо было делать
C++
1
size_t n
.
Но проверять на вхождение индекса придётся. Или я не прав?
0
18.07.2013, 16:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2013, 16:18
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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