Задание: Описать производный класс, дополнительно содержащий методы: умножения вектора на число, сложения двух векторов, вычитания двух векторов. Продемонстрируйте работу всех методов базового и производного классов. В производном классе создайте несколько конструкторов, деструктор. Не забывайте, что в конструкторе производного класса необходимо вызвать конструктор базового класса явным образом.
В ООП я откровенно слаб, но что-то написать получилось. Дело в том, что программа всё делает верно, но не так, как нужно. После того, как я умножил векторы, он берёт результат умножения и после этого уже складывает с вектором. С вычитанием тоже самое. Он берёт результат сложения и уже из него вычитает. Мне нужно, чтобы программа брала начальный вектор. Если у вас есть совет, как это сделать и что в программе лучше поменять, то прощу у вас помощи, т.к. я уже окончательно запутался. Код прилагаю.
/* Описать производный класс, дополнительно содержащий методы:
умножения вектора на число, сложения двух векторов, вычитания двух векторов. */
#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;
}
Во-первых:
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);
}
Как-то так.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Как сделать так, чтобы в QLineEdit автоматически (без нажатия клавиш влево-вправо) отображалась каретка?
Деление целого на целое в С++ дает целое число, замените 1 на 10
Начал изучать winapi в c++ написал простенькую программку которая меняет название окна на то что мы написали в текст боксе: