コンピュータプログラミングII (3)

複数の同種の値をまとめて扱う

このスライドの使い方

テキスト等がはみ出した場合は、フォントサイズを小さくして調整する。 「S」 キーで小さく、「B」 キーで大きくなる。また、 下記のキーボード操作が使用できる。(一部キー操作は IE のみ対応)

「←」 or 「Page Up」 前のスライドに戻る
「→」 or 「Page Down」 or「スペース」 次のスライドに進む
「Home」 and 「End」 先頭(Home)または最後(End)のスライドへ移動
「C」 or 「contents?」 をクリック スライド一覧の表示
「F11」 or 「Ctrl+Shift+F (Win)」, 「Cmd+Shift+F (Mac)」 フルスクリーン表示と通常表示の切り替え
「F」 フッタの表示と非表示の切り替え
「A」 全スライド表示に切替 (印刷時に使う)
「S」「-」/「B」「+」 フォントサイズの大(B) 小(S)

本日のゴール

復習: コンソールへの値の表示

表示したい内容には、""でくくった文字(文字列)を + で連結することができる。

int x;
int y = 6;
int z = 4;

x = y + z * 3;
println(x);
x = (y + z) * 3;
println("(y + z) * 3 = " + x + " です。");

Processingにおけるエラーの種類

文法エラー

実行時エラー

復習 - スカラーと配列

変数の型の種類

変数の型(type)には2種類ある。

代入で違いを見てみる。

基本型の変数への代入

参照型と null

参照型の変数への代入

参照型の変数への null の代入

参考: ガベージ・コレクション

配列を参照している変数に null を代入 -> その配列はどこからも参照されなくなる

多次元配列

多次元配列の生成

int[] a = new int[5];         // 1次元配列 (要素数5のベクトル)

int[][] a = new int[3][5];    // 2次元配列 (3行5列の行列)

上の記法では2次元配列全体を一度に生成するが、 1次元ずつ生成していく方法もある。 この方法では2次元目の要素数を行ごとに変えることができる。

int[][] a = new int[3][];   // 「配列をまとめるための配列」だけを生成
a[0] = new int[3];          // 行ごとに異なる要素数の1次元配列を生成
a[1] = new int[3];
a[2] = new int[2];

復習: 大きさが指定されている円

12個の円が横一列に並んでいる。円の直径には指定があり、規則性はない。

復習: 大きさが指定されている円

直径の値を格納する配列を導入。

size(400, 400);             // ウィンドウのサイズ
background(255, 255, 255);  // 背景色(白)
noStroke();                 // 輪郭線を無効に

int x = 30;                 // 円の中心の x座標の初期値
int y = 200;                // 円の中心の y座標
int dx = 30;                // 円の中心間の距離
int[] d;                    // 円の直径
int n = 12;                 // 円の個数

fill(0, 0, 0);              // 塗る色 (黒)

d = new int[] { 30, 15, 40, 10, 25, 20, 10, 40, 5, 45, 10, 35 };  // 直径の指定

for(int i = 0; i < n; i++) {
  println("(" + x + "," + y + ") d=" + d[i]);
  ellipse(x, y, d[i], d[i]);    // i番目の円の直径 d[i] を取り出す
  x = x + dx;
}

練習: 形状が指定されている魚

魚1匹の形状を決めるパラメータを1つの配列に格納 (楕円2つの配置と大きさ)。

練習: 形状が指定されている魚

// 定数
int[] fish = new int[] {           // 魚の形状 (体の中心=原点)
  0, 0, 70, 30,                    // 胴体の相対位置(x,y)・横幅・縦幅
  -38, 0, 15, 25                   // 尾びれの相対位置(x,y)・横幅・縦幅
};
// 変数
int x;                             // 魚の中心の x座標
int y;                             // 魚の中心の y座標

size(400, 400);             // ウィンドウのサイズ
noStroke();                 // 輪郭線を無効に
background(63, 63, 255);    // 背景色
fill(63, 31, 31);           // 塗る色

// 魚の姿の描画
for (int i = 0; i < 5; i++ ) {
  x = i * 50 + 100;
  y = i * 50 + 100;
  println("(" + x + "," + y + ")");
  ellipse(x + fish[0], y + fish[1], fish[2], fish[3]);   // 胴体
  ellipse(x + fish[4], y + fish[5], fish[6], fish[7]);   // 尾びれ
}

定数と修飾子

float x;
final float PI = 3.14;      // 定数

[参考] Java では定数を表すときに final と static を併用するが、これは2年生で扱う。

配列の index と定数

配列は同じ型の値をまとめ、添え字(index)がその順序を表すが、 要素ごとに意味づけがされていることがある。

float[] ball = new float[3];

ball[0] = 1.0;      // 0 は X座標
ball[1] = 5.5;      // 1 は Y座標
ball[2] = 180.0;    // 2 は 色相(Hue)

番号ではわかりにくいため、わかりやすい名前の定数を用意するとよい。

final int X = 0;    // 0 は X座標
final int Y = 1;    // 1 は Y座標
final int HUE = 2;  // 2 は 色相(Hue)

float[] ball = new float[3];

ball[X] = 1.0;
ball[Y] = 5.5;
ball[HUE] = 180.0;

練習: 形状が指定されている魚

// 定数
final int[] fish = new int[] {     // 魚の形状 (体の中心=原点)
  0, 0, 70, 30,                    // 胴体の相対位置(x,y)・横幅・縦幅
  -38, 0, 15, 25                   // 尾びれの相対位置(x,y)・横幅・縦幅
};
final int bodyX = 0;
final int bodyY = 1;
final int bodyLength = 2;
final int bodyWidth = 3;
final int finX = 4;
final int finY = 5;
final int finLength = 6;
final int finWidth = 7;
// 変数
int x;                             // 魚の中心の x座標
int y;                             // 魚の中心の y座標

size(400, 400);             // ウィンドウのサイズ
noStroke();                 // 輪郭線を無効に
background(63, 63, 255);    // 背景色
fill(63, 31, 31);           // 塗る色

// 魚の姿の描画
for (int i = 0; i < 5; i++ ) {
  x = i * 50 + 100;
  y = i * 50 + 100;
  println("(" + x + "," + y + ")");
  ellipse(x + fish[bodyX], y + fish[bodyY], fish[bodyLength], fish[bodyWidth]);   // 胴体
  ellipse(x + fish[ finX], y + fish[ finY], fish[ finLength], fish[ finWidth]);   // 尾びれ
}