課題

課題 1.

正の実数 \(r\) と 0 以上 360 以下の実数 \(\theta\) を入力すると、 半径が \(r\) で中心角を \(\theta [^{\circ}]\) とする扇形の面積を計算して出力するプログラムを作成してください。 ただし、円周率 \(\pi\) は 3.14 として扇型の面積を計算してください。 また、中心角は度数法で与えていることに注意してください。

期待されるプログラムの動作を示します。 1 行目と 2 行目はユーザーからの入力で、 1行目では \(r\) の値、2 行目では \(\theta\) の値を入力しています。 3 行目はプログラムの出力で、扇型の面積を出力しています。

terminal

12.3
60.0
79.175100

課題 2.

ジュースなどの飲料品を販売している自動販売機を考えます。 この自動販売機に 1000 円札を投入し、170 円のジュースを購入したとすると、お釣りとして 830 円が返ってきます。 この時、お釣りの硬貨の枚数を最小限となるようにお釣りが返されると、 500 円硬貨 1 枚、100 円硬貨 3 枚、10 円硬貨 3 枚 が返されます。

このように、投入金額と購入商品の金額を入力を入力すると、お釣りとして返される硬貨の枚数が最小限となるように計算して出力するプログラムを作成してください。

入力される投入金額と購入商品の金額は、10 円以上 1000 円以下とし、 10 円単位の整数値で入力されるものとします。投入金額は購入商品の金額以上とします。 出力としては、お釣りとして返される 500 円硬貨、100 円硬貨、50円硬貨、10 円硬貨の枚数をそれぞれ出力してください。

期待されるプログラムの動作例を 2 例示します。

まず、投入金額が 1000 円、購入商品の金額が 170 円の場合の例です。 1 行目と 2 行目はユーザーからの入力で、 1 行目では投入金額、2 行目では購入商品の金額を入力しています。 3 行目から 6 行目ではお釣りとして返される 500 円硬貨、 100 円硬貨、50 円硬貨、10 円硬貨の枚数を出力しています。

terminal

1000
170
500: 1
100: 3
 50: 0
 10: 3

動作例をもう一つ示します。 こちらは、投入金額が 510 円、購入商品の金額が 160 円の場合の例です。

terminal

510
160
500: 0
100: 3
 50: 1
 10: 0

課題 3.

実係数 \(b, c\) を持つ 2 次方程式 \(x^2 + bx + c = 0\) の実数解は、判別式 \(D = b^2 - 4c\) によって以下の表のように与えられます。

\(D\)実数解の個数
\(D > 0\)2\(\dfrac{-b + \sqrt{D}}{2}, \dfrac{-b - \sqrt{D}}{2}\)
\(D = 0\)1\(\dfrac{-b}{2}\)
\(D < 0\)0実数解無し

実数値の係数 \(b, c\) を入力すると、 2 次方程式 \(x^2 + bx + c = 0\) の実数解をすべて求めて出力するプログラムを作成してください。 ただし、実数解が存在しない場合は、 no real roots と出力するようにしてください。

なお、平方根を計算する方法は、 参考 : 平方根の計算 を参考にしてください。

期待されるプログラムの動作を示します。 1 行目と 2 行目はユーザーからの入力で、 それぞれ \(b\) と \(c\) の値を入力しています。

まずは \(b = -3.0, c = 1.5 \) と入力した場合の例です。 この場合は 2 つの実数解が存在し、3 行目と 4 行目にそれぞれの解が出力されています。

terminal

-3.0 
1.5
x = 2.366025
x = 0.633975

次は \(b = 2.0, c = 1.0 \) と入力した場合の例です。 この場合はただ 1 つの実数解が存在し、3 行目にその解が出力されています。

terminal

2.0
1.0
x = -1.000000

最後に \(b = 1.5, c = 2.0 \) と入力した場合の例です。 この場合は実数解が存在しないため、no real roots と出力されます。

terminal

1.5
1.0
no real roots

tips \(b = 0.2, c = 0.01\) とした場合、 \(D = 0\) となるので、この二次方程式の実数解は 1 つとなるはずです。 みなさんの作成したプログラムではどのような結果になるでしょうか。確認してみましょう。 なぜ、そのような結果が得られたのか、余力がある人は考察してみてください。 0.2 や 0.01 が2進数表現ではどのように表されるかを考えてみるとよいでしょう。


課題 4.

正の整数 \(n\) を入力し、その後に \(n\) 個の実数を入力すると、 入力した \(n\) 個の実数の平均値を出力するプログラムを作成してください。

期待されるプログラムの動作を示します。

1 行目はユーザーからの入力で、\(n\) の値を入力しています。 ここでは \(n = 3\) と入力しています。 2 行目から 4 行目もユーザーからの入力で、 3 個の実数を入力しています。 これらの実数の平均値が 5 行目に出力されています。

terminal (実行例1)

3
1.0
2.0
3.0
average : 2.000000

次は \(n = 5\) と入力した場合の例です。

terminal (実行例2)

5
3.1
-1.2
4.5
2.0
0.5
average : 1.780000

発展課題 1

以下に示す、ゲーム Nim をプレイするプログラムを作成してください。

Nim のルール

Nim は 2 人のプレイヤーが交互に石を取り合うゲームです。 ゲームの開始時には、石の山が 3 つあり、それぞれの山には 3, 4, 5 個の石が置かれています。 (山の数と石の数は任意の値に変更しても構いません。) プレイヤーは 1 回に一つの選び、そこから 1 つ以上の石を取る必要があります。 プレイヤーは交互に石を取り合い、最後の石を取ったプレイヤーが勝ちとなります。

ゲームの進行例

2 人のプレイヤーをそれぞれ、プレイヤー A と プレイヤー B として、 ゲームの進行例を示します。

プレイヤー A が先番です。 初期配置では、各山の石の数は以下のようになっています。 (山には番号が付けられています。) また、プレイヤー A に石を取り除く山の番号と取り除く石の数を入力するように促します。

1 :***
2 :****
3 :*****
player A : Enter the pile number and the number of stones to remove.

プレイヤー A は、山の番号と取り除く石の数を入力します。 ここでは、2 番の山から 3 個の石を取り除くとしして、2 3 と入力します。 そうすると、山の石の数は以下のように変化します。 (1 行目は、プレイヤー A の入力)

2 3
1 :***
2 :*
3 :*****
player B : Enter the pile number and the number of stones to remove.

次は、プレイヤー B の番です。 3 番目の山の石を 5 個すべて取り除くとして、3 5 と入力したとします。 山の石の数は次のようになります。

3 5
1 :***
2 :*
3 :
player A : Enter the pile number and the number of stones to remove.

次にプレイヤー A は、1 番目の山から 2 個の石を取り除くとして、 1 2 と入力すると、山の石の数は次のようになります。

1 2
1 :*
2 :*
3 :
player B : Enter the pile number and the number of stones to remove.

今度はプレイヤー B が 2 番目の山から 1 個の石を取り除くとして、 2 1 と入力すると、山の石の数は以下のようになります。

2 1
1 :*
2 :
3 :
player A : Enter the pile number and the number of stones to remove.

最後にプレイヤー A が 1 番目の山から 1 個の石を取り除くとして、 1 1 と入力すると、すべての石が取り除かれますので、 プレイヤー A が勝ちとなります。

1 1
1 :
2 :
3 :
player A, you won!

このようにプレイヤー A が勝ったことを示すメッセージを出力して、 ゲームは終了となります。

注意点

プレイヤーの入力は、山の番号と取り除く石の数を空白(もしくは改行)で区切って入力するものとします。 プレイヤーからの入力の値が不適切な場合、 例えば、山の番号が存在しない場合や、山の石の数より多くの石を取り除こうとした場合などでは、 プレイヤーへ再度入力を促すようにしてください。


参考 : 平方根の計算

正の実数値の平方根を計算するには、 ヘッダファイル math.h をインクルードして、 関数 sqrt() を用います。

次のプログラム sqrt2.c は、\(\sqrt{2}\) の値を計算して表示します。

sqrt2.c

#include <stdio.h>
#include <math.h>

int main(void) {
  double sqrt2 = sqrt(2.0);
  printf("sqrt(2) = %f\n", sqrt2);

  return 0;
}

math.h をインクルードしたプログラムを gcc でコンパイルする場合、 次のようにリンクオプション -lm を付けてください。 -lm は、math.h で定義されている関数を使用するためのオプションです。

terminal

$ gcc sqrt2.c -lm -o sqrt2

実行結果は次のようになります。

terminal

$ ./sqrt2
sqrt(2) = 1.414214