参考として、良かったレポートを示す。
Subject: #7 file-IO(4)
To: ruby-05-30@e.koeki-u.ac.jp
Date: Mon, 02 Jun 2014 17:43:50 +0900 (JST)
X-Mailer: Mew version 6.3 on Emacs 23.3 / Mule 6.0 (HANACHIRUSATO)
氏名: ma
学籍番号: C1130881
クラス: 1
1.作成したプログラム
#!/usr/koeki/bin/ruby
# -*- coding: utf-8 -*-
require 'kconv' # プログラムの先頭付近に置く
sum = 0
menu = []
price = []
i = 0
open("receipt.txt", "r") do |neta| # price.txtを読み込みモードで開く
while line = neta.gets # ファイルから1行ずつ読む
if /"(.+)"\s+(\d+)\s+(\d+)\s+(\d+)/ =~ line # (数字) というパターンがあれば
menu[i] = $1 # $1 は品名
price[i] = $4.to_i # $4 は価格
printf("%s. %s の価格は %d 円です\n", i, menu[i], price[i]) # 商品番号と、品名、価格を出力
i += 1
end
end
end
while true
print "御注文は(番号で入れてね、q で終了)?: "
line=gets.chomp! # ユーザの入力を line に入れる
if line == "q" # "q" を入力したら
break # 終了
end
number = line.to_i # 整数(メニュー番号)にする
if number < 0 || number >= i
puts "そんなメニューねぇでガス"
redo
end
printf("はぁ〜い、「%s」\n", menu[number])
sum += price[number]
end
printf("全部で %d 円でガス。まいどっ\n", sum)
open("result.txt","w") do |output|
output.printf("あなたの御注文金額の合計は %d 円でガス!!\n", sum)
end
2.プログラムを動かした結果画面と結果のファイル (result.txt)の内容
sime{c113088}% ./open4.rb [~/Ruby]
0. モコモコスパゲッティ の価格は 880 円です
1. suidou ざ・movie の価格は 3980 円です
2. SDHC 4GB の価格は 980 円です
3. 5フィンガー靴下 の価格は 120 円です
御注文は(番号で入れてね、q で終了)?: 0
はぁ〜い、「モコモコスパゲッティ」
御注文は(番号で入れてね、q で終了)?: 1
はぁ〜い、「suidou ざ・movie」
御注文は(番号で入れてね、q で終了)?: 2
はぁ〜い、「SDHC 4GB」
御注文は(番号で入れてね、q で終了)?: 3
はぁ〜い、「5フィンガー靴下」
御注文は(番号で入れてね、q で終了)?: 4
そんなメニューねぇでガス
御注文は(番号で入れてね、q で終了)?: q
全部で 5960 円でガス。まいどっ
sime{c113088}% cat result.txt [~/Ruby]
あなたの御注文金額の合計は 5960 円でガス!!
3.プログラムの説明
用語の復習
"open"
指定したファイルを指定したモードで開く。
"r"
読み込みモードで開く。
"r+"
読み書きモードで開く。ファイルを読み込む場合は先頭から読み込み始める。
"w"
書き込み(新規作成)モードで開く。既存のファイルは0バイトにクリアされる。
"w+"
読み書きモードで開く。既存のファイルは0バイトにクリアされる。
"a"
書き込みモードで開く。ファイルが既に存在する場合はファイルの終わりから開始し、なければ新規に作成する。
"a+"
読み書きモードで開く。ファイルが既に存在する場合はファイルの終わりから開始し、なければ新規に作成する。
""の消し方
例: /"(.+)"\s+ のように正規表現側に"をいれる
4.考察
言い方があっているかわからないが、
データを読み込み格納しておく、表示する、外部ファイルに書き込む、
と3つに分かれている内容だったが、表示して欲しい通りに実行結果がだせたので内容はあっていると思う。
5.参考文献
広瀬雄二. "Example of File IO".2014年度 基礎プログラミングI.
http://roy/~yuuji/2014/pf1/07/fileio-example.html ,(参照 2014-06-02).
6.感想
正規表現の部分でつまづきました。
結果として提出した通り、 if /"(.+)"\s+(\d+)\s+(\d+)\s+(\d+)/ =~ line の
ように"."を使用して解決したが、明確な理由があって"."を使ったわけではない
ので附に落ちていません。
それと5ができずにくやしかったです。