#!/usr/koeki/bin/ruby # -*- coding: utf-8 -*- print"レポートの合計得点を求めます。\n" print"何回分のレポートの合計が知りたいですか?\n" kaisuu = gets.chomp!.to_i count = 1 sum = 0 while count <= kaisuu printf("%2d回目の点数 : ",count) ten = gets.chomp!.to_f sum += ten count += 1 end ave = sum / kaisuu printf("あなたの%3d回分の合計得点は%5.1f点です。\n",kaisuu ,sum) printf("平均点は%5.2f点です。\n",ave) 実行結果 1 coy{c118xxx}% ./report2a.rb [~/program] レポートの合計得点を求めます。 何回分のレポートの合計が知りたいですか? 8 1回目の点数 : 6 2回目の点数 : 7.7 3回目の点数 : 4.5 4回目の点数 : 5.7 5回目の点数 : 9 6回目の点数 : 10 7回目の点数 : 7.3 8回目の点数 : 8.5 あなたの 8回分の合計得点は 58.7点です。 平均点は 7.34点です。 プログラム 1の説明 課題要件的には8回分の点数を入力させることで、その合計を求められればよい。 しかし、繰り返しの回数をあらかじめ定数として与えてしまうとプログラムと しての実用性に著しく欠けると考えたため、回数は変数とし最初にユーザーに 入力してもらいそれを元に合計と平均を求めるような構成で作成した。 while文では、count変数を設定しその数がユーザーの入力した回数以下ならば 繰り返すようになっている。 while文内部ではまず点数の入力を指示する文を出力し、その後点数を実数で入 力してもらっている。合計の変数sumに入力された点数を加算代入しているが、 ここでsumの初期値に0が入っていないと1回目の処理が上手くいかないため、 while文に入る前に0が入っているか確認が必要である。最後にカウントを1増や し、endで繰り返し条件を確認、次の処理に続いている。 また、プログラム内で合計と回数が明確になっているならばと繰り返し処理のあとに 平均を求める処理も追加している。 プログラム 2 #!/usr/koeki/bin/ruby # -*- coding: utf-8 -*- sum = 0 pl = 0 while line = gets sum += line.to_f #p sum pl += 1 #p pl end avage = sum / pl printf("平均年齢は%5.1f歳です。\n",avage) 実行結果 2 coy{c118xxx}% ./report2b.rb population.csv [~/program] 平均年齢は 47.5歳です。 プログラム 2の説明 プログラム自体は決して難しいものではなく、流れとしては繰り返し処理中に加 算代入を用いる変数2つ合計"sum"人口"pl"(population)に初期値の0を代入し ておき、読みこむファイルに入っているデータの数処理を繰り返すというもの。 その後、平均を計算し出力している。 while文ではまず継続条件として、line = getsが設定されている。これによりルー プ内で読みこんだデータの全てを処理することになっている。 内部1行目からは、合計を求めるためにsumにデータを加算代入している。このとき受 け取る値を実数にしなければならないため、to_fを用いる必要がある。確認用と してpメソッドを記述してはいるがコメント文に設定しているため、仮にこのプ ログラムで他のファイルを読みこむときは"#"を外して随時、確認を行うことを 推称する。plは繰り返しのたびに1増やし、データの数(=人口の数)を数える。 平均を計算することが目的であるため、平均を出し小数第一位までを出力してい る。 感想 前回の課題でも意識したことではありますが、今回の課題1のようなプログラムにお いては何よりも実用性というものを考えつつプログラムを作成していきたいと思っ ています。課題として求められていることをただ記述していくのではなく、ユー ザーが使いやすいもの。今回で言えばレポートの回数を任意で設定できる処理を 追加することで、この課題以外でも用途が生まれるのではないかという考えで作 成しました。 今回は制御構造の繰り返しを用いた課題でしたが、次回の講義で学ぶ条件分岐 "if-end"を今回のプログラムに追加できれば、平均が○○点以上なら「合格」と 出力するような処理を行わせることも出来ると思います。このように自分で作 成した?プログラムには随時、有用性を持たせていきたいです。