Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > комплексные числа


Автор: Deeoni$ 4.10.2004, 00:24
Интересует вопрос как из строки сделать комлексное число.

Автор: chipset 4.10.2004, 06:20
что такое комплексное число? withstupid.gif
atoi не подойдет? withstupid.gif

Автор: Дрон 4.10.2004, 08:17
Цитата(chipset @ 4.10.2004, 07:20)
что такое комплексное число?
Подрастёшь -- узнаешь... и может ещё пожалеешь, что узнал smile.gif smile.gif smile.gif

Deeoni$
А смотря в каком виду оно у тебя задано. Если в виде a+ib, то тут нужно разбить строку на части "a","+","b". Дальше через atof преобразовать вещественную и комплексную часть из строки в float. И ещё изменить, если надо, знак комплексной части (это если там не "+", а "-").

Если в другом виде, то соответственно по другому нужно разбивать и преобразовывать.

Автор: DENNN 4.10.2004, 13:35
ИМХО, чтоб какую-никакую работу с комплексными числами организовать, все равно придеться писать под них класс с переопределенными методами.
Ну или готовую библиотеку поискать smile.gif

А вопрос "из стороки сделать комплексное число" сам по-себе без пояснений несет мало ясности.

Автор: Deeoni$ 4.10.2004, 23:08
Цитата(DENNN @ 4.10.2004, 05:35)
ИМХО, чтоб какую-никакую работу с комплексными числами организовать, все равно придеться писать под них класс с переопределенными методами.
Ну или готовую библиотеку поискать smile.gif

А вопрос "из стороки сделать комплексное число" сам по-себе без пояснений несет мало ясности.

мне и надо класс написать простенький сложение, вычитание, деление, умножени, тригонометрическая форма, ввод\вывод.
Пусть у нас есть строка любого вида. Я ее пропарсил и получил два числа, вещественную и мнимую часть, теперь как мне присвоить их переменной соответствующего типа. Такая фигня не прокатывает:
complex <float> a;
float b;
float c;
//.......
a.real()=b;
a.imag()=c;
//........

компилирую если что gcc.exe

Автор: Step 5.10.2004, 09:35
Цитата
Такая фигня не прокатывает:


 ! 
 
убедительная просьба

в подобных случаях цитировать содержание ошибок которые выдал компилятор, в ряде случаев причина может быть не в самом коде

Автор: DENNN 6.10.2004, 09:34
Step,
Deeoni$
Причина очевидна.
про шаблон complex<> ты почитал, а про предназначение real() и imag() - нет.
А они используються только для вывода, но не для ввода. (да и как ты сепбе представляешь ввод в таком виде?)
по поводу иксов ничего не скажу, а вот мсдн приводит пример:
Код

A type that represents the data type used to represent the real and imaginary parts of a complex number.

typedef Type value_type;
Remarks
value_type is a synonym for the class complex Type template parameter.

Example
// complex_valuetype.cpp
// compile with: /EHsc
#include <complex>
#include <iostream>

int main( )
{
  using namespace std;
  complex <double>::value_type a = 3, b = 4;
 
  complex <double> c1 ( a , b );
  cout << "Specifying initial real & imaginary parts"
     << "\nof type value_type: "
     << "c1 = " << c1 << "." << endl;
}
Output
Specifying initial real & imaginary parts
of type value_type: c1 = (3,4).

Очевидный недостаток такого решения - дополнительные телодвижения в случае, когда надо изменить только одну часть комплексного числа.

Автор: anonym 10.7.2007, 23:14
А допустим, я хочу добавить в класс complex метод, поворачивающий вектор, соответствующий данному числу на плоскости, на заданный угол. Почему такой код не работает? 
Код

typedef complex<double> Point;

class MyClass : Point
{
    Point Rotate(double angle)
    {
        Point t(polar(1.0, angle*Pi/180));
        Point temp = Point((double) this.real, (double) this.imag);
        Point res = temp * t;
        return res;
    }    
};

Автор: Xenon 11.7.2007, 01:18
а что значит не работает? smile

Автор: anonym 11.7.2007, 01:37
Короче, пишу
Код

#include <iostream>
#include <complex>
using namespace std;

const double Pi = 2 * asin(1);

typedef complex<double> Point;

class MyClass : Point
{
    MyClass Rotate(double angle)
    {
        MyClass t(polar(1.0, angle*Pi/180));
        MyClass temp = Point((double) this.real, (double) this.imag);
        MyClass res = temp * t;
        return res;
    }    
};

int main()
{
    MyClass a(3, 2);
    MyClass b = a.Rotate(135);
    cout << b << endl;
    return 0;
}

получаю
Main.cpp(13) : error C2664: '__thiscall MyClass::MyClass(const class MyClass &)' : cannot convert parameter 1 from 'class std::complex<double>' to 'const class MyClass &'
        Reason: cannot convert from 'class std::complex<double>' to 'const class MyClass'
        No constructor could take the source type, or constructor overload resolution was ambiguous
Main.cpp(14) : error C2228: left of '.real' must have class/struct/union type
Main.cpp(14) : error C2228: left of '.imag' must have class/struct/union type
Main.cpp(15) : error C2440: 'initializing' : cannot convert from 'class std::complex<double>' to 'class MyClass'
        No constructor could take the source type, or constructor overload resolution was ambiguous
Main.cpp(22) : error C2661: 'MyClass::MyClass' : no overloaded function takes 2 parameters
Main.cpp(23) : error C2248: 'Rotate' : cannot access private member declared in class 'MyClass'
Main.cpp(11) : see declaration of 'Rotate'
Main.cpp(24) : error C2243: 'type cast' : conversion from 'class MyClass *' to 'const class std::complex<double> &' exists, but is inaccessible

Что они там такого набабахали в этом complex??? Или я чего не так делаю?)

Автор: Xenon 11.7.2007, 01:43
Код

#include <iostream>
#include <complex>
using namespace std;

const double Pi = 2 * asin(1);

typedef complex<double> Point;

class MyClass : public Point
{
public:
    MyClass Rotate(double angle)
    {
        MyClass t(polar(1.0, angle*Pi/180));
        MyClass temp = Point((double) this.real, (double) this.imag);
        MyClass res = temp * t;
        return res;
    }    
};

int main()
{
    MyClass a(3, 2);
    MyClass b = a.Rotate(135);
    cout << b << endl;
    return 0;

}


Хотя бы так для начала smile А кто конструктор напишет? Кто иницилизирует базовый класс ? smile

Автор: anonym 11.7.2007, 01:50
Это я так понял написать все варианты конструктора для класса complex и в каждом вызывать конструктор базового класса?...

Да фиг с этим конструктором... Меня больше нарягает, что если даже написать так
Код

#include <iostream>
#include <complex>
using namespace std;

const double Pi = 2 * asin(1);

typedef complex<double> Point;

class MyClass : Point
{
public:
    Point Rotate(double angle)
    {
        Point t(polar(1.0, angle*Pi/180));
        Point temp = Point((double) this.real, (double) this.imag);
        Point res = temp * t;
        return res;
    };    
};

int main()
{
    return 0;
}


то всё равно остаются ошибки
Main.cpp(15) : error C2228: left of '.real' must have class/struct/union type
Main.cpp(15) : error C2228: left of '.imag' must have class/struct/union type

Автор: Xenon 11.7.2007, 01:58
Ты вообще чего делаешь?
this это указатель, поэтому нужно писать this-> а не this. К тому же зачем?
real и imag это функции - чего ты их приводишь к double как переменные smile Я вообще не понимаю чего ты хочешь. А расширение стандартных классов классическим наследованием - нехорошо. Делегированием надо.

Автор: anonym 11.7.2007, 02:05
Цитата(Xenon @  11.7.2007,  01:58 Найти цитируемый пост)
Я вообще не понимаю чего ты хочешь

Да я тоже не совсем, если честно   smile 
Ладно, пасибо, понял, как именно этот код довести до ума, также понял, что делал через одно место)

Автор: anonym 16.7.2007, 16:25
Ну а как всё же расширить этот класс делегированием?... я в принципе представляю себе, что это такое, но как это всё реализовать и чтоб всё грамотно было, с этим проблема... если не трудно, напиши, пожалуйста, код)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)