ã³ã³ãã¥ãŒã¿ãŒãšäººé-ç§ãã¡ããäºããçè§£ããããšã¯ã©ãã»ã©é£ãããã å®éãããã°ã©ãã³ã°ããã»ã¹ã¯ããã·ã³ãçè§£ã§ããèšèªã§ããã·ã³ã«å¿
èŠãªãã®ã説æãããã®ã§ãã
ã¯ããã«
ç§ã®ä»äºã§ã¯ããŸãè¶£å³ãšããŠãæ°åŠèšç®ã«é¢é£ããã³ãŒããæžãããã»ã¹ã«é¢äžããŠããŸãã æåŸã®ã¿ã¹ã¯ã®1ã€ã¯ãããŒã¿ãèšç®ãèŠèŠåãããã³ããã€ãã®æ°åŒãæé©åãããšãã«ããŠãŒã¶ãŒãç¬èªã«å
¥åããŠäœ¿çšã§ãããœãããŠã§ã¢ãäœæããããšã§ããã ãããŠãç¹å¥ãªæ°åŠé¢æ°ã®ã³ãŒãã©ã€ãã©ãªãçµ¶ããè£å®ããç§ã®èªç¶ãªæ andããšäžæ¬æãèæ
®ããŠãèããæãæµ®ãã³ãŸãã-ã¯ã¬ã€ãžãŒãªåŠçã®ã¢ã€ãã¢ãå®è£
ããæ°åŒçšã®ããŒãµãŒãã€ã¯ãçºæããªãã®ã¯ãªãã§ããïŒ
ãã¡ãããæ¬çºæã®ããã»ã¹ã«çæããåã«ïŒåã³ãæ®éçãªæ inessãèæ
®ããŠïŒãæ¢åã®å®è£
ãããŒãã«ããYandexãšGoogleã®ããªãé·ãã¬ã€ãããããŸããã ãããŠãã¡ããã圌ãã¯éåžžã«å€ãçºèŠãããŸããã ããããæ®å¿µãªãããç¹å®ã®å®è£
ããéæãããã£ããã®ã¯èŠã€ãããŸããã§ããã æ€çŽ¢æ¡ä»¶ã¯æ¬¡ã®ãšããã§ãã
- ããŒãµãŒã¯ã4.0ããå€ã.NETã®äžã§å®è£
ããå¿
èŠããããŸãã
- ãã¹ãŠã®åºæ¬çãªæ°åŠæŒç®åïŒ+ã-ã*ã/ã^ãªã©ïŒãåŠçããããŸããŸãªçš®é¡ã®åªå
é äœãšãã©ã±ãããèæ
®ã«å
¥ããå¿
èŠããããŸãã
- ã¡ã€ã³é¢æ°ïŒsinãcosãªã©ïŒãèªèããäœæãããããŒãµãŒãªããžã§ã¯ãã«ç¬èªã®é¢æ°ã远å ããŠãïŒä»»æã®æ°ã®å
¥å倿°ã«å¯ŸããŠïŒå€ãèšç®ããã¡ãœããã®ããªã²ãŒãã瀺ãããšãã§ããŸãã
- ããŒãµãŒã«æ¢ç¥ã®å®æ°ã䜿çšããããããåŒã®è§£æã«äœ¿çšããããªã¹ãã«è¿œå ããããšãã§ããã¯ãã§ãã
- ãã©ã¡ãŒã¿ãšå€æ°ãæäœããã¡ã«ããºã ãå¿
èŠã§ãã ããã«ã¯ãããŸããŸãªã¿ã€ãã®å€æ°ãå¿
èŠã§ããåã«æ°å€ãæ ŒçŽããããåŒã³åºãæã«å€éšã³ãŒããå€ã決å®ããã€ãã³ããçºçãããŸãã
- æ©èœçãªã¡ã«ããºã ãå®è£
ããå¿
èŠããããŸãïŒæå°-çµ±åãã·ãªãŒãºã®åèšãããã³å·®å¥åïŒ
- æåååŒã®è§£æçµæã¯ããã€ããªããªãŒãªããžã§ã¯ãã¢ãã«ã§è¡šçŸããå¿
èŠããããŸãã
- æãéèŠãªããšã¯ããã€ããªããªãŒãLinq.ExpressionããªãŒã«ãããã§ããããã.NETãã©ãããã©ãŒã èªäœã®é床ã§èšç®ãå®è¡ããããªã²ãŒãã«ã³ã³ãã€ã«ã§ããããšã§ãã
èªè»¢è»äœãã®ç®æš
å®éãèªè»¢è»ã®çºæã®äž»ãªç®æšã¯ãäžé£ã®æ°åŒãããªã²ãŒãã«ã³ã³ãã€ã«ããŠãå€ãèšç®ããããã»ã¹ãé«éåããå¯èœæ§ã§ããã
æ®å¿µãªãããæ€çŽ¢ãšã³ãžã³ã§äœæ¥ããããã®ç§ã®ããããªèœåãæéãåŽåãæ ofã®æ¬ åŠã¯ããããã¿ã€ãã®æ€çŽ¢ã§è¯å®çãªçµæããããããªãã£ããããçææ
è¡ã«çæããããšã«ããŸããã
ã¢ãã«ãšäž»ãªã¢ã€ãã¢
ãªããžã§ã¯ãã¢ãã«ã¯ãããŒãµãŒã¯ã©ã¹ãšæ°åŒã¯ã©ã¹ã®2ã€ã®ã¯ã©ã¹ã§æ§æãããŸãã å
éšã§ã¯ãããã«3ã€ã®ã¯ã©ã¹ã䜿çšãããŸãïŒæ°åŠåŒããªãŒã¯ã©ã¹ãmat.expressionããªãŒã®æœè±¡ããŒãã¯ã©ã¹ãããã³mat.expressionæååã®è«çèŠçŽ ã®ã¯ã©ã¹-çšèªã ããã«ã颿°ã倿°ã颿°ã®ã¯ã©ã¹ãããã³é¢æ°ã倿°ãããã³é¢æ°ã®ã³ã¬ã¯ã·ã§ã³ãããããå®è£
ãããŸãïŒãããã¯æ°åŠã®ã¯ã©ã¹ã«åã蟌ãŸããŸãïŒã
çºèŠããŸãã¯è§£æ±ºçã®æé©åã®ãµããããŠããªãããåé¡ã®è§£æ±ºçã«ã¢ãããŒããã詊ã¿ã§ãã£ãã¢ã€ãã¢ã¯ãmat.expressionæååã®æåã®åæã·ãŒã±ã³ã¹ãããã€ãã®è«çã³ã³ããŒãã³ãã«åè§£ããããšã§ããã åä»ããããæ°åŒã®è«çãããã¯ã®éå±€ã·ãŒã±ã³ã¹ã圢æããŸãã ãããŠãããã«åºã¥ããŠãmat.expressionã®ããªãŒãæ§ç¯ããŸãã
èšèšã¯ããã©ã®ããã«å®æãããŠã䜿ãããã䟿å©ã«ããããïŒããšããã¢ã€ãã¢ããå§ãŸããŸããã æ¬¡ã®ãŠãŒã¹ã±ãŒã¹ãå®è£
ããããšæããŸããã
ããŒãµãŒãªããžã§ã¯ããäœæããããã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã®ã¬ãã«ãŸãã¯ããžãã¹ããžãã¯ã®ã©ããã«ä¿®æ£ãããŸãã ããã¯æ§æãããŸãïŒå¿
èŠãªå®æ°ãããã«è¿œå ããããã®åŸæ©èœãã颿°ãå®çŸ©ãããŸãã äžæãªé¢æ°ããã³å€æ°ãåŠçããããã«ãã€ãã³ããµãã¹ã¯ã©ã€ããŒã远å ãããŸãã ãããŠãããŒãµãŒã¯ParceïŒstringïŒã¡ãœããã®åŒã³åºããåŸ
ã£ãŠããŸãã
ã¡ã€ã³ã®ParceïŒïŒã¡ãœããã§ã¯ããããåŒæååãå
¥åãšããŠæž¡ããããã®çµæã¯ãããåŒããªãŒãå«ããããåŒãªããžã§ã¯ãã«ãªããŸãã
mat.expressionã®ãªããžã§ã¯ãã«ã¯ããã®äžã«ãã颿°ã倿°ãããã³å®æ°ã®ã³ã¬ã¯ã·ã§ã³ãå¿
èŠã§ãã ãããã®ãªããžã§ã¯ãã®å€ã倿Žããå¯èœæ§ãããã³ãã®ä¿®æ£ãç®çãšããŠåŒããªãŒã«åœ±é¿ãäžããå¯èœæ§ãããã¯ãã§ãã æ°åŒã®ãªããžã§ã¯ãã«ã¯ãïŒæ°åŒã®ããªãŒããã©ããŒã¹ããããšã«ããïŒå€ãèšç®ããã¡ãœãããå¿
èŠã§ãããã®ã¡ãœããã¯ãå
¥å倿°ã®ã»ããããã©ã¡ãŒã¿ãŒãšããŠåãåããçµæãšããŠæ°å€ãçæããŸãã
æ°åŒãªããžã§ã¯ãã«ã¯ãæ°åŒããªãŒãSystem.Linq.Expressionãªããžã§ã¯ãã«å€æããã¡ãœãããå¿
èŠã§ãã ãããŠãLinq.Expressionã¡ã«ããºã ã䜿çšããŠããã«ã³ã³ãã€ã«ãããããªã²ãŒããååŸããã¡ãœããã
æ®å¿µãªãããé¡äŒŒããäœãã®æ¢è£œã®å®è£
ãããã®ãããªããŒãµãŒã®äœæãããçšåºŠèª¬æããæ¹æ³ããã©ãã«ã説æãããŠããŸããã
ãªããžã§ã¯ãã¢ãã«ã®èª¬æ
ãªããžã§ã¯ãã®äœæïŒäœæåŸïŒã¯ãParseã¡ãœããã®åŒã³åºãããå§ãŸããŸãã
ãããªãã¯MathExpressionè§£æïŒæååStrExpressionïŒ
å¥çŽãçç¥ãããšã圌ã®ä»äºã®æå³ã¯ãæååã®ååŠçãæ°åŒã®ã³ã³ã¹ãã©ã¯ã¿ãŒã®åŒã³åºããããã³å€æ°ãšé¢æ°ã®åæã®ããã®ãã®åŒã®åŸåŠçã«éå®ãããŸãã
ååŠçã«ã¯2ã€ã®æ®µéããããŸãã
æååããäœåãªæåãåé€ãããã©ã€ããŒãStrPreprocessingã¡ãœããïŒ
ä¿è·ãããvoid StrPreprocessingïŒåç
§æååStrïŒ ããŒãµãŒãŠãŒã¶ãŒãåæã®ããã«æååãç¬ç«ããŠæºåã§ããããã«ãæååååŠçã€ãã³ããçæããã¡ãœããïŒ
ãããªãã¯ã€ãã³ãEventHandler <EventArgs <string >> StringPreprocessing è¡ã®ã¬ããŒãžãã¯ãªã¢ãããè§£æã®æºåãæŽããšãåŒã®ã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ãããŸãã 颿°ã宿°ã倿°ã®å®çŸ©ãæ
åœããããŒãµãŒèªäœãæž¡ãããŸãã
ãã®ã¡ã³ããŒãèšåããããšãããŒãµãŒã¯ã©ã¹ã«æ»ããŸãããããŠã...æ°åŠè¡šçŸã®ã¯ã©ã¹ïŒ
Parseã¡ãœããããã®åŒã³åºããæž¡ãããã³ã³ã¹ãã©ã¯ã¿ãŒïŒ
å
éšMathExpressionïŒæååStrExpressionãExpressionParserããŒãµãŒïŒ ç¹°ãè¿ããŸãããã³ã³ãã©ã¯ããããã¯ãçç¥ãããšãæåã«ãè¡ã«åºã¥ããŠãåŒã®çšèªã®éå±€ãªããžã§ã¯ãæ§é ãäœæãããŸãã æ¬¡ã«ãæåã®ãããã¯ãããmat.expressionã®ããªãŒã®ã«ãŒããååŸããã¡ãœãããåŒã³åºãããŸãã ãããŠãããã«åºã¥ããŠããªãŒã³ã³ã¹ãã©ã¯ã¿ãŒãæ©èœããŸãã
æ°åŒã®åæã®æåã®æ®µéã§ã¯ãæåå衚çŸïŒæåã®ã·ãŒã±ã³ã¹ïŒãè«çãããã¯ã®ã·ãŒã±ã³ã¹ã«çµåããå¿
èŠããããŸãã ãããã®ããã€ãã¯ãäºãã«ååž°çã«ãã¹ãã§ããŸãã
åŒçšèªã¯ã©ã¹ã®éå±€ è¡ã¯4çš®é¡ã®çšèªã«åãããŠããŸãã
- BlockTerm-çšèªã®é
åãå«ãçšèªã
- StringTerm-æååå€ãå«ãçšèª
- CharTerm-éåžžã®æååã«é¢é£ä»ããããšãã§ããªã1æåãå«ãçšèªã
- NumberTermã¯ãæŽæ°ãå«ãçšèªã§ãã
ãããã£ãŠãæåã¯è¡å
šäœã1ã€ã®ãããã¯çšèªãšããŠè¡šããããã®äžã«æ§æèŠçŽ ãå«ãŸããŸãã
public BlockTermïŒæååStrïŒ åºæ¬çãªãã«ãã¯ã©ã¹ïŒ
æœè±¡ã¯ã©ã¹Term {...} éšåæååã®æ§æèŠçŽ ãžã®å
èš³ã¯ãGetTermsã¡ãœããã«ãã£ãŠå®è¡ãããŸãã
private static Term [] GetTermsïŒæååStrïŒ ãã®ã¡ãœããã¯ã空ã®å
¥åè¡ãšãŒãé·ããã§ãã¯ããããšããå§ãŸããŸãã ãã®åŸãè¡å
ã®åæãããã·ã³ãã«ã®çŸåšã®äœçœ®ãšãã®é·ããåºå®ããããã®åŸãçŸåšã®äœçœ®ã®ã·ã³ãã«ã¯è¡ã®çµããã«éãããŸã§ãµã€ã¯ã«ã§èæ
®ãããŸãã
-æåãŸãã¯æŽæ°ã®èšå·ã®å ŽåãGetNameStringã¡ãœããã䜿çšããŠååããã£ããã£ããããšããŸãã
ãã©ã€ããŒãéçæååGetNameStringïŒæååStrãref int posïŒ ãã®åŸãçŸåšã®æåã«éå§ãã©ã±ããããããã©ããããã§ãã¯ãããŸãã ãã©ã±ããã®1ã€ãèŠã€ãã£ãå Žåããã¹ãããããããã¯ãè¡ããæœåºãããéå§ãã©ã±ãããšå¯Ÿå¿ããçµäºãã©ã±ããã«ãã£ãŠå¶éãããŸãã ãã®æ¹æ³ã§äœæããããããã¯çšèªã¯ãæ©èœçšèªã®ã³ã³ã¹ãã©ã¯ã¿ãŒã«é
眮ãããåã«èšå®ããã颿°åã瀺ãããŸãã
éãæ¬åŒ§ãšéãæ¬åŒ§ã§å¶éãããéšåæååã¯ãæ¡åŒµã¡ãœããã«ãã£ãŠæååããéžæãããŸãã
public static string GetBracketTextïŒãã®æååStrãref int OffsetãæååOpenãæååCloseïŒ æåã«ãéå§æåãšçµäºæåã®æåã®åºçŸã®ã€ã³ããã¯ã¹ã決å®ãããŸãã æåã®æåãèŠã€ãããªãå Žåã¯ãvoidãè¿ããŸãã çµäºæåãèŠã€ãããªãå Žåãããã¯ãã©ãŒããããšã©ãŒã§ãã
ãã®æ¹æ³ã®èãæ¹ã¯ãè¡ã®å
é ãšæ«å°Ÿã®ãã¿ãŒã³ãé çªã«åŸªç°æ€çŽ¢ããããšã§ãã æ¬¡ã®ãªãŒããã³ã°ãã£ã©ã¯ã¿ãŒãèŠã€ããããšããŠããŸãã èŠã€ãã£ãŠãçµäºæåã®åã«ããå Žåã¯ãçµäºæåã®ã€ã³ããã¯ã¹ãæŽæ°ããå¿
èŠããããŸãã ãµã€ã¯ã«ã¯ãéå§æåã®åã«ãªãçµäºæåããããŸã§ç¶ããŸãã
ã¡ãœããã®çµæã¯ãéå§æåãšçµäºæåã®éã«ãããµãã¹ããªã³ã°ã§ãã
圢æãããæ©èœçšèªã®åŸã«éå§äžæ¬åŒ§ãèŠã€ãã£ãå Žåãããã¯æ©èœã®æ¬äœãéå§ããŸãã ãããã¯å
ã®äžæ¬åŒ§ã®å
容ãéžæããterm-functionalãäœæããterm-functionã瀺ããŸãããã®ã³ã³ããã¹ãã§ã¯ã颿°ã®ååãšãã®ãã©ã¡ãŒã¿ãŒãå«ãŸããæ¬äœã¯äžæ¬åŒ§å
ã®ãããã¯ã«ãªããŸãã
æ¬åŒ§ãèŠã€ãããªãã£ãå ŽåãèŠã€ãã£ãååã¯ãªãã©ã«ïŒå°æ¥ã®å€æ°...ãŸãã¯å®æ°ïŒã§ãã
-æååã®æ¬¡ã®æåãæ°åã®å ŽåãæŽæ°ãå§ãŸããŸãã æ°åã®ã¿ãå«ãéšåæååãéžæããŸãã
ãã©ã€ããŒãéçæååGetNumberStringïŒæååStrãref int posïŒ ãã®ã¡ãœããã®çµæ-æ°åãå«ãæåå-ã¯ãæŽæ°é
ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã«åé¡ãããŸãã
-è¡ã®æ¬¡ã®æåãéãæ¬åŒ§ã®å Žåããããã¯ãå§ãŸããŸãã GetBracketTextæ¡åŒµã¡ãœããã§ãã®ãµãã¹ããªã³ã°ãéžæããŸãã
-æ¬¡ã®æåããã©ã±ããã§ã¯ãªãå Žåãããã¯ã·ã³ãã«çšèªã«å€ããæªå®çŸ©ã®æåã§ãã
äœæããããã¹ãŠã®çšèªã¯æåã«ãªã¹ãããåéãããé
åãšããŠè¿ãããŸãã
ä»ã®ãã¹ãŠã®çšèªã®ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ããã»ã©é¢çœããããŸããã ãããã¯ãçµæã®ãã©ã¡ãŒã¿ãŒãå
éšãã£ãŒã«ãã«æ ŒçŽããã ãã§ãïŒããããå倿ã䜿çšïŒã
ãã®åŸãæååã¯ãäºãã«åã蟌ãŸããç°ãªãã¿ã€ãã®çšèªã®ã·ãŒã±ã³ã¹ã®è«ççãªéå±€æ§é ã«å€æãããŸãã ãã®ã·ãŒã±ã³ã¹ãããæ°åŒã®äºåæšãååž°çã«æ§ç¯ãããŸãã
ããªãŒã®åºç€ã¯ããããã®ããªãŒããŒãã®åºæ¬ã¯ã©ã¹ã§ãã
åããŒãã¯ãå·Šã®ãµãããªãŒã®ã«ãŒãããŒããšå³ã®ãµãããªãŒã®ã«ãŒãããŒããžã®ãªã³ã¯ãããã³ãã®ç¥å
ãžã®ãªã³ã¯ãæ ŒçŽããã¯ã©ã¹ã§ãã ããªãŒããŒãã®æœè±¡ã¯ã©ã¹ã¯ãç¥å
/åå«ã®ããŒãããã©ããŒãµã«ã¡ãœãããçŸåšã®ããŒãã«é¢é£ä»ããããŠããããŒãã®åæãååŸã§ããæ©èœã€ã³ãã¯ãµãŒããã®ããŒãã«ïŒãµãããªãŒã®ã«ãŒããšããŠïŒæ¢ç¥ã®å€æ°ã颿°ãªã©ãååŸããããã®ååž°ã¡ãœããã«ã¢ã¯ã»ã¹ããããã®ã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããŸãã ãŸããããŒãã®åºæ¬ã¯ã©ã¹ã¯ãå€ãã®èšç®å¯èœãªããããã£ãæäŸããŸãïŒãµã€ã³-ããŒããå·Š/å³ãµãããªãŒã§ãããã©ãããããŒããã«ãŒãã§ãããã©ãããããªãŒã«ãŒããžã®ãªã³ã¯ãããªãŒã«ãŒãããçŸåšã®ããŒããžã®ã·ã³ããªãã¯ãã¹ãããã³ç¥å
ã€ãã¬ãŒã¿ã
ãã®ã¯ã©ã¹ã®ã³ãŒãã«ãããããªãŒèŠçŽ ã䜿çšããåºæ¬çãªæäœãå¯èœã«ãªãããããã眮æãåé
眮ããã©ããŒã¹ãããã³ã¢ã¯ã»ã¹ã§ããŸãã å¿
èŠã«å¿ããŠåå¥ã®ã¡ãœãããæäŸããŸãã å
šæã¯å€ãã®ã¹ããŒã¹ãå æããŸãã ãããžã§ã¯ããœãŒã¹ãã衚瀺/ã³ããŒã§ããŸãã
ããªãŒã®ãã¹ãŠã®ããŒãã¯ãèšç®å¯èœãŸãã¯è§£æã§äœ¿çšã§ããŸãã
è§£æããŒãã«ã¯ãæååããŒããæåããŒããééå€ããŒããå«ãŸããŸãã ãããã¯ãééãæå®ããå¿
èŠãããçµ±åæ©èœãªã©ãããªãŒå
ã®ç¹å®ã®ã¡ã¿æ§é ãè£å®ããããã«å¿
èŠã§ãã
èšç®å¯èœãªããŒãã¯ãçµæã®ããªãŒæ§é ã®äž»èŠãªããŒãã§ãã ãããã¯ãæ°åŒã§èšè¿°ã§ãããã¹ãŠã®èŠçŽ ã衚ããŸãã
ãããã«ã¯ä»¥äžãå«ãŸããŸãã
- ComputedBracketNode-ãã©ã±ããã®ãããã¯ã衚ããŸã
- ValueNodeã¯ãå€ããŒããè¡šãæœè±¡ã¯ã©ã¹ã§ãã 圌ã®çžç¶äººïŒ
-ConstValueNode-æ°å€ããŒã
-VariableValueNode-倿°ããŒãïŒpiãeã...ãªã©ã®å®æ°ïŒ
- FunctionNode-颿°ãªããžã§ã¯ãã衚ãããŒã
- FunctionalNode-æ©èœãªããžã§ã¯ãã衚ãããŒã
- NodeæŒç®åã¯ãæŒç®åããŒãã®æœè±¡ã¯ã©ã¹ã§ãã 圌ã®çžç¶äºº
-æãåçŽãªæ°åŠæŒç®å+ã-ã*ã/ã^;
-è«çæŒç®å==ãïŒã>ã<ã&&ã||;
-æ¡ä»¶ã<è«çæŒç®åã®æŒç®çµæ>ïŒãã®æŒç®å ãããŠãéžææŒç®åã<option_1>ïŒ<option_2>ã
-颿°ã®åŒæ°ãžã®ã¢ã¯ã»ã¹ãå®è£
ããæŒç®åãšã颿°ã®åŒæ°ã®ååã«ã¢ã¯ã»ã¹ããããã«äœ¿çšãããã¹ããŒãã¡ã³ãã
ããªãŒæ§ç¯ããã»ã¹
çšèªã¯ã©ã¹ã¯æœè±¡ã¡ãœããGetSubTreeã宣èšããŸããããã«ãããä»»æã®çšèªããããã«ãã£ãŠèšè¿°ããããµãããªãŒãååŸã§ããŸãã ããªãŒã®æ§ç¯ããã»ã¹ã¯ããœãŒã¹æååããçæããããããã¯çšèªã§ãã®ã¡ãœãããåŒã³åºãããšããå§ãŸããŸãã
ãããªãã¯ãªãŒããŒã©ã€ãExpressionTreeNode GetSubTreeïŒExpressionParserããŒãµãŒãMathExpression ExpressionïŒ ãã®ã¡ãœããã¯ãæž¡ããããªããžã§ã¯ãããããããã¯å
ã®åŒã衚ãã·ã³ãã«ãæœåºããŸãã ããã©ã«ãã®åºåãæåã¯ã;ãã§ãã -ã»ãã³ãã³ã
次ã«ãLinqã·ãŒã±ã³ã¹ã§ã¯ããã¹ããããçšèªã®é
åå
šäœããã»ãã¬ãŒã¿ïŒåŒã®åºåãæåãå«ãã·ã³ããªãã¯çšèªïŒã«ãã£ãŠãµãé
åã«åå²ãããŸãã ããã¯ãSplitæ¡åŒµã¡ãœãããæ
åœããŸãã
public static T [] [] Split <T>ïŒãã®T []é
åãFunc <Tãbool>ã¹ããªãã¿ãŒïŒ çšèªã®ãµãé
åããšã«ããã®ã°ã«ãŒãã®çšèªã®ããªãŒã®ã«ãŒããæ±ºå®ããããã«èšèšãããGetRootããŒãµãŒã¡ãœãããåŒã³åºãããŸãã æ¬¡ã«ãèŠã€ãã£ããã¹ãŠã®ã«ãŒããé
åã«çµåãããŸãã
GetRootã¡ãœããïŒ
å
éšExpressionTreeNode GetRootïŒçšèª[]ã°ã«ãŒããMathExpression MathExpressionïŒ ããã§ã¯ãåŒã®çšèªã®å
¥åé
åãé æ¬¡ã¹ãã£ã³ãããŸããåŒã®é£ç¶ããåé
ããããã®ããªãŒã®ã«ãŒããæœåºããŸãïŒããã§ååž°ãçºçããŸãïŒã次ã«ã以äžã確èªããå¿
èŠããããŸãã-çŸåšã®é
ãæŽæ°ã§ãé
åã®æåŸããå°ãªããšã3çªç®ã®å ŽåãçŸåšã®ããŒãã«å°æ°éšåã远å ããããšããŸããpublic static bool TryAddFractionPartïŒref ExpressionTreeNodeããŒããTerm SeparatorTermãchar DecimalSeparatorãTerm FrationPartTermïŒ ãã®ã¡ãœããã¯ã10鲿°ã®æŽæ°éšåãšå°æ°éšåã®åºåãæåãããã³çŸåšã®çšèªã«ç¶ã2ã€ã®çšèªã瀺ããŸãã2çªç®ã®çšèªãã·ã³ããªãã¯ã§åºåãæåãå«ã¿ã3çªç®ãæ°å€ã§ããå ŽåãããŒãã¯æ°ãã宿°å€ããŒãã«çœ®ãæããããŸã-2çªç®ã®ãã§ãã¯ã¯ãçŸåšã®çšèªããããã¯ã§ããå Žåããããã¯ãããã¯ããŒãã圢æãããŸããã§ãã¯ãå®äºãããšãåã®ãµã€ã¯ã«ã§äœæãããããŒããšçŸåšã®ãµã€ã¯ã«ãçµã¿åãããã¡ãœãããå®è¡ãããŸããpublic virtual void CombineïŒExpressionTreeNode LastãExpressionTreeNode NodeïŒ ããã¯äžå¿çãªæ¹æ³ã®1ã€ã§ããäœæãããæ°åŒããªãŒã®ããžãã¯ã«åŸã£ãŠãæŒç®åããŒãïŒãããã®åªå
é äœïŒãèæ
®ããŠãæ¢åã®ããŒãã«æ°ããããŒããã¢ã¿ããããŸãããã¡ãããã¡ãœããã¯ã³ãŒãã®ãµã€ãºã®ããã«ãªãã¡ã¯ã¿ãªã³ã°ãå¿
èŠãšããŸãã圌ã®äœåã®è«çã¯ãã³ãŒãã®ã³ã¡ã³ãã«åæ ãããŠããŸãã2ã€ã®ããŒãã®çµã¿åãããå®äºãããšãæåŸã®ãã§ãã¯ãå®è¡ãããŸããåŠçãããããŒããããªãŒã®ã«ãŒãã§ãããããŒããéžæè¢ã®ããŒãã§ããããã®å ŽåããŒã倿°<Variable>ïŒ<option_2>ãå·ŠãµãããªãŒã«ããå ŽåãåŒæ°åŒæ°<argument_nameã®ããŒããšèŠãªãããå¿
èŠããããŸã>ïŒ<argument_value>ããã®å ŽåãåŒæ°ã®ååã¯å€æ°åã«ãªããŸããå埩ãå®äºãããšãããŒãµãŒãªããžã§ã¯ãã§NewNodeAddedã€ãã³ããçæãããäœæãããããŒãã¯ãŠãŒã¶ãŒã«ããå€éšåŠçã®ããã«æž¡ãããŸãããã®å ŽåãããŒãã¯åç
§ã«ãã£ãŠæž¡ããããããäœæãããããªãŒãå®å
šã«ãªãŒããŒã©ã€ãããå¯èœæ§ããããŸããããŒãµãŒã«ãã£ãŠçšèªã®ã°ã«ãŒãã«å¯ŸããŠãµãããªãŒãäœæããããããã¯çšèªã®GetSubTreeã¡ãœããã§ããã®ãããªãµãããªãŒã®ãã¹ãŠã®ã«ãŒããé
åã«çµåãããåŸãã¡ãœããã¯ãã§ãã¯ããŸãã- é
åã«èŠçŽ ã1ã€ããå«ãŸããŠããªãå ŽåãçµæãšããŠè¿ãããŸãïŒããã¯ç°¡åãªã±ãŒã¹ã§ãïŒ
- å€ãã®ã«ãŒããããå Žåããããã®ããããã¯FunctionArgumentNode颿°ã®åŒæ°ã®ããŒãïŒå³åŽã®ãµãããªãŒå
ïŒã«ããã¯ãããæ¬¡ã®åŒæ°ã¯å·ŠåŽã®ãµãããªãŒã«ããã¿ã€ããŸãã
åŒããªãŒã®æ§é
ãããã£ãŠãçæãããããªãŒã¯æ¬¡ã®ã«ãŒã«ãæºãããŸãã- (, ) ( )
- . .
- , . ;
- â -, -.
- . ( ).
颿°ãšæ©èœèªäœã¯ãå¥ã
ã®ãªããžã§ã¯ãã«å²ãåœãŠãããŸããããªãŒãæ§ç¯ãããŸããæ§ç¯ããã»ã¹äžã«ã倿°ãšé¢æ°ã®ããŒããäœæãããŸããããã®ãããªåããŒãã¯ã察å¿ããã¿ã€ãã®ããŒãã®ã³ã³ã¹ãã©ã¯ã¿ãŒãžã®çŽæ¥åŒã³åºãã«ãã£ãŠã察å¿ããçšèªã«ãã£ãŠäœæãããŸãããã¯ã©ã¹StringTermïŒçšèª{...} åæã«ãããŒããäœæãããšããåŒã«ã¯ãç®çã®å€æ°ãªããžã§ã¯ã/颿°ãååã§æœåºããããã®å€æ°/颿°ã®ã³ã¬ã¯ã·ã§ã³ãå¿
èŠã§ããå
éšFunctionNodeïŒFunctionTermçšèªãExpressionParserããŒãµãŒãMathExpressionåŒïŒ æ°åŒãªããžã§ã¯ãã§ããªãŒãäœæãããåŸã倿°ãšé¢æ°ã®ã³ã¬ã¯ã·ã§ã³ã«ã¯äœ¿çšããããªããžã§ã¯ãã®ãªã¹ããå«ãŸããŸãããããããããã®æå³ã¯ç©ºã§ããäžéšã®å€æ°ã¯ãããŒãµãŒã«æ¢ç¥ã®å®æ°ãšããŠåé¡ããå¿
èŠããããŸãïŒé©åãªã³ã¬ã¯ã·ã§ã³ã«è»¢éããŸãã颿°ãªããžã§ã¯ãã¯ãããããå®è£
ããããªã²ãŒãã«ãã£ãŠå®çŸ©ããå¿
èŠããããŸããããªãŒã®åæå
æ°åŒã®ãçã®ãããªãŒãäœæããåŸã倿°ãšé¢æ°ã®å€ãå
¥åããå¿
èŠããããŸããããŒãµãŒã®Parseã¡ãœããã¯ãProcessVariablesãšProcessFunctionsã®2ã€ã®ã¡ãœãããé çªã«åŒã³åºããŠãäœæããããçã®ãããªãŒãæž¡ããŸãã倿°åŠçæ¹æ³ïŒå
éšvoid ProcessVariablesïŒMathExpressionåŒïŒ ãã®ã¿ã¹ã¯ã¯ãããªãŒãäžåšãããã¹ãŠã®å€æ°ããŒããèŠã€ããŠããããã§äœ¿çšãããŠãã倿°ãªããžã§ã¯ããæœåºããããšã§ãããã®åŸãããªãŒã§äœ¿çšãããŠããªããã¹ãŠã®ãã®ãæ°åŒã®å€æ°ã®ã³ã¬ã¯ã·ã§ã³ããåé€ããå¿
èŠããããŸãããã®åŸãããªãŒå
ã®å倿°ã«ã€ããŠããã®ååãæ¢ç¥ã®ããŒãµãŒå®æ°ã®ã³ã¬ã¯ã·ã§ã³ã«å«ãŸããŠãããã©ããããã§ãã¯ãããŸããããã§ããå ŽåãåŒã®å€æ°ã®ã³ã¬ã¯ã·ã§ã³ããåé€ãããåŒã®å®æ°ã®ã³ã¬ã¯ã·ã§ã³ã«å
¥åãããããŒãµãŒã«æ¢ç¥ã®å€ã§åæåããã宿°ã§ãããšãããã©ã°ãèšå®ãããŸãããã®åŸãããŒãµãŒã§æ°ãã倿°ãæ€åºããã€ãã³ããçºçããŸãããã®ã€ãã³ããåŠçãããšããããŒãµãŒãŠãŒã¶ãŒã¯ãã®å€æ°ã®å€ããªãŒããŒã©ã€ããããã倿°ãªããžã§ã¯ãèªäœã倿Žã§ããŸãã2çªç®ã®ProcessFunctionsã¡ãœããã¯ãåŒã«æ¢ç¥ã®é¢æ°ã§ããªã²ãŒããåããŸããå
éšvoid ProcessFunctionsïŒMathExpressionåŒïŒ 颿°åãcaseæŒç®åã®ããªã¢ã³ãã«å«ãŸããŠããå Žåãå¿
èŠãªé¢æ°ãåŒæ°ã®æ°ãšäžèŽãããšãããªã²ãŒããããã«å²ãåœãŠããããã®å€ãèšç®ãããŸãã颿°ãå®çŸ©ãããŠããªãå Žåãããªã²ãŒãã¯æªç¥ã®é¢æ°æ€åºã€ãã³ãã®çæã®çµæãšããŠå®çŸ©ãããŸãããã®å ŽåããŠãŒã¶ãŒã¯ãåŒæ°ã®ååãšæ°ïŒããã³ååïŒã«ãã£ãŠããã®ã€ãã³ããžã®å¿çã§å¿
èŠãªããªã²ãŒããæ±ºå®ã§ããŸããããã§ãæ°åŒã®çæãå®äºããŸããã䜿çšãã
ç§ãã¡ã®ä»äºã¯ã颿°A * cosïŒ2 * xïŒ/ pi + GïŒx / 2ïŒãAãš+ 1ã§é€ç®ããç©åãèšç®ããããšã§ãããšä»®å®ããŸããããšãã°ãAã5ã®å Žåã0.05ã®å¢åã§ç©åããšãå¿
èŠããããŸãã var parser = new ExpressionParser(); parser .FindFunction += (s, e) => { if(e.SignatureEqual(name: "G", ArgumentsCount: 1)) e.Function = new Func<double, double>(x => 2 * Math.Cos(x)); }; var expr = parser.Parse(@"Int[x=-10..10;dx=0.05]{A*cos(2x) + G(x/2)}/A + 1"); expr.Variable["A"] = 5; var y = expr.Compute();
ãããã«
èšäºã®çµæã®ããªã¥ãŒã ãèãããšãããã«ããªãªãã§ã¯ãªãã»ãã³ãã³ãå
¥ããŸãããäžèšã®çµæã次ã®ããšãå¯èœã«ãªããŸããã- åé¡ã解決ããæ¹æ³ã®äžè¬çãªã¢ã€ãã¢ãå
¥æããŠãã ããã
- æ°åŒã®ããŒãµãŒãæ°åŒèªäœãããã³ãã®ããªãŒã®ãªããžã§ã¯ãã¢ãã«ã圢æããã«ã¯ã
- æ°åŒãè«çã³ã³ããŒãã³ãã«è§£æããããã®å¹æçãªæ¹æ³ãäœæããŸãã
- æ¬åŒ§ã®äœ¿çšã®ç¹æ®æ§ãæŒç®åã®åªå
é äœãããã³ç¹å¥ãªæ§æïŒé¢æ°ïŒãèæ
®ããŠãæ°åŒã®ããªãŒãæ§ç¯ããããã®å¹æçãªæ¹æ³ãäœæããŸãã
- ã€ãã³ãã·ã¹ãã ã«åºã¥ããŠãããŒãµãŒãå
¥åããŒã¿ãåŠçããããŸããŸãªæ®µéãå¶åŸ¡ããŸãã
- æ©èœãæ¡åŒµããæ©èœã远å ããŸãã
ãã®èšäºã§ã¯èª¬æã§ããªãã£ããã®ïŒ- 倿°ã®è«çïŒãããã®æºåãšãã®åŸã®çœ®æã®ã¿ã€ããšæ¹æ³ïŒ;
- æ°åŒã®äœæ¥ã«é¢äžãã倿°ã宿°ã颿°ã®ã³ã¬ã¯ã·ã§ã³ã®æ§é ã
- ããªãŒãèµ°æ»ããŠæ°åŒã®å€ãèšç®ããæ¹æ³ã
- mat.expressionã®ããªãŒãããªã²ãŒãã«ã³ã³ãã€ã«ããããã®ã¡ãœããã
ããŒãµãŒèªäœã®å®è£
ã§ãããŸã§ã«å€±æãããã®ïŒ- æ°åŒã®ããªãŒãæé©åããã¡ãœãããå®è£
ããŸãã
- å€ãã®å ŽæããæŸèæãåãå€ããŸãã
- å
¥åããŒã¿ããããã®åœ¢åŒã«æºæ ããŠãããã©ããã®ãã§ãã¯ã远å ããŸãã
- å®éã«ããã®åœ¢åŒã®å¢çãæŠèª¬ããŠãã ããã
- åäœãã¹ãã§ã³ãŒãã«ãã¬ããžãå¢ãããŸãã
- åæã®æ®µéãšèšç®ã®æ®µéã®äž¡æ¹ã®ããã©ãŒãã³ã¹ã®æ¯èŒç ç©¶ã宿œããŸãã
äžè¬ã«ããã®ã³ãŒãã®äœæ¥ã«ã¯æ®å¿µãªããèæ¯æåããããæ°å¹Žç¶ããŠããŸããããã®æ®µéã§å²ãåœãŠãããã¿ã¹ã¯ã¯æ¢ã«è§£æ±ºããŠããŸããçŸåšã®åœ¢ã§ã¯åœŒãçç£ã«å
¥ããããšã¯äžå¯èœã§ããå®å
šãªãœãŒã¹ã³ãŒãã¯ããã§èŠã€ããããšãã§ããŸãã