MISO Calc

Copyright (C) 1999 Michal Cihar
Semestralni prace z vypocetni techniky


Co chcete cist:
Abstract  Uvod  Algoritmus  Datove struktury  Funkce  Konstanty  Operatory  Unit  Ovladani  Zaver

Abstract

Calcul is a recursive expression evaluator unit for Turbo Pascal. This unit can be used to retrieve expression from the user and calculate result of this expression.

Supported are operators (+, -, *, /, \, %, ~, ^, !, =), parethesis, functions, constants and variable. Variables can be saved or loaded from or to disk file.

Operators (functions) are evaluated according to their priorities. Operators of same priority are evaluated left to rigth it means that the most left operator (function) is evaluated first.

This program and unit are provided as FREEWARE. If you use this unit plese mention my name somewhere in credits or stuff like this.
Na zacatek


Uvod

Jako tema pro semestralni praci jsem se rozhodl vypracovat program ktery umozni vyhodnotit vyraz zadany uzivatelem za behu programu.
Na zacatek

Algorimus

Vyhodnocovani vyrazu

  1. Zpocitat pocet zacatku a koncu zavorek, pokud je vice koncu nahlasit chybu, pokud je vice zacatku pridat na konec potrebny pocet koncu zavorek
  2. Zjistit, jestli je ve vyrazu =, pokud je tak priradit promenne se jmenem pred = hodnotu zpocitanou za = (pokracovat ve vyhodnocovani)
  3. Zpocitat hodnotu vyrazu zleva doprava podle priorit: 1. funkce, promenne, konstanty, cisla, expnent; 2. zavorky (, ); 3. faktorial (!); 4. znamenko (+, -); 5. mocnina (^); 6. nasobeni, deleni, celociselne deleni, zbytek po deleni (*, /, %, \); 7. scitani, odcitani (+, -)

Na zacatek
Datove struktury

Pouzivane typy

TCislo - typ cisla ktere se bude pouzivat - standartne extended
Retezec - string o delce MaxDelka pro zadani vyrazu (nyni 239 = 4 radky x 60 znaku)
TUhlovaMira - v jake uhlove mire jsou zadavana cisla a maji byt vysledky

Pamet

Pamet je realizovana jako obousmerne retezeny spojovy seznam. Obsahuje jmeno promenne a jeji hodnotu.

Konstanty

Konstanty jsou realizovany jako obousmerne retezeny spojovy seznam. Obsahuje jmeno konstanty, jeji hodnotu a popis, ve kterem je v hranatych zavorkach ([, ]) uvedena jednotka konstanty.

Funkce

Funkce jsou ulozeny v poli, ktere obsahuje jmeno funkce a proceduralni typ, ktery provede vypocet teto funce.

Historie prikazove radky

Historie prikazove radky je ulozena v obousmerne retezenem spojovem seznamu. Obsahuje retezec zadany z prikazove radky.
Na zacatek

Definovane funkce

Funkce Popis Pocet parametru
sin, cos, tg, cotg goniometricke funkce 1
arcsin, arccos, arctg, arccotg cyklometricke funkce 1
sinh, cosh, tgh, cotgh hyperbolicke funkce 1
argsinh, argcosh, argtgh, argcotgh hyperbolometricke funkce 1
ln, ln2, ln10 logaritmus o zakladu e, 2 ,10 1
exp, power2, power10 mocnina e, 2, 10 1
sqr, sqrt druha mocnina, odmocnina 1
cu, cur treti mocnina, odmocnina 1
inv prevracena hodnota (1/x) 1
round zaokrouhleni 1
trunc, frac cela, desetinna cast 1
abs absolutni hodnota 1
deg, rad, grad prevod ze stupnu, radianu, gradu 1
log logaritmus o libovolnem zakladu 2
power mocnina 2
comb kombinace (kombinacni cislo) 2
var permutace 2
max, min vetsi, mensi cislo 2
maxa, mina cislo s vetsi, mensi absolutni hodnotou 2
avg, gav, hav prumer aritmeticky, geometricky, harmonicky 2
random nahodne cislo 0

Pokud ma fuknce jeden parametr nemusi byt uvedeny v zavorkach, vice parametru v zavorkach musi byt. Pokud neni parametr v zavorkach, jako parametr je pouzita prvni nasledujici hodnota. Priklady: sin pi = sin(pi), sin 5pi = sin(5*pi), but sin 5*pi = sin(5)*pi
Na zacatek


Definovane konstanty

jmeno=hodnota (informace [jednotky])
ANS= 0 (Vysledek posledniho vypoctu)
E= 2.71828182845904524 (Eulerovo cislo)
PI= 3.14159265358979324 (Ludolfovo cislo)
_MP= 1.6726231E-27 (Klidova hmotnost protonu [kg])
_F= 96485.309 (Faradayova konstanta [C/mol])
_A0= 5.29177249E-11 (Bohruv polomer [m])
_C= 299792458 (Rychlost svetla ve vakuu [m/s])
_H= 6.66260755E-33 (Plankova konstanta [J*s])
_GK= 6.67259E-11 (Gravitacni konstanta [N*m*m/kg*kg])
_E= 1.60217733E-19 (Elementarni naboj [C])
_ME= 9.1093897E-31 (Klidova hmotnost elektronu [kg])
_U= 1.6605402E-27 (?Eng: Atomic mass unit [kg])
_NA= 6.0221367E+23 (Avogadrova konstanta [1/mol])
_K= 1.380658E-23 (Boltzmannova konstanta [J/K])
_G= 9.80665 (Gravitacni zrychleni [m/s*s])
_R= 8.31451 (?Eng: Molar gas constant [J/mol*k])
_E0= 8.8541878176204E-12 (Permitivita vakua [F/m])
_U0= 0.000001256637061436 (Permeabilita vakua [H/m])
_UB= 9.2740154E-24 (Bohruv magneton [A/m*m])
_HK= 1.05457266E-34 (Konvertovana (Converted) Plankova konstanta [J*s])
_MN= 1.6749286E-27 (Klidova hmotnost neutronu [kg])
_R8= 10973731.53 (Rydbergova konstanta [1/m])
_O= 0.0000000567051 (Stefan-Boltzmannova konstanta [W/m*m*k*k*k*k])
ZETTA= 1E+21 (Prepona [Z])
EXA= 1E+18 (Prepona [E])
PETA= 1E+15 (Prepona [P])
TERA= 1E+12 (Prepona [T])
GIGA= 1000000000 (Prepona [G])
MEGA= 1000000 (Prepona [M])
KILO= 1000 (Prepona [k])
HECTA= 100 (Prepona [h])
DECA= 10 (Prepona [da])
DECI= 0.1 (Prepona [d])
CENTI= 0.01 (Prepona [c])
MILI= 0.001 (Prepona [m])
MICRO= 0.000001 (Prepona [u])
NANO= 0.000000001 (Prepona [n])
PIKO= 1E-12 (Prepona [p])
FEMTO= 1E-15 (Prepona [f])
ATTO= 1E-18 (Prepona [a])
ZEPTO= 1E-21 (Prepona [z])
YOKTO= 1E-24 (Prepona [y])
Na zacatek


Definovane operatory

* ... nasobeni
/ ... deleni
% ... celociselne deleni
\ ... zbytek po celociselnem deleni
+ ... scitani\znamenko
- ... odcitani\znamenko
() ... zavorky
^ ... mocnina
~ ... exponent
= ... prirazeni
! ... faktorial
Na zacatek

Rozdeleni programu do unit

Program je kvuli prehlednosti rozdelen do unit:
calcul ... zpracovani vyrazu, definice funkci
udata ... definice typu, konverzni funkce
upamet ... promenne a konstanty a prace s nimi
strfunc ... prace s retezci, prevod cisel na retezce
uhistory ... historie prikazove radky
ukbd ... pristup ke klavesnici (misto CRT)
uscreen ... prace s obrazovkou (misto CRT)
Na zacatek

Ovladani programu

Po spusteni programu se objevi prikazova radka na kterou zadavate vyraz, ktery chcete spocitat. Vyraz muze obsahovat funkce, operatory, cisla, konstanty a promenne, ktere byly drive definovany. Promenou definujete zapsanim jmeno_promenne=vyraz. Promennou muzete take nahrat ze souboru prikazem @NAHRAJ jmeno_souboru. Tento soubor muze byt drive vyvoren zapsanim @ULOZ jmeno_souboru. Vsechny promenne se daji zrusit zapsanim @VYPRAZDNI, po zadani tohoto prikazu se program dotaze, jestli chcete opravdu smazat vsechny promenne.
Programu muzete take krome vyrazu zadavat i nektere prikazy: @ASCII - vypise ASCII tabulku, @CLS - smaze obrazovku, @MEM - informace o pameti.

Napoveda se vyvola zapsanim ? nebo ?neco, kde neco je parametr napovedy:
?F / ?FUNKCE ... informace o funkcich
?P / ?PROMENNE ... informace o promennych
?O / ?OPERATORY ... informace o operatorech
?I / ?INFO ... informace o programu
?S / ?STAV ... informace o stavove radce
?C / ?PRIKAZY ... informace o prikazech
?K / ?KONSTANTY ... vypis konstant
?L / ?VYPIS ... vypis promennych
?W / ?POPIS ... popis funkci
?E / ?EDITACE ... klavesy pri editovani prikazove radky
?Q / ?KLAVESNICE ... klavesove zkratky pro funkce
?V / ?VYHODNOCOVANI ... priority vyhodnocovani vyrazu
?Z / ?ZAJIMAVOSTI ... zajimavosti o funkcich, presnost pocitani
?? ... seznam parametru napovedy

Funkce je mozno zapsat klavesovymi zkratkami:
Alt+klavesa prida na prikazovou radku funkci');
A ... ABS - absolutni hodnota
C, S ... COS - kosinus, SIN - sinus
E ... EXP - exponenciala
F ... FRACT - desetinna cast
K ... COMB - kombinace (kombinacni cislo)
L ... LOG - logaritmus (prvni parametr zaklad)
M, O ... SQR, SQRT - druha mocnina, odmocnina
N ... LN - prirozeny logaritmus
P ... POWER - mocnina (prvni parametr na druhy)
R ... RANDOM - nahodne cislo
Q, X ... KONEC
T ... TG - tangens
V ... VAR - variace
Z ... ROUND - zaokrouhli
= ... TRUNC - cela cast cisla
- ... ANS - vysledek posledniho vypoctu
1 ... LOG10 - logaritmus o zakladu 10
2, 0 ... POWER2, POWER10 - mocnina o zaklady 2, 10
3, 4 ... MAX, MIN - vetsi, mensi cislo
F5, F6, F7 ... DEG, RAD, GRAD - prevod uhlu

Pri editaci se daji pouzit tyto klavesy:
sipky ... pohyb po vyrazu
Home ... pohyb po radce (na zacatek)
End ... pohyb po radce (na konec)
PgUp ... pohyb v historii prikazu (zpet)
PgDown ... pohyb v historii prikazu (dopredu)
Insert ... prepinani vkladani/prepisovani
Backspace ... smazani predchoziho znaku
Delete ... smazani aktualniho znaku
Tab ... smazani cele radky
F5, F6, F7 ... nastavi jednotku uhlu na stupne, radiany, grady
F8 ... vypina/zapina vkladani ANS po zadani operatoru na zacatku prikazu
Na zacatek


Zaver

Behem testu jsem v programu nenasel zadne chyby, ale nemohu vyloucit, ze se tam zadne nenachazeji, program urcite jeste neni dokonaly.
Na zacatek
Co chcete cist:
Zacatek  Abstract  Uvod  Algoritmus  Datove struktury  Funkce  Konstanty  Operatory  Unit  Ovladani  Zaver

Copyright (C) 1999 Michal Cihar