coding Shift_JIS; import Math; import Text; import GUI; import File; import tool.Graph2D; /** 積分値を表示する際、丸める桁数(有効桁数)です。*/ const int RESULT_ROUNDING_DIGITS = 10; /** コンソール上のX値を丸める桁数(有効桁数)です。 */ const int X_ROUNDING_DIGITS = 10; /** 積分する数式 f(x) のデフォルト入力値です。 */ const string DEFAULT_EXPRESSION = "exp( 3 * sin(26 * x) )"; /** 積分区間の上端のデフォルト入力値です。 */ const string DEFAULT_X_MAX = "1.0"; /** 積分区間の下端のデフォルト入力値です。 */ const string DEFAULT_X_MIN = "0.0"; /** 数値積分での区間分割数のデフォルト入力値です。 */ const string DEFAULT_X_N = "10000"; /** シンプソン法のアルゴリズム名です。 */ const string ALGORITHM_NAME_SIMPSON = "SIMPSON - シンプソン法"; /** 台形法(台形近似)のアルゴリズム名です。 */ const string ALGORITHM_NAME_TRAPEZOIDAL = "TRAPEZOIDAL - 台形法"; /** 矩形法(長方形近似)のアルゴリズム名です。 */ const string ALGORITHM_NAME_RECTANGULAR = "RECTANGULAR - 矩形法(長方形近似)"; /** アルゴリズム名を格納する配列です。 */ const string ALGORITHM_NAMES[] = { ALGORITHM_NAME_SIMPSON, ALGORITHM_NAME_TRAPEZOIDAL, ALGORITHM_NAME_RECTANGULAR }; // 以下、グラフやGUIコンポーネントIDを格納する変数 /** グラフのIDを格納します。 **/ int graph = NULL; /** 入力画面のウィンドウのIDを格納します。 */ int window = NULL; /** 積分する数式を入力するテキストフィールドのIDを格納します。 */ int expressionField = NULL; /** 積分された値を出力するテキストフィールドのIDを格納します。 */ int resultField = NULL; /** X軸の最大値を入力するテキストフィールドのIDを格納します。 */ int xMaxField = NULL; /** X軸の最小値を入力するテキストフィールドのIDを格納します。 */ int xMinField = NULL; /** 数値積分での区間分割数を入力するテキストフィールドのIDを格納します。 */ int xNField = NULL; /** アルゴリズム選択項目のIDを格納します。 */ int algorithmSelectField = NULL; /** グラフをプロットするかどうかを選択するチェックボックスのIDを格納します。 */ int plotCheckBox = NULL; /** CALCボタンのIDを格納します。 */ int calcButton = NULL; /** * プログラムの開始時に自動で実行されます。 */ void main(){ // 入力画面を起動 createInputWindow(); // ※ ユーザーがボタンを押すとグラフが描かれる処理などは、 // 後で定義している onButtonClick 関数を起点として実行されます。 } /** * 文字列として渡された式を矩形法(長方形近似)で数値積分し、結果を返します。 * * @param fxEexpr 被積分関数の式(文字列) * @param xMin 積分区間の下端 * @param xMax 積分区間の上端 * @param n 数値積分の区間分割数 * @param plotGraph 積分過程をグラフに描画するかどうか(trueなら描画する) * @return 積分結果の値 */ float integrateRectangular(string fxExpr, float xMin, float xMax, int n, bool plotGraph) { // コンソールの内容をクリア clear(); // 数値積分の微小区間の幅 float dx = (xMax-xMin) / n; // 積分値 float value = 0.0; // f(x) を微小区間ごとに二次関数近似し、面積を足していくループ(シンプソン法) for (int i=0; i