第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 / 2y = 0 として、numbers[i]( )を下図のように棒グラフとして描画せよ。 棒の色は、最も大きい値を赤色、最も小さい値を青色、それ以外の値を白色で塗り潰せ。

fig01

授業内課題11-4

幅400高さ400のWindowにおいて、画面内に直径10の黒色の点を10個描画せよ。 点のx座標とy座標は0以上400未満の範囲で乱数を用いて決定する。 次に10個の点の重心を求め、重心の座標に赤色の点を描画せよ。 さらに10個の点と重心を結ぶ線分を描画せよ。

fig02

授業内課題の解答例

授業内課題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増やせ
}

実行結果

Screen Shot 0030-12-04 at 6.43.28.png (8.4 kB)

授業内課題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 / 2y = 0 として、numbers[i]( )を下図のように棒グラフとして描画せよ。 棒の色は、最も大きい値を赤色、最も小さい値を青色、それ以外の値を白色で塗り潰せ。

fig01

解答例

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個の点と重心を結ぶ線分を描画せよ。

fig02

解答例

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点の間を線分を描画せよ。

fig03

授業外課題11-5

プログラムの先頭で整数配列numbersを作成し、任意の要素で初期化する。 幅400高さ400のWindowにおいて、i番目の棒の高さが、numbersの0番目からi番目までの総和に比例するような棒グラフを描画せよ。 ただし、最も高い棒の高さはWindowの高さと一致するようにすること。

fig04

results matching ""

    No results matching ""