Ve fyzice se casto pracuje s vektory v trojrozmerném prostoru (velicinami majícími velikost a smer). Nejcastejsím matematickým popisem takového vektoru je trojice císel, predstavujících prumet fyzikálního (prostorového) vektoru do jednotlivých souradnicových os x, y, z. Temto 3 císlum ríkáme slozky vektoru. Velicina, která je charakterizována pouze císelnou hodnotou, se ve fyzice nazývá skalár.
Nad vektory jsou bezne definovány následující operace:
(x1,y1,z1) a
(x2,y2,z2) je skalár x1*x2+y1*y2+z1*z2.
Skalární násobení se v matematice znací teckou: a.b (x1,y1,z1) a
(x2,y2,z2) je vektor (y1*z2-z1*y2,z1*x2-x1*z2,x1*y2-y1*x2),
tento vektor je kolmý na oba puvodní vektory.
Vektorové násobení se v matematice znací krízkem: a×b, v
tomto programu se pro nej vsak pouzívá operátor % vect3 vhodnou pro reprezentaci trojrozmerných vektoru
se slozkami ruzných reálných typu (float, double,
long double).
Pro ni implementujte sablony operátoru a dalsích funkcí pro následující operace s trojrozmernými vektory: -). Tato operace puvodní
vektor nemení, jen vrátí jeho "opak". + a
-) *) *) %) >> a << pro ctení a
výpis vektoru m_product pro výpocet smíseného soucinu 3 vektoru a pretízenou funkci
abs pro výpocet absolutní hodnoty (délky) vektoru.
r, s,
t (prípadne podle potreby dalsí vektory a jiné promenné). Program precte
hodnoty slozek prvního vektoru r a vytiskne jeho délku; vytiskne také
opacný vektor a vektor vynásobený císlem -1/2 a jejich délky. Potom precte druhý
vektor s a vytiskne soucet a rozdíl vektoru r+s, r-s a
souciny r.s, r×s, s.r a s×r. Nakonec precte 3. vektor
t a vytiskne smísený soucin vsech 3 vektoru. vect3t.h, (pod názvem
vect3tmain.C odevzdejte svuj testovací program, který proverí aspon
na jednom reálném typu operace uvedené výse v bodu 2; ten vsak nebude
hodnocen). Pokud budete potrebovat implementovat nejaké nesablonové funkce,
ulozte je do souboru vect3t.C, pokud ne, odevzdejte soubor
vect3t.C také, ale bude obsahovat jen komentár.
>> a << nemusí
testovat správnost dat, musí vsak dovolovat kombinovat v jednom V/V príkazu data
standardních typu a typu vect3<typ>. Prinejmensím u výstupního operátoru
to ve funkci main overte. .h, a ne do souboru .Cprivate) a
funkce/operátory jako verejné (public). this.
Norma jiz nepovoluje pracovat s nimi prímo. vect3t, trída
(její sablona) jen vect3. vect3<float> vektorem vect3<long double>
nebo císlem double.-s×r.friend). << a >>.
Protoze mají mít prototypyistream& operator>> <>(istream&, vect3<T>&); // cteni vektoru
ostream& operator<< <>(ostream&, const vect3<T>&); // vypis vektoru
a na jejich levé strane tedy není vektor, je treba deklarovat je jako
sprátelené.inline). Pripomenme, ze funkce, jejichz telo je zapsáno
uvnitr trídy, jsou inline automaticky i bez uvedení tohoto
klícového slova a ze inline by mely
být jenom velmi krátké funkce. this. U binárního
operátoru je to levý operand, u unárního jediný operand. Unární operátor
implementovaný jako metoda nemá proto viditelný parametr, binární má jeden
deklarovaný parametr. Operátory implementované jako sprátelené funkce mají o
parametr víc (tj. tolik, kolik bychom u nich ocekávali).
return. To platí i pro operátory, které vracejí objektový typ. V
return vsak nelze vracet ukazatel nebo
odkaz na lokálne
definovanou nestatickou entitu, nebot ta opustením funkce prestává
existovat. :: <>, ale v sablone její implementace (definice
mimo trídu) uz nikoli. gcc pouzívejte
benevolentnejsí prekladac gcc-3.3.6.
Programy akceptované touto
verzí budou tolerovány, i kdyz je gcc novejsí verze odmítne.
Podobne i vzorové resení bylo prelozeno zmínenou verzí prekladace. module add gcc-3.3.6,
nikoli module add gcc.
#ifndef VECT3
#define VECT3
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
template<class T>class vect3
{
private:
T x,y,z;
public:
// inicializacni konstruktor (nahradi i prazdny kontruktor):
vect3(T xx=0, T yy=0, T zz=0):x(xx),y(yy),z(zz){}
// kopirovaci konstruktor vyhovuje implicitni
// destruktor vyhovuje implicitni
// operatory:
vect3 operator+(const vect3<T>); // soucet vektoru
vect3 operator-(const vect3<T>); // rozdil vektoru
vect3 operator-(void); // opacny vektor
friend vect3 operator*<T>(double, const vect3); // konstanta * vektor
vect3 operator*(T mult); // vektor * konstanta
T operator*(const vect3<T>); // skalarni soucin
vect3 operator%(const vect3<T>); // vektorovy soucin
friend istream& operator>><>(istream&, vect3<T>&); // cteni vektoru
friend ostream& operator<<<>(ostream&, const vect3<T>&); // vypis vektoru
// dalsi metody:
friend vect3<T> m_product<>(vect3<T>, vect3<T>, vect3<T>); //zmiesany sucin
friend T abs<>(const vect3<T>); // delka vektoru
};
template<class T>vect3<T> vect3<T>::operator+(const vect3 b) // soucet vektoru
{ vect3 result(*this);
result.x+=b.x;
result.y+=b.y;
result.z+=b.z;
return result;
}
template<class T>vect3<T> vect3<T>::operator-(const vect3 b) // rozdil vektoru
{ vect3 result(*this);
result.x-=b.x;
result.y-=b.y;
result.z-=b.z;
return result;
}
template<class T>vect3<T> vect3<T>::operator-(void) // opacny vektor
{ vect3 result;
result.x=-this->x;
result.y=-this->y;
result.z=-this->z;
return result;
}
// vektor * konstanta
template<class T>vect3<T> vect3<T>::operator*(T mult){return mult*(*this);}
template<class T>T vect3<T>::operator*(const vect3 b)
{return this->x*b.x+this->y*b.y+this->z*b.z;} // skalarni soucin
// vektorovy soucin
template<class T>vect3<T> vect3<T>::operator%(const vect3 b) { vect3 result;
result.x=this->y*b.z-this->z*b.y;
result.y=this->z*b.x-this->x*b.z;
result.z=this->x*b.y-this->y*b.x;
return result;
}
// friends:
//nacitanie vektoru
template<class T>istream& operator>>(istream& in, vect3<T> &a)
{ in >> a.x >> a.y >> a.z;
return in;
}
// vypis vektoru
template<class T>ostream& operator<<(ostream& out, const vect3<T> &a)
{ out << a.x << " " << a.y << " " << a.z;
return out;
}
// konstanta * vektor
template<class T>vect3<T> operator*(T mult, const vect3<T> a)
{ vect3<T> result;
result.x=mult*a.x;
result.y=mult*a.y;
result.z=mult*a.z;
return result;
}
template<class T>T abs(const vect3<T> a) // delka vektoru
{ return sqrt(a.x*a.x+a.y*a.y+a.z*a.z);
}
template<class T>vect3<T>
m_product( vect3<T> a, vect3<T> b, vect3<T> c)
{return (c)%(a*b);} // smiseny soucin
#endif
// definicie nesablonovych funkcii
#include "vect3t.h"
int main(void)
{
double a,b,c;
cout<<"Zadaj 1. vektor r(x,y,z):";
cin >> a >> b >> c;
cout<<endl;
vect3<double> vect1(a,b,c);
cout<<"r = "<<vect1<<" "<<"abs= "<<abs(vect1)<<endl;
cout<<"-r = "<<-vect1<<" "<<"abs= "<<abs(-vect1)<<endl;
cout<<"r/(-2) = "<<(vect1*-0.5)<<endl;
cout<<"dlzka (opacneho/2)= "<<abs((-vect1)*0.5)<<endl;
cout<<"Zadaj 2. vektor s(x,y,z):";
cin >> a >> b >> c;
cout<<endl;
vect3<double> vect2(a,b,c);
cout<<endl;
cout<<"s = "<<vect2<<endl;
cout<<"r + s = "<<vect1+vect2<<endl;
cout<<"r - s = "<<vect1-vect2<<endl;
cout<<"r . s = "<<vect1*vect2<<endl;
cout<<"r x s = "<<vect1%vect2<<endl;
cout<<"s . r = "<<vect2*vect1<<endl;
cout<<"s x r = "<<vect2%vect1<<endl;
cout<<"Zadaj 3. vektor t(x,y,z):";
cin >> a >> b >> c;
cout<<endl;
vect3<double> vect3(a,b,c);
cout<<"t = "<<vect3<<endl;
cout<<"Zmiesany sucin = "<<(m_product(vect1,vect2,vect3))<<endl;
return 0;
}