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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.79
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
#1

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

03.09.2011, 16:27. Просмотров 4069. Ответов 6
Метки нет (Все метки)

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 посчитать не получается, да и еще его прибавить.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.09.2011, 16:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Стандартный класс complex. (C++):

Как заполнить массив комплексными числами, не используя стандартный класс std::complex<double>? - C++
Короче, дана структура. Как заполнить массив комплексными числами, не используя стандартный класс std::complex&lt;double&gt;. struct...

С++ класс (создайте класс с именем Complex для выполнения в арифмитических операий с комплексными числами)) - C++
Кто сможет помогите пожалуйста! (Класс Complex). Создайте класс с именем Complex для выполнения в арифмитических операий с...

Базовый класс Complex и производный класс Vector - C++
Создайте базовый класс Complex (комплексное число) для реализации комплексных чисел в алгебраической форме и основных операций с ними:...

Класс Complex - C++
Напишите программу, в которой создайте обьекты типа Complex и выполните над ними действия, предусмотренные методами класса. Объявите...

Класс Complex - C++
Описать класс, реализующий указанный ниже тип данных. Класс должен содержать множество конструкторов для создания объектов определенного...

Класс complex - C++
для программной модели заданного объекта. Описание объекта и его основных свойств приводится ниже. Привести фрагмент программы (int...

6
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
03.09.2011, 16:55 #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;
}
1
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
03.09.2011, 17:15  [ТС] #3
Появился вопрос: почему при вводе комплексного числа cin >> z вводится только одно значение, т.е. при вводе 2 комплексное число будет (2,0), а при вводе 2 3 комплексное число будет все равно (2,0)?
Просто мне надо перегрузить потоковый ввод для своего класса Complex и делаю я это по аналогии стандартного класса complex.
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
03.09.2011, 17:27 #4
Chelioss, потому что синтаксис ввода строго декларирован: сначала скобка, потом действительная часть, потом запятая, мнимая часть и скобка. Между каждой парой таких "узлов" могут быть любые разделители. При этом ввод одного числа без скобок и т.д. будет воспринят как ввод действительного числа, мнимая часть которого, как известно, равна 0.
1
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
03.09.2011, 17:50  [ТС] #5
Спасибо.
Вот откуда вы это узнали? В стандарте вряд ли это написано, ибо комплексный числа с языком C++ никак не связаны. А реализация перегрузки потокового ввода нельзя посмотреть, ибо инкапсуляция.
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
03.09.2011, 18:10 #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).
1
-=ЮрА=-
Заблокирован
Автор FAQ
03.09.2011, 20:24 #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
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.09.2011, 20:24
Привет! Вот еще темы с ответами:

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

Разработать класс complex - C++
Разработать класс complex для работы с комплекснымичислами В классе complex будут члены класса: • double x – действительная часть...

Создать класс Complex - C++
В универе задали написать класс Complex для выполнения арифметических операция с комплексными числами. Сам класс. #include...

Создать класс Complex - C++
С чего начать? Задача: Создать класс Complex для работы с комплексными числами. Определить перегруженную функцию, возвращающую...


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

Или воспользуйтесь поиском по форуму:
7
Yandex
Объявления
03.09.2011, 20:24
Ответ Создать тему
Опции темы

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