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

Стандартный класс complex. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.79
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
03.09.2011, 16:27     Стандартный класс complex. #1
1)Есть ли стандартный не шаблонный класс complex?
Я нашел только шаблонный класс, определенный в заголовочном файле <complex>
Есть ли нет не шаблонного класса complex, нельзя ли объявить объект complex без указаний типа?

Судя по этому( в самом низу страницу ) http://msdn.microsoft.com/en-us/libr...e3(VS.80).aspx
, вроде бы можно( я англ. плохо знаю ), а компилятор Visual Studio не разрешает.

2) Как вычислить с помощью стандартного класса complex y(z) = 2z + sin(z-i)?
z - это комплексной число, я так понимаю.

Вот мой не полный вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <complex>
 
int main()
{
    std::complex < double > complex_( 5, 10 );
    std::cout << ( std::complex < double >(2)*complex_);
    
    system( "pause" );
    return 0;
}
А sin посчитать не получается, да и еще его прибавить.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.09.2011, 16:27     Стандартный класс complex.
Посмотрите здесь:

C++ Класс Complex
C++ Класс complex
C++ Создать класс Complex
Создать класс Complex C++
Люди! Базовый класс Complex C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
03.09.2011, 16:55     Стандартный класс complex. #2
Так?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <complex>
#include <cmath>
 
template< typename T >
std::complex< T > y(const std::complex< T > &z)
{
    return 2.0 * z + sin(z - std::complex< T >(T(), T(1)));
}
 
int main()
{
    std::complex< double > z;
 
    std::cout << "Enter z: ";
    std::cin >> z;
 
    std::cout << "y(z) = " << y(z) << std::endl;
 
    return 0;
}
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
03.09.2011, 17:15  [ТС]     Стандартный класс complex. #3
Появился вопрос: почему при вводе комплексного числа cin >> z вводится только одно значение, т.е. при вводе 2 комплексное число будет (2,0), а при вводе 2 3 комплексное число будет все равно (2,0)?
Просто мне надо перегрузить потоковый ввод для своего класса Complex и делаю я это по аналогии стандартного класса complex.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
03.09.2011, 17:27     Стандартный класс complex. #4
Chelioss, потому что синтаксис ввода строго декларирован: сначала скобка, потом действительная часть, потом запятая, мнимая часть и скобка. Между каждой парой таких "узлов" могут быть любые разделители. При этом ввод одного числа без скобок и т.д. будет воспринят как ввод действительного числа, мнимая часть которого, как известно, равна 0.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
03.09.2011, 17:50  [ТС]     Стандартный класс complex. #5
Спасибо.
Вот откуда вы это узнали? В стандарте вряд ли это написано, ибо комплексный числа с языком C++ никак не связаны. А реализация перегрузки потокового ввода нельзя посмотреть, ибо инкапсуляция.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
03.09.2011, 18:10     Стандартный класс complex. #6
Chelioss, Microsoft

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
        // TEMPLATE FUNCTION operator>>
template<class _Ty,
    class _Elem,
    class _Tr> inline
    basic_istream<_Elem, _Tr>& operator>>(
        basic_istream<_Elem, _Tr>& _Istr, complex<_Ty>& _Right)
    {   // extract a complex<_Ty>
    typedef complex<_Ty> _Myt;
    const ctype<_Elem>& _Ctype_fac = _USE(_Istr.getloc(), ctype<_Elem>);
    _Elem _Ch = 0;
    long double _Real = 0;
    long double _Imag = 0;
 
    if (_Istr >> _Ch && _Ch != _Ctype_fac.widen('('))
        {   // no leading '(', treat as real only
        _Istr.putback(_Ch);
        _Istr >> _Real;
        _Imag = 0;
        }
    else if (_Istr >> _Real >> _Ch && _Ch != _Ctype_fac.widen(','))
        if (_Ch == _Ctype_fac.widen(')'))
            _Imag = 0;  // (real)
        else
            {   // no trailing ')' after real, treat as bad field
            _Istr.putback(_Ch);
            _Istr.setstate(ios_base::failbit);
            }
    else if (_Istr >> _Imag >> _Ch && _Ch != _Ctype_fac.widen(')'))
            {   // no imag or trailing ')', treat as bad field
            _Istr.putback(_Ch);
            _Istr.setstate(ios_base::failbit);
            }
 
    if (!_Istr.fail())
        {   // store valid result
        _Ty _Tyreal((_Ty)_Real), _Tyimag((_Ty)_Imag);
        _Right = _Myt(_Tyreal, _Tyimag);
        }
    return (_Istr);
    }
И gcc

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
  ///  Extraction operator for complex values.
  template<typename _Tp, typename _CharT, class _Traits>
    basic_istream<_CharT, _Traits>&
    operator>>(basic_istream<_CharT, _Traits>& __is, complex<_Tp>& __x)
    {
      _Tp __re_x, __im_x;
      _CharT __ch;
      __is >> __ch;
      if (__ch == '(') 
    {
      __is >> __re_x >> __ch;
      if (__ch == ',') 
        {
          __is >> __im_x >> __ch;
          if (__ch == ')') 
        __x = complex<_Tp>(__re_x, __im_x);
          else
        __is.setstate(ios_base::failbit);
        }
      else if (__ch == ')') 
        __x = __re_x;
      else
        __is.setstate(ios_base::failbit);
    }
      else 
    {
      __is.putback(__ch);
      __is >> __re_x;
      __x = __re_x;
    }
      return __is;
    }
Ну и глава 26 стандарта, раздел 4, подраздел 6 (26.4.6 complex non-member operations):
C++
1
2
3
template<class T, class charT, class traits>
basic_istream<charT, traits>&
operator>>(basic_istream<charT, traits>& is, complex<T>& x);
Effects: Extracts a complex number x of the form: u, (u), or (u,v), where u is the real part and v is
the imaginary part (27.7.1.2).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.09.2011, 20:24     Стандартный класс complex.
Еще ссылки по теме:

Реализовать класс Complex C++
C++ С++ класс (создайте класс с именем Complex для выполнения в арифмитических операий с комплексными числами))
C++ Создать класс Complex

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
03.09.2011, 20:24     Стандартный класс complex. #7
Вот листинг моего complex.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
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
#ifndef COMPLEX_H
#define COMPLEX_H
 
#include <math.h>//Подключение прототипов математических функций
 
class CComplex
{   
public:
    double re,im;   
    CComplex(){re = 0; im = 0;}
    CComplex(double _re, double _im){re = _re; im = _im;}
 
    CComplex operator+(double val);
    CComplex operator-(double val);
    CComplex operator*(double val);
    CComplex operator/(double val);
 
    CComplex operator+(CComplex& val);
    CComplex operator-(CComplex& val);
    CComplex operator*(CComplex& val);
    CComplex operator/(CComplex& val);
 
    double Re(CComplex val);
    double Im(CComplex val);
    CComplex ExpToAlg(double abs_val, double angle);
    CComplex AlgToExp(CComplex val);
    CComplex cmxpower(CComplex val, double power);
};
typedef CComplex *LPCCOMPLEX;
 
CComplex
CComplex::operator +(double val)
{
    CComplex ret_val;
    ret_val.re = re+val;
    ret_val.im = im;
    return ret_val;
}
 
CComplex
CComplex::operator -(double val)
{
    CComplex ret_val;
    ret_val.re = re-val;
    ret_val.im = im;
    return ret_val;
}
 
CComplex
CComplex::operator *(double val)
{
    CComplex ret_val;
    ret_val.re = re*val;
    ret_val.im = im*val;
    return ret_val;
}
 
CComplex
CComplex::operator /(double val)
{
    CComplex ret_val;
    ret_val.re = re/val;
    ret_val.im = im/val;
    return ret_val;
}
 
CComplex
CComplex::operator +(CComplex& val)
{
    CComplex ret_val;
    ret_val.re = re+val.re;
    ret_val.im = im+val.im;
    return ret_val;
}
 
CComplex
CComplex::operator -(CComplex& val)
{
    CComplex ret_val;
    ret_val.re = re-val.re;
    ret_val.im = im-val.im;
    return ret_val;
}
 
CComplex
CComplex::operator *(CComplex& val)
{
    CComplex ret_val;
    ret_val.re = re*val.re - im*val.im;
    ret_val.im = im*val.im + re*val.im;
    return ret_val;
}
 
CComplex 
CComplex::operator /(CComplex& val)
{
    CComplex ret_val;
    double div = pow(val.re,2)+pow(val.im,2);
    ret_val.re = re*val.re + im*val.im;
    ret_val.im = -re*val.im + im*val.re;    
    return ret_val/div;
}
 
double CComplex::Re(CComplex val)
{
    return val.re;
}
 
double CComplex::Im(CComplex val)
{
    return val.im;
}
 
CComplex 
CComplex::ExpToAlg(double abs_val, double angle)
{
    CComplex ret_val;
    double pi = 3.14;
    angle = (angle/360);
    angle = angle - floor(angle);   //отбрасываем целое число 360 градусов
    angle = angle*2*pi;             //переводим угол в радианы
 
    angle = (angle/(pi/2));
    angle = angle - floor(angle);   //отбрасываем целое число pi/2 радиан
    angle = angle*(pi/2);           //переводим угол в первую четверть
    ret_val.re = abs_val*cos(fabs(angle));
    ret_val.im = abs_val*sin(fabs(angle));
    if(angle < 0)
        ret_val.im = - ret_val.im;//sin(-x) = - sin(x);
    return ret_val;
}
 
CComplex 
CComplex::AlgToExp(CComplex val)
{
    CComplex ret_val;
    ret_val.re = sqrt(pow(val.re,2)+pow(val.im,2));
    ret_val.im = atan2(val.im,val.re);
    return ret_val;
}
 
CComplex 
CComplex::cmxpower(CComplex val, double power)
{
    CComplex ret_val;
    ret_val    = AlgToExp(val);
    ret_val.im = ret_val.im*power;
    ret_val    = ExpToAlg(ret_val.re,ret_val.im);
    return ret_val;
}
 
#endif
Yandex
Объявления
03.09.2011, 20:24     Стандартный класс complex.
Ответ Создать тему
Опции темы

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