Наследование. Вектор на плоскости

244
08 мая 2018, 00:21

Задание: Описать производный класс, дополнительно содержащий методы: умножения вектора на число, сложения двух векторов, вычитания двух векторов. Продемонстрируйте работу всех методов базового и производного классов. В производном классе создайте несколько конструкторов, деструктор. Не забывайте, что в конструкторе производного класса необходимо вызвать конструктор базового класса явным образом.

В ООП я откровенно слаб, но что-то написать получилось. Дело в том, что программа всё делает верно, но не так, как нужно. После того, как я умножил векторы, он берёт результат умножения и после этого уже складывает с вектором. С вычитанием тоже самое. Он берёт результат сложения и уже из него вычитает. Мне нужно, чтобы программа брала начальный вектор. Если у вас есть совет, как это сделать и что в программе лучше поменять, то прощу у вас помощи, т.к. я уже окончательно запутался. Код прилагаю.

/* Описать производный класс, дополнительно содержащий методы: 
умножения вектора на число, сложения двух векторов, вычитания двух векторов. */
#include <iostream>
#include <conio.h>
#include <math.h>
#include <cstdlib>
#include <ctime>
using namespace std;
class pVector
{
protected: double x, y;
public:
    // 1) конструктор для создания вектора с нулевыми координатами
    pVector()
    {
        x = 0.0;
        y = 0.0;
    }
    // 2) конструктор с двумя параметрами для создания вектора
    pVector(double x_, double y_)
    {
        x = x_;
        y = y_;
    }
    // 3) конструктор-копия
    pVector(pVector &k)
    {
        x = k.x;
        y = k.y;
    }
    // Метод. Вывод координат
    void printCoordinates()
    {
        cout << "Координаты вектора: x = " << x <<", y = " << y << endl;
    }
    // Метод. Угол в градусах между вектором и осью OX
    double getAngle()
    {
        if(x == 0.0 && y == 0.0) return 0.0;
        if(x == 0.0) {
            if(y > 0)
                return 90;
            else
                return 270;
        }
        if(y == 0) {
            if(x > 0)
                return 0;
            else
                return 180;
        }
        const double pi=3.14159;
        if(x > 0 && y > 0)
            return atan(y / x) * (180.0 / pi);
        if(x < 0 && y > 0)
            return 180 - atan(y / -x) * (180.0 / pi);
        if(x < 0 && y < 0)
            return 180 + atan(y / x) * (180.0 / pi);
        if(x > 0 && y < 0)
            return 360 - atan(-y / x) * (180.0 / pi);
    }
    // Метод. Равенство векторов
    char isEqual(pVector v)
    {
        bool l;
        double p, c;
        p=sqrt(x*x+y*y);
        c=sqrt(v.x*v.x+v.y*v.y);
        if (p == c)
            l=true;
        else if (x == v.x && y == v.y)
             l=true;
        else 
            l=false;
        if (l==true) cout << "Вектора равны     =" << endl;
        else cout << "Вектора не равны !=" << endl; 
    }
    ~pVector()
    {}
};
class pVector2: public pVector
{ 
double a, b;
public:
    // Конструктор класса pVector2 вызывает конструктор класс pVector
    pVector2() : pVector()
    {}
    pVector2(double a, double b) : pVector(a, b)
    {x=a; y=b;}
    //Умножение вектора на число
    double VBN(double c)
    {
        x=x*c;
        y=y*c;
    }
    //Вывод координат
    void printCoordinates()
    {
        pVector::printCoordinates();
    }
    //Сумма векторов
    double AmountVectors(pVector2 N)
    {
        x=x+N.x;
        y=y+N.y;
    }
    double DifferenceVectors(pVector2 N)
    {
        x=x-N.x;
        y=y-N.y;    
    }
     ~pVector2()
     {}
};
int main()
{
    setlocale(LC_ALL, "Russian");
    srand(time(NULL));
    int a, b, v, p, x1, y1;
    cout << "Каким образом хотите задать координаты вектора? 1, если случайным образом, 2, если вручную: ";
    cin >> v;
    switch(v){
    case 1:{
        a=rand()%10-5;
        b=rand()%10-5;
        break;
    }
    case 2: {
        cout << "X="; cin >> a;
        cout << "Y="; cin >> b;
        break;
    }
}
    system("cls");
    pVector v1;
    pVector v2(3, 4);
    pVector v3(v2);
    pVector v4(2, 8);
    pVector v5(0, 5);
    pVector par(a, b);
    cout << "Параметрический вектор: " << endl;
    par.printCoordinates();
    getch();
    cout << "\nКоординаты векторов: " << endl;
    v1.printCoordinates();
    v2.printCoordinates();
    v3.printCoordinates();
    v4.printCoordinates();
    v5.printCoordinates();
    getch();
    cout << "\nУглы между вектором и осью Ох: "<< endl;
    cout << "v1 Угол: " << v1.getAngle() << endl;
    cout << "v2 Угол: " << v2.getAngle() << endl;
    cout << "v3 Угол: " << v3.getAngle() << endl;
    cout << "v4 Угол: " << v4.getAngle() << endl;
    cout << "v5 Угол: " << v5.getAngle() << endl;
    getch();
    cout << "\nРавенство векторов: " << endl;
    cout << "  " << par.isEqual(v1) << endl;
    cout << "  " << par.isEqual(v2) << endl;
    cout << "  " << par.isEqual(v3) << endl;
    cout << "  " << par.isEqual(v4) << endl;
    cout << "  " << par.isEqual(v5) << endl;
    getch();
    pVector2 v6;
    pVector2 v7(3, 4);
    pVector2 v8(v7);
    pVector2 v9(2, 8);
    pVector2 v10(0, 5);
    cout << "Введите число, на которое хотите умножать вектора: "; cin >> p;
    v6.VBN(p);
    v6.printCoordinates();
    v7.VBN(p);
    v7.printCoordinates();
    v8.VBN(p);
    v8.printCoordinates();
    v9.VBN(p);
    v9.printCoordinates();
    v10.VBN(p);
    v10.printCoordinates();
    cout << endl;
    getch();
    cout << "Сумма векторов" << endl;   
    v6.AmountVectors(v6);
    v6.printCoordinates();
    v7.AmountVectors(v6);
    v7.printCoordinates();  
    v8.AmountVectors(v7);
    v8.printCoordinates();
    v9.AmountVectors(v7);
    v9.printCoordinates();
    v10.AmountVectors(v7);
    v10.printCoordinates();
    cout << endl;   
    getch();
    cout << "Разность векторов" << endl;  
    v6.DifferenceVectors(v6);
    v6.printCoordinates();
    v7.DifferenceVectors(v6);
    v7.printCoordinates();  
    v8.DifferenceVectors(v7);
    v8.printCoordinates();
    v9.DifferenceVectors(v7);
    v9.printCoordinates();
    v10.DifferenceVectors(v7);
    v10.printCoordinates();    
    return 0;
}
Answer 1

Во-первых:

double VBN(double c)
{
    x=x*c;
    y=y*c;
}

как я понял, функция умножения векторов на число. Где возвращаемое значение? И вы вписываете результат умножение сразу в объект класса.

Вам лучше бы перегрузить оператор *, нежели писать такие ф-ции.

friend pvector operator*(const pvector &in, const double &c)
{
    return pvector (in.x * c, in.y * c);
}

Как-то так.

READ ALSO
Замена вектора декой

Замена вектора декой

Помогите понять в чем проблема:

223
Каретка в QLineEdit

Каретка в QLineEdit

Как сделать так, чтобы в QLineEdit автоматически (без нажатия клавиш влево-вправо) отображалась каретка?

230
Почему то не работает деление в программе. Язык C++

Почему то не работает деление в программе. Язык C++

Деление целого на целое в С++ дает целое число, замените 1 на 10

183
с++ WINAPI Edit text работает очень криво

с++ WINAPI Edit text работает очень криво

Начал изучать winapi в c++ написал простенькую программку которая меняет название окна на то что мы написали в текст боксе:

210