Waňov web

PB161 Jazyk C++ - 12. cvicení

Práce s trojrozmernými vektory - sablony

Úvod:

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:

Zadání:

  1. Definujte sablonu trídy 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:
    • opacný vektor (unární operátor -). Tato operace puvodní vektor nemení, jen vrátí jeho "opak".
    • soucet a rozdíl 2 vektoru (binární operátory + a -)
    • skalární soucin 2 vektoru  (binární operátor *)
    • násobení vektoru skalárem a násobení skaláru vektorem (pretízené verze binárního operátoru *)
    • vektorový soucin 2 vektoru  (pro nej pouzijeme binární operátor %)
    • pretízené operátory >> a << pro ctení a výpis vektoru
    a dále funkci m_product pro výpocet smíseného soucinu 3 vektoru a pretízenou funkci abs pro výpocet absolutní hodnoty (délky) vektoru.
  2. Pridejte hlavní program, v nemz deklarujete tri trojrozmerné vektory 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.

Pozadavky:

Poznámky:


Riešenie:


vect3t.h
#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




vect3t.C
// definicie nesablonovych funkcii


vect3tmain.C
#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;
}


Nahor