第11回 配列の高度な利用
前回の復習
- 配列の利用
- 連続したデータを格納するデータ構造
- 変数と似たような操作を行う(参照、書き換え)
- ふりがな表
配列を利用した描画
授業内課題11-1
以下のプログラムについて、(1) 読み下し文を書き、(2) 実行結果を予測せよ。 プログラムを実行し予測と合っていたか確かめよ。
int n = 12345;
int[] digits = new int[10];
for (int i = 0; i < digits.length; ++i) {
digits[i] = n % 10;
n /= 10;
}
for (int i = digits.length - 1; i >= 0; --i) {
print(digits[i] + " ");
}
println();
授業内課題11-2
以下のプログラムについて、(1) 読み下し文を書き、(2) 実行結果を予測せよ。 プログラムを実行し予測と合っていたか確かめよ。
size(400, 400);
background(255, 255, 255);
fill(255, 0, 0);
int[] numbers = {52, 23, 65, 48, 49, 30, 0, 76, 13, 22};
int max = numbers[0];
for (int i = 1; i < numbers.length; ++i) {
if (numbers[i] > max) {
max = numbers[i];
}
}
int rectWidth = width / numbers.length;
for (int i = 0; i < numbers.length; ++i) {
int rectHeight = numbers[i] * height / max;
rect(i * rectWidth, height - rectHeight, rectWidth, rectHeight);
}
授業内課題11-3
以下のように、実数配列型の変数numbersに-200から200の範囲の実数が10個格納されている。
float[] numbers = {126.86, 149.24, 29.74, -63.32, 177.73, -159.43, 78.50, -63.83, -27.60, 139.69};
幅400高さ400のWindowにおいて、高さ height / 2
を y = 0
として、numbers[i]( )を下図のように棒グラフとして描画せよ。
棒の色は、最も大きい値を赤色、最も小さい値を青色、それ以外の値を白色で塗り潰せ。
授業内課題11-4
幅400高さ400のWindowにおいて、画面内に直径10の黒色の点を10個描画せよ。 点のx座標とy座標は0以上400未満の範囲で乱数を用いて決定する。 次に10個の点の重心を求め、重心の座標に赤色の点を描画せよ。 さらに10個の点と重心を結ぶ線分を描画せよ。
授業内課題の解答例
授業内課題11-1
以下のプログラムについて、(1) 読み下し文を書き、(2) 実行結果を予測せよ。 プログラムを実行し予測と合っていたか確かめよ。
int n = 12345;
int[] digits = new int[10];
for (int i = 0; i < digits.length; ++i) {
digits[i] = n % 10;
n /= 10;
}
for (int i = digits.length - 1; i >= 0; --i) {
print(digits[i] + " ");
}
println();
読み下し文
整数型の変数nを作成して、整数12345で初期化しろ
整数配列型の変数digitsを作成して、要素数整数10の整数配列で初期化しろ
整数型の変数iを作成して、整数0で初期化しろ
変数iの値が配列digitsの要素数より小さいの真偽が真である限り以下を繰り返せ
{
配列digitsの変数iの値番目に変数nの値を整数10で割った余りを代入しろ
変数nの値を整数10で割った結果を変数nに代入しろ
変数iの値を1増やせ
}
整数型の変数iを作成して、配列digitsの要素数から整数1を引いた結果で初期化しろ
変数iの値が整数0以上の真偽が真である限り以下を繰り返せ
{
配列digitsの変数iの値番目の値に文字列「 」を足した結果を表示しろ
変数iの値を1減らせ
}
実行結果
0 0 0 0 0 1 2 3 4 5
授業内課題11-2
以下のプログラムについて、(1) 読み下し文を書き、(2) 実行結果を予測せよ。 プログラムを実行し予測と合っていたか確かめよ。
size(400, 400);
background(255, 255, 255);
fill(255, 0, 0);
int[] numbers = {52, 23, 65, 48, 49, 30, 0, 76, 13, 22};
int max = numbers[0];
for (int i = 1; i < numbers.length; ++i) {
if (numbers[i] > max) {
max = numbers[i];
}
}
int rectWidth = width / numbers.length;
for (int i = 0; i < numbers.length; ++i) {
int rectHeight = numbers[i] * height / max;
rect(i * rectWidth, height - rectHeight, rectWidth, rectHeight);
}
読み下し文
整数配列型の変数numbersを作成して、{整数52, 整数23, 整数65, 整数48, 整数49, 整数30, 整数0, 整数76, 整数13, 整数22}を要素に持った配列で初期化しろ
整数型の変数maxを作成して、配列numbersの整数0番目の値で初期化しろ
整数型の変数iを作成して、整数1で初期化しろ
変数iの値が配列numbersの要素数より小さいの真偽が真である限り以下を繰り返せ
{
もし配列numbersの変数iの値番目の値が変数maxの値より大きいの真偽が真なら以下を実行しろ
{
変数maxに配列numbersの変数iの値番目の値を代入しろ
}
変数iの値を1増やせ
}
整数型の変数rectWidthを作成して、Windowの幅を配列numbersの要素数で割った結果で初期化しろ
整数型の変数iを作成して、整数0で初期化しろ
変数iの値が配列digitsの要素数より小さいの真偽が真である限り以下を繰り返せ
{
整数型の変数rectHeightを作成して、配列numbersの変数iの値番目の値にWindowの高さを掛けた結果を変数maxの値で割った結果で初期化しろ
左上の座標を( 変数iの値に変数rectWidthの値を掛けた結果 , Windowの高さから変数rectHeightの値を引いた結果 )とした幅変数rectWidthの値、高さ変数rectHeightの値の長方形を描画しろ
変数iの値を1増やせ
}
実行結果
授業内課題11-3
以下のように、実数配列型の変数numbersに-200から200の範囲の実数が10個格納されている。
float[] numbers = {126.86, 149.24, 29.74, -63.32, 177.73, -159.43, 78.50, -63.83, -27.60, 139.69};
幅400高さ400のWindowにおいて、高さ height / 2
を y = 0
として、numbers[i]( )を下図のように棒グラフとして描画せよ。
棒の色は、最も大きい値を赤色、最も小さい値を青色、それ以外の値を白色で塗り潰せ。
解答例
size(400, 400);
background(255, 255, 255);
float[] numbers = {126.86, 149.24, 29.74, -63.32, 177.73, -159.43, 78.50, -63.83, -27.60, 139.69};
int minIndex = 0;
int maxIndex = 0;
for (int i = 1; i < numbers.length; ++i) {
if (numbers[i] < numbers[minIndex]) {
minIndex = i;
}
if (numbers[i] > numbers[maxIndex]) {
maxIndex = i;
}
}
int rectWidth = width / numbers.length;
for (int i = 0; i < numbers.length; ++i) {
if (i == minIndex) {
fill(0, 0, 255);
} else if (i == maxIndex) {
fill(255, 0, 0);
} else {
fill(255, 255, 255);
}
if (numbers[i] < 0) {
rect(i * rectWidth, height / 2, rectWidth, -numbers[i]);
} else {
rect(i * rectWidth, height / 2 - numbers[i], rectWidth, numbers[i]);
}
}
授業内課題11-4
幅400高さ400のWindowにおいて、画面内に直径10の黒色の点を10個描画せよ。 点のx座標とy座標は0以上400未満の範囲で乱数を用いて決定する。 次に10個の点の重心を求め、重心の座標に赤色の点を描画せよ。 さらに10個の点と重心を結ぶ線分を描画せよ。
解答例
size(400, 400);
int n = 10;
int[] x = new int[n];
int[] y = new int[n];
for (int i = 0; i < n; ++i) {
x[i] = int(random(0, width));
y[i] = int(random(0, height));
}
float cx = 0;
float cy = 0;
for (int i = 0; i < n; ++i) {
cx += x[i];
cy += y[i];
}
cx /= n;
cy /= n;
for (int i = 0; i < n; ++i) {
line(cx, cy, x[i], y[i]);
fill(0, 0, 0);
ellipse(x[i], y[i], 10, 10);
}
fill(255, 0, 0);
ellipse(cx, cy, 10, 10);
授業外レポート
授業外課題11-1
寿司打( http://neutral.x0.com/home/sushida/play2.html )「5000円コース」をプレイし、以下のスコアを報告せよ(スピードは任意)
- 成績(xxx円分得 or 損した)
- 正しく打ったキーの数
- 平均キータイプ数(回 / 秒)
- ミスタイプ数
授業外課題11-2
以下のプログラムについて、(1) 読み下し文を書き、(2) 実行結果を予測せよ。 プログラムを実行し予測と合っていたか確かめよ。
int[] numbers = new int[15];
for (int i = 0; i < numbers.length; ++i) {
numbers[i] = int(random(2));
}
for (int i = 0; i < numbers.length; ++i) {
print(numbers[i] + " ");
}
println();
int i = 0;
while (i < numbers.length) {
int count = 0;
int target = numbers[i];
while (i < numbers.length && numbers[i] == target) {
i++;
count++;
}
println(target + " * " + count);
}
授業外課題11-3
以下のプログラムについて、(1) 読み下し文を書き、(2) 実行結果を予測せよ。 プログラムを実行し予測と合っていたか確かめよ。
size(400, 400);
background(255, 255, 255);
fill(255, 255, 255);
float[] numbers = {52, 23, 65, 48, 49, 30, 0, 76, 13, 22};
float sum = 0;
for (int i = 0; i < numbers.length; ++i) {
sum += numbers[i];
}
float x = 0;
for (int i = 0; i < numbers.length; ++i) {
float rectWidth = numbers[i] * width / sum;
rect(x, 0, rectWidth, height);
x += rectWidth;
}
授業外課題11-4
幅400高さ400のWindowにおいて、画面内に直径10の黒色の点を10個描画せよ。 点のx座標とy座標は0以上400未満の範囲で乱数を用いて決定する。 さらに、全ての2点の間を線分を描画せよ。
授業外課題11-5
プログラムの先頭で整数配列numbersを作成し、任意の要素で初期化する。 幅400高さ400のWindowにおいて、i番目の棒の高さが、numbersの0番目からi番目までの総和に比例するような棒グラフを描画せよ。 ただし、最も高い棒の高さはWindowの高さと一致するようにすること。