С++ Модифицировать программу(закрытые переменные)

С++ Модифицировать программу(закрытые переменные)

Здравствуйте! Кому не сложно, помогите пожалуйста модифицировать программу таким образом, чтобы класс содержал закрытые переменные. Код готов. И еще проблема в программе есть когда выводится комплексное число после сложения, вычитания или умножения получается какой-то неверный вид, как исправить?(посмотрите изображение).
альтернативный текст
Вот само условие, если что:Составить описание класса для представления комплексных чисел. Обеспечить выполнение операций сложения, вычитания и умножения комплексных чисел.

#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;

class Komplecs{
int *a;
public:

        Komplecs()
    {
        a= new int[2];
        a[0] = 0;
        a[1] = 0;
    }

    ~Komplecs()
    {
     delete []a;
    }
 void Vvod();
 void Slog();
 void Umnog();
 void Vich();
  void Print();
};
void Komplecs::Print()
{
    cout<<a[0] <<"+i*"<<a[1]<<endl;
}

void Komplecs::Vvod()
{
cout<<"Введите действительную часть числа";
cout<<endl;
cin>>a[0];
cout<<"Введите мнимую часть числа";cout<<endl;
cin>>a[1];
cout<<endl;cout<<"Число равно  ";
cout<< a[0]<<"+i*"<< a[1];cout<<endl;
}
void Komplecs::Slog()
{int t,d,x,z;
cout<<"Введите действительную часть первого числа";
cout<<endl;
cin>>t;
cout<<"Введите мнимую часть первого числа";cout<<endl;
cin>>d;
cout<<endl;
cout<<"Введите действительную часть второго числа";
cout<<endl;
cin>>x;
cout<<"Введите мнимую часть второго числа";cout<<endl;
cin>>z;
a[0]=(t+x);
a[1]=(d+z);
cout<<"Сумма равна";
cout<<endl;
cout<< a<<"+i*"<< a[1]; cout<<endl;
}
void Komplecs::Umnog()
{
int t,d,x,z;
cout<<"Введите действительную часть первого числа";
cout<<endl;
cin>>t;
cout<<"Введите мнимую часть первого числа";cout<<endl;
cin>>d;
cout<<endl;
cout<<"Введите действительную часть второго числа";
cout<<endl;
cin>>x;
cout<<"Введите мнимую часть второго числа"; cout<<endl;
cin>>z;
a[0]=(t*x-d*z);
a[1]=(t*z+d*x);
cout<<"При умножении число равно";cout<<endl;
cout<< a<<"+i*"<< a[1];cout<<endl;
}
void Komplecs::Vich()
{
int t,d,x,z;
cout<<"Введите действительную часть первого числа";
cout<<endl;
cin>>t;
cout<<"Введите мнимую часть первого числа";cout<<endl;
cin>>d;
cout<<endl;
cout<<"Введите действительную часть второго числа";
cout<<endl;
cin>>x;
cout<<"Введите мнимую часть второго числа";cout<<endl;
cin>>z;
a[0]=(t-x);
a[1]=(d-z);
cout<<"При вычитании число равно";cout<<endl;
cout<< a<<"+i*"<< a[1];cout<<endl;
}


void main()
{ 
    setlocale (LC_ALL, "Russian");
    Komplecs c;int v;
v=1;
while(v!=0)
{
cout<<endl;
cout<<"1-Ввод числа";cout<<endl;
cout<<"2-Сложение чисел"; cout<<endl;
cout<<"3-Умножение чисел";cout<<endl;
cout<<"4-Вычитание чисел";cout<<endl;
cout<<"0-Выход";cout<<endl;
cin>>v;
if (v==1)
{
c.Vvod();
}
if (v==2)
{
c.Slog();
}
if (v==3)
{
c.Umnog();
}
if (v==4)
{
c.Vich();
}
} }

(1) У тебя и так есть закрытые переменные в количестве 1 (одна) штука — это a. По умолчанию, пока не указано public или protected члены класса считаются private.

(2) При выводе числа «какой-то неверный вид» из-за того, что в строке cout<< a<<"+i*"<< a[1];cout<<endl; вместо a[0] ты выводишь значение a, которое равно адресу первого элемента массива.

(3) Для такого класса совершенно излишне динамически выделять память для хранения данных.

(4) Тип данных для действительной и мнимой части комплексного числа должен быть с плавающей точкой. По определению комплексного числа.

(5) «Код готов» — это ещё слабо сказано )) Не в обиду, но данный код демонстрирует полное непонимание принципов ООП. Классы — это не синтаксическая обёртка для фрагментов кода. Экземпляр класса должен работать как самостоятельная сущность.

(6) Выполняю просьбу по модификации программы:

#include <iostream>

using namespace std;

class Komplecs {
private:
    double r, i;
public:

    Komplecs() : r(0.0), i(0.0) { }
    Komplecs(double ar, double ai) : r(ar), i (ai) { }

    void Vvod();
    void Print();

    friend Komplecs operator+(Komplecs a, Komplecs b);
    friend Komplecs operator-(Komplecs a, Komplecs b);
    friend Komplecs operator*(Komplecs a, Komplecs b);
};

void Komplecs::Print()
{
    cout << r << "+i*";
    if (i < 0) {
        cout << "(" << i << ")";
    }
    else {
         cout << i;
    }
    cout << endl;
}

void Komplecs::Vvod()
{
    cout << "  действительная часть числа: ";
    cin >> r;
    cout << "  мнимая часть числа: ";
    cin >> i;
    cout << "  введено число: ";
    Print();
}

Komplecs operator+(Komplecs a, Komplecs b)
{
    return Komplecs(a.r + b.r, a.i + b.i);
}

Komplecs operator-(Komplecs a, Komplecs b)
{
    return Komplecs(a.r - b.r, a.i - b.i);
}

Komplecs operator*(Komplecs a, Komplecs b)
{
    return Komplecs(a.r * b.r - a.i * b.i, a.r * b.i + a.i * b.r);
}


int main() 
{ 
    setlocale (LC_ALL, "Russian");

    cout << "*** Типа комплексная арифметика ***\n";

    Komplecs a, b;

    int v = 1;

    while (true)
    {
        cout <<
            "\n"
            "1-Сложение чисел\n"
            "2-Умножение чисел\n"
            "3-Вычитание чисел\n"
            "0-Выход" << endl;
        cin >> v;
        if (v == 0) {
            break;
        }

        if (v < 1 || v > 3) {
            cout << "Не угадал. Попробуй ещё раз!" << endl;
            continue;
        }

        cout << "\nВведите первое число:\n";
        a.Vvod();
        cout << "\nВведите второе число:\n";
        b.Vvod();
        cout << endl;

        switch (v) {
            case 1:
                cout << "Результат сложения: ";
                (a + b).Print();
                break;
            case 2:
                cout << "Результат умножения: " << endl;
                (a * b).Print();
                break;
            case 3:
                cout << "Результат вычитания: " << endl;
                (a - b).Print();
                break;
        }

    } 
    return 0;
}

Комментарии не нужны. Код должен говорить сам за себя. (с) не я ))

Но некоторые места я всё-таки поясню.

  1. Добавлен второй конструктор, принимающий действительную и мнимую часть комплексного числа. Активно используется в функциях перегруженных арифметических операторов.
  2. Сложение, вычитание и умножение оформлены как дружественные функции перегрузки соответствующих операторов. Привычнее написать a + b, чем a.Slog(b).
  3. В функциях, реализующих перегруженные арифметические операторы, используется второй конструктор класса. В качестве аргументов он получает вычисленные действительную и мнимую части нового комплексного числа. После отработки конструктора, созданный им экземпляр класса (безымянный) возвращается функцией как результат.
  4. В функции main() строки типа (a + b).Print(); работают так: для безымянного экземпляра класса, полученного в результате сложения (см. п.3), вызывается метод Print(). Далее этот объект не нужен и будет автоматически уничтожен при выходе из функции main().

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.