プログラミング実習I (2021年度) のクラス 2 の補足ページ

目次

1. TA の担当

  • 情報 M2 (巳波研) 池田 晴人 hqr55832@kwansei.ac.jp
    • 37023469
    • 37023472
    • 37023474
    • 37023475
    • 37023476
    • 37023477
    • 37023478
    • 37023458
  • 情報 M2 (作元研) 瀬川 絵里子 ijt52842@kwansei.ac.jp
    • 37023452
    • 37023456
    • 37023459
    • 37023460
    • 37023461
    • 37023462
    • 37023466
    • 37023468
    • 27020835
  • 情報 M1 (作元研) 坂口 翔太郎 hbn04470@kwansei.ac.jp
    • 37023479
    • 37023480
    • 37023484
    • 37023485
    • 37023488
    • 37023489
    • 37023492
    • 37021467
  • 人シス M1 (長田研) 坂本 櫻 gjm02496@kwansei.ac.jp
    • 37023495
    • 37023496
    • 37023498
    • 37023502
    • 37023504
    • 37023505
    • 37023506
    • 37022477

2. レポートの書き方

2.1. 冒頭の部分

  • 以下のように書いてください

    • ※「R1」 に対するレポートを「関学 太郎」(学生番号:12345678) が書く場合の例
    • ※ 所要時間は,授業中と授業外を合わせたものを書くてください
    課題: R1
    学生番号: 12345678
    氏名: 関学次郎
    
    所要時間: ( 4 ) 時間
    

2.2. Q&A 方式の課題(非プログラム作成課題)の場合

  • 質問と解答をそれぞれの対応関係が分かるように書いてください

    • 質問は,そのままコピペで問題ありません.
    • 具体例を以下にまとめます
    質問1: オブジェクト指向とは何か?
    解答1:
    オブジェクト指向とは,従来からの手続型と呼ばれるプログラミングの方式に
    対して操作対象となる「モノ(部品)」を主体にしたプログラミングの方式のこ
    とである.
    

2.3. プログラムを作成する課題の場合

必要項目

  • 小課題(R1_2 など)ごとに,以下の 3 つ項目を書いてください
    • 方法(課題を解くために,どのようなプログラムを作成したのか説明する)
      • ※ 問題文の単なるコピペではなく,自分を主体とした文章で簡潔にまとめてください
        • 問題文は「...せよ」などの命令形で書かれてありますが,レポートでは「...する」のように主体が自分となるようにしましょう
    • 結果(実行結果などをコピーして貼り付ける)
      • ※ 実行結果の説明を簡単に行ってください
      • ※ 実行した結果が分かるようにスクリーンショットを撮って貼り付けてください
    • 考察(理解した点,工夫した点,苦労した点,などを 50 〜 200 字程度で書く)
      • ※ R1 や R2 ではあまり書くことがないかもしれません. その場合は,50 文字未満でも構いません.

  • R1_2 の例を以下にまとめます

    • ※ 実行結果のスクリーンショットで,実行結果をマークする必要はありません

    example_report.png

    図1: R1_2 のレポートの例

2.4. 末尾の部分

  • 課題全体に対する感想を書いてください

    • R1 に対する例を以下にまとめます
    [R1] 全体に対する感想
    今回の課題を通じて,Java を用いてコンソールに文字列を出力する方法や,
    簡単な数値の計算,変数の使い方などの基本的な内容を学ぶことができた.
    Java によるプログラミングは初めてだったため,エラーの理解などに時間が
    かかってしまった.次回以降の実習では,今回学んだ Java の基本的な内容の
    理解や,エラーへの対処方法などを役立てていきたい.
    

3. 中間試験の準備

3.1. 目的

  • 中間審査に必要な演習室の PC 操作をやってみる

3.2. 手順

必要なファイルのダウンロードと確認

  1. ココ から準備に必要なファイル(sample.zip) をダウンロード
  2. sample.zip を解凍する(パスワードは prog1 です)
  3. 解凍してできたフォルダに以下が含まれることを確認
    • problem.pdf
    • test フォルダ
      • MyFrame2.java
      • Face.java
      • DisplayFaceObject.java
  4. problem.pdf をダブルクリックする
    • pdf が閲覧できることを確認

ecipse のファイル操作の確認

  1. eclipse を起動する
  2. exam_sample という名前のプロジェクトを作成する
  3. 作成したプロジェクト exam_sample に以下を追加(プロジェクトにある src に向けてドラッグ&ドロップ)
    • MyFrame2.java
    • Face.java
    • DisplayFaceObject.java
  4. DisplayFaceObject.java を実行する
    • 以下のようなウィンドウが表示されれば ok

R7_2.png

図2: DisplayFaceObject.java の実行例

4. R5_6 のヒント

  • 線分描画のヒント: 以下の手順(★) に従って 1×1の四角形を fillRect(x, y, 1, 1) を用いて少しづつ描画していけばいい
    1. 以下の 5 つの変数を初期化する
      • 横方向の変化量(整数) \(dx = x_2 - x_1\)
      • 縦方向の変化量(整数) \(dy = y_2 - y_1\)
      • 変化量の最大値(整数) \({\rm steps} = \max(|dx|, |dy|)\)
      • 描画する 1x0 の四角形の x 座標(実数) \(x = x_1\)
      • 描画する 1x0 の四角形の y 座標(実数) \(y = y_1\)
    2. \(i = 0, 1, ... , {\rm steps}\) と変化する for 文により,以下を上から順に繰り返す
      • fillRect((int)x, (int)y, 1, 1) で 1×1の四角形を描画
      • \(x\) += \(dx\) /(double) \({\rm steps}\) (☆)
      • \(y\) += \(dy\) /(double) \({\rm steps}\) (☆)
  • 手順(★) の解説
    • 簡単のため,\(x_1 < x_2\) および \(y_1 < y_2\) の場合に限定して解説する
    • この場合,線分の描画パターンは,図 3 に示す(a) と (b) に分けられる
      • (a) \(|dx| \ge |dy|\) である場合( 横方向の変化量の絶対値のほうが大きい場合 ),線分の \((x, y)\) 座標は以下で与えられる \((i = 0, 1, ... |dx|)\) (☆☆)

        \begin{align} x &= x_1 + i\\ y &= y_1 + \frac{dy}{dx} \times i \end{align}
        • ※ \(x\) は \(x_1, x_1+1, ..., x_2\) で変化
      • (b) \(|dx| < |dy|\) である場合( 縦方向の変化量の絶対値のほうが大きい場合 ),線分の \((x, y)\) 座標は以下で与えられる \((i = 0, 1, ... |dy|)\) (☆☆)

        \begin{align} x &= x_1 + \frac{dx}{dy} \times i\\ y &= y_1 + i \end{align}
        • ※ (a) とは異なり,今度は,\(y\) が \(y_1, y_1+1, ... , y_2\) で変化
          • 傾きが急であるため,\(y\) を一つずつ変化させていかないと,1x0の四角形がまばらになってしまう

        drawLine.png

        図3: 線分の描画パターン (\(x_1 < x_2\) および \(y_1 < y_2\) の場合)

    • 手順(★) における (☆) は,(a) と (b) のどちらの場合でも,線分の \((x, y)\) 座標の式に一致する(確認してみよ)
    • 手順(★)は,\(x_1 \ge x_2\) および \(y_1 \ge y_2\) の場合でもうまくいく(なぜか考えて,考察にまとめてみよ)
  • 備考
    • 興味のある学生は以下のことを調べ,考察にまとめてみよ
      • 線分の描画手順(★)は Digital differential analyzer アルゴリズムと呼ばれ,実は,あまり良くないことが知られている
        • どういった意味で良くないのか?
      • また,線分の良い描画方法として「ブレゼンハムのアルゴリズム」 というものがある
        • どのように改善しているか?

著者: Yusuke Sakumoto

Created: 2023-09-27 水 16:49

Validate