Přístup k výpočtům v kalkulačkách TI si v některých situacích vyžaduje změnu typu proměnné, ať už z důvodu nároků možné metody nebo zrychlení výpočtu. K těmto převodům slouží několik vestavěných funkcí, které se vám budu snažit přiblížit.
Převody typů proměnných jsou užitečné ve chvílích, kdy je výhodnější některé proměnné zpracovat jako jiný typ. Jednoduchým příkladem může být příkaz Request, který vyvolá okno pro zadání obsahu proměnné, ale vložená data uloží jako string (řetězec). Pokud jsme ale zadali číslo, pravděpodobně chceme zpracovávat číslo a ne řetězec. Je tedy nutné proměnnou převést z typu řetězec (string) na typ výraz (expression). Uvedu zde nejčastější použití převodů (pokud možno názorně). Nebudu uvažovat použití převodů v základní obrazovce (HOME), protože tam není vyžadováno další zpracování výsledků. Tyto rady berte spíše jako pomůcky pro psaní programů...
Řetězec -> výraz
Nejběžnější použití tohoto převodu jsem již uvedl, takže si to můžeme ukázat na příkladu:
Chceme třeba po spuštění programu zadávat nějaké číslo, a protože jsme nároční, chceme využít okna Request pro vkládání dat. Z uživatelské příručky ale víme, že proměnná, do které se data vloží, je typu řetězec. Jak víme, nad řetězci nelze provádět matematické operace, je tedy potřebné proměnnou převést do přijatelné podoby. K tomu poslouží funkce expr(). Argumentem funkce je název proměnné (nebo přímo řetězec - nepoužívá se), jejíž obsah chceme převést; návratovou hodnotou je výsledek po převodu, tedy data typu výraz. Tato data musíme v programu nějak zpracovat. Buď uložit, nebo je použít ve výpočtu. Uložením myslím i přepsání původního obsahu proměnné. Viz několik příkladů:
request "Zadej cislo",cis
Do proměnné cis vloží zadané číslo jako řetězec:
expr(cis)->a
Do proměnné a vloží převedený řetězec na číslo (výraz):
Disp 2+10*expr(cis)
Zobrazí výsledek výrazu, počítá s hodnotou cis převedenou na výraz:
expr(cis)->cis
Přetypuje proměnnou - do proměnné cis uloží výraz z převedení cis:
expr("10")-›cis
Po provedení tohoto příkazu bude v proměnné cis hodnota 10 a ne řetězec "10". Tento příkaz s přímým zadáním argumentu nemá v programu praktický význam - když víme, že budeme chtít převést "10" na výraz, tak rovnou uložíme 10 jako výraz:
expr("ahoj")->cis
Zajímavější je převod "nečíselného" řetězce. Tu se projeví síla typu expression - výraz. Po tomto příkazu se hledá proměnná s názvem "ahoj". Pokud existuje, bude "ahoj" bráno jako proměnná s obsahem, můžeme tedy tímto převodem vyvolat její obsah. Pokud neexistuje, bude s "ahoj" nakládáno jako s obecnou nezávislou proměnnou bez hodnoty.
Výraz -> řetězec
Tento převod se používá přesně v opačném případě, než v předchozím, tedy když číslo (přesněji výraz) - výsledek výpočtu - chceme zobrazit na displeji jako součást nějakého dalšího řetězce nebo textu (příkaz Text v dialogovém okně). K tomuto účelu slouží funkce string(). Jejím argumentem je název proměnné typu výraz (nebo rovnou výraz samotný - opět - v programu se nepoužívá) a vrací převedený řetězec, který musí být zpracován buď jako argument jiného příkazu či funkce, nebo uložen do proměnné. Opět uvedu příklad:
10->a
Disp "Vysledek je "&string(a)&" V"
Zobrazí "Vysledek je 10 V", tedy spojení řetězců. V případě použití 'Disp "Vysledek je ",a' je zobrazení na dvou řádcích.
string(a)->a
Dlog
Text "Cislo a = "&a
Enddlog
Příkaz Text v bloku dialogu vyžaduje jako argument řetězec. I zde by se dalo použít převedení až v spojení řetězců.
string(10)->a
Tento příklad je zde jen pro úplnost, neboť je zbytečné v programu uvádět pevné argumenty (převod by se prováděl zbytečně). Po provedení tohoto příkazu bude v proměnné a řetězec "10".
Matice -> seznam
Převod mezi maticí a seznamem je méně používaný, ale použitelný. Oceníme ho hlavně v případech, kdy pracujeme se statistickou analýzou, tedy s proměnnou typu data (resp. se seznamy). Pokud do argumentu této funkce zadáme celou matici, bude převedena na seznam po řádcích. Chceme-li tedy vybírat do seznamu jeden prvek, řádek, sloupec nebo submatici, musíme využít přístupu k těmto prvkům pomocí funkce SubMat(), v případě řádku postačí výběr pomocí hranatých závorek (viz příklad).
mat list([1,2,3;4,5,6])->sez
Původní matice je dvouřádková, výsledný seznam bude {1,2,3,4,5,6}
mat list([1,2,3;4,5,6][2])
Do seznamu bude umístěn pouze druhý řádek matice.
mat list(subMat([1,2,3;4,5,6],1,1,2,2)
Pomocí funkce subMat() jsme vybrali submatici [1,2;4,5], která je umístěna do seznamu {1,2,4,5}. Samozřejmě je možné pracovat s maticí uloženou v paměti voláním jména její proměnné. Příklad zde uvádět nebudu.
Seznam -> matice
Protože se jedná o opačný převod než předchozí, je jasné, že oblast použití bude obdobná, tedy máme-li seznam jako výsledek nějaké statistické analýzy, můžeme jej použít v maticovém, resp. vektorovém počtu. Tato funkce ale nedokáže odhadnout, které prvky patří do kterého řádku, takže alibisticky vytvoří řádkovou matici, tedy vektor. K vytvoření dvourozměrné matice budeme muset vytvořit novou libovolnou dvourozměrnou matici, do které budeme jednotlivé řádkové matice vkládat prostým přiřazením. Ukážeme si pár příkladů:
list mat({1,2,3})->mat
Z daného seznamu jsme vytvořili řádkovou matici, neboli řádkový vektor.
list mat({1,2,3})->mat1
list mat({4,5,6})->mat2
NewMat(2,3)->mat
mat1->mat[1]
mat2->mat[2]
V prvních dvou řádcích jsme vytvořili dva nové vektory, dále novou dvouřádkovou matici, do které budeme ukládat naše vektory. Když už jsme ale u toho, mohli bychom tento převod trochu vylepšit. Pravděpodobně budeme počet vektorů (řádků nové matice) znát dopředu. Půjde tedy jen o to, aby seděl počet sloupců (prvků v každém vektoru). Toto malé ošetřeníčko by mohlo vypadat třeba takto:
list mat({1,2,3})->mat1
list mat({4,5,6})->mat2
if (dim(mat1) > < dim(mat2))
return
NewMat(2,dim(mat1))->mat
mat1->mat[1]
....
Kdybychom měli těchto seznamů více, mohli bychom ušetřit kód a umístit celou proceduru do cyklu. Dokonce bychom ani nemuseli znát počet seznamů. To už ale zasahuje do dalších článků....
Výraz -> sezam
Název "Výraz -> seznam" trochu zavádí. Slovo "výraz" totiž znamená výsledek po řešení rovnice pomocí funkce solve() a csolve(). Je třeba dodat, že tyto funkce nejsou funkcemi v pravém slova smyslu - nevracejí totiž hodnoty, ale výsledek pouze zobrazí na display. Tyto výsledky se nedají programově zpracovat a proto je tu funkce, která výsledky solve() a csolve() převede na seznam výsledků (kořenů rovnice). Potom už lze s výsledky dále počítat. Tento postup (použití dvou funkcí) je trochu nešikovný, vzhledem k tomu, že se dá většina problémů řešit pomocí zeros() a czeros(). Někdy je ale použití solve() nevyhnutné, takže proto je tu tento převod:
exp list(solve(2x^2-2x+1=5,x),x)->vysl
disp "Prvni koren",vysl[1]
disp "Druhy koren",vysl[2]
Řešením dané rovnice dostaneme dva kořeny, které nám funkce exp > list uloží do seznamu vysl, jehož členy můžeme například jednotlivě zobrazit pomocí disp. Nesmíme zapomenout udat v argumentu funkce převodu název proměnné, jejíž výsledky chceme převést (v našem případě x).