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

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

Восстановить пароль Регистрация
 
alexkrasny
0 / 0 / 2
Регистрация: 07.07.2014
Сообщений: 25
07.07.2014, 15:27     Некорректная работа операции сложения векторов в классе #1
Объясните мне пожалуйста, почему операция сложения векторов работает неккоректно!
Дело в том, что после выполнения операции, каким-то чудом изменяется и вектор и при выводе векторов один вектор изменяется(его координаты становится ужасными числами...)
Я никак не меняю сами векторы, так в чем проблема?
Вот код:

Это 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");
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2014, 15:27     Некорректная работа операции сложения векторов в классе
Посмотрите здесь:

C++ Подмена операции сложения на умножение. Си!!!
C++ Не работает операция сложения в классе. Исправить код
C++ В классе перегрузить операцию сложения
Работа с классами(сложения двух векторов) C++
Перегрузка операции присваивания и сложения C++
C++ Перегрузить операцию сложения в базовом классе, который имеет два наследника
C++ Некорректная работа сложения строки

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
orange_fox
 Аватар для orange_fox
34 / 34 / 6
Регистрация: 06.04.2014
Сообщений: 189
07.07.2014, 15:30     Некорректная работа операции сложения векторов в классе #2
Постарайтесь локализовать проблему. Слишком много текста.
alexkrasny
0 / 0 / 2
Регистрация: 07.07.2014
Сообщений: 25
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[] - состоит из длин векторов соответственно!
Yandex
Объявления
07.07.2014, 15:37     Некорректная работа операции сложения векторов в классе
Ответ Создать тему
Опции темы

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