Сложение и вычитание комплексных чисел с использованием класса в C ++ - PullRequest
0 голосов
/ 16 февраля 2012

У меня есть код, который должен задавать пользователю два набора действительных и мнимых чисел.

#include <iostream>

using namespace std;

class Complex {
    public:
        double r;
        double i;
    public:
        Complex();
        void add(Complex, Complex);
        void subtract(Complex, Complex);
        void print();
};



Complex::Complex() {
    r = i = 0;
}

void Complex::add (Complex op1, Complex op2) {
    r = op1.r+op2.r;
    i = op1.i+op2.i;
}

void Complex::subtract (Complex op1, Complex op2) {
     r = op1.r-op2.r;
     i = op1.i-op2.i;
}

void Complex::print () {
    cout << r << i;
}

int main () {
    Complex operand1, operand2, result;
    cout << "Input real part for operand one: " << endl;
    cin >> operand1.r;
    cout << "Input imaginary part for operand one: " << endl;
    cin >> operand1.i;
    cout << "Input real part for operand two: " << endl;
    cin >> operand2.r;
    cout << "Input imaginary part for operand two: " << endl;
    cin >> operand2.i;
    result.add(operand1, operand2);
    cout << "The sum is " << result.add << endl;
    result.subtract(operand1, operand2);
    cout << "The difference is " << result.subtract << endl;
}

Однако, когда я скомпилировал программу, отображается много ошибок (std :: basic_ostream), которых я даже не получаю.

Другая проблема, с которой я столкнулся, связана с функцией void :: Complex print. Там должно быть условие внутри самого кута. Нет, если-еще. Но я понятия не имею, что делать.
Программа должна работать так:
Введите вещественную часть для первого операнда: 5
Введите мнимую часть для операнда один: 2 (i для мнимого не должно быть написано)
Введите вещественную часть для второго операнда: 8
Введите мнимую часть для второго операнда: 1 (опять же, мне не нужно вводить)
/ тогда он напечатает введенные (ed) числа /
(5, 2i) // на этот раз с i
(8, 1i)
/ тогда ответы /
Сумма 13 + 3i.
Разница составляет -3,1i. // или -3, я

Пожалуйста, помогите мне! Я новичок в C ++ и здесь, в stackoverflow, и ваша помощь будет принята с благодарностью. Большое спасибо!

Ответы [ 5 ]

2 голосов
/ 16 февраля 2012

Линия

cout << "Сумма" << result.add << endl; </p>

неверен, так как add является методом, поэтому result.add будет указателем на этот метод, а cout не знает, как его обработать - что заставляет компилятор выплевывать его.

Измените строку на

cout << "The sum is ";
result.print();
cout << endl;

Вы должны сделать то же самое для линии

cout << "The difference is " << result.subtract << endl;

Что касается стиля кодирования, два метода перезаписывают существующее комплексное число. Возможно, иметь такую ​​функцию было бы лучше

Complex &Complex::add (const Complex &op) { 
    r += op.r; 
    i += op.i;
    return *this;
}

Это позволит вам связывать вместе сложения, а также просто добавлять комплексное число к существующему комплексному номеру.

Кроме того, вы можете сделать переменные класса r и i закрытыми. Для этого потребуется альтернативный конструктор:

Complex:Complex(double real, double imaginary) : r(real), i(imaginary) {};

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

0 голосов
/ 02 мая 2019

Я также работаю с комплексными числами, вот мой файл ComplexNumbers.h:

#include <iostream> // for std namespace
class ComplexNumber
{
    public:
        ComplexNumber();
        ComplexNumber(float RealPart, float ImaginaryPart);
        ComplexNumber(ComplexNumber &NewComplexNumber);
        void SetRealPart(float RealPart);
        void SetImaginaryPart(float ImaginaryPart);
        friend ComplexNumber operator+(const ComplexNumber Complex1, const ComplexNumber Complex2);
        friend ComplexNumber operator-(const ComplexNumber Complex1, const ComplexNumber Complex2);
        friend std::ostream & operator<<(std::ostream &output, const ComplexNumber &NumberToDsiplay);
        friend std::istream & operator >>(std::istream &input, ComplexNumber &NumberToInput);
        bool operator==(const ComplexNumber Complex);
        bool operator!=(const ComplexNumber Complex);

    private:
        float RealPart;
        float ImaginaryPart;
};

и файл .cpp это:

#include "Complex Numbers.h"

ComplexNumber::ComplexNumber()
{
    RealPart = 0;
    ImaginaryPart = 0;
}

ComplexNumber::ComplexNumber(float RealPart, float ImaginaryPart)
{
    SetRealPart(RealPart);
    SetImaginaryPart(ImaginaryPart);
}

ComplexNumber::ComplexNumber(ComplexNumber &NewComplexNumber)
{
    RealPart = NewComplexNumber.RealPart;
    ImaginaryPart = NewComplexNumber.ImaginaryPart;
}

void ComplexNumber::SetRealPart(float RealPart)
{
    this->RealPart=RealPart;
}

void ComplexNumber::SetImaginaryPart(float ImaginaryPart)
{
    this->ImaginaryPart=ImaginaryPart;
}

ComplexNumber operator+(const ComplexNumber Complex1, const ComplexNumber Complex2)
{
    ComplexNumber TemporaryComplexNumber;
    TemporaryComplexNumber.RealPart = Complex1.RealPart + Complex2.RealPart;
    TemporaryComplexNumber.ImaginaryPart = Complex1.ImaginaryPart + Complex2.ImaginaryPart;

    return TemporaryComplexNumber;
}

ComplexNumber operator-(const ComplexNumber Complex1, const ComplexNumber Complex2)
{
    ComplexNumber TemporaryComplexNumber;
    TemporaryComplexNumber.RealPart = Complex1.RealPart - Complex2.RealPart;
    TemporaryComplexNumber.ImaginaryPart = Complex1.ImaginaryPart - Complex2.ImaginaryPart;

    return TemporaryComplexNumber;
}


std::ostream & operator<<(std::ostream &output, const ComplexNumber &NumberToDsiplay)
{
    if(NumberToDsiplay.ImaginaryPart > 0)
        output << NumberToDsiplay.RealPart << "+" << NumberToDsiplay.ImaginaryPart << "i";
    else if(NumberToDsiplay.ImaginaryPart < 0)
        output << NumberToDsiplay.RealPart << "" << NumberToDsiplay.ImaginaryPart << "i";
    else
        output << NumberToDsiplay.RealPart << "+" << NumberToDsiplay.ImaginaryPart << "i";
    return output;
}

std::istream & operator >>(std::istream &input, ComplexNumber &NumberToInput)
{
    std::cout << "Enter the real part: ";
    input >> NumberToInput.RealPart;
    std::cout << "Enter the imaginary part: ";
    input >> NumberToInput.ImaginaryPart;
}

bool ComplexNumber::operator==(const ComplexNumber Complex)
{
    return RealPart==Complex.RealPart && ImaginaryPart==Complex.ImaginaryPart;
}

bool ComplexNumber::operator!=(const ComplexNumber Complex)
{
    if(RealPart != Complex.RealPart && ImaginaryPart != Complex.ImaginaryPart)
            return true;
    else if(RealPart != Complex.RealPart && (!(ImaginaryPart != Complex.ImaginaryPart)))
            return true;
    else if(ImaginaryPart != Complex.ImaginaryPart && (!(RealPart != Complex.RealPart)))
        return true;

    return false;
}
0 голосов
/ 17 марта 2017

Вы уже используете пространство имен std ::.Просто используйте в нем библиотеку комплексных чисел, как этот ответ предлагает: Добавление комплексных чисел с использованием классов

0 голосов
/ 01 июля 2013

Попробуйте еще раз с небольшими исправлениями

    #include <iostream.h>
    class Complex {
        public:
        double r; //real part
        double i; //imaginary part
        public:
        void add(Complex, Complex);
        void subtract(Complex, Complex);
        void print();
    };

    void Complex::add (Complex op1, Complex op2) {
        r = op1.r + op2.r;
        i = op1.i + op2.i;
    }

    void Complex::subtract (Complex op1, Complex op2) {
         r = op1.r - op2.r;
         i = op1.i - op2.i;
    }

    void Complex::print () {
        cout << "("<<r<<", " << i <<")";
    }

    void main () {
        Complex operand1, operand2, result;
        cout << "\nInput real part for operand one: " << endl;
        cin >> operand1.r;
        cout << "Input imaginary part for operand one: " << endl;
        cin >> operand1.i;
        cout << "Input real part for operand two: " << endl;
        cin >> operand2.r;
        cout << "Input imaginary part for operand two: " << endl;
        cin >> operand2.i;
        cout << "\nThe sum is ";
        result.add(operand1, operand2);
        result.print();
        cout << "\nThe difference is ";
        result.subtract(operand1, operand2);
        result.print();
    }
0 голосов
/ 16 февраля 2012

В main после вызова result.add вы помещаете ту же функцию в поток cout, когда он ничего не возвращает. Я думаю, что вы хотели написать cout << "сумма равна" << result.print (); </p>

...