トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

ProgrammingMiniProject1

プログラミング演習I 雪田のページ

この演習ではJava言語を使うにも関わらず、オブジェクト指向の要素を極力避け、手続き的なスタイルでプログラムを書きまくるということを目標としている。そういうことなので、サンプルプログラムはプロフェッショナルな書法からは大きく隔たっている。しかし、この演習を受講する諸君にとって、ここでサンプルとして提供するプログラミングスタイルで多くの行数を書くことには以下のような意義がある。

  • forループやif文による分岐などの基本的なプログラミング技術に習熟する
  • メソッド呼び出しと定義の方法を完全にマスターする
  • 素朴なテスト、デバッグの方法が使える

以上の体験が、今後どのようなプログラミング言語を学ぶときに大いに役立つ。もちろんJava言語で本来のオブジェクト指向プログラミングを学ぶ上でも前提条件となる。

Q and A のページ ==> こちら

  この演習の到達目標と成績評価

プログラミング入門Iを履修したばかりの人を対象としている。習得した技能レベルは人によって大きく異なるので、習熟度を考慮した課題設定を行う。

Level 想定する技術レベル 作成物 成績評価
B プログラミング入門IでCまたはB サンプルプログラム(200行ほど)の量的拡大。1000行ほど。 CまたはBまたはA
A プログラミング入門IでBまたはA。メソッドが自在に書ける サンプルプログラム(300行ほど)のユーティリティメソッド(数個)に加えて10個ほど追加し、1000行ほど。 BまたはA
S プログラミング入門IでAまたはA+。データ構造が考えられる。 マークアップするなど簡易入力する仕組み。1000行以上。 A+
X プログラミング入門IでA+。オブジェクト指向まで先取り勉強している。 Compositeパターンを適用したサンプルプログラム(400行ほど)の機能を拡張する。1000行以上。 A+

  Unicode とは

とりあえず、この演習では大雑把にunicodeは32ビット整数で番号付けられた文字の表と考えてよい。

参考STIXGeneral.otf.pdf(205)

現時点での正しい情報は以下の用語についての調査を行うと得られる。様々な概念の間の関係を見つけ出してください。

  • UCS-2 (Universal multilingual Code Set 2)
  • UCS-4 (Universal multilingual Code Set 4)
  • Character code set と Encoding Scheme
  • UTF-8, UTF-16, UTF-32
  • UTF-16とSurrogate pair
  • Java 言語における unicode の扱い JavaLangSpec3.pdf(1864)
    • char型は16ビットだ。Javaが世に出たころのunicodeの規格に合わせたのだがunicodeは現在32ビットに拡張されている。
    • 今更char型を32ビットに変更するのはできない。
    • Surrogate APIというものがある。

Windows OSを使っている人は文字コード表が使える。

スタート -> すべてのプログラム -> アクセサリ -> システムツール -> 文字コード表

プログラムを書くときの基本的な心得

  • まず最小限機能できちんと動くものを作る。
  • 機能を1つずつ追加して行く。1つ追加するたびに正しく動くかテストをする。

これを実行するためには、機能の追加をしやすいプログラムの構造を最初によく考えておく必要がある。最小限の機能をもつ以下のプログラムを動かしてみよう。すると以下のようなウィンドウが表示されるはずだ。このプログラムを出発点にして機能を拡張して行く。

package lesson01;
 
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTabbedPane;

public class Experiment12 {
    // Unicode code points
    final int _a = 0x1D44E;
    final int _A = 0x1D434;
    final int _P = 0x1D443;
    final int _x = 0x1D465;
    final int _forall = 0x2200;
    final int _in = 0x2208;

    final int _semicolon = ';';
    final int _space = ' ';
    final int _leftP = '(';
    final String LP = new String(new int[] { _leftP }, 0, 1);
    final int _rightP = ')';
    final String RP = new String(new int[] { _rightP }, 0, 1);
    final int _plus = '+';
    final int _minus = 0x2212;
    final int _eq = '=';

    final int indent = 10;
    final int normalSize = 40;
    final int doubleSize = 80;
    final int baselineSkip = 50;

    
    public static void main(String[] args) {
        (new Experiment12()).start();
    }

    void start() {
        createMultiPads("Exp12 Unicode and Math", 800, 600);
    }

    void myPaint1(Graphics g) {
        Font font1 = new Font("Cambria Math", Font.PLAIN, normalSize);
        Font font2 = new Font("Cambria Math", Font.PLAIN, doubleSize);

        int lineNo = 1;
        // A proposition
        String line1 = new String(new int[] { _forall, _x, _in, _A, _semicolon,
                _space, _P, _leftP, _x, _rightP }, 0, 10);
        g.setFont(font1);
        g.drawString(line1, indent, baselineSkip * lineNo);
        lineNo++;
    }

    void myPaint2(Graphics g) {

    }

    void createMultiPads(String title, int w, int h) {
        JFrame f = new JFrame(title);
        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        f.setSize(w, h);
        JTabbedPane tp = new JTabbedPane();
        JLabel area1 = new JLabel() {
            public void paint(Graphics g) {
                myPaint1(g);
            }
        };
        JLabel area2 = new JLabel() {
            public void paint(Graphics g) {
                myPaint2(g);
            }
        };
        tp.add("色々", area1);
        tp.add("線形代数", area2);
        f.getContentPane().add(tp);
        f.setVisible(true);
    }
}

  第1回

参考資料

Level B,A,S,X毎にサンプルプログラムを理解することが目標。Eclipseで作業する場合はJava Project名を適切につけてください。何も思い浮かばないときは yukita2010 とでもつけるとよい。パッケージも考えてください。 例えば lesson01, lesson02, lesson03 などでもよい。2Dグラフィックスを多用するが、春学期のプログラミング入門で使用した Canvas に置き換えるとすっきり書ける。サンプルプログラムでは生で awt や swing をいじっている。

Level サンプルプログラムとその解説 注意
B 基本Experiment12.java 入力フィールド付きExperiment12rev2.java
A and S 基本Experiment14.java マルチタブ対応Experiment14rev3.java Level Bを理解してから
X Experiment17.java Level A and Sを理解してから

Level Bのサンプルプログラムの実行結果は以下の通り。「線形代数」のタブをクリックしてもサンプルプログラムのままだと空っぽの表示に切り替わる。他のレベルのサンプルの実行結果もほぼ同じ。

第2回までの自習課題

  • Unicode とは何か。参考資料を読んで概要をつかむこと。
  • それぞれが自分の習熟度に応じて選んだサンプルプログラムを実際に動かし、そのからくりを理解すること。

GBCなどを積極的に利用してほしい。

  第2回

第1回の後の自習成果を確認する。第3回までの課題を解説する。

第3回までの自習課題 Level B

Unicode の表から様々な数学記号を選び、タブを増やして表示してみる。

第3回までの自習課題 Level A

  • メソッドをいくつも書いてみよ。たとえば
    • 積分の上端、下端、中身
    • 3×3の行列
  • Level Bのサンプルを参考にマルチタブに変更する。

第3回までの自習課題 Level S, X

  • ユーザからの入力を受け取るように変更する。
    • x^3 + x^2 + 1 のような入力を受け付けて ^ を上付き添え字として表示する。
    • C_6 H_12 O_6 のような入力を受け付けて _ を下付き添え字として表示する。

参考手順

  • start メソッドの最後に対話のループを記述する。
  • 対話のループでは
    • 入力ダイアログボックスを開いてもよい。
    • 入力されたデータは解析し、DrawThis の配列に追加格納、あるいは特別の変数に格納する。
    • area に対して repaint メソッドを呼び出す。

他のやり方もいろいろある。

  第3回

第3回までの自習課題の確認。

最終課題

機能拡張をし、1000行を超えるプログラムにする。

  第4回 まとめ

レポートの作成と提出について

締め切り
第5週の授業時。第4週から受け付け開始する。
提出方法
メール添付による。件名を「Mini Project」とし、本文には学籍番号と氏名を明記すること。
添付ファイルの形式
添付のファイル名は"学籍番号.zip"とする。例えば"10k2001.zip"のように。このZIPファイルには以下のファイルを含むものとする。
  • ソースコード(Eclipseからコピーしたままのもの、つまり行番号をつけてないもの)
  • レポート(doc,docx,pdfのいずれか)
レポートの形式
以下の通り。
  • 表紙を付ける。
  • 構成。以下の節を設ける。
    • 前書き。以下の各項目で最低1段落は必要。
      • 何を成し遂げたのか。自分独自の売り(他人にないもの)は何か。
      • どのように、それを進めたのか。例えば、特定の技術についてネットで検索して、自分のやりたいことに合う情報を得たとか。プログラミング上の苦労とそれをどう乗り越えたのかなど。
      • このテーマを通じて自分が得たこと。他の人に伝えられる発見、有用な経験があればそれにも言及。
      • 簡単は締めのことば。
    • プログラムの概要と実行例
      • 実行時の画面キャプチャ
      • 画面遷移とそのトリガーとなるイベント
    • プログラムとその解説
      • 行番号つきのソースコード。この部分は、固定ピッチのフォントを使用する。
      • プログラムの解説
    • 結論。前書きにきちんと書かれていれば省いてよい。その場合は「謝辞」とする。
      • 誰かの助けを受けたなら、必ず礼を書かなければならない。大事な社会常識であり、どの道でプロになるにしても作法として当然。
    • 参考文献。ネット上にある記事の参考文献の書き方を真似する。
行番号つきのソースコードの作り方
以下の順でやらなくてもよいが参考にしてください。ここではCygwinを使う。ラボ教室のマシンを使っているときは u ドライブがホームなので以下のとおりだが、ノートPCでやっているときは多分 d ドライブなので変える必要がある。

以下の作業の前にTAB文字をスペースに変換しておこう。OEditで YourProgram.java を開く。

  • 「編集」-> 「すべて選択」
  • 「編集」-> 「高度な操作」->「タブをスペースに変換」
  • 保存する
cd /cygdrive/u/xxxxxxxx/yyyyyy
cat -n YourProgram.java > YourProgram.txt

これで行番号つきのファイルができる。

このとき、日本語の文字化けがあったら、OEditのメニューから「文字コードの変更」を選び UTF-8 で作業を進めるようにする。

MS Wordを使っているなら、このファイルからコピー&ペーストしてよい。この部分だけフォントを固定ピッチのものに替える。フォントは例えばCourierあるいはMSゴシックあるいはLucida Consoleのどれでもよい。

実行画面のキャプチャの仕方
以下の手順でやらなくてもよいが参考にしてください。
  1. Eclipse上からプログラムを実行する。
  2. キャプチャはSnipping Toolなどが使える状態なら簡単だが以下のようにもできる。
  3. Print Screen キー (prt sc とか表示されているかも)を叩く。ファンクションキーを押し下げた状態でやる必要があるかもしれない。これでクリップボードにスクリーン全体の画像がコピーされる。
  4. Paint を起動して、貼りつけを実行する。これでクリップボードから画像が転送されてPaint内で表示される。
  5. クリップ領域を指定して(トリミング)、「編集」->「ファイルへコピー」。形式はgifとかpngがよい。
  6. MS Word でこのファイルを取り込めばよい。
ZIPファイルの作り方
以下の手順でやる。
  1. 作業用のディレクトリ(フォルダ)を作成する。名前は学籍番号とすればよい。例えば"10k2001"のように。
  2. このディレクトリにソースコードとレポートのファイルを置く。
  3. OSによるが、Windows7とかWindowsVistaだったら、
    1. このディレクトリのアイコン上で右ボタンをクリック
    2. 「送る」-> 「圧縮(Zip形式)フォルダ」
    3. これで 10k2001.zip というファイルが出来上がる。
    4. 内容の確認は必ずやってください。できますね。