Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/92: Рейтинг темы: голосов - 92, средняя оценка - 4.73
 Аватар для JaEvg
1 / 1 / 0
Регистрация: 23.09.2010
Сообщений: 31

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

01.03.2011, 12:35. Показов 17213. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Чот уже вторую неделю бьюсь над кодом, а осилить не могу, подскажите
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();
}
Там по заданию основные операции и их перегрузки и корень числа
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.03.2011, 12:35
Ответы с готовыми решениями:

Перегрузка оператора, комплексные числа
Не могу понять что делаю не так, компилятор выдает ошибки. Но все они из за неправельной перегрузки операторов вывода &lt;&lt; и &gt;&gt;...

C++ перегрузка операторов, комплексные числа
Помогите разобраться в предоставленной программе.. Сама программа(не сначала..до этого всё вроде понятно): // Вспомогательная...

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

10
54 / 54 / 9
Регистрация: 09.11.2010
Сообщений: 120
01.03.2011, 13:27
Как мне кажется, такая запись
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";
1
 Аватар для kazak
3599 / 2741 / 354
Регистрация: 11.03.2009
Сообщений: 6,298
01.03.2011, 14:05
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 Посмотреть сообщение
Как мне кажется, такая запись
не верна.
Совершенно верно.
1
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
01.03.2011, 14:22
Что вы понимаете под корнем из комплексного числа?
То, что вы вычисляете, это похоже на модуль комплексного числа, да и тот с ошибками.

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

Для этого внутри класса пишем:
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";
1
 Аватар для kazak
3599 / 2741 / 354
Регистрация: 11.03.2009
Сообщений: 6,298
01.03.2011, 14:32
А зачем функцию дружественной делать?
1
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
01.03.2011, 16:16
На случай, если в компиляторе 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. У вас там еще баги с перегрузкой операций. Если никто ничего не предложит или вы сами их не найдете, посмотрю уже в начале новых суток.

Удачи, играйтесь пока с корнем.
2
 Аватар для JaEvg
1 / 1 / 0
Регистрация: 23.09.2010
Сообщений: 31
01.03.2011, 16:41  [ТС]
Спасибо, вечер посвящу редактированию по советам
0
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
01.03.2011, 16:47
Да, и вверху еще допишите
C++
1
#define M_PI       3.14159265358979323846
а то внутри собственного класса ПИ не появится.
0
 Аватар для JaEvg
1 / 1 / 0
Регистрация: 23.09.2010
Сообщений: 31
02.03.2011, 12:13  [ТС]
не, чот ересь какая-то с перегрузкой (корень пока откинул) с 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();
}
1
 Аватар для kazak
3599 / 2741 / 354
Регистрация: 11.03.2009
Сообщений: 6,298
02.03.2011, 12:40
Цитата Сообщение от JaEvg Посмотреть сообщение
чот ересь какая-то с перегрузкой
не очено-то информативно
Цитата Сообщение от JaEvg Посмотреть сообщение
с ostream ошибками сыплет
ошибка ошибке рознь, у каждой описание есть.
0
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
02.03.2011, 12:57
Цитата Сообщение от JaEvg Посмотреть сообщение
не, чот ересь какая-то с перегрузкой
Угу, и предать нас всех анафеме за то, что его преосвящество не может готовый код скопипастить.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.03.2011, 12:57
Помогаю со студенческими работами здесь

Комплексные числа
2. Даны два комплексных числа в алгебраической форме. Найти их произведение. Пример //Лаб.раб.№ 1. Линейная программа. ...

Комплексные числа
Доброе время суток! Я новичок в Си++ а задали задание сделать: Заранее спасибо!

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

Комплексные числа
Сформировать массив из 10 элементов в диапазоне из структуры комплексных чисел.

комплексные числа
дан список, элементы которого являются комплексными числами. Найти сумму элементов списка


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru