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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Построение логического вектора по правилу http://www.cyberforum.ru/cpp-beginners/thread1223864.html
Помогите пожалуйста с задачкой. Даны действительные x и матрица A(n,n), n<=20. Разработать программу которая строит логический вектор X(n) по правилу: если максимальный элемент i-той строки не превышает х, тогда Х(і)=true, иначе - Х(і)=false.
C++ Вывод в файл из командной строки по указанному в ней пути Здравствуйте! Нужно написать программу, которая копирует вводимый с клавиатуры код (до эмулированного конца файла) в файл, имя которого будет передано в командной строке. Вот мое решение: #include <iostream> #include <fstream> #include <string> int main(int argc, char* argv) { http://www.cyberforum.ru/cpp-beginners/thread1223850.html
Структуры, нумерация полей структуры C++
Добрый день, у меня есть задачка, она решена. Но меня попросили "предусмотреть нумерацию полей структуры, например 1)Имя:Петр и тд.". Напечатал, как просили сделать, в итоге сказали не правильно - доделай. Пожалуйста подскажите, помогите, не до конца понимаю, что требуется от меня. Написать программу составления карточки на студента с динамиским распределением памяти для имени и фамилии на...
Записать имена созданных файлов в другой файл C++
{ system("cls"); cout<< "Enter file name: "; char filename = { 0 }; cin >>filename; FILE* file = fopen(filename, "w"); cout <<(file != NULL ? "File created\n" : "Cannot create file\n"); char rus; for (int i = 0; i < count; i++) //для каждой строки {
C++ Нужна библиотека Winmm.lib http://www.cyberforum.ru/cpp-beginners/thread1223820.html
Помогите не могу никак найти библиотеку winmm.lib, можете дать мне силку
C++ Изменение радиус вектора, программа не хочет откликаться на виджет слайдер доброго времени суток , проблема в том что программа не хочет откликаться на виджет слайдер #include cpp "mainwindow.h" #include "ui_mainwindow.h" #include <QtGui> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { подробнее

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

Это 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");
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 07:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru