MatrixCalculator
MatrixCalculator on programm, mis võimaldab teha tehteid maatriksitega.
Autorid:
- Martin Maikov
- Harald Jõgi
Kirjeldus
Kasutaja saab luua tekstipõhises keskkonnas maatrikseid, neid vaadata ning nende peal tehteid sooritada
Klassid
Kasutajaliides: Kasutaja side programmiga. Küsib sisendit ja teeb selle põhjal asju.
- Meetod küsi otsustab, mis lehte järgmisena näidata.
- Meetod prompt võtab sõne, väljastab selle koos muutumatu päisega, ning küsib sisendit. See tõlgendab ka mõndasid käske.
Expression: Kirjeldab tehteid ja loeb sõnest välja võrrandi, kus muutujad asendab nende väärtustega.
- compute() -- tehte redutseerimine ehk evalueeritakse tehet.
- Meetod parse võtab sõne ja muutujate sõnastiku ning teeb nendest võrrandi.
- Meetod lex võtab sõne ja muudab selle vähimate sümbolite massiiviks.
Vahendaja: Hoiab muutujaid ja teostab tehteid
- Meetod parse-wrap kutsub meetodeid parse ja compute, kuid püüab kinni tekkivad vead
- Meetod lisaMaatriks lisab maatriksi kindla nime ja elementidega
- Meetod sobivNimiP annab infot selle kohta, kas nimi võib olla muutuja nimeks
- Meetod leiaMuutuja annab kindla nimega muutuja
TundmatuMuutuja: Viga, mis annab teada, et võrrandis on muutuja, mida pole määratud.
TõlgendamatuSisend: Viga, mis teatab, kui parser ei oska võrrandist väljundit lugeda, nt. kui on tundmatu sümbol või maatriks, millel ei ole ridu
InvalidMatrixException: Viga, mis annab teada, et maatriks ei ole sobilik teatud tehte tegemiseks.
InvalidOperandException: Viga, kus üks tehte operandidest ei ole sobilikud, nt maatriksi liitmine numbriga.
InvalidReductionException: Viga, kus tehete redutseerimisel ei tekkinud Value tüüpi väärtus.
MathOp: liides, mis kirjeldab kõige tavapäraseid matemaatilisi operatsioone: liitmine, lahutamine, korrutamine, jagamine, absoluutväärtus ja astendamine.
AbsoluteValue: Kirjeldab tehtes absoluutväärtust mingist operandist, maatriksite puhul determinanti ja numbrite puhul absoluutväärtust.
Addition: Kirjeldab tehtes kahe operandi liitmist.
Division: Kirjeldab tehtes kahe operandi jagamist.
MatrixInversion: Kirjeldab tehtes maatriksi pööramist ehk pöördmaatriksi leidmist. Määratud vananenuks, kuna sama saan kirjeldada Exponentiation klassi abil, pannes astendajaks -1.
MatrixTranspose: Kirjeldab tehtes maatriksi transponeerimist.
MatrixValue: Kirjeldab tehtes mingit maatriksi väärtust.
Multiplication: Kirjeldab tehtes kahe operandi korrutamist.
Number: Kirjeldab tehtes mingit numbrit.
Subtraction: Kirjeldab tehtes kahe operandi lahutamist.
Value: Kirjeldab tehtes mingit väärtust.
Exponentiation: Kirjeldab tehtes kahe operandi astendamist. Maatriksi puhul tõlgendatakse astendaja täisarvuliseks.
InverseMatrix: Kirjeldab maatriksi pööramist ehk pöördmaatriksi leidmist.
- gaussJordonMethod() - Gauss-Jordoni meetodi abil arvutab pöördmaatriksi
Matrix: Kirjeldab maatriksit ja sellega seonduvaid operatsioone.
- add() -- lisab kaht maatriksit
- multiply() -- korrutab kaht maatriksit või maatriksit mingi teatud teguriga.
SquareMatrix: Kirjeldab ruutmaatriksit ja sellega lisanduvaid operatsioone.
- determinant() -- Arvutab ruutmaatriksi determinandi
Protsess ja panus
Harald tegi kasutajaliidese ja parseri. (Klassid Kasutajaliides, Vahendaja, TundmatuMuutuja, TõlgendamatuSisend) Kulus u. 15h.
Martin tegi maatriksid ja tehted nendega. (Kõik klassid pakettides exceptions(v.a. TundmatuMuutuja, TõlgendamatuSisend), expressions (v.a. Expression'is implementeeritud meetodid) ja matrix ning v.a. root pakettis (KasutajaLiides, Vahendaja)). Kulus u. 15h.
Kõigepealt tegi Harald valmis kogu kasutajaliidese peale maatriksitega tehete.
Lõpuks tegi Harald valmis parseri, viis kasutajaliidese maatriksitele üle ja ühendas parseri kasutajaliidesega.
Martin alustas maatriksite funktsionaalsuse implementeerimisega. Kirjutas teste nendele, siis kirjutas tehete struktuuri.
Mured
Muresid ei olnud.
Hinnang
Kasutajaliides saaks olla parem: kohati ebamugav, ülevalt eelmist lehte veel näha jne. ning väga kirju ehk väljastab palju teksti.
Tehete parsimine sõnest võiks olnud olla võimsam ning oleks võinud lisada ka vektori andmetüübi ja sellega seonduvad tehted.
Testimine
Kasutajaliidest testisin peamiselt lihtsalt kasutades ja vaadates, kas soovitud asju on võimalik teha. Tehtepuu juures hakkasin põhjast pihta: Testisin, kas lex() töötab õigesti, siis kontrollisin algeliste tehete puhul parserit jne.
Martin otsustas targem olla ja konfigureeris JUnit testimisraamistikku ning kirjutas palju teste, mis kontrollisid erinevate klasside tööd. Selle abil oli võimalik koodi kirjutamise ajal üles leida erinevaid vigu.
Nõuded
- Maatriksi operatsioonid:
- Liitmine ja korrutamine
- Transponeerimine
- Inverteerimine ehk pöördmaatriksi leidmine
- Determinandi leidmine
- Mälu --- kalkulaatoril on teatud hulk mälupesi, kuhu on defineeritud maatriksid või numbrid.
- Tehted --- kalkulaator on võimeline arvutama mitu tehet ja õiges järjekorras.
Ülesannete jaotus
- Martin --- Maatriksi operatsioonid ja tehete struktuurne representatsioon ning arvutus.
- Harald --- Kasutajaliides ja sõne parsimine tehete andmestruktuurile.
Kasutajaliidese näide
> 2 + 2
4
> |{{1, 4, 3},{0, 4, 0}, {0, 0, 9}}|
36
> |-4|
4
> 6/2*(1+2)
9
> {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}} + {{2, 4, 9}, {0, 4, 0}, {0, 0, 9}}
{{3, 6, 12}, {4, 9, 6}, {7, 8, 18}}
> %set A {{3, 6, 12}, {4, 9, 6}, {7, 8, 18}}
A = {{3, 6, 12}, {4, 9, 6}, {7, 8, 18}}
> %list
A {{3, 6, 12}, {4, 9, 6}, {7, 8, 18}}
> A*2
{{6, 12, 24}, {8, 18, 12}, {14, 16, 36}}