Calculator/index.html
2023-12-02 14:12:25 +01:00

54 lines
3.5 KiB
HTML

<!doctype html>
<html>
<head>
<meta charset="utf-8" http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>CALC</title>
<style>
tr, td { border-collapse: collapse; }
table { width:100%; border-collapse: collapse; text-align: center; }
.emscripten { padding-right: 0; margin-left: auto; margin-right: auto; display: block; }
textarea.emscripten { font-family: monospace; font-size: 16px; width: 100%; overflow-x: scroll; white-space: pre; background: black; color: rgb(0,255,0);}
.frame1 { width: 96%; margin: 0; padding: 10px; background-color: #FFFFC0; border: 10px solid #F0C0F0; }
.canvas { width: 100%; height: 65vh; background-color: black; }
</style>
</head>
<body>
<script type="module" src="index.js"></script>
<div class="frame1"><canvas id="canvas" class="canvas"></canvas></div>
<div class="frame1"><input id="buttonTest" type="button" value="Submit"></div>
<div class="frame1">
<table><tr>
<td width="40%"><textarea class="emscripten" id="input" rows="10" spellcheck="false"></textarea></td>
<td><textarea readonly class="emscripten" id="stdout" rows="10" spellcheck="false"></textarea></td>
</tr></table>
</div>
<div class="frame1">
<h2>Kalkulátor s grafickým výstupem.</h2>
<p>Když jsem přepisoval z nudy syntax highlighter pro C++ z pythonu do C++, zjistil jsem, že regulární výrazy
jsou kupodivu v tom pythonu efektivnější. V tomto ohledu je STL knihovna asi dost naprd. Ale vzpomněl jsem si
na prastarý pár flex a bison, který umí nejen regulární výrazy, ale jde s tím parsovat dost jednoduše gramatika.
Mělo by to jít i v C++, ale příklady na webu byly dost zamotané a bylo nutné použít STL, kterou jsem pro tento
účel neměl k dispozici. Vyřešilo se to jednoduše - vygenerovaný C-čkový kód se přeloží jako C++, přičemž je
nutné povypínat něktetré warningy.
</p>
<p>Je to tedy jednoduchý kalkulátor, jde napsat výraz s normální notací (+-*/^), obsahující čísla (i desetinná),
který to normálně vyhodnotí. Postupně přibyly proměnné (jen písmenkové řetězce), které mohou mít i rozsah ve
kterém se pak výraz zobrazí jako funkce. Syntaxe je <br>
proměnná = dolní_mez , horní_mez , počet_bodů<br>
a použije se pro vodorovnou osu, poslední řádek je pak výraz, jehož hodnota je na svislé ose. Ostatní "proměnné"
jsou pak fakticky jen pojmenované konstanty. Zobrazovaných funkcí (výrazů) může být víc, první určí limity
zobrazení na ose "y". Komentáře jsou ve složených závorkách. Vložené matematické funkce
jsou sin(), cos(), exp(), log() (přirozené).<b>Na konci výrazu musí být ENTER.</b>
</p>
<p>Jsou v tom chyby, celé je to vlasně hloupost, celé by to šlo napsat v javascriptu mnohem jednodušeji,
ale v podstatě to funguje a jde si podle toho udělat představu, jak daná funkce vypadá. Odkaz na zdrojáky v licenci
MIT <a href="https://code.nolog.cz/Kizarm/Calculator" target="_blank">přikládám</a>. Pro kompilaci je použit jen
clang a jím kompilovaná C-čková knihovna <a href="https://sourceware.org/newlib/" target="_blank">newlib</a>.
</p>
<p>Že jde něco takového napsat v čistém javascriptu, viz <a href="./Hamilton/index.html">zde</a>.
Není to dokonalé, ale funguje to. Python by na to byl asi lepší, ale tady není potřeba nic jiného
než prohlížeč.
</p>
</div>
</body>
</html>