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

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

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

Работа с Complex - C++

19.02.2014, 15:17. Просмотров 233. Ответов 2
Метки нет (Все метки)

Вроде как все правильно, компилятор даже не ругается, но почему-то значения затираются, и я не могу понять почему.
Вот сам код:
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
class Complex
    {
    private:
        double real;  // Действительная часть
        double image; // Мнимая часть
    public:
    Complex() {}; // Конструктор по умолчанию
    Complex(double r) { real = r; image = 0; } // Конструктор
    Complex(double r, double i) { real = r, image = i; } // Конструктор
    ~Complex() {} // Деструктор 11.
    float abs()   // Модуль комплексного числа
        {
        return (real * real - image * image);
        }
    Complex operator+(Complex &); // Перегрузка оператора сложения
    Complex operator-(Complex &); // Перегрузка оператора вычитания
    Complex operator*(Complex &); // Перегрузка оператора умножения
    Complex operator/(Complex &); // Перегрузка оператора деления
    //Complex operator^(Complex &);
    // Перегрузка функции-оператора << для вывода класса Complex
    friend ostream &operator<<(ostream &, Complex &);
     // Перегрузка функции-оператора >> для ввода класса Complex
     friend istream &operator>>(istream &, Complex &);
     };
 
 
     // Перегрузка +
    Complex Complex::operator+(Complex &fp1)
        {
        fp1.real = real + fp1.real;
        fp1.image = image + fp1.image;
        return fp1;
        }
         // Перегрузка -
    Complex Complex::operator-(Complex &fp1)
         {
         fp1.real = real - fp1.real;
         fp1.image = image - fp1.image;
         return fp1;
         }
          // Перегрузка *
    Complex Complex::operator*(Complex &fp1)
        {
        double i, j;
        i = real * fp1.real - image * fp1.image;
        j = real * fp1.image + fp1.real * image;
        fp1.real = i;
        fp1.image = j;
        return fp1;
        }
        // Перегрузка /
    Complex Complex::operator/(Complex &fp1)
        {
        double k, i, j;
        k = fp1.real * fp1.real + fp1.image * fp1.image;
        i = (real * fp1.real + image * fp1.image) / k;
        j = (fp1.real * image - real * fp1.image) / k;
        fp1.real = i;
        fp1.image = j;
        return fp1;
        }
 
 
        // Перегрузка оператора <<
     ostream &operator<< (ostream &fo,  Complex &fp)
        {
        if (fp.image < 0) fo << fp.real << "+i(" << fp.image << ")\n";
        else fo << fp.real << "+i" << fp.image << "\n";
        return fo;
        }
        // Перегрузка оператора >>
    istream &operator>>(istream &fi,  Complex &fp)
        {
        cout << "Vvedite deistvitelnyu chast': ";  fi >> fp.real;
        cout << "Vvedite mnimyu chast': ";
        fi >> fp.image;
        return fi;
        }
 
 
int _tmain(int argc, _TCHAR* argv[])
{
Complex c1(0,0);
 
 
Complex c2;    //ввели первое число
cin>>c2;
 
 
Complex c3;    //ввели второе число
cin>>c3;
 
printf("\n");    
 
cout<<c3.abs();   //модуль
 
printf("\n");
c1 = c2 + c3;   //сложили
cout<<c1;
 
c1 = c2 - c3;
cout<<c1;
 
 
system("pause");
    return 0;
}
И почему-то после сложения значение c3 затирается и становится равно значению суммы, отчего вычитание работает уже некорректно... Почему так происходит и как от этого избавиться?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.02.2014, 15:17     Работа с Complex
Посмотрите здесь:

Class Complex C++
C++ Класс Complex
C++ Класс complex
Создать класс Complex C++
Реализовать класс Complex C++
Шаблон класса complex. Ошибка undefined reference to `complex<double>::SetRe(double)' C++
valarray and complex C++
Тип complex C++
C++ Работа с классами: массив объектов класса Complex
C++ Библиотека <complex>
C++ Создать класс Complex
Класс Complex C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1784 / 1159 / 224
Регистрация: 16.05.2013
Сообщений: 3,048
Записей в блоге: 5
Завершенные тесты: 1
19.02.2014, 15:23     Работа с Complex #2
Недавно подобная задача была. Разбирайтесь, может поможет:
Кликните здесь для просмотра всего текста
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
#include<iostream>
#include<math.h>
using namespace std;
 class CComplex
 {
 private:
     double re;
     double im;
 public:
 
     CComplex():re(0), im(0)
     {}
     CComplex(double val): re(val), im(0)
     {}
     CComplex(double _re, double _im): re(_re), im(_im)
     {}
 
     friend CComplex operator+(CComplex, CComplex);
     friend CComplex operator-(CComplex, CComplex);
     friend CComplex operator*(CComplex, CComplex);
     friend CComplex operator/(CComplex, CComplex);
 
     friend ostream& operator << (ostream&, const CComplex&);
     friend istream& operator >> (istream&, CComplex&);
 };
 
 CComplex operator +(CComplex val1, CComplex val2)
 {
     double  re = val1.re+val2.re;
     double  im = val1.im+val2.im;
     return CComplex(re, im);
 }
 
 CComplex operator -(CComplex val1, CComplex val2)
 {
     double  re = val1.re-val2.re;
     double  im = val1.im-val2.im;
     return CComplex(re, im);
 }
 
 CComplex operator *(CComplex val1, CComplex val2)
 {
     double  re = val1.re*val2.re - val1.im*val2.im;
     double  im = val1.im*val2.im + val1.re*val2.im;
     return CComplex(re, im);
 }
 
 CComplex operator /(CComplex val1, CComplex val2)
 {
     double div = val2.re * val2.re + val2.im * val2.im;
     double re = val1.re*val2.re + val1.im*val2.im;
     double im = -val1.re*val2.im + val1.im*val2.re;
     return CComplex(re / div, im / div);
 }
 
 ostream& operator << (ostream& os, const CComplex& comp)
 {
    std::cout << comp.re;
    if (comp.im >= 0) {
        std::cout << '+';
        std::cout << comp.im << 'i';
    }
    else {
        std::cout << comp.im << 'i';
    }
    return os;
 }
 istream& operator >> (istream& is, CComplex& comp)
 {
    std::cin >> comp.re;
    std::cin >> comp.im;
    return is;
 }
 
 int main()
 {
 CComplex a(3.0, 4.0);
 CComplex b;
 
 std::cout << "Enter a complex number (q to quit):\n";
 
 while (std::cin >> b)
 {
     std::cout << "b is " << b << '\n';
 
     std::cout << "a + b is " << a + b << '\n';
     std::cout << "a - b is " << a - b << '\n';
     std::cout << "a * b is " << a * b << '\n';
     std::cout << "2 * b is " << 2 * b << '\n';
     std::cout << "a/b is " << a / b << '\n';
 
     std::cout << "Enter a complex number (q to quit):\n";
 }
 
 std::cout << "Done!\n";
 return 0;
 }

Цитата Сообщение от cucumberbatch Посмотреть сообщение
Вроде как все правильно, компилятор даже не ругается, но почему-то значения затираются, и я не могу понять почему.
Так вы же сами их затираете:
C++
1
2
3
4
5
6
    Complex Complex::operator+(Complex &fp1)
        {
        fp1.real = real + fp1.real;
        fp1.image = image + fp1.image;
        return fp1;
        }
Здесь вы передаете аргумент по ссылке и меняете значения его полей.
cucumberbatch
0 / 0 / 0
Регистрация: 19.02.2014
Сообщений: 2
20.02.2014, 14:04  [ТС]     Работа с Complex #3
Цитата Сообщение от Ilot Посмотреть сообщение
Недавно подобная задача была. Разбирайтесь, может поможет
Я уже просматривала подобные темы на этом форуме, но все равно с проблемой справиться не могу, потому решилась создать новую тему...

Добавлено через 22 часа 38 минут
Цитата Сообщение от Ilot Посмотреть сообщение
Так вы же сами их затираете:
Код C++
1
2
3
4
5
6
Complex Complex::operator+(Complex &fp1)
* * * * {
* * * * fp1.real = real + fp1.real;
* * * * fp1.image = image + fp1.image;
* * * * return fp1;
* * * * }
Здесь вы передаете аргумент по ссылке и меняете значения его полей.
Спасибо за подсказку, наконец-то разобралась и теперь все работает как надо *О*
Yandex
Объявления
20.02.2014, 14:04     Работа с Complex
Ответ Создать тему
Опции темы

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