ファイル入出力の処理例

決められた商品に対する、支払金額計算プログラムを作ろう。

以下のような、商品と価格の書かれたファイルがある。
price.txt

サーモン	110円
イカゲソ	110円
えんがわ	110円
マグロ		110円
ネギトロ	110円
蛸		110円
赤貝		110円
穴子		110円
鉄火巻		110円
カッパ巻	110円
ハマチ		110円
サヨリ		180円
中トロ		180円
牛トロ		180円
寒ブリ		180円
イクラ		240円
タラバ		240円
大トロ		360円
ウニ		360円

プログラムを起動すると、このファイルを読み込み、その内容をメニュー番 号とともに標準出力に出す。

     1	サーモン	110円
     2	イカゲソ	110円
     3	えんがわ	110円
     4	マグロ		110円
     5	ネギトロ	110円
     6	蛸		110円
     7	赤貝		110円
     8	穴子		110円
     9	鉄火巻		110円
    10	カッパ巻	110円
    11	ハマチ		110円
    12	サヨリ		180円
    13	中トロ		180円
    14	牛トロ		180円
    15	寒ブリ		180円
    16	イクラ		240円
    17	タラバ		240円
    18	大トロ		360円
    19	ウニ		360円

ユーザがメニュー番号を順次入力し、最後に qをタイプすると、それまで入力したメニューの価格を全て足した 金額を出力するプログラムを作成してみよう。

  1. 価格データファイルの読み込み

    まず、price.txtデータファイルから価格リストを読み 込み商品名を配列変数に入れる部分を作ろう。さらにその値段部分を別の 配列変数に入れておこう。前者の配列変数を menu, 後者の 配列変数を price としよう。するとプログラム(の一部)は 以下のようになる。

    menu = []
    name = []
    price = []
    i = 1
    
    open("price.txt", "r") do |neta| # price.txtを読み込みモードで開く
      while line = neta.gets	 # ファイルから1行ずつ読む
        if /(\w+)\s+(\d+)円/e =~ line # (数字)円 というパターンがあれば
          menu[i]  = $1		 # $1 は商品名
          price[i] = $2.to_i	 # $2 が「数字」に当てはまるので整数化
          printf "%3d %s", i, line   # 商品番号と、読み込んだ行を画面表示
        end
        i += 1
      end
    end
    
  2. 注文の読み込み

    続いてユーザが対話入力で、商品番号を入れるループを作ろう。

    sum = 0
    while true
      print "御注文は(番号で入れてね、q で終了)?: "
      line=gets.chomp!		# ユーザの入力を line に入れる
      if line == "q"		# 入力が "q" なら
        break			# 終了
      end
      number = line.to_i		# 整数(メニュー番号)にする
      if number < 1 || number >= i
        puts "そんなメニューねぇでガス"
        redo
      end
      printf "はぁ〜い、「%s」一丁\n", menu[number]
      sum += price[number]
    end
    
  3. 結果(精算金額)表示

    変数 sum に合計金額が入っているので、これに消費税 をかけて表示して終了する。

    print "おあいそでガス\n"
    printf "全部で %d 円でガス。まいどっ\n", sum*1.05
    

以上を組み合わせることでプログラムが完成する。
sushi.rb

#!/usr/koeki/bin/ruby

sum = 0
menu = []
name = []
price = []
i = 1

open("price.txt", "r") do |neta| # price.txtを読み込みモードで開く
  while line = neta.gets	 # ファイルから1行ずつ読む
    if /(\w+)\s+(\d+)円/e =~ line # (数字)円 というパターンがあれば
      menu[i]  = $1		 # $1 は商品名
      price[i] = $2.to_i	 # $2 が「数字」に当てはまるので整数化
      printf "%3d %s", i, line	 # 商品番号と、読み込んだ行を画面表示
    end
    i += 1
  end
end

while true
  print "御注文は(番号で入れてね、q で終了)?: "
  line=gets.chomp!		# ユーザの入力を line に入れる
  if line == "q"		# 入力が "q" なら
    break			# 終了
  end
  number = line.to_i		# 整数(メニュー番号)にする
  if number < 1 || number >= i
    puts "そんなメニューねぇでガス"
    redo
  end
  printf "はぁ〜い、「%s」一丁\n", menu[number]
  sum += price[number]
end

print "おあいそでガス\n"
printf "全部で %d 円でガス。まいどっ\n", sum*1.05

実行

sushi.rbprice.txtを保存し、実際に実行してみ よう。