半径 r を入力し、そこから
その半径の円の円周長、
円の面積、および
を計算・表示するプログラムを作成せよ。
ただし、プログラム中で用いる円周率は _PI_ というマクロを定義し、3.14159265359を用いること。
※ マクロを定義する、というのが今回のミッションです。 プリプロセッサのコマンド(#ではじまるやつ)を使って _PI_ というマクロを定義し、それをプログラムの中で使ってください。「プログラムの中に _PI_ という記述があったら、それが自動的に 3.14159265359 に置き換えるようにマクロを定義してください」ということです。
異なる n 個の整数から r 個の整数を取り出す組み合わせの数 nCr を求める関数
long int combination(int n, int r){ .... }
を作成し、10C5 を計算せよ。(ちなみにこたえは 252)
この課題ではコースノートに例示した factorial は使わず、以下の式と再帰を用いて long int combination(int n, int r) を定義すること。みんなの書く combination は、その定義の中で combination を使っている、というのがこの課題の達成条件です。
※ 関数 combination の戻り値が int ではなく、long int である点に気をつけてください。long のない通常の int 型を使うと、計算の途中で値が大きくなりすぎた際に桁落ちが起こって正しい値が得られません。(桁落ち、とは、変数・関数の値がそのデータ型で扱える範囲よりも大きすぎる、もしくは小さすぎるために誤った値で計算が行われることです。)
組み合わせの数の計算法:
nCr は以下のように定義される。
nCr = n-1Cr-1 + n-1Cr (ただし、 nC0 = nCn = 1, nC1 = n)
ヒント: 上の式は組み合わせの数 nCr を定義するのに組み合わせの数(n-1Cr-1 と n-1Cr)を使っています。つまり、 関数 combination を定義するのに combination を使っているわけです。
(教科書 p. 227の演習 8-8)
二つの整数値 x と y の最大公約数をユークリッドの互除法を用いて求める関数 (gcd) を作成せよ。
その上で、二つの整数を scanf でうけとり、関数 gcd を用いてその二つの最大公約数を求めるプログラムを作成せよ。
※ 関数 gcd は以下のように定義する
int gcd(int x, int y){
/* gcd の処理本体 */
}
※ gcd は「再帰」を用いて実装すること。
※ ユークリッドの互除法については教科書(新・明解C言語)の p. 227 を参照。
課題4. 関数形式マクロ
(教科書 p. 215 の演習 8-1)
二つの値 x と y を受け取り、その差を求める関数形式マクロ diff(x, y) を定義せよ。
その上で、二つの整数を scanf でうけとり、diff(x,y) を用いて二つの整数の差を求めるプログラムを作成せよ。
※ 実際のプログラミングでは関数形式マクロの使用はあまり推奨されません。これは、関数形式マクロが「変数と関係なく動く」という高い汎用性を持っている反面、それが意図せぬ動作を引き起こすことが多い(つまり、バグの温床になりがちである)ためです。ただし、きちんと整備されたライブラリなどでは適切に使われている場合も多いため、自分で関数形式マクロを書くことはなくても、関数形式マクロを「読む」機会はあると思います。その時のための経験としてこの課題をといてみてください。