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

Комплексные числа/перегрузка - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 41, средняя оценка - 4.73
JaEvg
 Аватар для JaEvg
1 / 1 / 0
Регистрация: 23.09.2010
Сообщений: 31
01.03.2011, 12:35     Комплексные числа/перегрузка #1
Чот уже вторую неделю бьюсь над кодом, а осилить не могу, подскажите
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
#include <iostream.h>
#include <conio.h>
#include <math.h>
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() {} // Деструктор
float sqrt() // Корень комплексного числа
{
return sqrt(real * real - image * image);
}
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 << "Введите действительную часть: ";
fi >> fp.real;
cout << "Введите мнимую часть: ";
fi >> fp.image;
return fi;
}
void main()
{
clrscr();
// Комплексные числа
Complex c1, c2;
// Ввод комплексных чисел
cin >> c1;
cin >> c2;
// Вывод комплексных чисел
cout << "\nc1 = " << c1;
cout << "c2 = " << c2 << '\n';
cout << "Корень c1: " << c1.sqrt() << "\n\n";
// Вывод результатов операций
cout << "c1 + c2 = " << (c1 + c2);
cout << "c1 - c2 = " << (c1 - c2);
cout << "c1 * c2 = " << (c1 * c2);
cout << "c1 / c2 = " << (c1 / c2);
getch();
}
Там по заданию основные операции и их перегрузки и корень числа
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2011, 12:35     Комплексные числа/перегрузка
Посмотрите здесь:

C++ Комплексные числа
C++ Комплексные числа
C++ Комплексные числа
C++ Комплексные числа
C++ перегрузка операторов, комплексные числа C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Escapable
53 / 53 / 1
Регистрация: 09.11.2010
Сообщений: 120
01.03.2011, 13:27     Комплексные числа/перегрузка #2
Как мне кажется, такая запись
C++
1
float sqrt() {}
не верна. Зачем перегружать уже зарезервированную функцию, которая прописана в "math.h"? И дальше получается неоднозначный вызов перегруженной функции ...
C++
1
sqrt(real * real - image * image);
И вместо "float" все же лучше использовать "double".

Как вариант:
C++
1
2
3
4
double root() // Корень комплексного числа
{
    return sqrt(real * real - image * image);
}
И соответственно в строке 90
C++
1
cout << "Корень c1: " << c1.root() << "\n\n";
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
01.03.2011, 14:05     Комплексные числа/перегрузка #3
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
#include <iostream.h>
#include <conio.h>
#include <math.h>
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() {} // Äåñòðóêòîð
   float sqrt_() // ÊîðåГ*Гј êîìïëåêñГ*îãî Г·ГЁГ±Г«Г*
   {
      return sqrt(real * real - image * image);
   }
   Complex operator+(const Complex &) const; // ÏåðåãðóçêГ* îïåðГ*òîðГ* ñëîæåГ*ГЁГї
   Complex operator-(const Complex &) const; // ÏåðåãðóçêГ* îïåðГ*òîðГ* âû÷èòГ*Г*ГЁГї
   Complex operator*(const Complex &) const; // ÏåðåãðóçêГ* îïåðГ*òîðГ* ГіГ¬Г*îæåГ*ГЁГї
   Complex operator/(const Complex &) const; // ÏåðåãðóçêГ* îïåðГ*òîðГ* äåëåГ*ГЁГї
   // ÏåðåãðóçêГ* ГґГіГ*êöèè-îïåðГ*òîðГ* << äëÿ âûâîäГ* ГЄГ«Г*Г±Г±Г* Complex
   friend ostream &operator<<(ostream &, const Complex &);
   // ÏåðåãðóçêГ* ГґГіГ*êöèè-îïåðГ*òîðГ* >> äëÿ ââîäГ* ГЄГ«Г*Г±Г±Г* Complex
   friend istream &operator>>(istream &, Complex &);
};
// ÏåðåãðóçêГ* +
Complex Complex::operator+(const Complex &fp1) const
{
   Complex sum;
   sum.real = real + fp1.real;
   sum.image = image + fp1.image;
   return sum;
}
// ÏåðåãðóçêГ* -
Complex Complex::operator-(const Complex &fp1) const
{
   Complex dif;
   dif.real = real - fp1.real;
   dif.image = image - fp1.image;
   return dif;
}
// ÏåðåãðóçêГ* *
Complex Complex::operator*(const Complex &fp1) const
{
   Complex prod;
   prod.real = real * fp1.real - image * fp1.image;
   prod.image = real * fp1.image + fp1.real * image;
   return prod;
}
// ÏåðåãðóçêГ* /
Complex Complex::operator/(const Complex &fp1) const
{
   Complex quot;
   double k;
   k = fp1.real * fp1.real + fp1.image * fp1.image;
   quot.real = (real * fp1.real + image * fp1.image) / k;
   quot.image = (fp1.real * image - real * fp1.image) / k;
   return quot;
}
// ÏåðåãðóçêГ* îïåðГ*òîðГ* <<
ostream &operator<< (ostream &fo, const 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 << "Ââåäèòå äåéñòâèòåëüГ*ГіГѕ Г·Г*Г±ГІГј: ";
   fi >> fp.real;
   cout << "Ââåäèòå Г¬Г*èìóþ Г·Г*Г±ГІГј: ";
   fi >> fp.image;
   return fi;
}
void main()
{
   clrscr();
   // ÊîìïëåêñГ*ûå Г·ГЁГ±Г«Г*
   Complex c1, c2;
   // Ââîä êîìïëåêñГ*ûõ Г·ГЁГ±ГҐГ«
   cin >> c1;
   cin >> c2;
   // Âûâîä êîìïëåêñГ*ûõ Г·ГЁГ±ГҐГ«
   cout << "\nc1 = " << c1;
   cout << "c2 = " << c2 << '\n';
   cout << "ÊîðåГ*Гј c1: " << c1.sqrt_() << "\n\n";
   // Âûâîä ðåçóëüòГ*òîâ îïåðГ*öèé
   cout << "c1 + c2 = " << (c1 + c2);
   cout << "c1 - c2 = " << c1 - c2;
   cout << "c1 * c2 = " << (c1 * c2);
   cout << "c1 / c2 = " << (c1 / c2);
   getch();
}
Цитата Сообщение от Escapable Посмотреть сообщение
Как мне кажется, такая запись
не верна.
Совершенно верно.
IrineK
Заблокирован
01.03.2011, 14:22     Комплексные числа/перегрузка #4
Что вы понимаете под корнем из комплексного числа?
То, что вы вычисляете, это похоже на модуль комплексного числа, да и тот с ошибками.

В данном случае имеет смысл перезагрузить операцию вычисления квадрата комплексного числа, а не сомнительного корня.

Для этого внутри класса пишем:
C++
1
friend double square(Complex &);
Сама функция (сразу под описанием класса) будет иметь вид:
C++
1
2
3
4
5
double square(Complex &fp1)
{
    double i=fp1.real * fp1.real - fp1.image * fp1.image;
    return i;
}
Обращение к функции:
C++
1
cout << "Квадрат c1: " << square(c1) << "\n\n";
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
01.03.2011, 14:32     Комплексные числа/перегрузка #5
А зачем функцию дружественной делать?
IrineK
Заблокирован
01.03.2011, 16:16     Комплексные числа/перегрузка #6
На случай, если в компиляторе square() есть. Если нет - тогда не надо.
Сейчас напишу корень по-чесному - сброшу.

Добавлено через 1 час 35 минут
Для того, чтобы перегрузить корень, вводим в класс следующие функции:

C++
1
2
3
double module(); // Модуль комплексного числа
double arg(); //Агрумент комплексного числа
friend void sqrt(Complex &); //Перегрузка корня
Под описанием класса определяем функции:
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
double Complex::module()
{   double i=sqrt(real * real + image * image);
    return i;
}
 
double Complex::arg()
{   double i;
    if(real) i=atan(image/real);
    else if(image>0)i= M_PI/2;
    else i= -M_PI/2;
    return i;
}
 
void sqrt(Complex &f)
{   Complex res[2];
    double sqmod = sqrt(f.module());
    double sqarg = f.arg()/2;
    res[0].real=sqmod*cos(sqarg);
    res[0].image=sqmod*sin(sqarg);
    res[1].real=sqmod*cos(sqarg);
    res[1].image=-sqmod*sin(sqarg);
    cout<<"     1: "<<res[0];
    cout<<"     2: "<<res[1];
}
В модуле main() дописываем:
C++
1
2
3
4
cout << "Модуль c1: "<<c1.module()<<endl;
cout << "Аргумент c1: "<<c1.arg()<<endl;
cout << "Корень c1: "<<endl;
sqrt(c1);
Теперь эта часть работает корректно.

P.S. У вас там еще баги с перегрузкой операций. Если никто ничего не предложит или вы сами их не найдете, посмотрю уже в начале новых суток.

Удачи, играйтесь пока с корнем.
JaEvg
 Аватар для JaEvg
1 / 1 / 0
Регистрация: 23.09.2010
Сообщений: 31
01.03.2011, 16:41  [ТС]     Комплексные числа/перегрузка #7
Спасибо, вечер посвящу редактированию по советам
IrineK
Заблокирован
01.03.2011, 16:47     Комплексные числа/перегрузка #8
Да, и вверху еще допишите
C++
1
#define M_PI       3.14159265358979323846
а то внутри собственного класса ПИ не появится.
JaEvg
 Аватар для JaEvg
1 / 1 / 0
Регистрация: 23.09.2010
Сообщений: 31
02.03.2011, 12:13  [ТС]     Комплексные числа/перегрузка #9
не, чот ересь какая-то с перегрузкой (корень пока откинул) с ostream ошибками сыплет и ещё хз чо

Добавлено через 20 минут
хотя по подкинутой проге вроде тянет, корень осталось реализовать
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
# include <iostream>
# include <stdlib.h>
# include <conio.h>
 
using namespace std;
struct complex{
double a,b;
};
class Complex{
complex comp;
public:
Complex(double x=0,double y=0){
comp.a=x;
comp.b=y;
}
Complex operator +(const Complex &c);
Complex operator *(const Complex &c);
Complex operator -(const Complex &c);
Complex operator /(const Complex &c);
const Complex& operator =(const Complex &c){
comp.a=c.comp.a;
comp.b=c.comp.b;
return *this;
}
Complex conj();
Complex Read();
void Display();
};
Complex Complex::operator +(const Complex &c){
Complex d;
d.comp.a=comp.a+c.comp.a;
d.comp.b=comp.b+c.comp.b;
return d;
}
Complex Complex::operator *(const Complex &c){
Complex t;
t.comp.a=comp.a*c.comp.a-comp.b*c.comp.b;
t.comp.b=comp.a*c.comp.b+comp.b*c.comp.a;
return t;
}
Complex Complex::operator /(const Complex &c){
Complex t;
t.comp.a=(comp.a*c.comp.a+comp.b*c.comp.b)/(comp.a*comp.a+comp.b*comp.b);
t.comp.b=(comp.b*c.comp.a-comp.a*c.comp.b)/(comp.a*comp.a+comp.b*comp.b);
return t;
}
Complex Complex::operator -(const Complex &c){
Complex y;
y.comp.a=comp.a-c.comp.a;
y.comp.b=comp.b-c.comp.b;
return y;
}
Complex Complex::conj(){
comp.a=comp.a;
comp.b=-comp.b;
return *this;
}
void Complex::Display(){
if(comp.b>=0)
cout<<comp.a<<"+"<<comp.b<<"i\n";
else
cout<<comp.a<<comp.b<<"i\n";
}
Complex Complex::Read(){
double x,y;
cout<<"Действительнвая часть: ";
cin>>x;
cout<<"Мнимая часть: : ";
cin>>y;
Complex A=Complex(x,y);
return A;
}
//-----------------------------------------------------------
void execute()
{ 
cout<<" Задание: \n";
cout<<" Реализовать класс Complex для работы с комплексными числами.\n";
cout<<" Комплексное число представляются парой действительных чисел (a, b), где\n";
cout<<" a - действительная часть, b - мнимая часть. \n";
cout<<" Реализовать операции:\n";
cout<<" - сложения\n";
cout<<" - вычитания\n";
cout<<" - умножения\n";
cout<<" - деления\n";
}
int chois(){
int chois_1;
cout<<" Операции комплексными числами\n";
cout<<" 1 - Сложение\n";
cout<<" 2 - Вычитание\n ";
cout<<" 3 - Умножение\n";
cout<<" 4 - Деление\n";
cout<<" 0 - Выход\n\n";
cout<<"\n Выберите действие : \n";
cin>>chois_1;
return chois_1;
}
void choise(){
switch (chois()){
case 1: { 
Complex a,b;
cout<<"Первое число:\n";
a=a.Read();
cout<<"Второе число:\n";
b=b.Read();
Complex c=a+b;
c.Display();
break;
}
case 2:{ 
Complex a,b;
cout<<"Первое число:\n";
a=a.Read();
cout<<"Второе число:\n";
b=b.Read();
Complex c=a-b;
c.Display();
break;
}
case 3 :{ 
Complex a,b;
cout<<"Первое число:\n";
a=a.Read();
cout<<"Второе число:\n";
b=b.Read();
Complex c=a*b;
c.Display();
break;
}
case 4:{
Complex a,b;
cout<<"Первое число:\n";
a=a.Read();
cout<<"Второе число:\n";
b=b.Read();
Complex c=a/b;
c.Display();
break;
}
case 5:{
Complex a;
cout<<"Комплексное число : \n";
a=a.Read();
cout<<"Комплексное число : ";
a.Display();
Complex c=a.conj();
cout<<"\nСопреженное комплексное число :";
c.Display();
break;
}
default :exit(0);
}
system("pause");
system("cls");
choise();
 
}
//-----------------------------------------------------------
int main (){
setlocale(LC_ALL, "Russian" );
execute();
cout<<"\n -------------------------------------------------------\n";
cout<<"\n\n\n\n\n\n\n\n\n\n\n\n";
choise();
}
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
02.03.2011, 12:40     Комплексные числа/перегрузка #10
Цитата Сообщение от JaEvg Посмотреть сообщение
чот ересь какая-то с перегрузкой
не очено-то информативно
Цитата Сообщение от JaEvg Посмотреть сообщение
с ostream ошибками сыплет
ошибка ошибке рознь, у каждой описание есть.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2011, 12:57     Комплексные числа/перегрузка
Еще ссылки по теме:

Комплексные числа C++
Классы, комплексные числа и перегрузка оператора C++
Перегрузка оператора, комплексные числа C++

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

Или воспользуйтесь поиском по форуму:
IrineK
Заблокирован
02.03.2011, 12:57     Комплексные числа/перегрузка #11
Цитата Сообщение от JaEvg Посмотреть сообщение
не, чот ересь какая-то с перегрузкой
Угу, и предать нас всех анафеме за то, что его преосвящество не может готовый код скопипастить.
Yandex
Объявления
02.03.2011, 12:57     Комплексные числа/перегрузка
Ответ Создать тему
Опции темы

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