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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
Fintt
 Аватар для Fintt
10 / 10 / 0
Регистрация: 13.02.2012
Сообщений: 94
18.07.2013, 08:43     Класс вектор #1
Не могу разобраться с этим классом, прошу помощи и в объяснении(задание очень объёмное ещё), проблема с самим вектором тоже есть.
Разработать класс вектор размерности n. Определить несколько конструкторов , в том числе и конструктор копирования. Реализовать методы для вычисления модуля вектора, скалярного произведения, сложения,вычитания, умножения на константу. Перегрузить операции сложения, вычитания, умножения, инкремента, декремента, индексирования, присваивания для данного класса. Написать программу, демонстрирующую работу с классом. Создать массив объектов. Написать функцию, которая для заданной пары векторов будет определять, явл ли они коллинеарными или ортогональными.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.07.2013, 08:43     Класс вектор
Посмотрите здесь:

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

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

Большенство операций делается дружественными ф-ми ну и перегрузка операторов. Как сказал 0x10 все это подробно описанно в книгах. Вопрос в том, что возможно вы пока до этого не дочитали.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.07.2013, 10:14     Класс вектор #6
Цитата Сообщение от 0x10 Посмотреть сообщение
В этой постановке задачи под вектором понимается не направленный отрезок, а динамический массив.
Уверены? А это:
Цитата Сообщение от Fintt Посмотреть сообщение
Написать функцию, которая для заданной пары векторов будет определять, явл ли они коллинеарными или ортогональными.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
18.07.2013, 10:17     Класс вектор #7
Цитата Сообщение от alsav22 Посмотреть сообщение
Уверены? А это:
Мой косяк, несколько раз перечитывал, но последнего предложения не замечал.
Тогда... Все только проще.
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 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 локальная переменная.
*Проверки на равенство размеров векторов пока нет!
Wolkodav
 Аватар для Wolkodav
599 / 452 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
18.07.2013, 13:00     Класс вектор #9
Ilot, а почему в конструкторе по умолчанию у вас n=3 именно? И я бы посоветовал сразу забубенить в конструкторах обнуление. И конструктор копирования надо бы создать( всётаки имеете дело с указателями). Лишнем точно не было бы. Да и присваивание допилить бы.
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
18.07.2013, 13:06     Класс вектор #10
Wolkodav, ну как бы до перегрузок пока не дошел. Пытался сперва разобраться с дружественными ф-ми.
Копирование перегружал, но и с ним программа на 116 строке вылетает.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,868
Записей в блоге: 2
Завершенные тесты: 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];
    }
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
18.07.2013, 13:18     Класс вектор #12
Croessmah, а можете объяснить в двух словах для чего он нужен?
Так как я тоже пытался написать подобный конструктор, но у меня почему-то ничего не получилось.

А хотя постойте... я кажется передавал в конструктор переменную по значению, а значит вызывался тот же конструктор и так до бесконечности. Эм.. я правильно это понимаю?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,868
Записей в блоге: 2
Завершенные тесты: 1
18.07.2013, 13:22     Класс вектор #13
Цитата Сообщение от Ilot Посмотреть сообщение
для чего он нужен?
Для правильного построения копии объекта.

Конструктор копий, который сгенерирует компилятор, сделает примерно следующее:
C++
1
2
n = src.n;
ptrArr = src.ptrArr;
теперь указатель в объекте и указатель в копии указывают на одну область памяти, что явно противопоказано, ибо после выполнения деструктора одного из объектов
C++
1
delete [] ptrArr;
указатель второго будет указывать на освобожденную память
Wolkodav
 Аватар для Wolkodav
599 / 452 / 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 секунд
первое сравнение необходимо для само присваивания.
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
18.07.2013, 14:25     Класс вектор #15
Я недавно читал, что есть конструктор копирования и оператор присвоения. Как я понимаю сейчас речь идет о них самых. Хотелось бы разъяснить:
-когда мы передаем переменную по значению в функцию вызывается конструктор копирования. Если передаем по ссылке ничего не создается и мы работаем с объектом на который создается ссылка. Это правильно?
-когда и для чего вызывается конструктор vektor(const vektor & src) как указал Croessmah? Я этого не понимаю ведь по идее вот здесь:
C++
1
    v = Kommutativ(&v1, &v2);
должен вызываться перегруженный оператор =? И если даже передавать ему аргумент по ссылке все равно происходит вылет.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,868
Записей в блоге: 2
Завершенные тесты: 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));
Wolkodav
 Аватар для Wolkodav
599 / 452 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
18.07.2013, 14:43     Класс вектор #17
Croessmah, разрешите дополнить:
Той копии которую сделал конструткор копирования. А потом копия уничтожется. И без конструктора копирования дырка получится.
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
18.07.2013, 14:59     Класс вектор #18
Цитата Сообщение от Wolkodav Посмотреть сообщение
Croessmah, разрешите дополнить:
Той копии которую сделал конструткор копирования. А потом копия уничтожется. И без конструктора копирования дырка получится.
Не совсем понял о чем идет речь.
Fintt
 Аватар для 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 минуту
Спасибо за то что отклинулись, я сейчас уже разбираюсь в этой задаче, и сижу с тремя книгами.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2013, 15:15     Класс вектор
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
18.07.2013, 15:15     Класс вектор #20
Fintt, НИ СЦЫ. Сейчас доведу до ума свой код и выложу. Как ни как тебе будет уже легче.
Yandex
Объявления
18.07.2013, 15:15     Класс вектор
Ответ Создать тему
Опции темы

Текущее время: 23:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru