Witam. Nie za bardzo wiem jak mam się zabrać za podane zadanie, jakie metody prywatne mają być dodane, i jak to wszystko powiązać wtedy. Proszę o wskazówki.
Treść:
Zmodyfikuj plik nagłowkowy klasy Vectorr i plik implementacjii jej metod(listingi 11.13 i 11.14)tak ,aby obiekty nie przechowywały w składowych wartości długości i odchylenia wektora. Zamiast tego obiekt powinien obliczać i zwracać te wartości w wyniku wywołania metod magval() (długość wektora) i angval()(kąt wektora). Publiczny interfejs klasy powinien pozostać bez zmian (co do metod publicznych i ich argumentów), sekcję prywatną należy jednak uzupełnić o kilka metod prywatnych i zubożyć o wyeliminowane składowe. Przetestuj nową wersję klasy programem z listingu 11.15, który skoro publiczny interfejs klasy Vector ma pozostać niezmienny powinien nadawać się do wykorzystania.
// randwalk.cpp -- test klasy Vector
// kompilować z plikiem vect.cpp
#include <iostream>
#include <cstdlib> // prototypy funkcji rand() i srand()
#include <ctime> // prototyp funkcji time()
#include "vect.h"
int main()
{
using namespace std;
using VECTOR::Vector;
srand(time(0)); // inicjalizacja generatora liczb pseudolosowych
double direction;
Vector step;
Vector result(0.0, 0.0);
unsigned long steps = 0;
double target;
double dstep;
cout << "Podaj dystans do przejścia (k, aby zakończyć): ";
while (cin >> target)
{
cout << "Podaj długość kroku: ";
if (!(cin >> dstep))
break;
while (result.magval() < target)
{
direction = rand() % 360;
step.reset(dstep, direction, Vector::POL);
result = result + step;
steps++;
}
cout << "Po " << steps << " krokach delikwent "
"osiągnął położenie:\n";
cout << result << endl;
result.polar_mode();
cout << " czyli\n" << result << endl;
cout << "Średnia długość kroku pozornego = "
<< result.magval()/steps << endl;
steps = 0;
result.reset(0.0, 0.0);
cout << "Podaj dystans do przejścia (k, aby zakończyć): ";
}
cout << "Koniec!\n";
cin.clear();
while (cin.get() != '\n')
continue;
return 0;
}
// vect.h -- klasa Vector z operatorem << i przełącznikiem trybu
#ifndef VECTOR_H_
#define VECTOR_H_
#include <iostream>
namespace VECTOR
{
class Vector
{
public:
enum Mode {RECT, POL};
// RECT to współrzędne kartezjańskie, POL to współrzędne biegunowe
private:
double x; // wartość składowej poziomej
double y; // wartość składowej pionowej
double mag; // długość wektora
double ang; // kierunek wektora (w stopniach)
Mode mode; // RECT lub POL
// prywatne metody ustawiające składowe
void set_mag();
void set_ang();
void set_x();
void set_y();
public:
Vector();
Vector(double n1, double n2, Mode form = RECT);
void reset(double n1, double n2, Mode form = RECT);
~Vector();
double xval() const {return x;} // zwraca wartość składowej x
double yval() const {return y;} // zwraca wartość składowej y
double magval() const {return mag;} // zwraca długość
double angval() const {return ang;} // zwraca kąt
void polar_mode(); // ustawia tryb na biegunowy (POL)
void rect_mode(); // ustawia tryb na kartezjański (RECT)
// metody przeciążające operatory
Vector operator+(const Vector & b) const;
Vector operator-(const Vector & b) const;
Vector operator-() const;
Vector operator*(double n) const;
// funkcje zaprzyjaźnione
friend Vector operator*(double n, const Vector & a);
friend std::ostream &
operator<<(std::ostream & os, const Vector & v);
};
} // koniec przestrzeni nazw VECTOR
#endif
// vect.cpp -- implementacje metod klasy Vector
#include <cmath>
#include "vect.h" // włącza plik nagłówkowy <iostream>
using std::sqrt;
using std::sin;
using std::cos;
using std::atan;
using std::atan2;
using std::cout;
namespace VECTOR
{
// przelicznik radianów na stopnie
const double Rad_to_deg = 45.0 / atan(1.0);
// powinno wyjść około 57.2957795130823
// metody prywatne
// oblicza długość wektora ze składowych x i y
void Vector::set_mag()
{
mag = sqrt(x * x + y * y);
}
void Vector::set_ang()
{
if (x == 0.0 && y == 0.0)
ang = 0.0;
else
ang = atan2(y, x);
}
// oblicza składową x ze współrzędnych biegunowych
void Vector::set_x()
{
x = mag * cos(ang);
}
// oblicza składową y ze współrzędnych biegunowych
void Vector::set_y()
{
y = mag * sin(ang);
}
// metody publiczne
Vector::Vector() // konstruktor domyślny
{
x = y = mag = ang = 0.0;
mode = RECT;
}
// konstruuje wektor o zadanych współrzędnych biegunowych (w trybie 'p')
// bądź prostokątnych (w domyślnym trybie 'r')
Vector::Vector(double n1, double n2, Mode form)
{
mode = form;
if (form == RECT)
{
x = n1;
y = n2;
set_mag();
set_ang();
}
else if (form == POL)
{
mag = n1;
ang = n2 / Rad_to_deg;
set_x();
set_y();
}
else
{
cout << "Niepoprawna wartość trzeciego argumentu Vector() -- ";
cout << "zeruję wektor\n";
x = y = mag = ang = 0.0;
mode = RECT;
}
}
// zerowanie wartości wektora dla zadanych współrzędnych kartezjańskich (dla RECT)
// albo dla zadanych współrzędnych biegunowych (POL)
void Vector::reset(double n1, double n2, Mode form)
{
mode = form;
if (form == RECT)
{
x = n1;
y = n2;
set_mag();
set_ang();
}
else if (form == POL)
{
mag = n1;
ang = n2 / Rad_to_deg;
set_x();
set_y();
}
else
{
cout << "Niepoprawny trzeci argument set() -- ";
cout << "zeruję wektor\n";
x = y = mag = ang = 0.0;
mode = RECT;
}
}
Vector::~Vector() // destruktor
{
}
void Vector::polar_mode() // przełącza do reprezentacji biegunowej
{
mode = POL;
}
void Vector::rect_mode() // przełącza do reprezentacji kartezjańskiej
{
mode = RECT;
}
// przeciążone operatory
// dodawanie dwóch wektorów
Vector Vector::operator+(const Vector & b) const
{
return Vector(x + b.x, y + b.y);
}
// odejmowanie wektora b od wektora a
Vector Vector::operator-(const Vector & b) const
{
return Vector(x - b.x, y - b.y);
}
// zmienia znak wektora
Vector Vector::operator-() const
{
return Vector(-x, -y);
}
// mnoży wektor wywołujący przez n
Vector Vector::operator*(double n) const
{
return Vector(n * x, n * y);
}
// funkcje zaprzyjaźnione
// mnoży n przez wektor a
Vector operator*(double n, const Vector & a)
{
return a * n;
}
// wyświetla współrzędne wektora (prostokątne w trybie RECT,
// biegunowe w trybie POL)
std::ostream & operator<<(std::ostream & os, const Vector & v)
{
if (v.mode == Vector::RECT)
os << "(x,y) = (" << v.x << ", " << v.y << ")";
else if (v.mode == Vector::POL)
{
os << "(m,a) = (" << v.mag << ", "
<< v.ang * Rad_to_deg << ")";
}
else
os << "Niepoprawny tryb reprezentacji obiektu wektora";
return os;
}
} // koniec przestrzeni nazw VECTOR