演習 05
問題 1
以下の図のようなタコメーターで速度の値を表示する。
速度は 0 から 100 の範囲をとり、針は速度の値に応じて扇型の左端から右端までを時計回りに回転する。 次の 2 つの関数を作成し、タコメーターを描画するプログラムを完成させよ。
- 2 つの実数値
value
とmaxValue
を引数として受け取り、速度の最大値をmaxValue
としたときの速度value
に対応した針の角度を返す関数calcAngle
- 2 つの実数値
value
とmaxValue
を引数として受け取り、速度の最大値をmaxValue
としたときの速度value
に対応した針を描画する関数drawMeter
void drawTicks(int nTicks, float maxValue) {
float cx = width / 2;
float cy = height;
float r = width / 2;
float r0 = r - 10;
noFill();
stroke(0);
ellipse(cx, cy, 2 * r, 2 * r);
fill(0);
textAlign(CENTER, CENTER);
float dv = maxValue / (nTicks - 1);
for (int i = 0; i < nTicks; ++i) {
float v = dv * i;
float t = calcAngle(v, maxValue);
line(cx + r * cos(t), cy + r * sin(t), cx + r0 * cos(t), cy + r0 * sin(t));
text(int(v), cx + (r0 - 10) * cos(t), cy + (r0 - 10) * sin(t));
}
}
void drawTachometer(float value) {
float maxValue = 100;
drawTicks(11, maxValue);
drawMeter(value, maxValue);
}
void setup() {
size(400, 200);
}
void draw() {
background(255);
float speed = 65;
drawTachometer(speed);
}
問題 2
整数配列を受け取り、隣り合う 2 要素の差の絶対値のうちの最大値を返す関数 maxDifference
を作成して以下のプログラムを完成させよ。
整数配列の要素数は 2 以上であり、値は昇順に並んでいるとする。
void setup() {
noLoop();
}
void draw() {
int[] data = {13, 28, 30, 32, 35, 43, 52, 52, 56, 78};
println(maxDifference(data));
}
実行結果
22
問題 3
500 円硬貨、100 円硬貨、50 円硬貨、10 円硬貨、5 円硬貨、1 円硬貨がそれぞれ十分な枚数あるとする。
price
円の金額を、なるべく少ない合計枚数の硬貨で支払いたい。
整数値 price
を引数として受け取り、最適な支払う硬貨の合計枚数を返す関数 coinCount
を作成して以下のプログラムを完成させよ。
void setup() {
noLoop();
}
void draw() {
int price = 916;
println(coinCount(price));
}
実行結果
8
問題 4
ランレングス符号化は文字列の圧縮方法の一つであり、同じ文字が連続した部分を連続した長さとその文字で表す。
文字列を引数として受け取り、その文字列を圧縮した文字列をコンソールに表示する関数を作成せよ。
作成した関数を用いて、data.txt
に格納された文字列の各行をランレングス符号化した結果を出力せよ。
入力例
AAAAAAAAAABBBBBBBBBCCCCCDDEEEEEEEEEFGGGG
AABBBBBCCCCCDDDDDDDDDDDDDDDDDEEEFFFFFFGG
AAAAAAAAAAAAAAAAAAAAAAAAAABBCDEFGGGGGGGG
AAAABBBBBBBBBCCCCDDDDDDDDDDDDDEEEEFGGGGG
AABBBBBBBBBBBBBBDDDDDDDDDEEEEEFFFFFFFFFF
AAAAABBBBBBCCCCCCCCCCCDEFFFFFFFFFGGGGGGG
入力例の出力結果
10A9B5C2D9E1F4G
2A5B5C17D3E6F2G
26A2B1C1D1E1F8G
4A9B4C13D4E1F5G
2A14B9D5E10F
5A6B11C1D1E9F7G
考え方の例
文字列の i
番目について、次のいずれかの条件を満たすとき、そこから同じ文字が連続する回数を数える
i
が 0 であるi-1
番目の文字がi
番目の文字と異なる
問題 5
モンテカルロ法を用いて円周率を計算する。 以下の 3 つの関数を作成し、draw 関数内で使用して円周率の計算および図の描画を行うプログラムを作成せよ。 内部をさらに関数に分割しても良い。
- 整数型の と を引数として受け取り、0 以上 未満の実数を 個持った配列を生成して返す関数
- 要素数 の実数型配列と整数 を引数として受け取り、 番目の要素を 、 番目の要素を とした時に、中心角 90 度半径 の扇形内に含まれる(x, y)の個数を数え、円周率を出力する関数
- 個の要素を持った実数型配列と整数 を引数とし、 番目の要素を 、 番目の要素を とした時に、中心角 90 度半径 の扇形内と の各点を描画する関数
実行例
PI = 3.124