情報科学演習
2010.6.14
提出が遅れた人がC6とC7のクラスにそれぞれ数名いました.テスト中に「後1分」
とか,声かけをしていましたので準備は迅速に,時間切れになる前に提出をする
ようにしましょう.
プログラミングには大切なことがいくつかありますが,重要なことの一つに面倒
なことはコンピュータにやらせる,という方針があります.人間が繰り返しや全
ての場合を列挙するような面倒な手作業をしないですむように処理を考えるのが
大事です.例えば,下記のような処理が結構たくさん見られました.
このような処理は,結局は自分が手作業で約数を捜し出しているだけですね.
3
桁や4桁の数の約数だったらどうしますか?自分でやりますか?
このようなやり方だけは絶対にしないようにこれ
からは注意しましょう!!!
では,解答例はどんなだったでしょうか?
同じようなことが何度も出てきていますね.こっちは何でよい方法なのでしょう
か?
まず,約数を探すのはコンピュータに任せていますね.それが大事です.次に大
事なことですが,
if 文がずらずら並んでいます.良く見ると,全部同じ書式ですね.し
かも,if の判別式の中の割る数字と,printf の数字
が同じです.ここが重要なことで,同じことを規則正しく繰り返すことは
コンピュータが一番得意なことなので,このような発想ができると今日の
内容である「反復処理」がよく分かることでしょう.
さいころ,トランプ,じゃんけんと,確率事象に関係する遊びを表現するプログ
ラムをこれまでいくつか作成してきました.今後も,このような考え方を取り入
れた実習例を用意しますので,忘れないようにしてください.
剰余について
この授業では剰余を使用するプログラムがたくさん出てきます.もちろん,乱数
を発生させるためにほぼ毎回使用していますが,それ以外にもたくさん出てきま
す.皆さんは,小学校で割算を習ったときに,最初は余りを意識していましたが,
小数を習ってからはとにかく割ってしまうことの訓練ばかりやったためか,「割
る」ことへの意識がものすごく強くなっています.コンピュータのプログラムは
整数の方が処理が速いので,整数型の演算をたくさん使用します.その中で,余
りというのが非常に重要になってきますので,繰り返しになりますが,いつも意
識しておいてください.
教科書のp.37からp.41までの for 文を練習します.for 文
にはp.39にあるように特殊な表現も出てきます.たくさん使って慣れて覚えるよ
うにしましょう.それにはたくさん演習を行うことです.
例題4.1を少し修正して,偶数の和のみを求めるものにしてみましょう.for
文の式3の部分の工夫が必要です.
解答例(14行)
前回の小テストの問題を for 文を使用して作りなおしましょう.
解答例(23行)
実習iiをさらに拡張して,任意の3桁の正の整数を乱数を利用して発生させ,その
約数を全て表示するようにしましょう.
解答例(23行)
実習iiiでは約数がたくさんある数が発生した場合,表示が横に長くて見づら
いですね.5つずつで改行するようにしましょう.例えば,下記のように表
示されるものではどうすれば良いでしょうか?
解答例(31行)
例題4.1を改良して,10の階乗(10!)を計算してみましょう.
例題4.1には和に関する自己代入が出ていますが,四則演算全てに自己代入は適
用できます.また,教科書p.38にあるように便利な表記もありますので,活用し
てください.
switch(num){
case 1: a = "1";
break;
case 2: a = "1, 2";
break;
case 3: a = "1, 3";
break;
case 4: a = "1, 2, 4";
break;
case 5: a = "1, 5";
break;
case 6: a = "1, 2, 3, 6";
break;
case 7: a = "1, 7";
break;
case 8: a = "1, 2, 4, 8";
break;
default: a = "1, 3, 9";
break;
}
printf("Divisors: 1");
if(num % 2 == 0)
printf(", 2");
if(num % 3 == 0)
printf(", 3");
if(num % 4 == 0)
printf(", 4");
if(num % 5 == 0)
printf(", 5");
if(num % 6 == 0)
printf(", 6");
if(num % 7 == 0)
printf(", 7");
if(num % 8 == 0)
printf(", 8");
if(num % 9 == 0)
printf(", 9");
printf("\n");
「インクリメント演算子」は変数の値を1増やしますが,この部分を工夫すれば,
2ずつ増やす,3ずつ増やす,などの処理も可能ですし,一定の値ずつでは無いも
のも可能になります.
Obtained number: 774
Divisors: 1 2 3 6 9
18 43 86 129 258
387 774
a = a + 1
-->
a += 1
a = a - 1
-->
a -= 1
a = a * 2
-->
a *= 2
a = a / 2
-->
a /= 2
a = a % 3
-->
a %= 3
画面に次のように表示するプログラムを作りましょう.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
解答例(19行)
for 文の中にまた for 文を入れることも可能です.以下の ように表示するプログラムを作ってみましょう.
1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 1 2 3 4 5 6 1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 11 1 2 3 4 5 6 7 8 9 10 11 12 1 2 3 4 5 6 7 8 9 10 11 12 13 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
解答例(17行)
100までの整数の内の素数を探すプログラムを作りましょう.結果表示は下記の ように単純で構いません.
Prime numbers under 100 1 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 |
解答例(23行)
以下に示すように6月のカレンダーを表示させてみましょう.
Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
解答例(20行)
オランダ対日本の仮想PK戦をつくりましょう.一応,オランダに敬意を表して, オランダのPKが入る確率を90%,日本を70%にしてみましょう.また,勝敗の決定 に関しては6人目以降のサドンデスは無しにして,5本目までとします.(決着が 付かなかった場合には Draw とだけ表示) 残りのキッ クを蹴っても勝ちが無くなった段階でPK戦は終了するのがサッカーのルールです.
「PK戦」と言うとき,正式には「ペナルティーマークからのキック戦」と言い, 「ペナルティーキック合戦」というのは正式名称ではありませんので注意してくだ さい.(って,どうでもいいか)
NDL JPN o o o x o x o The winner is the Netherland. |
解答例(61行)
授業の最後に宿題の案内をしますので,注意していて下さい.なお,前回から適 切なインデント(字下げ)や空行の入っていない解答は減点していますので,注意して ください.基本的には教科書や解答例などにあるように,タブや空行を使用してブロッ クごとの区別がつきやすいように字の先頭位置を揃えてください.