Требуется помощь в переделке проги. С++

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Требуется помощь в переделке проги. С++

Сообщение Chip115 »

Всем привет!
Малость проболел и не успел сделать лабу, потому нашел исходник в инете, но проблема в том, что тут нужно реализовать перегрузку операторов умножить и разделить друзьями функции. А тут, на сколько я разобрался, методами. Как сделать что бы перегрузка оператора была друзьями?
программа требует ввод комплексных значений в виде Re и Im, которые помещаются в безопасный массив. . Затем формирует комплексные числа и производит с ними операции.


Код: Выделить всё

#include <iostream>
#include <conio.h>
#include <math.h>

using namespace std; // Переход в пространство имен STD

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 abs () // Модуль комплексного числа
	{
		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 << "Please enter a valid part: ";
	fi >> fp.real;
	cout << "Enter the imaginary part: ";
	fi >> fp.image;
	return fi;
}

class massiv 
{
	int size; // Определение размера
	Complex *pm;
	public:
		
		massiv() {size = 0; pm = NULL;} // Конструктор по умолчанию

		massiv (int i) : size (i) // Конструктор по размеру массива
		{
			if (size < 0){cout <<  "\nError: the size of >= 0" << "\n"; getch (); exit (0);}
			// Создание массива
			pm = new Complex [size];
			for (int j = 0; j < size; j++)
				*(pm+j) = Complex(0,0);
		}
		Complex &operator [](int i) // Перегрузка []
		{
			if((i<0) || (i >= size)){cout << "\nError: ''The small size of the array declared''" << "\n"; getch (); exit (0);}
			// Если объявленный массив меньше массива который определен, то завершить программу
			return pm[i];
		}
};

void main()
{

	cout << "\nLab number 3 on the course ''Mathematical models of electronic devices''\n";
	cout << "\nCreating a custom type of a complex number\n\n\n";
	cout <<	"Faculty: REF\nGroup: RE3-81\nStudent: Kopylov A.A.\nInstructor: Neveyko E.N.\n\n\n";
	//clrscr();

	// Комплексные числа
	Complex c1, c2, c3, c4, c5;
	
	// Ввод комплексных чисел
	cin >> c1;
	cin >> c2;
	cin >> c3;
	cin >> c4;
	cin >> c5;
	
	massiv pm(5); // 5 - это размер массива
	// Определение массива
	pm[0]=c1;
	pm[1]=c2;
	pm[2]=c3;
	pm[3]=c4;
	pm[4]=c5;

	// Вывод комплексных чисел
	cout << "\nc1 = " << c1;
	cout << "c2 = " << c2;
	cout << "c3 = " << c3;
	cout << "c4 = " << c4;
	cout << "c5 = " << c5 << '\n';
	cout << "The module c1: " << c1.abs() << "\n\n";
	
	// Вывод результатов операций
	cout << "c1 + c2 = " << (c1 + c2);
	cout << "c1 - c3 = " << (c1 - c3);
	cout << "c1 * c4 = " << (c1 * c4);
	cout << "c1 / c5 = " << (c1 / c5) << "\n\n";

	// Вывод результатов операций с использованием массива
	cout << "Output the results of operations using an array:\n";
	cout << "pm[0] + pm[1] = " << (pm[0] + pm[1]);
	cout << "pm[0] - pm[2] = " << (pm[0] - pm[2]);
	cout << "pm[0] * pm[3] = " << (pm[0] * pm[3]);
	cout << "pm[0] / pm[4] = " << (pm[0] / pm[4]);
	
	getch();
}
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Реклама
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: Требуется помощь в переделке проги. С++

Сообщение BerZerK-ku »

Код: Выделить всё

friend Complex &operator* (Complex &fp1, Complex &fp2)
{
		double i, j;
		i = fp1.real * fp2.real - fp1.image * fp2.image;
		j = fp1.real * fp2.image + fp1.real * fp2.image;
		fp2.real = i;
		fp2.image = j;
		return fp2;
}
friend Complex &operator/ (Complex &fp1, Complex &fp2)
{
		double k, i, j;
		k = fp2.real * fp2.real + fp2.image * fp2.image;
		i = (fp1.real * fp2.real + fp1.image * fp2.image) / k;
		j = (fp2.real * fp1.image - fp1.real * fp2.image) / k;
		fp2.real = i;
		fp2.image = j;
		return fp2;
}
Реклама
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»