- Java 100%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .idea | ||
| src | ||
| .gitignore | ||
| pom.xml | ||
| README.md | ||
MatrixCalculator
MatrixCalculator on programm, mis võimaldab teha tehteid maatriksitega.
Autorid:
- Martin Maikov
- Harald Jõgi
Kirjeldus
Kasutaja saab luua graafilises või 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
TundmatuMuutujaErind: Viga, mis annab teada, et võrrandis on muutuja, mida pole määratud.
TõlgendamatuSisendiErind: 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.
ComputationException: Abstraktne veaklass, mis kirjeldab tehte evalueerimisel tekkinud veast.
ParsingException: Abstraktne veaklass, mis kirjeldab tehte parsimisel tekkinud veast.
InvalidFileException: Viga, kus fail ei ole sobivas formaadis.
DivisionByZero: Viga, kui üritatakse jagada nulliga.
Variable: klass, mis hoiab muutuja nimetust ja väärtust.
ValueSerializer: klass, mis tegeleb Value tüübi jadastamise ja objektimisega
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
Config: klass, mis tegeleb konfiguratsiooni lugemise ja salvestamisega faili kujul.
Dialogs: klass, mis kuvab dialooge sobivas keeles.
ExpressionsController: FXML struktuurile vastav kontroller, mis käsitleb graafilise liidese eripärasustega tehete sakkis.
LoomineController: FXML struktuurile vastav kontroller Loomise sakkis, mis käsitleb graafilise liidese eripärasustega.
MainApp: JavaFX peaklass, kus käivitub graafilise liidesega programm.
MainController: FXML struktuurile vastav kontroller terve programmi raames.
SettingsController: FXML struktuurile vastav kontroller sätete akna jaoks.
MuutujaSobilikkus: väärtustik, mis väljendab kui sobilik antud muutuja on.
Protsess ja panus
Harald tegi kasutajaliidese ja parseri. (Klassid Kasutajaliides, Vahendaja, TundmatuMuutujaErind, TõlgendamatuSisendiErind) Kulus u. 23h.
Martin tegi maatriksid ja tehted nendega. (Kõik klassid pakettides exceptions(v.a. TundmatuMuutujaErind, TõlgendamatuSisendiErind), expressions (v.a. Expression'is implementeeritud meetodid), matrix ja gui(v.a LoomineController) ning v.a. root pakettis (KasutajaLiides, Vahendaja)). Kulus u. 25h.
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. Graafilise kasutajaliidesega seadistas Martin esimena JavaFX struktuuri ning tegi programmi peavaate, sh sakkid, menüüriba (MenuBar) ning tegi valmis menüüriba funktsionaalsuse, sh oleku salvestamise, ja tehete sakki ning refaktoreeris koodi ümber, nt teha erindid kontrollitud erinditeks ning panna pärilusse, teha väärtustik muutuja sobilikkuse testimiseks.
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.
Graafiline kasutajaliides näeb normaalne välja, kuid suurelt kuvatuna näeb natukene imelik välja.
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.
Graafilise kasutajaliidese puhul testiti seda käsitsi.
Nõuded
- Maatriksi operatsioonid:
- Liitmine ja korrutamine
- Transponeerimine
- Inverteerimine ehk pöördmaatriksi leidmine
- Determinandi leidmine
- Mälu --- kalkulaatoris on võimalik defineerida tähtedest nimedega muutujaid, 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. Graafilise kasutajaliidese puhul JavaFX põhistruktuur (sakkid ja menüüriba) ning tehete sakk ja menüüriba.
- Harald --- Kasutajaliides ja sõne parsimine tehete andmestruktuurile. Graafilise kasutajaliidese puhul loomise sakk.
Graafilise liidese kasutusjuhend
Käivitatakse MainApp.java kaudu
On kaks vahelehte: Maatriksid ja Tehted
Maatriksite lehel on võimalik nii maatriksite kui arvude muutujaid luua ja muuta. Selleks, et olemasolevat maatriksit vaadata, pead kirjutama selle nime tekstikasti või rippmenüüst avama. Seejärel vajutage nuppu 'Lae'. Muudetud maatriksi salvestamiseks on nupp salvesta ja ridade ja veergude arvu muutmiseks tekstikastid ja rakenda.
Tehete lehel saab kirjutada ning jooksutada muutujaid sisaldavaid tehteid ning muutujaid tulemustega väärtustada.
Üleval on riba, kus on valikud Fail ja Teave. Faili menüüs on võimalused loodud muutujate faili salvestamiseks või failist laadimiseks. Lisaks saab seal programmist lahkuda. Teabe all on keele sätted, muutujate lähtestamine ja abileht.
Terminalipõhise 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}}