Diskuze: Zpracování vzorce
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Tvůrce
Zobrazeno 17 zpráv z 17.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Opravil jsem sekci hledání funkcí - místo contains jsem dal ty příkazy se 4mi znaky do catch bloku, zbytek pod,...
Oprava:
string[] dohr = new string[2];
try
{
try
{
dohr[0] = this.Vzorec.Substring(pozz - 4, 4);
dohr[1] = this.Vzorec.Substring(pozz - 3, 4);
}
catch
{
dohr[0] = "nic";
dohr[1] = this.Vzorec.Substring(pozz - 3, 4);
}
}
catch
{
dohr[0] = "nic";
dohr[1] = "nic";
}
if (dohr[0] == "sin" || dohr[1] == "sin")
this.matf = "sin";
else if (dohr[0] == "sinh" || dohr[1] == "sinh")
this.matf = "sinh";
else if (dohr[0] == "asin" || dohr[1] == "asin")
this.matf = "asin";
else if (dohr[0] == "cosh" || dohr[1] == "cosh")
this.matf = "cosh";
else if (dohr[0] == "acos" || dohr[1] == "acos")
this.matf = "acos";
else if (dohr[0] == "tanh" || dohr[1] == "tanh")
this.matf = "tanh";
else if (dohr[0] == "atan" || dohr[1] == "atan")
this.matf = "atan";
else if (dohr[0] == "cos" || dohr[1] == "cos")
this.matf = "cos";
else if (dohr[0] == "tan" || dohr[1] == "tan")
this.matf = "tan";
else
this.matf = "";
Tak nevím, mně se to nezdá. Nebylo by lepší použít na parsování stavový automat? Tohle věčné nahrazování má vysokou režii.
No tak z celého toho kódu se porvede ani ne čtvrtina,... Nevím, co máš na mysli - konečný automat?
Až z toho budeš kreslit grafy...
Mám na mysli Mooreův nebo Mealyho automat. Je jedno, který použiješ, jsou mezi sebou převoditelné. Mooreův je na pochopení jednodušší a pamatuje si poslední stav.
Prostě bereš ze vstupu znak po znaku. Až z toho detekuješ symbol, dáš ho na výstup jako dvojici (symbol, atribut) nebo ho rovnou zpracuješ.
Kdybys místo špagety "else if" použil slovník, bylo by to kratší a efektivnější.
Také nechápu, proč se před nahrazováním znaků v řetězci ptáš, jestli tam ten znak je. A také nechápu, proč to nemáš v jedné funkci, ale děláš to pro každý znak zvlášť. Že by v C# nebyl ekvivalent funkce tr()?
Ptám se proto, že pokud to v tom stringu není, tak to hodí error - protože to tam musí být - tak se ptám,... Nevím, jak bych to měl jinak udělat - ani switch se na to nehodí,...
Error nebo výjimku? Výjimka se dá ošetřit a dá se z ní zotavit.
Podívej se, jak se dělá slovník. Ovšem překládat "asin" jako "asin" mi připadá poněkud hloupé. Když už si dáš tu práci a rozpoznáš symbol, měl bys mu přiřadit místo stringu třeba výčet. I když netuším, jak to dál zpracováváš. Snad ne jako string.
To mám louskat tu hrůzu, ve které je každý druhý řádek zbytečný? Navíc jsem v C# nikdy nedělal.
Co jsem našel na internetu byly kilometrové vzorce - a neuměli vše - jeden třeba jen základní operace + pow a toť vše - a o desetinných číslech aby si člověk nechal zdát - mě fungují všechny funkce, i destinná čísla,... Celou dobu se snažím srazit kód na minimum - i cykly maximálně omezit,... Ještě s tím zkusím něco udělat,...
Nemohu to celé strčit do try bloku - pak by to neproběhlo vším,...
Která? Totiž mám to rozdělené na tři části. Pokud výraz obsahuje závorky, vyhledám tu nejvnitřnější - to spočítám do dočasného double a nahradím ve vzorci. Takto pokračuji, dokud výraz neobsahuje žádnou závorku. Pak to již spočítám do výsledného double,...
Zobrazeno 17 zpráv z 17.