**************************************************************** Pomocny program maticovych funkci ve strojovem kodu Z80 pro Sinclair Spectrum **************************************************************** Program je urcen k vypoctu maticovych operaci . Soucasti tohoto programu je take funkce USING$ slouzici k formatovani cisel a tiskovy program pro tiskarnu DZM 180 . Program se nahrava pokud neni soucasti basic. programu po CLEAR 63129 prikazem LOAD "" CODE . Po nahrati se prikazem RANDOMIZE USR 65130 definuji pomocne promenne ( adresy funkci : aa,ab,ac,ad,ae,af ) pokud jeste nebyly definovany . Tyto adresy nesmeji byt meneny anebo definovany jinak . Prikazem RANDOMIZE USR 65130 se dale inicializuje tiskovy program pro tiskarnu DZM 180 s interface s 8255 , ktery zacina na adrese 65001 a dale se likviduji vsechny navratove adresy GO SUB , proto je vhodne umistit tento prikaz na zacatek programu basic a pak je tam mozne skocit i z podprogramu v pripade chyby a nebo v situaci kdy pozadujeme zlikvidovat vsechny GO SUB . V pripade , ze nechceme inicializovat tiskovy program pouzejeme RANDOMIZE USR 63133 . Pokud nepozadujeme ani likvidovat GOSUB pouzijeme RANDOMIZE USR 63171 . Pro tiskovy program je vymezen prostor od adresy 65001 do 65359 . V tomto prostoru lze tento program nahradit i jinym v pripade pouziti jine tiskarny . Inicializace se vsak predpoklada na adrese 65001 . Vsechny pouzivane fukce musi byt definovny v programu basic pomoci prikazu DEF FN tak jak je uvedeno u jejich popisu . Pro spravnou funkci musi byt formulace presne dodrzeny . Funkce lze pouzivat jako normalne definovane funkce ( priklady jsou uvedeny s prikazem LET lze vsak pouzil i v ostatnich napr. PRINT , IF , GOTO a pod. ) . Vsechny matice - pole cisel musi byt dvourozmerne i kdyz se jedna o matici radkovou resp. sloupcovou a musi byt definovany prikazem DIM pred jejich prvnim pouzitim i v pripade , ze budou vysledkem operace . Poznamka : V matematickych vyjadrenich jsou pro zjednoduseni matice znaceny velkymi pismeny a jednoduche promenne malymi . 1.0 Maticove funkce se skalarnim vystupem ----------------------------------------- 1.1 Vypocet determinantu Definice DEF FN d(A$) = USR aa V programu lze pouzit jako napr.: LET x = FN d(A$), kde A$ je jednoznakovy retezec oznacujici matici (pole cisel) , ktera musi byt ctvercova . Priklad: 10 DIM E(10,10) . . . . 500 LET x= FN d("E") Matematicky: x = det E 2.0 Skalarni operace na matici ------------------------------ 2.1 Nasobeni matice konstantou DEF FN s (A$,a)= USR ab Funkce provede vynasobeni vsech prvku matice oznacene jednoznakovym retezcem A$ promenou . Vystupem vlastni funkce je kod chyby - viz zaver . Priklad: LET y= FN s ("E",1.53) - vsechny prvky matice E se vynasobi cislem 1.53 Matematicky: E' = 1.53 * E 2.2 Zaokrouhleni vsech prvku matice DEF FN z (A$,a)= USR ac Funkce vsechny prvky matice oznacene jednoznakovym retezcem A$ matematicky zaokrouhli na urceny pocet desetinnych mist . Priklad: LET y= FN z ("E",2) -vsechny prvky matice E se zaokrouhli na dve desetinna mista . y= kod chyby - viz zaver 3.0 Maticove operace -------------------- Definice: DEF FN m (A$)= USR ad Tato nejvykonnejsi funkce umoznuje vykonavat vsechny zakladni maticove operace . Operace je symbolicky predepsana retezcem A$ . Vystupem funkce je kod chyby - viz zaver . V pripadech , kde je pouzita stejna matice na obou stranach rovnitka nebo pri slozitejsich operacich je nutno pocitat s rezervou v pameti , protoze je vytvorena pomocna vypoctova matice , ktera se po vypoctu likviduje . 3.1 Vytvoreni transponovane matice Priklady: LET y= FN m ("B=A'") t.j. matematicky B = A' lze i pouzit: LET y= FN m ("A=A'") - jen ctvercova mat. Matice B resp. A se rovna transponovane puvodni matici A , tzn. radky se zameni za sloupce . Nutno dodrzet vhodne rozmery u nectvercovych matic . 3.2 Soucet , rozdil a soucin matic Priklady: -soucet LET y= FN m ("A=B+C") t.j. matematicky A = B + C nebo i LET y= FN m ("A=A+B") -rozdil LET y= FN m ("A=B-C") t.j. matematicky A = B - C nebo i LET y= FN m ("A=A-B") -soucin LET y= FN m ("A=B*C") t.j. matematicky A = B * C nebo i LET y= FN m ("A=A*B") Pozor na vhodne rozmery matic pokud nejsou matice ctvercove zvlaste u nasobeni , kde musi platit A(m,p)=B(m,n)*C(n,p) , lze vsak zamenit v tomto pripade B s C , program behem vypoctu pri zjisteni nevhodnosti rozmeru obe matice zameni a hlasi chybu ve forme nenuloveho vystupu az kdyz rozmery nevyhovuji ani po teto zamene . 3.3 Inverze matice Priklad: LET y= FN m ("A=B-1") nebo i LET y= FN m ("A=A-1") Vytvori se inverzni matice k matici B resp. A a ulozi se do puvodni matice A . Toto se provede jen v pripade ctvercove matice a pokud determinant se nerovna nule . Chyby hlasi ve forme nenuloveho vystupu - viz zaver . 3.4 Rovnost Priklad: LET y= FN m ("A=B") - prenese vsechny prvky matice B do matice A . 3.5 Vytvoreni jednotkove matice Priklad: LET y= FN m ("A=1") Vytvori z matice A jednotkovou matici tzn. ze hlavni diagonala obsahuje jednicky a ostatni prvky jsou nulove . 4.0 Formatovani numerickych dat ------------------------------- Definice: DEF FN u$(A$,a)= CHR$ USR ae Funkce umoznuje vytvorit retezec zadaneho cisla v zadanem formatu A$ . Lze pouzit v prikazech PRINT,LPRINT,LET i jinych . Ve formatovacim retezci zastupuje znak "#"(kod 35) cislici nebo mezeru , ostatni znaky se meni jen v pripade potreby . Tecka nesmi byt na 1. pozici !!! Priklady: LET a$= FN u$("####.##",x) PRINT FN u$("###.#",x) Priklady zobrazeni cisla 34.56 s ruznymi formaty (_=mezera): "##" 35 "##.##" 34.56 "##.###" 34.560 "##.#" 34.6 "###.#" _34.6 "****.***" **34.560 "a=###.##" a=_34.56 "#.#####" ??????? Posledni pripad zobrazuje signalizaci "kratkeho" formatu . Cisla v exponencialnim tvaru se zobrazi bez upravy pokud se "vejdou do formatovaciho retezce , jinak se zobrazi vsechny znaky jako "?" . 5.0 Cislo prave provadeneho radku basic -------------------------------------- LET x= USR af Vhodne pri potrebe zjisteni cisla prave provadeneho radku v programu basic . Zkracuje program napr. pri nastavovani RESTORE : RESTORE USR af: READ a,b,c,d: DATA 5,a+3,b+a,c-a nebo v prikazu GOTO : IF INKEY$ <>"A" THEN GOTO USR af 6.0 Zaver - chybova hlaseni --------------------------- Pri provadeni maticovych operaci jak bylo jiz uvedeno funkce mohou v pripade chyb zadani nabyvat nenulovych hodnot . V tomto pripade se prislusna operace neprovede a hodnoty matic se nemeni . Z hodnoty funkce lze identifikovat proc operace nemuze byt vykonana . Hodnota funkce: 0.............operace provedena - OK 1.............matice musi byt ctvercova 2.............nevhodne rozmery matic 3.............matice musi byt stejnych rozmeru 4.............nelze invertovat - determinant=0 Zaverem bych chtel pozadat vsechny uzivatele tohoto programu , aby v pripade , ze zjisti sebemensi vadu programu podali zpravu na adresu : Ing. xx. xxxxxxx xxxxxxxx xx 261 01 PRIBRAM I Dekuji