Jestliže nevidíte správně česká písmena, zvolte potřebné kódování češtiny manuálně.
28.11.2004 večer: Doplněna, resp. opravena identifikace
adresáře.
30.11. Opraven název požadované šablony, řada dalších upřesnění vyznačených
červeně.
2.12. Funkce abs
a m_product
mají být spřátelené.
Ve fyzice se často pracuje s trojrozměrnými vektory. Nejčastějším matematickým popisem takového vektoru je trojice čísel, představujících průmět fyzikálního (prostorového) vektoru do jednotlivých souřadnicových os x, y, z. Těmto 3 číslům říkáme složky vektoru.
Nad vektory jsou běžně definovány následující operace:
(x1,y1,z1)
a
(x2,y2,z2)
je číslo x1*x2+y1*y2+z1*z2
.
Skalární násobení se v matematice značí tečkou: a.b
(x1,y1,z1)
a
(x2,y2,z2)
je vektor (y1*z2-z1*y2,z1*x2-x1*z2,x1*y2-y1*x2)
.
Vektorové násobení se v matematice značí křížkem: a×b
vect3
vhodnou pro reprezentaci trojrozměrných vektorů
se složkami různých reálných typů (float
, double
,
long double
).
Pro ni implementujte šablony operátorů a dalších funkcí pro následující operace s trojrozměrnými vektory: -
) +
a
-
) *
) *
) %
) >>
a <<
pro čtení a
výpis vektorua dále funkci m_product
pro výpočet smíšeného součinu 3 vektorů a přetíženou funkci
abs
pro výpočet absolutní hodnoty (délky) vektoru.
r, s,
t
(případně podle potřeby další vektory a jiné proměnné). Program přečte
hodnoty složek prvního vektoru r
a vytiskne jeho délku; vytiskne také
opačný vektor a vektor vynásobený číslem -1/2 a jejich délky. Potom přečte druhý
vektor s
a vytiskne součet a rozdíl vektorů r+s
, r-s
a
součiny r.s, r×s, s.r
a s×r
. Nakonec přečte 3. vektor
t
a vytiskne smíšený součin všech 3 vektorů. vect3t.h
,
(pod názvem
vect3tmain.C
odevzdejte svůj testovací program, který prověří aspoň
na jednom reálném typu operace uvedené výše v bodu 2; ten však nebude
hodnocen). Pokud budete potřebovat implementovat nějaké nešablonové funkce,
uložte je do souboru vect3t.
C, pokud ne, odevzdejte soubor
vect3t.
C
také, ale bude obsahovat jen komentář. Po odladění uložte tyto soubory do adresáře /export/e1/pb161/
váš_login/cvic10
.
Odlaďte jej na počítači aisa. >>
a <<
nemusí
testovat správnost dat, musí však dovolovat kombinovat v jednom V/V příkazu data
standardních typů a typu vect3<
typ>
. Přinejmenším u výstupního operátoru
to ve funkci main
ověřte. .h
, a ne do souboru .
C vect3t
, třída
(její šablona) jen vect3
.private
) a
funkce/operátory jako veřejné (public
). vect3t(float)
vektorem vect3t(long double)
nebo číslem double.
-
s×r.friend
), aby měly
přístup k soukromým atributům.istream& operator>> <>(istream&, vect3<T>&); // cteni vektoru
ostream& operator<< <>(ostream&, const vect3<T>&); // vypis vektoru
a na jejich levé straně tedy není vektor, je třeba deklarovat je jako
spřátelené.inline
). Připomeňme, že funkce, jejichž tělo je zapsáno
uvnitř třídy, jsou inline
automaticky a že inline
by měly
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 spřátelené funkce mají o
parametr víc (tj. tolik, kolik bychom u nich očekávali). this
.
Norma nepovoluje pracovat s nimi přímo.
return
. To platí i pro operátory, které vracejí objektový typ. V
return však
nelze vracet ukazatel nebo odkaz na lokálně
definovanou nestatickou entitu, neboť ta opuštěním funkce přestává
existovat. ::
<>
, ale v šabloně její implementace (definice
mimo třídu) už nikoli. gcc-3.4
kontroluje
soulad s normou velmi striktně. U této úlohy bude při kontrole používán
benevolentnější překladač gcc-3.3.3
a programy akceptované touto
verzí budou tolerovány, i když je gcc-3.4
odmítne. Podobně i
vzorové řešení bylo přeloženo starší verzí překladače./home/jkucera/pb161/cvic10/vect3tmain
module add gcc-3.3.3
,
nikoli module add gcc.
vect3t.
C![]() |
![]() (jen příklad ke zkoušce) |
![]() |