情報実習 Ⅱ 第 7 回 ( これまでの復習 ) 課題資料
Java のクラスの概形 クラス フィールドコンストラクタメソッド main メソッドローカル変数宣言オブジェクト生成オブジェクトへのメッセージ ( メソッド呼び出し ) 変数 : 基本型, 参照型 これまでの 習得事項 まだ初歩的な内容だけだが これらを利用するだけでも多くの実用的なプログラムが記述できる キーボード入力 : Scanner の利用 : nextint(), nextdouble(), 演算子 : 算術演算子, 増減演算子, 代入演算子, 比較演算子, 論理演算子 書式付出力と書式指定子 : printf(): %d, %f, %s, %c 条件分岐 : if 文, else-if ラダー, switch 文 繰り返し : while 文, do-while 文, for 文, break 文, continue 文
課題番号 7 任意の 2 次関数の定 積分を近似計算する ためのプログラムの 作成 3 種類の近似法 区分求積法 台形則 ( 今日の課題 ) 合成シンプソン法 x0 x1 定積分値 = න y = f(x) どのような複雑な関数 でも 積分公式を使わ x 1 f(x) dx ずに かなり正確に計 x 0 算できる
一番簡単だが 精度はいまいち 区分求積法 ( 参考 ) 計算範囲を n 等分し n 個の長方形の面積 ( 負になる場合もある ) で近似 grid grid spacing y = f(x) w w w w x0 x1 x2 x3 積分値 f(x0) w +... + f(x3) w w は (x4 x0)/4 で求まる 1 区間の幅 (n=4 の場合 ) x4
台形則 ( 今日の課題 ) 計算範囲を n 等分し n 個の台形の面積 ( 負になる場合もある ) で近似 y = f(x) x0 x1 x2 x3 積分値 w w w w x4 (f(x0) + f(x1)) w/2 + + (f(x3) + f(x4)) w/2 (n=4 の場合 ) 簡単で 精度もそこそこ
ちょっと複雑だが 精度は良い 合成シンプソン法 ( 参考 ) 3 点を通る 2 次関数で f(x) の積分値を近似 区分数は偶数でなければならない y = f(x) w w w w x0 x1 x2 x3 x4 積分値 w n (f x 2 3 0 + f x n + 2 σ 1 2 i=1 f(x 2i ) + 4 σ i=1 f(x 2i 1 )) n
実行例 f(x) = x 2 + 2x + 1 のグラフの彩色部分の面積を求める場合 2 次関数の 3 つの係数 ( 整数 ) をスペースで区切って入力 : 1 2 1 積分の始点と終点 ( 実数 ) をスペースで区切って入力 : -3.0 3.0 f(x) = 1x^2+2x+1 の定積分 [-3.0, 3.0] の近似値 1 分割 : 60.00 10 分割 : 24.36 100 分割 : 24.00 1000 分割 : 24.00 10000 分割 : 24.00 100000 分割 : 24.00 青文字はキーボードからの入力
今日の課題 課題番号 7-1, 7-2, 7-3, レポートの作成 提出するファイルは次の4つ課題 7-1 QuadraticFunction.java 課題 7-2 TrapezoidalRule.java 課題 7-3 IntegralTester.java report7.pdf
課題番号 7-1 積分の対象となる任意の2 次関数を表すクラス QuadraticFunction.javaを作成せよ 実行例 2 次関数の 3 つの係数 ( 整数 ) をスペースで区切って入力 : 2-3 -8 f(x) = 2x^2-3x-8 引数の値 ( 実数 ) を入力 : 6.7 f(6.7) = 61.68 2 次関数の 3 つの係数 ( 整数 ) をスペースで区切って入力 : -6 5 0 f(x) = -6x^2+5x+0 引数の値 ( 実数 ) を入力 : -4.7 f(-4.7) = -156.04 2 次関数の 3 つの係数 ( 整数 ) をスペースで区切って入力 : -1 0 1 f(x) = -1x^2+0x+1 引数の値 ( 実数 ) を入力 : 67.0 f(67.0) = -4488.00 表示上の注意 青文字はキーボードからの入力 1 次の係数と定数の値が負のときには演算子が になるように工夫すること 例えば 1 番目の実行例が f(x) = 2x^2+-3x+-8 では不可 演算子が になる際 式中に余分なスペースが入らないように工夫すること f(x) = 2x^2-3x -8 では不可 係数が -1 又は 0 又は 1 のとき 式を正しく表示するためには条件分岐が複雑になりすぎるので 今回の課題では 2 3 番目の実行例のように工夫無しで各係数の値をそのまま表示して良い (4.7 節の String クラスを学習すれば 正しい表示が比較的簡単に実装可能 ) 絶対値の計算には Math.abs メソッドを利用する 例えば b の絶対値を求めるには int test = Math.abs(b) などとすれば良い
課題番号 7-1 QuadraticFunction クラスの仕様 フィールド : a, b, c: int 2 次関数の係数 コンストラクタ : 3つの整数を引数として フィールドを初期化メソッド : evaluate(x: double): 関数の戻り値 ( a x^2 + b x + c の計算結果 ) を返す showfunction(): 前ページに示したように 関数の式を表示 main メソッド : 前ページに示したように キーボードから 3 つの整数を入力して このクラスのオブジェクトを一つ生成する さらにキーボードから 1 つの実数を入力して関数の計算結果を表示する フィールド コンストラクタ メソッドの修飾子はクラス図を参照
Scanner を使えるようにする準備 課題 7-1 の半完成品 /** 課題番号 学籍番号などをドキュメンテーションコメントとして記入 */ クラス宣言 { フィールドの宣言コンストラクタの宣言 evaluate メソッドの宣言 showfunction メソッドの宣言 public static void main(string[] args) { /* キーボード入力の準備 */ Scanner kbscanner = new Scanner(System.in); /* キーボードから 2 次関数の係数を入力する */ System.out.print("2 次関数の 3 つの係数 ( 整数 ) をスペースで区切って入力 : "); int a = kbscanner.nextint(); int b = kbscanner.nextint(); int c = kbscanner.nextint(); /* 与えられた係数を元に 2 次関数を表すオブジェクトを生成する */ QuadraticFunction qfunction = new QuadraticFunction(a,b,c); qfunction.showfunction(); System.out.println(); /* キーボードから関数に与える引数の値を入力する */ System.out.print(" 引数の値 ( 実数 ) を入力 : "); double x = kbscanner.nextdouble(); /* 関数の計算結果を表示 */ System.out.printf("f(%1.1f) = %8.2f",x,qFunction.evaluate(x)); } kbscanner.close();
課題 7-1 クラス図
課題番号 7-2 台形則に基づいて 関数の定積分の近似値を計算する機能を持つクラス TrapezoidalRule.java を作成せよ フィールド : startpoint: double TrapezoidalRule クラスの仕様定積分の始点を表す endpoint: double 定積分の終点を表す qfunction: QuadraticFunction 積分対象の関数を表す コンストラクタ : 2 つの整数と QuadraticFunction 型の参照を引数として 各フィールドを初期化 メソッド : calcarea(x: double, gridspacing: double): double qfunction, x, gridspacing を用いて 一区画の台形面積を計算して返す integrate(numofgrid: int): double startpoint から endpoint までの定積分値を numofgrid 個の台形の面積を合計することで近似して返す
メソッド内 (main は除く ) から 同じクラスの他のメソッドを呼び出すには (integrate メソッドのヒント ) 例えば p. 25 の Rectangle.java において move メソッドの中から showstate メソッドを呼び出し move の実行ごとに情報を表示させるようにするには 以下のように記述すればよい public void move(int xmove, int ymove) { xposition = xposition + xmove; yposition = yposition + ymove; showstate(); }
課題 7-2 クラス図
課題番号 7-3 区間分割数を 1~100000 に 10 倍ずつ変化させ 積分の近似計算をする main メソッドのみのプログラム IntegralTester.java を作成せよ 2 次関数の 3 つの係数 ( 整数 ) をスペースで区切って入力 : -3-8 9 積分の始点と終点 ( 実数 ) をスペースで区切って入力 : -23.4 82.8 f(x) = -3x^2-8x+9 の定積分 [-23.4, 82.8] の近似値 1 分割 : -1203638.94 10 分割 : -610742.63 100 分割 : -604813.66 1000 分割 : -604754.37 10000 分割 : -604753.78 100000 分割 : -604753.78 2 次関数の 3 つの係数 ( 整数 ) をスペースで区切って入力 : 1 2 1 積分の始点と終点 ( 実数 ) をスペースで区切って入力 : -4.0 9.0 f(x) = 1x^2+2x+1 の定積分 [-4.0, 9.0] の近似値 1 分割 : 708.50 10 分割 : 346.00 100 分割 : 342.37 1000 分割 : 342.33 10000 分割 : 342.33 100000 分割 : 342.33 2 次関数の 3 つの係数 ( 整数 ) をスペースで区切って入力 : 3 0 1 積分の始点と終点 ( 実数 ) をスペースで区切って入力 : -578.0 2345.9 f(x) = 3x^2+0x+1 の定積分 [-578.0, 2345.9] の近似値 1 分割 : 25601660256.94 10 分割 : 13228155068.37 100 分割 : 13104420016.49 1000 分割 : 13103182665.97 10000 分割 : 13103170292.47 100000 分割 : 13103170168.71 2 次関数の 3 つの係数 ( 整数 ) をスペースで区切って入力 : 4 0 0 積分の始点と終点 ( 実数 ) をスペースで区切って入力 : 21.0-21.0 積分区間が間違っています. 2 次関数の 3 つの係数 ( 整数 ) をスペースで区切って入力 : 7 0 0 積分の始点と終点 ( 実数 ) をスペースで区切って入力 : 9.0 9.0 積分区間が間違っています. 課題 7-3 の実行例
Scanner を使えるようにする準備 IntegralTester.java の半完成品 /** ここに必ずこのクラスの役割を明記する 記述がいい加減な場合も再提出となる */ クラス宣言 { main メソッド { final int maxpartitionnumber = 100000; // 分割数の上限 定数を扱う場合は final 修飾子をつける /* キーボード入力の準備 */ Scanner /* キーボードから 2 次関数の係数を入力する */ System.out.print("2 次関数の 3 つの係数 ( 整数 ) をスペースで区切って入力 : "); /* 与えられた係数を元に 2 次関数を表すオブジェクトを生成する */ QuadraticFunction /* キーボードから積分区間の始点と終点を入力する */ System.out.print(" 積分の始点と終点 ( 実数 ) をスペースで区切って入力 : "); ( 間違った積分区間を入力した際は System.exit(1) で終了 ) /* TrapezoidalRule クラスのオブジェクトを生成 */ TrapezoidalRule /* 積分対象の関数の表示 */ System.out.printf(" の定積分 [%2.1f, %2.1f] の近似値 n", ); } /* 1 maxpartitionnumber 分割したそれぞれの場合の積分の近似値を求め表示する */ for ( ここに 100000 という数値を直接書かないこと ) { } Scanner を閉じる
課題 7-3 のクラス図
各課題ごとに プログラムの先頭に 以下の事項を必ず記入すること 学籍番号 名前 課題番号 提出日 再提出日 例 ( ドキュメンテーションコメントを使用すること ) /** * クラスの簡単な説明 * * @author 19-1-037-0999 近大太郎課題 7-1 提出日 2019/10/29 再提出日 2019/11/19 ( 再提出時のみ ) */
レポートの提出について 今回と第 11 回では LaTeX で作成した pdf 形式のレポート ( ファイル名 report7.pdf ) も提出します 公式ページにレポートの雛形となる report7.tex というファイルがあるので 必ずそれを利用して作成してください またその中に書かれている指示には従ってください 不備のあるレポートは内容を見ずに再提出として返却します また 大幅に減点します
レポートの提出について レポート作成は プログラムを submitj.sh で提出してから行ってください 課題 7.3 は ターミナル上で ~/JJ2/JavaBook/bin に移動し $ java IntegralTester.java として実行し その実行画面の画像をレポートに貼り付けてください 課題 7.1 の画像は不要です Eclipse 上の実行画面では受理しません 詳細は 公式ページにある report7.pdf の第 6 節をよく読んでください
テスト仕様以下のようなテスト結果 ( 入力値は自分で考える ) を記載する 番号 入力 1 入力 2 出力 1 出力 2 合否 1 1 2 1-3.0 3.0 2 f(x) = 1x^2+2x+1 の定積分 [-3.0, 3.0] の近似値 上記以外最低でも 4 つのテスト結果を 2~5 に記載 1 分割 : 60.00 10 分割 : 24.36 100 分割 : 24.00 1000 分割 : 24.00 10000 分割 : 24.00 100000 分割 : 24.00 か を記入 3 4 5 6 右記以外の入力エラーの場合の結果を 2 つ記載 28.8-15.9 積分区間が間違っています. 7 6.2 6.2 積分区間が間違っています.
添付する画像 レポートに添付する画像は 右図のようなターミナル上での実行結果です エクリプス上の実行結果では受理しません 画像には 自分で考えテスト仕様に示した実行結果を全て含めるようにしてください また それ以外の余分な行 (cd や誤ったコマンドなど ) は含めないでください
よくある再提出例 プログラムの仕様の記述が不完全 コメントが無い 字下げしていない または不完全 ( 自己流の字下げ ) ソースコードの一部がはみ出して欠落 または次の行に折り返されている 実行結果の図がターミナルではなく eclipse で実行したものになっている 実行結果の図に java コマンド以外の余分な情報が入っている report7.tex に記載されている指示文章がそのまま残っている これらも含め pdf ファイルに不備が無いかどうかよく確認してから提出してください 再提出となった場合 遅刻提出と同様に大きく減点されます
課題提出期限 課題 7の全てのJavaプログラム 基本期限 : 本日 16:30 延長期限 :11 月 6 日 ( 水 ) 17:00 LaTeX によるレポート ( report7.pdf ) 基本期限 :11 月 6 日 ( 水 ) 17:00