Wst ˛ep do Programowania 2
dr Bo˙zena Wo´zna-Szcze´sniak bwozna@gmail.com
Akademia im. Jana Długosza
Wykład 7
Przykład realizowany na wykładzie
Klasa Wektor. Wst ˛epne pliki zał ˛aczone jako ´zródła.
Przykład z ksi ˛a˙zki: Stephen Prata. J ˛ezyk C++. Szkoła programowania. Wydanie V.
Informacje wst ˛epne
Wektorto termin u˙zywany m.in. w in˙zynierii, fizyce i matematyce.
Wektorjest wielko´sci ˛a, która posiada zarównorozmiar jak ikierunek, np. efekt pchni ˛ecia jakiego´s przedmiotu zale˙zy od u˙zytej siły (rozmiar) oraz obranego kierunku.
Matematyczna reprezentacja wektora zale˙zy od układu współrz ˛ednych wykorzystanego do jego opisu.
Przykładowo: wektor dwuwymiarowy mo˙zna reprezentowa´c przy pomocy dwóch warto´sci, które przedstawia´c b ˛ed ˛a:
rozmiar (długo´s´c) i kierunek (k ˛at) – układ współrz ˛ednych biegunowych (polarnych);
wspólrz ˛edn ˛a x i y – układ współrz ˛ednych kartezja ´nskich (prostok ˛atnych);
Informacje wst ˛epne
Wektory mog ˛a by´c dodawane, odejmowane, mno˙zone przez liczb ˛e i odwracane. Operacje te spełniaj ˛a znane prawa algebraiczne: przemienno´sci, ł ˛aczno´sci,
rozdzielno´sci (odejmowanie traktowane jest jako szczególny przypadek dodawania). Zatem operacje przeprowadzane na wektorach daje si ˛e łatwo opisa´c za pomoc ˛a operatorów przeci ˛a˙zonych, gdy˙z stanowi ˛a one analogie do zwykłych operacji arytmetycznych.
Klasa Vector - interfejs, czesc prywatna
#ifndef VECTOR_H_
#define VECTOR_H_
#include <iostream>
namespace VECTOR // nasz nowa przestrzen {
class Vector {
private:
double x; // wartosc skladowej poziomej double y; // wartosc skladowej pionowej double mag; // dlugosc wektora
double ang; // kierunek wektora
char mode; // ’r’ = tryb prostokatny, ’p’ = tryb biegunowy // metody prywatne ustawiajace skladowe
void set_mag(); // ustaw dlugosc void set_ang(); // ustaw kat void set_x(); // ustaw wsp. x void set_y(); // ustaw wsp. y public:
...
};
} // koniec przestrzeni nazw VECTOR
#endif
Klasa Vector - interfejs, czesc publiczna
#ifndef VECTOR_H_
#define VECTOR_H_
#include <iostream>
namespace VECTOR // nasz nowa przestrzen {
class Vector {
...
public:
Vector();
Vector(double n1, double n2, char form = ’r’);
void set(double n1, double n2, char form = ’r’);
~Vector();
double xval() const {return x;} // zwraca wartosc skladowej x double yval() const {return y;} // zwraca wartosc skladowej y double magval() const {return mag;} // zwraca dlugosc
double angval() const {return ang;} // zwraca kat void polar_mode(); // ustawia tryb na ’p’
void rect_mode(); // ustawia tryb na ’r’
// metody przeciazajace operatory Vector operator+(const Vector & b) const;
Vector operator-(const Vector & b) const;
Vector operator-() const;
Vector operator*(double n) const;
// funkcje zaprzyjaznione
friend Vector operator*(double n, const Vector & a);
friend std::ostream & operator<<(std::ostream & os, const Vector & v);
};
} // koniec przestrzeni nazw VECTOR
#endif
Uwagi do przykładu
Nast ˛epuj ˛ace funkcje z uwagi na swoj ˛a definicj ˛e wewn ˛atrz deklaracji klasy staj ˛a sie automatycznie funkcjami
wplatanymi (inline):
double xval() const {return x;} // zwraca wartosc skladowej x double yval() const {return y;} // zwraca wartosc skladowej y double magval() const {return mag;} // zwraca dlugosc
double angval() const {return ang;} // zwraca kat
Poniewa˙z powy˙zsze funkcje nie modyfikuj ˛a obiektów, to zostały zdefiniowane z u˙zyciem modyfikatoraconst.
Uwagi do przykładu
Definicja operatcji dodawania wektorów:
Vector Vector::operator+(const Vector & b) const {
Vector sum;
sum.x = x + b.x;
sum.y = y + b.y;
sum.set_ang();
sum.set_mag();
return sum;
}
Uwagi do przykładu
Definicja operatcji dodawania wektorów:
Vector Vector::operator+(const Vector & b) const {
return Vector(x + b.x, y + b.y);
}
Uwagi do przykładu
Klasa Vector mo˙ze zosta´c zastosowana do symulacji problemu losowego prze´scia z punktu A do punktu B.
Wyobra´zmy sobie osob ˛e, która ma doj´s´c do jakiego´s punktu, lecz za ka˙zdym razem zmienia kierunek marszu. Jeden z rodz ˛acych sie
problemów jaki trzeba tutaj rozwi ˛aza´c jest wyliczenie liczby kroków potrzebnych do osi ˛agni ˛ecia celu.
W uj ˛eciu wektorowym problem ten mo˙zna sprowadzi´c do dodawania du˙zej ilo´sci losowo zorientowanych wektorów, trwaj ˛ace dopóty, dopóki ich suma osi ˛agnie odległo´s´c jaka ma zosta´c przebyta przez dana osobe.
Uwagi do przykładu
Program do kompilacji wymaga biblioteki matematycznej cmath.
W niektórych systemach operacyjnych do kompilacji omawianego programu wymagane jest jawne doł ˛aczenie biblioteki cmath, tj.:
g++ pliki ´zródłowe z rozszerzeniem .cc (.cpp) -lm
bws@bws:~/programy$ g++ randwalk.cpp vect.cpp -o wektory bws@bws:~/programy$ g++ randwalk.cpp vect.cpp -lm -o wektory