情報基礎 【演習問題 (C プログラミング–配列と for ループ) 用紙 】 ※ ∗ 印のある欄全てに洩れなく丁寧に記入すること。記入洩れのあるものや判読できないものは有効と認めないことがある。 ※ 必ずしも正答である必要はないが、題意とかけ離れたものや著しく不誠実なものは有効と認めないことがある。 ※ 他人の解答の丸写しもしくはそれに少しだけ手を加えただけのものを提出しないでください。不正行為とみなされ不利益 な扱いを受けることがあります。 ふ り が な 所属・学年・組 学生番号 ∗ ∗ 氏 名 提出日 ∗ ∗ 月 日 非負整数 n が与えられたとき、パスカルの三角形を次のように表示する C プログラムを作ろう。 0 C0 1 C0 2 C0 1 C1 2 C1 3 C1 ··· ··· n−1 C0 n C0 n C1 .. . n−1 Cn−1 n Cn−1 n Cn 例えば n = 8 のとき、実行結果が次のようになればよい。(キーボードからの入力には下線を付した。) Input n = 8 1 1 1 1 1 1 1 1 1 1 2 3 4 5 6 7 8 1 3 6 10 15 21 28 1 4 10 20 35 56 1 5 15 35 70 1 6 21 56 1 7 28 1 8 1 各行に正しい数値が並んでいることが重要であって、n の数が大きいとき上のように三角形の形が崩れ ても気にしないことにする。 次の注意点に気をつけて以下のプログラムの空欄部分を埋めて完成させよ。 • m, k ≥ 1 のとき、m Ck = m−1 Ck + m−1 Ck−1 が成り立つ。 • パスカルの三角形の m+1 行目、k+1 列目の要素を、変数 m, k に関する多重ループで計算して出力 せよ。 1 #include <stdio.h> int main(void) { int a[1024]; int n, m, k; printf("Input n = "); scanf("%d", &n); for (m=0;m<=n;m++) { a[m]=1; printf(" %d", a[m]); }; printf("\n"); return 0; } ただし、空欄部分は次に挙げるプログラム要素に適宜カッコ ( ) { } や セミコロン ; を補って埋 めること。使わなくてもよいプログラム要素も含まれているので注意すること。(空欄の大きさと実際の プログラムの長さは必ずしも一致しません。細かなプログラムの文法はあまり気にしなくてよい。) for(m=0;m<=n;m++) for(k=0;k<=n-m;k++) for(m=1;m<=n;m++) for(k=n-m;k>=0;k--) if else k==0 a[k]=a[k]+a[k-1] k==n-m a[k]=a[k+1] printf(" %d", a[k]) printf("\n") k!=0 2 演習問題 C プログラミング–配列と for ループ 解答例 #include <stdio.h> int main(void) { int a[1024]; int n, m, k; printf("Input n = "); scanf("%d", &n); for (m=0;m<=n;m++) { a[m]=1; printf(" %d", a[m]); }; printf("\n"); for (m=1;m<=n;m++) { for (k=0;k<=n-m;k++) { if (k!=0) { a[k]=a[k]+a[k-1]; }; printf(" %d", a[k]); }; printf("\n"); }; return 0; } • 外側のループ for (m=1;m<=n;m++) による繰り返しで、行を一行ずつ表示していきます。 • 内側のループ for (k=0;k<=n-m;k++) による繰り返しで、a[0] に m Cm 、a[1] に m+1 Cm 、…、 a[n − m] に n Cm の値を順に代入しながら表示していきます。 ループの実行前には、配列 a には一つ前の行に対応する値 (すなわち、各 a[i] には m−1+i Cm−1 ) が格納されていることを利用して、配列の値を順次更新していきます。 k = 0 のとき. 最初に a[0] の値は 0 C0 = 1 に設定され、しかも m Cm の値は m にかかわらず 1 の まま変わらないので、更新を行う必要はありません。 k > 0 のとき. a[k] を m+k Cm の値で更新する必要があります。ここで、a[k − 1] の値はすでに m+k−1 Cm に更新済みだが、a[k] はまだ更新されておらず、m+k−1 Cm−1 の値のままになっ ていることに気をつけましょう。m+k Cm = m+k−1 Cm + m+k−1 Cm−1 より、m+k Cm の値は a[k − 1] と a[k] の和であるので、代入文 a[k]=a[k]+a[k-1]; によって a[k] の更新を行えば良いことがわかります。 (等式 m+k Cm = m+k−1 Cm + m+k−1 Cm−1 は、問題文に示したパスカルの三角形の図中、各 m+k Cm の値がその左隣の m+k−1 Cm と上の m+k−1 Cm−1 との和となっていることから確か められます。) • 条件 P が成り立つときのみ何かを計算したいときは if (P ) { 文; …; 文;} のように else 以下 を省略することができますが、逆に条件 P が不成立のときのみ何かを計算したいときに if (P ) { } else { 文; …; 文;} のように書くことはできません。 このようなときは、if (!P ) { 文; …; 文;} のように条件を否定して「P が偽のときのみ」計 算を行うようにプログラミングします。 3
© Copyright 2024 ExpyDoc