演習 03

問題 1

アルファベット小文字からなる文字列 s を受け取り、母音(a, e, i, o, u)を取り除いた子音のみの文字列をコンソールに表示する関数 printConsonant を作成して以下のプログラムを完成させよ。

// ここに自作関数を作る

void setup() {
  noLoop();
}

void draw() {
  String[] words = {
    "racoon",
    "dog",
    "rabbit",
    "cow",
    "horse",
    "hippopotamus",
  };
  for (int i = 0; i < words.length; ++i) {
    printConsonant(words[i]);
  }
}

実行結果

rcn
dg
rbbt
cw
hrs
hppptms

問題 2

自然数 について、 を満たす自然数 が存在するとき、 を立方数(cubic number)と呼ぶ。 また、そのときの の三乗根(cubic root)と呼ぶ。

1 以上の整数値 y を受け取り、y が立方数であればその三乗根をかえし、そうでなければ -1 を返す関数 cubicRoot を作成して以下のプログラムを完成させよ。

// ここに自作関数を作る

void setup() {
  noLoop();
}

void draw() {
  int[] numbers = {1, 8, 100, 3375, 9999, 997002999};
  for (int i = 0; i < numbers.length; ++i) {
    int c = cubicRoot(numbers[i]);
    if (c < 0) {
      println(numbers[i] + " is not a cubic number");
    } else {
      println("cubic root of " + numbers[i] + " is " + c);
    }
  }
}

実行結果

cubic root of 1 is 1
cubic root of 8 is 2
100 is not a cubic number
cubic root of 3375 is 15
9999 is not a cubic number
cubic root of 997002999 is 999

問題 3

について、 とすると、の補色は によって求められる。

整数値 rgb を受け取り、 その補色を計算する関数 complementaryColor を作成して以下のプログラムを完成させよ。

complementaryColor の戻り値には color 型を使用すると良い。

// ここに自作関数を作る

void setup() {
  size(400, 200);
}

void draw() {
  background(255);
  int r = 51;
  int g = 153;
  int b = 0;
  color c1 = color(r, g, b);
  color c2 = complementaryColor(r, g, b);
  noStroke();
  fill(c1);
  ellipse(100, 100, 200, 200);
  fill(c2);
  ellipse(300, 100, 200, 200);
}

実行結果

問題3の実行結果

問題 4

小文字のアルファベットをランダムに返す関数 randomChar を作成して以下のプログラムを完成させよ。

// ここに自作関数を作る

void setup() {
  noLoop();
}

void draw() {
  String s = "";
  for (int i = 0; i < 50; ++i) {
    s += randomChar();
  }
  println(s);
}

実行結果の例

mjrbkskrpxgmmetpsnflwjmzzkjciiflnhasunhepxqkxkxcdv

問題 5

3 点 A = (x1, y1), B = (x2, y2), C = (x3, y3) を結ぶ三角形とその外接円を描画する関数 drawCircumscribedCircle を作成して以下のプログラムを完成させよ。 x1, y1, x2, y2, x3, y3 は実数値として与えられる。

外接円の中心は線分 AB, AC, BC の垂直二等分線の交点である。 また、点 A, B, C は外接円の円周上にある。

以下の intersection 関数と verticalBisector 関数を利用して良い。

/**
 * 二直線 y = a1 x + b1, y = a2 x + b2 の交点 (x, y) を持った2要素の実数配列を返す
 */
float[] intersection(float a1, float b1, float a2, float b2) {
  float x = - (b1 - b2) / (a1 - a2);
  float y = a1 * x + b1;
  float[] xy = {x, y};
  return xy;
}

/**
 * 点 (x1, y1) と点 (x2, y2) を結ぶ線分の垂直二等分線 y = ax + b の(a, b) を持った2要素の実数配列を返す
 */
float[] verticalBisector(float x1, float y1, float x2, float y2) {
  float mx = (x1 + x2) / 2;
  float my = (y1 + y2) / 2;
  float a = -(x1 - x2) / (y1 - y2);
  float b = my - a * mx;
  float[] ab = {a, b};
  return ab;
}

// ここに自作関数を作る

void setup() {
  size(400, 400);
}

void draw() {
  background(255);
  drawCircumscribedCircle(100, 100, 300, 200, 200, 300);
}

実行結果

問題5の実行結果

results matching ""

    No results matching ""