講評: ARGV[2] の値が nil でないならば、という 条件をどこかにつけるとよかったのではないでしょうか。 ---- 11 月 07 日 第 6 回レポート 「コマンドライン入力」 学籍番号: c106XXXX 氏名: XXXXXXXX 語学クラス: 中国語選択XX 系: 社会系 1. 筆記問題 A. 出席番号順から背の順へ並べ替える時などは、トランプの並べ替えで使われ た考え方と似ていると思う。 出席番号が1番の人より2番の人の方が背が高かった場合は後ろに並ぶ、低かった 場合は前に並ぶという風に繰り返すからである。 B. テレフォンショッピングで服を購入する場合 必要な情報 ・氏名 ・住所 ・電話番号 ・服のサイズ C. 配列 ARGV に格納される情報 ・氏名 : ARGV[0] → "コウエキルビオ" ・住所 : ARGV[1] → "山形県" ・電話番号 : ARGV[2] → "0123-45-6789" ・服のサイズ : ARGV[3] → "M" 2.A. (reservation.rb) a. 考えた設定 テレフォンショッピングで服を購入する際の情報をコマンドライン入力で与え、 それを表示させるプログラム。 b.プログラムコード #!/usr/koeki/bin/ruby if ARGV[0|1|2|3] == nil STDERR.print("入力情報に不備があります。\n") STDERR.print("入力例 : 氏名 \t 住所 \t 電話番号 \t 服のサイズ\n") exit(1) end name = ARGV[0] address = ARGV[1] tel = ARGV[2] size = ARGV[3] printf("購入情報確認\n\n") printf("氏名: %-10s\n",name) printf("住所: %-10s\n",address) printf("電話番号: %-10s\n",tel) printf("服のサイズ: %s\n",size) open("kakunin.txt","w") do |data| data.printf("購入情報確認\n\n") data.printf("氏名: %-10s\n",name) data.printf("住所: %-10s\n",address) data.printf("電話番号: %-10s\n",tel) data.printf("服のサイズ: %s\n",size) end c. 変更点 airline.rb を参考にした。 ・「||」を使って入力情報に不備があった場合は購入情報が表示されないように した。 ・open-end を使って kakunin.txt に入力された情報を書き込むようにした。 d. 結果画面 (全て入力した場合) irsv{c106179}% ./reservation.rb 公益ルビ緒 山形県 0123-45-6789 M [~/Ruby] 購入情報確認 氏名: 公益ルビ緒 住所: 山形県 電話番号: 0123-45-6789 服のサイズ: M (入力情報に不備がある場合) irsv{c106179}% ./reservation.rb 公益ルビ緒 0123-45-6789 M [~/Ruby] 入力情報に不備があります。 入力例 : 氏名 住所 電話番号 服のサイズ e. 考察 データ (kakunin.txt ) 購入情報確認 氏名: 公益ルビ緒 住所: 山形県 電話番号: 0123-45-6789 服のサイズ: M 正しく書き込まれた。 f. 参考文献 西村先生のHP 予約プログラム http://roy/~madoka/2007/r2/06/06-03-airline.html B. (twomulti.rb) a. 考えた設定 2つの数値をコマンドライン入力し、その数値をかけ算して答えを出力するプログラム。 b. プログラムコード #!/usr/koeki/bin/ruby if ARGV[0] == nil STDERR.print("入力失敗です。\n") STDERR.print("2つの数値を入力して下さい。\n") exit(1) end x = ARGV[0].to_i y = ARGV[1].to_i answer = x * y print("計算式\n") printf("%d * %d = %d \n",x,y,answer) c. 変更点 airline.rb を参考にした。 d. 結果画面 irsv{c106179}% ./twomulti.rb 3 9 [~/Ruby] 計算式 3 * 9 = 27 e. 考察 irsv{c106179}% bc -l [~/Ruby] 3*9 27 quit 計算は正しい。 ちなみに2つ目の数値を入力しなかった場合は、 irsv{c106179}% ./twomulti.rb 3 [~/Ruby] 計算式 3 * 0 = 0 上記のように、0 で計算された。 また、数値を2つ以上入力した場合は、 irsv{c106179}% ./twomulti.rb 3 6 7 2 [~/Ruby] 計算式 3 * 6 = 18 上記のように最初の2つの数字で計算されたが、計算は正しかった。 f. 参考文献 西村先生のHP 予約プログラム http://roy/~madoka/2007/r2/06/06-03-airline.html C. (multi2.rb) a. 考えた設定 好きなだけ数を入力し、それをかけ算するプログラム。 b. プログラムコード #!/usr/koeki/bin/ruby if ARGV[0] == nil STDERR.print("数値を入力すると、かけ算をします。\n") exit(1) end n = 0 x = Array.new while true if ARGV[n] == nil then break else x[n] = ARGV[n].to_i n += 1 end end goukei = 1 for y in x do goukei *= y end puts x printf("答え: %d\n",goukei) c. 変更点 airline.rb を参考にした。 d. 結果画面 irsv{c106179}% ./multi2.rb 2 3 6 12 [~/Ruby] 2 3 6 12 答え: 432 e. 考察 irsv{c106179}% bc -l [~/Ruby] 2*3*6*12 432 quit 計算は正しい。 結果画面で「1 * 2 * 3 * 4」のように式の形式で入力された数字を表示させた かったが、できなかった。そのため puts を使って一応は入力された数字を表示させた。 while 文を使って入力した数字の数だけ printf で表示するという風に作成すれ ば、式の形式で表示させることができるのではないかと思った。 f. 参考文献 ・西村先生のHP 予約プログラム http://roy/~madoka/2007/r2/06/06-03-airline.html ・逆引きRuby 「制御構造」 http://www.namaraii.com/rubytips/?%C0%A9%B8%E6%B9%BD%C2%A4 3.感想 twomulti.rb で2つ以上の数値が入力された場合は、nil を返すという風にする にはどうすれば良いのかわからなかった。 最後の multi2.rb は配列を使えばできるということは思いついたが、それをプ ログラムの形にするまで時間がかかったが、何とか作成することができた。