Výpočet příkladu předaného jako string   zodpovězená otázka

VB.NET

Zdravíčko,

ve škole jsme dostali za úkol naprogramovat ve VisualBasicu kalkulačku do konzole. No a jednim z bonusových úkolů je to, že načtu od uživatele obecný příklad jako string, s libovolnými operandy, se závorkami (například (6+3)*9/3-5) a program ho má vypočítat. Bohužel moc mi nedochází jak toto řešit.Samozřejmě od vás nechci celé řešení, to bych z toho ani neměl radost, spíš jen takové lehké postrčení :-).Díky

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jednou jsem přesně toto řešil v Deplhi. bylo to taky ještě na škole. Pokud si dobře pamatuji, jedná se v podstatě o to ten řetězec rozkouskovat, takže musíte naučit ten program, aby prohlédaval daný řetězec. Začněte tím, že najdete nejvíce vnořenou závorku - čili například do nějakého zásobníku ukládat všechny "(" dokud nenarazíte na ")". V tuto chvíli víte, že uvnitř již budete mít nějaký příklad jednoduchý, který začnete opět prohledávat - musíte nejprve vyřešit "*, /" a poté "+, -". Teď už stačí převést to číslo ve stringu na integer, vypočítat a nahradit onu závorku výsledkem a jet v podstatě znova s novým řetězcem. Určitě lze na to aplikovat různé metody prohledávání, pokud půjde i o nějaké nároky na rychlost, ale pokud bude zadání v takovéto podobě, tak snad ani nebude třeba vymýšlet něco složitého.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

A není to zbytečné? VB .NET počítat umí a závorky respektuje - zkuste:

  Console.WriteLine((3 + 5 * 9 / (5 - 4)))
  Console.ReadLine()

vystoupí 48 - vstupní hodnoty jistě budou zadávány do proměnné

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Tohle ale nebude fungovat, pokud bude vstup zadávat uživatel.

Řeší se to buď vytvořením stromu výrazu, nebo zpracování výrazu v infixové notaci (zkus vyhledat nějaké algoritmy na internetu).

Pomalejší, ale jednodušší řešení spočívá ve vyhledání operátoru, který se bude zpracovávat nejpozději a rozdělením výrazu na dva podvýrazy (např. "3 + 5 * 9 / (5 - 4)" se rozdělí na "3" a "5 * 9 / (5 - 4)"). Na tyto výrazy se znovu spustí stejné vyhledávání (pokud tam nějaký operátor zbyl).

Můžeš se také podívat na řešení druhé úlohy v soutěži .NET Challenge, jako těžká úloha tam byl právě parsovač matematických výrazů.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Díky moc, přesně tohle je to popostrčení co jsem potřeboval. Díky díky díky :-)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tato úloha se shodou okolností řešila v soutěži .NET Challenge. Správné řešení je popsáno v tomto článku: http://www.vbnet.cz/blog-clanek--189-vys...

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback