Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/41: Рейтинг темы: голосов - 41, средняя оценка - 4.83
10 / 10 / 2
Регистрация: 13.02.2012
Сообщений: 94
1

Класс вектор

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

Author24 — интернет-сервис помощи студентам
Не могу разобраться с этим классом, прошу помощи и в объяснении(задание очень объёмное ещё), проблема с самим вектором тоже есть.
Разработать класс вектор размерности n. Определить несколько конструкторов , в том числе и конструктор копирования. Реализовать методы для вычисления модуля вектора, скалярного произведения, сложения,вычитания, умножения на константу. Перегрузить операции сложения, вычитания, умножения, инкремента, декремента, индексирования, присваивания для данного класса. Написать программу, демонстрирующую работу с классом. Создать массив объектов. Написать функцию, которая для заданной пары векторов будет определять, явл ли они коллинеарными или ортогональными.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.07.2013, 08:43
Ответы с готовыми решениями:

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

Создать класс, полем которого является класс вектор
как это выглядит?

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

Вектор класс
Всем привет!!! Вот написал программу с класами а она не правильно работеает. Пожалуйста помогоите...

25
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
18.07.2013, 09:35 2
Fintt, так чего же вы хотите? Что бы для вас полностью написали данный класс или подсказали в решении конкретного вопроса?
Если первое то вам лучше обратиться к фрилансерам, второе - задавайте конкретный вопрос.
Однако самому стало интересно написать данную программу, но это у меня потребует около часа времени плюс я сейчас на работе.
1
10 / 10 / 2
Регистрация: 13.02.2012
Сообщений: 94
18.07.2013, 09:54  [ТС] 3
Это всего лишь моя 2 задача. Первую я с лёгкостью справился и понятно всё, а тут появились конструкторы, деструкторы и т.д. и много всего и сразу. Потом я не помню про вектора. Заного вспоминать школу как-то не хочется и я не прогр С++. Ну если всё вопрос закрыт, буду бодаться сам с ним)) У меня на это уйдёт явно не час а больше суток.
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.07.2013, 09:57 4
Цитата Сообщение от Fintt Посмотреть сообщение
Потом я не помню про вектора. Заного вспоминать школу как-то не хочется и я не прогр С++.
В этой постановке задачи под вектором понимается не направленный отрезок, а динамический массив.
Цитата Сообщение от Fintt Посмотреть сообщение
а тут появились конструкторы, деструкторы и т.д. и много всего и сразу
Хорошая задача для первой-второй лабы. Можно только отправить в книги, если нет конкретных вопросов.
1
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
18.07.2013, 09:59 5
Почему все? Я же сказал уже пишу.

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

Большенство операций делается дружественными ф-ми ну и перегрузка операторов. Как сказал 0x10 все это подробно описанно в книгах. Вопрос в том, что возможно вы пока до этого не дочитали.
1
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.07.2013, 10:14 6
Цитата Сообщение от 0x10 Посмотреть сообщение
В этой постановке задачи под вектором понимается не направленный отрезок, а динамический массив.
Уверены? А это:
Цитата Сообщение от Fintt Посмотреть сообщение
Написать функцию, которая для заданной пары векторов будет определять, явл ли они коллинеарными или ортогональными.
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.07.2013, 10:17 7
Цитата Сообщение от alsav22 Посмотреть сообщение
Уверены? А это:
Мой косяк, несколько раз перечитывал, но последнего предложения не замечал.
Тогда... Все только проще.
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
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
840 / 478 / 58
Регистрация: 18.09.2012
Сообщений: 1,688
18.07.2013, 13:00 9
Ilot, а почему в конструкторе по умолчанию у вас n=3 именно? И я бы посоветовал сразу забубенить в конструкторах обнуление. И конструктор копирования надо бы создать( всётаки имеете дело с указателями). Лишнем точно не было бы. Да и присваивание допилить бы.
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
18.07.2013, 13:06 10
Wolkodav, ну как бы до перегрузок пока не дошел. Пытался сперва разобраться с дружественными ф-ми.
Копирование перегружал, но и с ним программа на 116 строке вылетает.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 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
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
18.07.2013, 13:18 12
Croessmah, а можете объяснить в двух словах для чего он нужен?
Так как я тоже пытался написать подобный конструктор, но у меня почему-то ничего не получилось.

А хотя постойте... я кажется передавал в конструктор переменную по значению, а значит вызывался тот же конструктор и так до бесконечности. Эм.. я правильно это понимаю?
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
18.07.2013, 13:22 13
Цитата Сообщение от Ilot Посмотреть сообщение
для чего он нужен?
Для правильного построения копии объекта.

Конструктор копий, который сгенерирует компилятор, сделает примерно следующее:
C++
1
2
n = src.n;
ptrArr = src.ptrArr;
теперь указатель в объекте и указатель в копии указывают на одну область памяти, что явно противопоказано, ибо после выполнения деструктора одного из объектов
C++
1
delete [] ptrArr;
указатель второго будет указывать на освобожденную память
1
840 / 478 / 58
Регистрация: 18.09.2012
Сообщений: 1,688
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
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
18.07.2013, 14:25 15
Я недавно читал, что есть конструктор копирования и оператор присвоения. Как я понимаю сейчас речь идет о них самых. Хотелось бы разъяснить:
-когда мы передаем переменную по значению в функцию вызывается конструктор копирования. Если передаем по ссылке ничего не создается и мы работаем с объектом на который создается ссылка. Это правильно?
-когда и для чего вызывается конструктор vektor(const vektor & src) как указал Croessmah? Я этого не понимаю ведь по идее вот здесь:
C++
1
    v = Kommutativ(&v1, &v2);
должен вызываться перегруженный оператор =? И если даже передавать ему аргумент по ссылке все равно происходит вылет.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 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
840 / 478 / 58
Регистрация: 18.09.2012
Сообщений: 1,688
18.07.2013, 14:43 17
Croessmah, разрешите дополнить:
Той копии которую сделал конструткор копирования. А потом копия уничтожется. И без конструктора копирования дырка получится.
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
18.07.2013, 14:59 18
Цитата Сообщение от Wolkodav Посмотреть сообщение
Croessmah, разрешите дополнить:
Той копии которую сделал конструткор копирования. А потом копия уничтожется. И без конструктора копирования дырка получится.
Не совсем понял о чем идет речь.
0
10 / 10 / 2
Регистрация: 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
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
18.07.2013, 15:15 20
Fintt, НИ СЦЫ. Сейчас доведу до ума свой код и выложу. Как ни как тебе будет уже легче.
1
18.07.2013, 15:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.07.2013, 15:15
Помогаю со студенческими работами здесь

Класс Вектор
Решил написать свой класс вектор, приблизительно как в СТЛ. Сначала решил сделать каркас. Все...

Класс Вектор
Нужна помощь в написании программы. Класс &quot;Вектор&quot;. (Чем он отличается от массива? в том что мне...

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

Класс вектор
необходимо написать класс вектор (в геометрическом смысле в трёхмерном пространстве) ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru