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

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

Войти
Регистрация
Восстановить пароль
 
alexkrasny
0 / 0 / 2
Регистрация: 07.07.2014
Сообщений: 26
#1

Некорректная работа операции сложения векторов в классе - C++

07.07.2014, 15:27. Просмотров 284. Ответов 2
Метки нет (Все метки)

Объясните мне пожалуйста, почему операция сложения векторов работает неккоректно!
Дело в том, что после выполнения операции, каким-то чудом изменяется и вектор и при выводе векторов один вектор изменяется(его координаты становится ужасными числами...)
Я никак не меняю сами векторы, так в чем проблема?
Вот код:

Это 1 файл odm.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
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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
#include "odm.h"
#include "math.h"
int odm::kol=0;
odm::odm()
{
    n=0;
}
odm::~odm(void)
{
    delete(a);
}
void odm::vvod_kol(int l)
{
    kol=l;
}
void odm::soz(int n1)
{
    n=n1;
    a= new int [n];
    for(int i=0;i<n;i++)
        a[i]=0;
}
void odm::adob(int nomv1)
{
    if((*this).proverka_vect(nomv1))
    {
    std::cout<<"Введите элементы вектора (через пробел):  ";
    for(int i=0;i<n;i++)
        std::cin>>a[i];
    }
}
void odm::op(int nomv1,int uy)
{
    if(uy==1)
    {
        if((*this).proverka_vect(nomv1))
        {
            std::cout<<"Ваш "<<nomv1<<"-й "<<"вектор:   ";
            std::cout<<"( ";
            for(int i=0;i<n-1;i++)
                std::cout<<a[i]<<" , ";
            std::cout<<a[n-1]<<" )";
        }
    }
    else
    {
        std::cout<<"Ваш "<<nomv1+1<<"-й "<<"вектор:   ";
        std::cout<<"( ";
        for(int i=0;i<n-1;i++)
            std::cout<<a[i]<<" , ";
        std::cout<<a[n-1]<<" )";
        std::cout<<std::endl;
    }
}
void odm::opel(int nomv1,int y)
{
    if((*this).proverka_el_vect(y) && (*this).proverka_vect(nomv1))
        std::cout<<y<<"-й"<<" элемент вашего вектора:   "<<a[y-1];
}
void odm::izmel(int nomv1,int y)
{
    if((*this).proverka_el_vect(y) && (*this).proverka_vect(nomv1))
    {
        std::cout<<"Меняем элемент вектора на   ";
        std::cin>>a[y-1];
    }
}
void odm::slog(odm k,int nomv1,int nomv2)
{
        if(nomv1==nomv2)
        {
            int *p2;
            p2=new int[n];
            int *p3;
            p3=new int[n];
            for(int i=0;i<n;i++)
                p3[i]=k.otd(i);
            for(int i=0;i<n;i++)
                p2[i]=(*this).a[i]+k.otd(i);
            std::cout<<"Результат сложения векторов:    ( ";
            for(int i=0;i<n-1;i++)
                std::cout<<p2[i]<<", ";
            std::cout<<p2[n-1]<<" )";
            for(int i=0;i<n;i++)
                k.a[i]=p3[i];
        }
        else
        std::cout<<"Длины векторов не совпадают!";
        
}
void odm::vych(odm k,int nomv1,int nomv2)
{
    if(nomv1==nomv2)
    {
            int *p2;
            p2=new int[n];
            for(int i=0;i<n;i++)
                p2[i]=(*this).a[i]-k.otd(i);
            std::cout<<"Результат вычитания векторов:    ( ";
            for(int i=0;i<n-1;i++)
                std::cout<<p2[i]<<", ";
            std::cout<<p2[n-1]<<" )";
    }
    else
        std::cout<<"Длины векторов не совпадают!";
}
void odm::umn(int sk,int nomv1)
{
    if((*this).proverka_vect(nomv1))
    {
        int *p2;
        p2=new int[n];
        for(int i=0;i<n;i++)
            p2[i]=a[i]*sk;
        std::cout<<"Результат умножения на скаляр:    ( ";
        for(int i=0;i<n-1;i++)
            std::cout<<p2[i]<<", ";
        std::cout<<p2[n-1]<<" )";
        delete(p2);
    }
}
void odm::del(int sk,int nomv1)
{
    if(sk==0)
    {
        if((*this).proverka_vect(nomv1))
        {
            double *p1;
            p1=new double[n];
            for(int i=0;i<n;i++)
                p1[i]=a[i]/sk;
            std::cout<<"Результат умножения на скаляр:    ( ";
            for(int i=0;i<n-1;i++)
                std::cout<<p1[i]<<", ";
            std::cout<<p1[n-1]<<" )";
            delete(p1);
        }
    }
    else
        std::cout<<"Нельзя делить на нулевой скаляр!";  
}
bool odm::proverka_vect(int nomv)
{
    if(nomv>0 && nomv<=kol)
        return true;
    else
    {
        std::cout<<"Не существует такого вектора!";
        return false;
    }
}
bool odm::proverka_el_vect(int nomel)
{
    if(nomel>0 && nomel<=n)
        return true;
    else
    {
        std::cout<<"Не существует такого элемента вектора!";
        return false;
    }
}
bool  odm::proverka_dop(int nomv1,int nomv2)
{
    if(nomv1>0 && nomv1<=kol && nomv2>0 && nomv2<=kol)
        return true;
    else
    {
        std::cout<<"Не существует таких векторов!";
        return false;
    }
}
int odm::otd(int ir)
{
    return (*this).a[ir];
}
Это 2 файл odm.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
26
27
28
29
//#pragma once
//вариант 8
#include <iostream>
#include <iomanip>
class odm
{
private:
    int *a;
    int n;
    static int kol;
public:
    odm::odm();
    ~odm(void);
    void vvod_kol(int l);
    void soz(int n1);   
    void adob(int nomv1);
    void op(int nomv,int uy);
    void opel(int nomv1,int y);
    void izmel(int nomv1,int y);
    void slog(odm k,int nomv1,int nomv2);
    void vych(odm k,int nomv1,int nomv2);
    void umn(int sk,int nomv1);
    void del(int sk,int nomv1);
    bool proverka_dop(int nomv1,int nomv2);
protected:
    int otd(int ir);
    bool proverka_vect(int nomv);
    bool proverka_el_vect(int nomel);
};
Это 3 файл inter.cpp в котором main
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
#include "odm.h"
#include <iostream>
#include <iomanip>
 
int main()
{
    setlocale(LC_ALL,"Russian");
    int f=0,dli,kol,i1=0;
    int nomv;
    int nomel;
    std::cout<<std::endl;
    std::cout<<"Введите количество векторов:   ";
    std::cin>>kol;
    int *p;
    p=new int[kol];
    std::cout<<std::endl;
    std::cout<<"Введите длины векторов (через пробел):   ";
    for(int i=0;i<kol;i++)
        std::cin>>p[i];
    std::cout<<std::endl;
    odm *b=new odm[kol];
    b[0].vvod_kol(kol);
    for(int i=0;i<kol;i++)
        b[i].soz(p[i]);
    while(true)
    {
    std::cout<<"Введите номер операции:   ";
    std::cin>>f;
    std::cout<<std::endl;
    switch(f)
    {
    case 0:
        std::cout<<"0 ->    Справка;"<<std::endl;
        std::cout<<std::endl;
        std::cout<<"1 ->    Ввод нового вектора (по номеру);"<<std::endl;
        std::cout<<std::endl;
        std::cout<<"2 ->    Вывод вектора (по номеру вектора);"<<std::endl;
        std::cout<<std::endl;
        std::cout<<"3 ->    Вывод всех векторов;"<<std::endl;
        std::cout<<std::endl;
        std::cout<<"4 ->    Вывод элемента вектора (по номеру вектора и номеру элемента);"<<std::endl;
        std::cout<<std::endl;
        std::cout<<"5 ->    Изменение элемента вектора (по номеру вектора и номеру элемента);"<<std::endl;
        std::cout<<std::endl;
        std::cout<<"6 ->    Сложение двух векторов одинаковой длины (по номерам векторов);"<<std::endl;
        std::cout<<std::endl;
        std::cout<<"7 ->    Вычитание векторов одинаковой длины (по номерам (1 - из чего вычитаем; 2 - что вычитаем));"<<std::endl;
        std::cout<<std::endl;
        std::cout<<"8 ->    Умножение вектора на скаляр (по номеру вектора);"<<std::endl;
        std::cout<<std::endl;
        std::cout<<"9 ->    Деление вектора на скаляр (по номеру вектора);"<<std::endl;
        std::cout<<std::endl;
        break;
    case 1:
        std::cout<<"Введите номер вектора, который хотите ввести:    ";
        std::cin>>nomv;
        std::cout<<std::endl;
        b[nomv-1].adob(nomv);
        std::cout<<std::endl;
        break;  
    case 2:
        std::cout<<"Введите номер вектора, который хотите вывести:    ";
        std::cin>>nomv;
        std::cout<<std::endl;
        b[nomv-1].op(nomv,1);
        std::cout<<std::endl;
        break;
    case 3:
        std::cout<<"Ваши вектора:";
        std::cout<<std::endl;
        for(int i=0;i<kol;i++)
            b[i].op(i,2);
        std::cout<<std::endl;
        break;
    case 4:
        std::cout<<"Введите номер вектора:    ";
        std::cin>>nomv;
        std::cout<<std::endl;
        std::cout<<"Введите номер элемента вектора:    ";
        std::cin>>nomel;
        std::cout<<std::endl;
            b[nomv-1].opel(nomv,nomel);
        std::cout<<std::endl;std::cout<<std::endl;
        break;
    case 5:
        std::cout<<"Введите номер вектора:    ";
        std::cin>>nomv;
        std::cout<<std::endl;
        std::cout<<"Введите номер элемента вектора:    ";
        std::cin>>nomel;
        std::cout<<std::endl;
            b[nomv-1].izmel(nomv,nomel);
        std::cout<<std::endl;
        break;
    case 6:
        std::cout<<"Введите номер первого вектора:    ";
        std::cin>>nomv;
        std::cout<<std::endl;
        std::cout<<"Введите номер второго вектора:    ";
        std::cin>>nomel;
        std::cout<<std::endl;
        if(b[0].proverka_dop(nomv,nomel))
        b[nomv-1].slog(b[nomel-1],p[nomel-1],p[nomv-1]);
        std::cout<<std::endl;std::cout<<std::endl;
        break;
    case 7:
        std::cout<<"Введите номер первого вектора:    ";
        std::cin>>nomv;
        std::cout<<std::endl;
        std::cout<<"Введите номер второго вектора:    ";
        std::cin>>nomel;
        std::cout<<std::endl;
        if(b[0].proverka_dop(nomv,nomel))
        b[nomv-1].vych(b[nomel-1],p[nomv-1],p[nomel-1]);
        std::cout<<std::endl;std::cout<<std::endl;
        break;
    case 8:
        std::cout<<"Введите номер вектора:    ";
        std::cin>>nomv;
        std::cout<<std::endl;
        std::cout<<"Введите скаляр:    ";
        std::cin>>nomel;
        b[nomv-1].umn(nomel,nomv);
        std::cout<<std::endl;std::cout<<std::endl;
        break;
    case 9:
        std::cout<<"Введите номер вектора:    ";
        std::cin>>nomv;
        std::cout<<std::endl;
        std::cout<<"Введите скаляр:    ";
        std::cin>>nomel;
        b[nomv-1].del(nomel,nomv);
        std::cout<<std::endl;std::cout<<std::endl;
        break;
;} 
    }
    for(int i=0;i<kol;i++)
        b[i].~odm();
    delete(b);
    delete(p);
    system("pause");
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2014, 15:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Некорректная работа операции сложения векторов в классе (C++):

Перегрузка операции сложения в классе - C++
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;iomanip&gt; using namespace std; class Project { private: int id; ...

Описать операции сложения и вычитания векторов с получением нового вектора - C++
Составить описание класса для объектов-векторов, задаваемых координатами в трехмерном пространстве. Описать операции сложения и вычитания...

Некорректная работа сложения строки - C++
void Nmin (int **matrix, const size_t rows, const size_t columns) { int min=10000; int Nmin ; int NumberStr; int...

Работа с классами(сложения двух векторов) - C++
Составить описание класса. Определить конструктор по умолчанию, конструктор с параметрами и методы класса. Написать программу,...

Неправильная работа сложения в пользовательском классе - C++
Вечер добрый. Написал свой класс Money. Решил протестировать, и наткнулся на ошибку. #include &lt;iostream&gt; #include &quot;Money.h&quot; using...

Создать класс векторов, реализующий сложения и вычитания векторов - C++
Помогите найти ошибку, так как неправильно выводятся массивы, то скорее всего не получается сформировать массив. А задание:создать класс...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
orange_fox
34 / 34 / 6
Регистрация: 06.04.2014
Сообщений: 189
07.07.2014, 15:30 #2
Постарайтесь локализовать проблему. Слишком много текста.
0
alexkrasny
0 / 0 / 2
Регистрация: 07.07.2014
Сообщений: 26
07.07.2014, 15:37  [ТС] #3
Хорошо. Проблема вот!

Здесь из main я вызываю функцию сложения:
C++
1
2
3
4
5
6
7
8
9
10
std::cout<<"Введите номер первого вектора:    ";
        std::cin>>nomv;
        std::cout<<std::endl;
        std::cout<<"Введите номер второго вектора:    ";
        std::cin>>nomel;
        std::cout<<std::endl;
        if(b[0].proverka_dop(nomv,nomel))
        b[nomv-1].slog(b[nomel-1],p[nomel-1],p[nomv-1]);
        std::cout<<std::endl;std::cout<<std::endl;
        break;
Ну а здесь сами функции класса, которые вызываются из main.
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
void odm::slog(odm k,int nomv1,int nomv2)
{
        if(nomv1==nomv2)
        {
            int *p2;
            p2=new int[n];
            int *p3;
            p3=new int[n];
            for(int i=0;i<n;i++)
                p3[i]=k.otd(i);
            for(int i=0;i<n;i++)
                p2[i]=(*this).a[i]+k.otd(i);
            std::cout<<"Результат сложения векторов:    ( ";
            for(int i=0;i<n-1;i++)
                std::cout<<p2[i]<<", ";
            std::cout<<p2[n-1]<<" )";
            for(int i=0;i<n;i++)
                k.a[i]=p3[i];
        }
        else
        std::cout<<"Длины векторов не совпадают!";
        
}
bool  odm::proverka_dop(int nomv1,int nomv2)
{
    if(nomv1>0 && nomv1<=kol && nomv2>0 && nomv2<=kol)
        return true;
    else
    {
        std::cout<<"Не существует таких векторов!";
        return false;
    }
}
int odm::otd(int ir)
{
    return (*this).a[ir];
}
Добавлено через 2 минуты
Если что, то массив b[] - является массивом векторов, т.е. объектов моего класса, а массив p[] - состоит из длин векторов соответственно!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.07.2014, 15:37
Привет! Вот еще темы с ответами:

Реализовать метод сложения векторов - C++
Здравствуйте. Имеется базовый класс: class Triad { double a,b,c; public: Tria(double a1,double b1, double c1) { a=a1; ...

Перегрузка оператора +, для сложения координат 2х векторов - C++
Задание: разработать абстрактный тип данных &quot;Вектор&quot;. АТД должен обеспечивать : ввод\вывод векторов,сложение\вычитание,перемножение на...

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

Не работает операция сложения в классе. Исправить код - C++
Сделал класс типа список &quot;Unit2.h&quot; //--------------------------------------------------------------------------- #ifndef Unit2H ...


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

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

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