Similar documents
(OnePoint) ( URL Web Copyright 2005 Microsoft Corporation. All rights reserved. Microsoft Windows Visual Basic Visual Studio Microsoft Corporation

IronPython による柔軟なゲーム開発 筑波大学 AmusementCreators

Oracle Lite Tutorial

Oracle Lite Tutorial

C#の基本

Java Scriptプログラミング入門 3.6~ 茨城大学工学部情報工学科 08T4018Y 小幡智裕

Microsoft PowerPoint - chap10_OOP.ppt

相続支払い対策ポイント

150423HC相続資産圧縮対策のポイント

ハピタス のコピー.pages

Copyright 2008 All Rights Reserved 2

URL AdobeReader Copyright (C) All Rights Reserved.

VB.NETコーディング標準

Visual Basic Oracle Database 11 Release 1

VFD256 サンプルプログラム

untitled

プログラミング基礎I(再)

Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

ICONファイルフォーマット

TestDesign for Web

how-to-decide-a-title

外周部だけ矩形配列

1.SqlCtl クラスリファレンス SqlCtl クラスのリファレンスを以下に示します メソッドの実行中にエラーが発生した場合は標準エラー出力にメッセージを出力します (1)Connect() メソッド データベースへ connect 要求を行います boolean Connect(String

FileMaker Oracle Microsoft SQL Server MySQL Salesforce.com ROI TCO RAD IT FileMaker Pro RAD RAD TCO RAD Microsoft Visual Studio 2008 Oracle Developer

1. 画面拡大ショートカット ショートカットキーで作業効率 UP [Ctrl]+[+]: 拡大 [Ctrl]+[-]: 縮小 [Ctrl]+ 0 : デフォルトに戻す (100%) オンライン製品ヘルプ 2

PowerPoint Presentation

Javaプログラムの実行手順

10th Developer Camp - B5

Oracle Lite Tutorial

目次 はじめに... 3 システムの必要条件... 3 サンプルアプリケーションの作成... 3 手順 手順 手順 手順 手順 手順 終わりに... 23


WPF アプリケーションの 多言語切替

初心者にもできるアメブロカスタマイズ新2016.pages

- 2 Copyright (C) All Rights Reserved.

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

API 連携方式 外部 DLL の呼び出し宣言 外部 DLL の呼び出し宣言のサンプルコード (Microsoft Visual C#.NET の場合 ) プログラムコードの先頭で using System.Runtime.InteropServices; が必要 クラスの内部に以下のような外部 D

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版  

インテル(R) Visual Fortran コンパイラ 10.0


Copyright 2006 KDDI Corporation. All Rights Reserved page1

SolarWinds Event Log Forwarder for Windows v

PowerPoint プレゼンテーション

●コンテンツ「掲示板」

PowerPoint プレゼンテーション

Copyright All Rights Reserved. -2 -!

untitled

開発・運用時のガイド JDK8への移行に伴う留意点 [UNIX]

untitled

GS1-128 の描画 DLL について (ver. 2.3) 動作環境など動作環境 WindowsXP Windows Vista Windows7 Windows8/8.1 Windows10 上記 OS について すべて日本語版を対象としております 32bit アプリケーションから呼び出される

SmartBrowser_document_build30_update.pptx

セットアップカード

スーパー英語アカデミック版Ver.2

IP IP All contents are Copyright (c) All rights reserved. Important Notices and Privacy Statement. page 2 of 39

プロセス間通信

( 目次 ) 1. はじめに 開発環境の準備 仮想ディレクトリーの作成 ASP.NET のWeb アプリケーション開発環境準備 データベースの作成 データベースの追加 テーブルの作成

コンピュータ中級B ~Javaプログラミング~ 第3回 コンピュータと情報をやりとりするには?

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

1 はじめに 前準備 MICROSOFT 製品のプログラムを最新の状態にする NET FRAMEWORK 4.0 ( と日本語 LANGUAGE PACK) のインストール NET FRAMEWORK 4.0 のインストール... 4

Microsoft Word - 最終版 バックせどりismマニュアル .docx

MVP for VB が語る C# 入門

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版   None

Windows Web Windows Windows WinSock

ページの作成について ショッピングカート以外のすべてのページは自作できます また 一部のページだけ自作することもできます トップページだけ自作のものを用意する店舗さんも多数おられます 利用テーマに合わせて文字コードを指定します 制作する HTML ファイルの文字コードは ショッピングカートで利用して

スライド 1

PowerPoint プレゼンテーション

Microsoft Word - oo4o_extra.doc

早分かりS2Dao

コンピュータ中級B ~Javaプログラミング~ 第3回 コンピュータと情報をやりとりするには?

Transcription:

1/6 ページ プログラミングするなら Microsoft Visual Studio 2005 シンプルでパワフルな C# の最新版 www.defyallchallenges.jp/.net Tips (VB.NET, C#, Visual Studio...).NET Frameworkプログラミング, Visual Basic.NET, C#, Visual Studio, デプロイメントなどのTips ソースド サンプルを紹介しています 検索 Wiki 掲示板 Ads by Google C# コード C# Ajax C# SQLServer ASP Net C# At Visual Studio 購入 MSDNをお安く契約する方法はこちらフリーダイヤル 0120-350- 253 msdn.ips.co.jp/ C# プログラミング徹底解徹底解説 ITエンジニア必須の充実 IT 講座 100 選無料会員登録でITpro 新サービスを提供 itpro.nikkeibp.co.jp/ パート主婦主婦の給与明細旦那の給与明細女たちの給細 japanetgin.sakura.ne.jp/m プログラミング.NET Tips フォームコントロール DataGrid DataGridView ファイル フォルダ画像 印刷インターネットその他... ASP.NET 無料ホスティング Web サービスインストーラ研究メールマガジン 掲示板最新情報 ブラウザオブジェクトの NewWindow について by 鉄芯 2007/12/03(Mon) 15:38:13 検索 DOBON.NET > プログラミング道 >.NET Tips > その他の Tips 文字列の計算式計算式の計算結果計算結果を取得取得する 例えば "(1+6)*5/(7-4)" のような計算式を表す文字列から その計算結果を取得する様々な方法を紹介します 自分で解析解析するする方法 正攻法で行けば 計算式を解析し 計算するコードを自分で書くということになります そのために参考になりそうなコードは 例えば A Math Expression Evaluator です この A Math Expression Evaluator は簡単な計算はもちろん cos sin log などにも対応しています ( ただし コードは VB.NET のみです ) さらに 掲示板で ArAy さんが紹介された MSDN Japan の アルゴリズム入門 : 第 1 章 Visual C# による文字列処理入門 も参考になります このように自分でコードを書く以外の方法も様々あります JScript.NET の Eval を使用使用するする方法 Web 検索 dobon.net この方法は GotDotNet Message Boards の String to Numeric のスレッドで enderminh さんが紹介しています この方法によると まず参照に Microsoft.Jscript と Microsoft.Vsa を追加し 次のようなコードにより 計算を実行します その他 掲示板 Wiki リンク集リンクをご希望の方へ携帯専用サイト管理人にメール Translate this site into English... 広告 ' 計算式 Dim exp As String = "(1+6)*5/(7-4)" Dim ve As Microsoft.JScript.Vsa.VsaEngine = _ Microsoft.JScript.Vsa.VsaEngine.CreateEngine() Dim result As Double = _ CDbl(Microsoft.JScript.Eval.JScriptEvaluate(exp, ve)) Console.WriteLine(result) // 計算式 string exp = "(1+6)*5/(7-4)"; Microsoft.JScript.Vsa.VsaEngine ve = Microsoft.JScript.Vsa.VsaEngine.CreateEngine(); double result =

2/6 ページ (double) Microsoft.JScript.Eval.JScriptEvaluate( exp, ve); C# プログラミング徹底解説 ITエンジニア必須の充実 IT 講座 100 選無料会員登録でITpro 新サービスを提供 itpro.nikkeibp.co.jp/ C# の転職情報リクナビNEXT 職種や地域 経験などで全国の求人情報を検索 next.rikunabi.com MSDN がお得に更新できる期限切れでも更新価格で購入可能ですマイクロソフトキャンペーン実施中! www.microsoft.com 主婦の給与振込待ち遠しい給与振込やった私の給与振込 japanetgin.sakura.ne.jp/me 他の広告を表示 VS.NET を買うなら VS2005 Pro アップグレードが 61,550 円 VB2005 EE (4,550 円 ) とアップグレードを買ったほうが新規 (122,120 円 ) より安い アップグレードについて 機能比較 VS2005 Standardアップグレードが18,580 円 新規で28,180 円 学生なら VS2005 Academic が5 千円弱 詳細 VS Tools For Office 2005 アップグレードが 63,050 円 詳細 Express Edition なら無料で使える!! * 上記の情報は 07/4/8 現在のもので 変更されている可能性があります Console.WriteLine(result); また JScriptCodeProvider により Eval メソッドを実行する方法が An Eval Function for C# using JScript.NET (JavaScript) に紹介されています この方法によると 次のようなコードがかけます 'Imports System.Reflection 'Imports System.CodeDom.Compiler ' がソースファイルの一番上に書かれているものとする ' 計算式 Dim exp As String = "(1+6)*5/(7-4)" ' 計算するためのコード Dim [source] As String = _ "package Evaluator " + vbcrlf + _ "class Evaluator " + vbcrlf + _ "public function Eval(expr : String) : String " + vbcrlf + _ "return eval(expr);}}}" ' コンパイルするための準備 Dim cp = New Microsoft.JScript.JScriptCodeProvider Dim icc As ICodeCompiler = cp.createcompiler() Dim cps As New CompilerParameters Dim cres As CompilerResults ' メモリ内で出力を生成する cps.generateinmemory = True ' コンパイルする cres = icc.compileassemblyfromsource(cps, [source]) ' コンパイルしたアセンブリを取得 Dim asm As [Assembly] = cres.compiledassembly ' クラスの Type を取得 Dim t As Type = asm.gettype("evaluator.evaluator") ' インスタンスの作成 Dim eval As Object = Activator.CreateInstance(t) 'Eval メソッドを実行し 結果を取得 Dim result As String = CStr(t.InvokeMember("Eval", _ BindingFlags.InvokeMethod, Nothing, eval, New Object() exp})) Console.WriteLine(result) //using System.Reflection; //using System.CodeDom.Compiler; // がソースファイルの一番上に書かれているものとする // 計算式 string exp = "(1+6)*5/(7-4)"; // 計算するためのコード string source = @"package Evaluator class Evaluator public function Eval(expr : String) : String

3/6 ページ }"; } } return eval(expr); // コンパイルするための準備 CodeDomProvider cp = new Microsoft.JScript.JScriptCodeProvider(); ICodeCompiler icc = cp.createcompiler(); CompilerParameters cps = new CompilerParameters(); CompilerResults cres; // メモリ内で出力を生成する cps.generateinmemory = true; // コンパイルする cres = icc.compileassemblyfromsource(cps, source); // コンパイルしたアセンブリを取得 Assembly asm = cres.compiledassembly; // クラスの Type を取得 Type t = asm.gettype("evaluator.evaluator"); // インスタンスの作成 object eval = Activator.CreateInstance(t); //Eval メソッドを実行し 結果を取得 string result = (string) t.invokemember("eval", BindingFlags.InvokeMethod, eval, new object[] exp}); Console.WriteLine(result); CSharpCodeProvider を使用使用したした方法 さらに 掲示板でピラルクさんが提案されたように CSharpCodeProvider を使って 計算式が含まれるコードの文字列をコンパイルし 実行する方法もあります この方法は Runtime Compilation (A.NET eval statement) や Evaluating Mathematical Expressions by Compiling C# Code at Runtime などでも紹介されています 具体的なコードは 例えば 次のようなものです 'Imports System.Reflection 'Imports System.CodeDom.Compiler ' がソースファイルの一番上に書かれているものとする ' 計算するためのコード Dim [source] As String = _ "public class MainClass " + vbcrlf + _ "public static double EVal() " + vbcrlf + _ "return (1d+6d)*5d/(7d-4d);" + vbcrlf + _ "}}" ' コンパイルするための準備 Dim cp = New Microsoft.CSharp.CSharpCodeProvider Dim icc As ICodeCompiler = cp.createcompiler() Dim cps As New CompilerParameters Dim cres As CompilerResults ' メモリ内で出力を生成する cps.generateinmemory = True ' コンパイルする cres = icc.compileassemblyfromsource(cps, [source])

4/6 ページ ' コンパイルしたアセンブリを取得 Dim asm As [Assembly] = cres.compiledassembly 'MainClass クラスの Type を取得 Dim t As Type = asm.gettype("mainclass") 'EVal メソッドを実行し 結果を取得 Dim d As Double = CDbl(t.InvokeMember("EVal", _ BindingFlags.InvokeMethod, Nothing, Nothing, Nothing)) Console.WriteLine(d) //using System.CodeDom.Compiler; //using System.Reflection; // がソースファイルの一番上に書かれているものとする // 計算するためのコード string source = @" public class MainClass public static double EVal() return (1d+6d)*5d/(7d-4d); } }"; // コンパイルするための準備 CodeDomProvider cp = new Microsoft.CSharp.CSharpCodeProvider(); ICodeCompiler icc = cp.createcompiler(); CompilerParameters cps = new CompilerParameters(); CompilerResults cres; // メモリ内で出力を生成する cps.generateinmemory = true; // コンパイルする cres = icc.compileassemblyfromsource(cps, source); // コンパイルしたアセンブリを取得 Assembly asm = cres.compiledassembly; //MainClass クラスの Type を取得 Type t = asm.gettype("mainclass"); //EVal メソッドを実行し 結果を取得 double d = (double) t.invokemember("eval", BindingFlags.InvokeMethod, null); Console.WriteLine(d); 前の JScript.NET の Eval を使った方法と比べると この方法は計算式をコードに含めなければならず 計算式が変わるたびにコンパイルが必要になりますし メモリのアセンブリをどのように解放するかという問題もあります ( この問題は Dynamically executing code in.net に詳しい ) そのため 実用としては困難かもしれません Microsoft Script Control を使用使用したした方法 Microsoft Script Control が使用できるならば VBScript や JSCript の Eval 関数を使う方法もあります

5/6 ページ ' 計算式 Dim exp As String = "(1+6)*5/(7-4)" Dim t As Type = _ Type.GetTypeFromProgID("MSScriptControl.ScriptControl") Dim obj As Object = Activator.CreateInstance(t) t.invokemember("language", _ System.Reflection.BindingFlags.SetProperty, _ Nothing, _ obj, _ New Object() "vbscript"}) 'Eval 関数で計算を実行して結果を取得 Dim result As Double = CDbl( _ t.invokemember("eval", _ System.Reflection.BindingFlags.InvokeMethod, _ Nothing, _ obj, _ New Object() exp})) Console.WriteLine(result) // 計算式 string exp = "(1+6)*5/(7-4)"; Type t = Type.GetTypeFromProgID("MSScriptControl.ScriptControl"); object obj = Activator.CreateInstance(t); t.invokemember("language", System.Reflection.BindingFlags.SetProperty, obj, new object[] "vbscript"}); //Eval 関数で計算を実行して結果を取得 double result = (double) t.invokemember("eval", System.Reflection.BindingFlags.InvokeMethod, obj, new object[] exp}); Console.WriteLine(result); その他の方法 これ以外にも DataTable.Compute メソッドを使う方法など まだまだありそうですが きりが無いので この辺で終わりにします ( 面白い方法がありましたら ご連絡ください ) ( この記事は.NET プログラミング研究第 34 号 で紹介したものです ) 注意 : この記事では 基本的な事柄の説明が省略されているかもしれません 初心者の方は 特に以下の点にご注意ください コードの先頭に記述されている Imports??? がソースファイルの一番上に書かれているものとする (C# では using???; がソースファイルの一番上に書かれているものとする ) の意味が分からないという方は こちらをご覧ください??? を参照に追加します の意味が分からないという方は こちらをご覧

6/6 ページ ください この記事記事へのへの評価 この記事が 役に立った 人に勧められる すばらしいと思う方は 良い を 役に立たなかった いまいち 消えてなくなれと思う方は 悪い を選択して 送信 をクリックしてください この記事への今までの評価はこちら 各 Tips の評価一覧はこちら 良い 悪い この記事記事へのへのコメント この記事に関するごく簡単なコメントを残すことが出来ます 通常のご投稿 ご質問 ご意見等は掲示板へ この記事への今までのコメントはこちら.NET Framework 2.0 以降に関するする情報 明記のない場合 この記事の全てまたは一部は.NET Framework 1.1 以前についてのみ述べられている可能性があります.NET Framework 2.0 以降では事実と異なる内容が含まれている場合 下のボタンからご報告ください 今まで投稿された情報はこちらでご覧いただけます この記事記事へのへのトラックバック この記事にトラックバックすることができます ただしこちらの注意事項に沿わないものは遠慮なく削除させていただきます 自動トラックバックにも対応 この記事への今までのトラックバックはこちら この記事のトラックバック Ping URL : http://dobon.net/cgi-bin/tb/tb.php/programing/eval.html その他 送信 コメントを投稿する.NET Framework 2.0 以降に関する情報を投稿する Translate this page into English... この Tips の URL を電子メールで送信するこのページをブックマークに追加する Copyright 2002-2007 DOBON!. All rights reserved.