(2)10/05の授業内容

  1. 制御構造の復習
  2. 通常上から順番に実施されるプログラムの流れを変えるのが制御構造でした。具体的には、条件に応じてある処理を繰り返し実施するものや、条件に応じて処理が分岐するものを学びました。今日は、それぞれの働きについて思い出しましょう。

    繰り返し(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つの条件から該当する結果を表示できるようにせよ

  3. 配列の復習
  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までです


メール送信時の注意

今回は復習なので、使用したメソッドや制御構造について、他の人が読んでもわかるように詳しく説明してください。なお、実行してもエラーになってしまう場合や、途中までしかわからない場合は提出をあきらめるのではなく、できたところまでで構いませんのでレポート作成、提出してください。

レポート採点基準:期限内提出(2点)、課題1(2点)、課題2(2点)、課題3(3点)、指示通りにメールを送っているか(1点)

Tips

emacsについて

Mewについて