(2)10/05の授業内容
- 制御構造の復習
- 配列の復習
通常上から順番に実施されるプログラムの流れを変えるのが制御構造でした。具体的には、条件に応じてある処理を繰り返し実施するものや、条件に応じて処理が分岐するものを学びました。今日は、それぞれの働きについて思い出しましょう。
繰り返し(while〜end)
while 繰り返し条件 繰り返す処理 end
これが基本的な形でした。繰り返し条件の場所には、比較演算子を用いてi < 10などと指定していたことを思い出しましょう
練習:以下のwhileを使ったプログラムを実行するとどのような結果が出力されるでしょう。まず考えてみましょう。答えがわかったら実際に実行して確認してみよう(ファイル名はgoukei.rb)
#!/usr/koeki/bin/ruby goukei = 0 i = 1 while i <= 10 goukei += i i += 1 end printf ("goukeiの値は%dです\n",goukei)
printfに関して:Rubyの将来のバージョンでは()を使わなくてはならなくなるとのことです。これまでは、 printf "%d\n", hoge と printf ("%d\n", hoge) のいずれも使用できました(授業では()を使用していませんでした)が、 今後は後者を使うようにしてください
課題1
実行すると好きな数字(xとする)を聞き、ユーザーがそれに答えると1からxまで足した数を表示するプログラムaddition.rbを作成、実行せよ
条件分岐(if〜then〜elsif〜else〜end)
if 条件1 then 条件1が成り立ったときに実施する処理 elseif 条件2 条件2が成り立ったときに実施する処理 else 条件12が成り立たなかったときに実施する処理 end
これが基本的な形でした。条件が2つの場合はif〜then〜elsif〜else〜endで表記できましたが、条件が3つ以上になった場合は、if〜then〜elsif〜elsif〜else〜endのようにelsifを何度でも繰り返し使えます
練習:以下のifを使ったプログラムを実行するとどのような結果が出力されるでしょう。まず考えてみましょう。答えがわかったら実際に実行して確認してみよう(ファイル名はbmi.rb)
#!/usr/koeki/bin/ruby STDERR.print "身長をm単位で入力してください" height = gets.chomp!.to_f STDERR.print "体重をkg単位で入力してください" weight = gets.chomp!.to_i bmi = weight / (height ** 2) printf ("BMIの値は%3.1f\n",bmi) if bmi > 25 then print "太っています\n" elsif bmi < 18.5 print "やせています\n" else print "標準的です\n" end
課題2
上記プログラムでは、bmi25以上:肥満、18.5〜25:標準的:18.5以下:やせとしているが、より正確には25〜30:肥満、30以上:高度肥満となる。bmi.rbを改良し、ユーザーが入力した値に基づき、4つの条件から該当する結果を表示できるようにせよ
変数を拡張し、複数の値を入れられるようにしたものが配列でした。
a = 1:通常の変数(代入できる値は1つだけ) a = [1, 8, 12, 3, 1, 0]:配列(いくつでも値を代入することができる
配列に値を代入したり、配列から値を読み出す場合、対象となるのが配列の中の何番目の値であるのかを指定する必要がありました(インデックス)。a[0]の[0]の部分がインデックスでした。配列の中の値は0番目から数えるので、a[0]はaという配列の中の1番目の値をさしています
a = [100, 200, 300, 400, 500, 600]という配列に代入されている値を表示する場合、以下のように行いました。
a = [100, 200, 300, 400, 500, 600] print a[0]"\n" #=>100 print a[1]"\n" #=>200 print a[2]"\n" #=>300
配列に値を代入する場合は、以下のように行いました。
b = [] #はじめにbが配列であることを宣言 b[0] = 30 b[1] = 50 b[2] = 80 p b #=>[30, 50, 80]
インデックスに具体的な数字を指定するかわりに変数を指定する方法についても学びました。
練習:以下の配列を使ったプログラムを実行するとどのような結果が出力されるでしょう。まず考えてみましょう。答えがわかったら実際に実行して確認してみよう(ファイル名はbokin.rb)
#!/usr/koeki/bin/ruby bokin = [] sum = 0 i = j = 0 while true STDERR.print "募金お願いします" bokin[i] = gets.chomp!.to_i if bokin[i] == 0 then break end i += 1 end print "今日はもうやめよう\n" while j < i sum += bokin[j] j += 1 end printf ("募金の合計は%d円でした\n",sum)
課題3
実行するとレポートの得点を聞き、ユーザーが順番に入力すると、平均点を表示するプログラムreport-av.rbを作成、実行せよ(bokin.rbを一部手直しするだけでできる。文章からプログラムを導き出せるか)
本日の課題
課題1〜3をできるところまで解答して提出する。
作成したプログラムや実行結果をメールでnaoya@e.koeki-u.ac.jp宛に送る
課題の提出期限は10月11日(火)23:59までです
メール送信時の注意
- Subjectは「学籍番号-1005」とすること
- メール本文は下記の構成で記載すること
- 課題1のプログラムと実行結果
- 課題1のプログラムの説明
- 課題2のプログラムと実行結果
- 課題2のプログラムの説明
- 課題3のプログラムと実行結果
- 課題3のプログラムの説明
- 感想(どの程度思い出してきたか)
今回は復習なので、使用したメソッドや制御構造について、他の人が読んでもわかるように詳しく説明してください。なお、実行してもエラーになってしまう場合や、途中までしかわからない場合は提出をあきらめるのではなく、できたところまでで構いませんのでレポート作成、提出してください。
レポート採点基準:期限内提出(2点)、課題1(2点)、課題2(2点)、課題3(3点)、指示通りにメールを送っているか(1点)
Tips
emacsについて
- emacsで新しいファイルを作成する場合は,C-x C-fを押し,ミニバッファにkensaku/kadai2.rbのようにファイル名を入力する
- ファイルの保存はC-x C-s
- 日本語入力のオンオフの切り替えはC-o
Mewについて
- emacsを起動する
- Escとxを押し,mewと入力しReturn(Escとxを押すことを,一般にM-xと表記します)%<--これでMewが起動します
- Mewを起動するとパスワードがたずねられるので入力しReturn
- 新着メールの確認およびパスワードを間違えた場合はiと入力しReturn
- メールを読む場合は,カーソルキー(矢印キー)で読みたいメールを選びReturn
- メールの新規作成はwと入力
- e-mailの本文にテキストファイルを読み込むには,新規送信メール画面の本文を記入するエリアにカーソルを移動し,Ctrl+x,iとすると,ミニバッファにInsert file: ~/と表示されるので,読み込みたいファイル名を入力する。
- プログラムの実行結果の貼り付けは,kterm上の出力結果部分をマウスで選択し,Mewの本文の貼り付け位置にカーソルを移動し,マウスの真ん中ボタンをクリックする
- メールの送信はC-c C-cと入力するか,もしくはメニューのsendアイコンをクリックする
- Mewを終了するにはqと入力
- emacsを終了する