講評: 自分で頑張れるようになってきていることがとても良いです。 ---- 11 月 07 日 第 6 回レポート 「コマンドライン入力」 学籍番号:c106XXXX 氏名:XXXXXXXX 語学クラス:英語XX 系:環境系 1. 筆記問題 A.携帯のアドレス帳で名前検索の時に使われており、根拠は"あいうえお "順で 並べられているから。おそらく、アドレス帳に登録した時に講義でやったような quik sortが働いているのではないかと思った。 B. 業務用の品物を注文する際の電話のオペレーター 品物を注文する際に必要な項目:店の店番、電話番号、責任者の名前、品物、数、 日時 C.ARGV 配列 ARGVの0番目には店の店番、1番目には電話番号、2番目には責任者の名前、3 番目には品物、4番目には数、5番目には日時が入るようにする。わかりやす いように図にしてみました。 ●ARGV 配列の図● ARGV[0]→店の店番 ARGV[1]→電話番号 ARGV[2]→責任者の名前 ARGV[3]→品物 ARGV[4]→数 ARGV[5]→日時 2. 以下のプログラムについて、できる範囲まで提出せよ。 A. reservation.rb のプログラム a. 考えた設定 入力する項目を6個にし、業務用のものを注文をする時の電話のオペレーターを 考えて設定しました。発注して、それをレシート的にしてだすようにしてみまし た。テキストファイルに書くようにしました。 b. 作成したプログラムコードそのもの #!/usr/koeki/bin/ruby if ARGV[0|1|2|3] == nil #コマンドラインの配列がnilの場合 STDERR.print("入力する項目に不備があります。もう一度確認して下さい。\n") sleep 2 STDERR.print("入力する項目は、店番、電話番号、責任者の名前、品物、数、日時です。\n") exit(1) elsif ARGV[4|5] == nil #コマンドラインの配列がnilの場合 STDERR.print("入力する項目に不備があります。もう一度確認して下さい。\n") sleep 2 STDERR.print("入力する項目は、店番、電話番号、責任者の名前、品物、数、日時です。\n") exit(1) end tennbann = ARGV[0].to_i #to_i で整数値 banngou = ARGV[1] name = ARGV[2] sina = ARGV[3] kazu = ARGV[4].to_i time = ARGV[5].to_i printf("発注確認\n") sleep 1 printf("--"*20) printf("\n店番 :\t%-5d\n",tennbann) printf("電話番号 :\t%-5s\n",banngou) printf("責任者の名前 :\t%-5s\n",name) printf("品物 :\t%-5s\n",sina) printf("数 :\t%-5d\n",kazu) printf("日時 :\t%d時まで\n",time) printf("--"*20) open("reservation.txt","w") do |shop| #open-endを使い、w でshopを書き込ませる shop.printf("店番: %-10d\n",tennbann) #変数とファイルに書き込むprint文 shop.printf("電話番号: %-10s\n",banngou) shop.printf("責任者の名前: %-10s\n",name) shop.printf("品物: %-10s\n",sina) shop.printf("数: %-10d\n",kazu) shop.printf("日時: %-10d\n",time) sleep 2 print("\n発注確認しました。ご苦労さまでした。\n") end c. もとにしたプログラムからの変更点 授業で使った "airline.rb"もとに変更しました。 変更点…コマンドライン入力の変更。 open-endを使い、wで書き込ませるように変更。 変数の変更。 d. プログラムを実行した結果画面 irsv{c106048}% ./reservation.rb 1003 32-1322 小野寺 コピー用紙 200 10時 発注確認 ---------------------------------------- 店番 : 1003 電話番号 : 32-1322 責任者の名前 : 小野寺 品物 : コピー用紙 数 : 200 日時 : 10時まで ---------------------------------------- 発注確認しました。ご苦労さまでした。 ● reservation.txt のcat● irsv{c106048}% cat reservation.txt [~/Ruby] 店番: 1003 電話番号: 32-1322 責任者の名前: 小野寺 品物: コピー用紙 数: 200 日時: 10 ●不備がある場合● irsv{c106048}% ./reservation.rb 1003 小野寺 200 10時 [~/Ruby] 入力する項目に不備があります。もう一度確認して下さい。 入力する項目は、店番、電話番号、責任者の名前、品物、数、日時です。 e. 導き出された結果の考察 reservation.txtはちゃんと実行ができたので、テキストに問題はないとわかっ た。 if ARGV[0|1|2|3|4|5] == nil コマンドラインの配列を、上記のように最初一つにまとめましたが、全部エラー 表示になり、分割しながら確認をしてみたら、完成したプログラムのように落ち 着きました。 f. 参考文献 西村まどか先生のHP、予約プログラム "http://roy/~madoka/2007/r2/06/06-03-airline.html"より B.twomulti.rb のプログラム a. 考えた設定 かけ算をさせるプログラムを考え設定しました。 b. 作成したプログラムコードそのもの #!/usr/koeki/bin/ruby def kakezan(one,two) #計算式をdefでさせる return one * two #returnで計算式の繰り返し end if ARGV[0] == nil #ARGVに入っている要素がnilになっているか確認 STDERR.print("数字を入力して下さい。\n") exit(1) end iti = ARGV[0].to_i #数値をコマンドライン入力させる ni = ARGV[1].to_i #数値をコマンドライン入力させる printf("かけ算をします。\n") sleep 1 printf("数字1: %-10d\n",iti) printf("数字2: %-10d\n",ni) kakezan(iti,ni) printf("Answer: %d!!\n",kakezan(iti,ni)) c. もとにしたプログラムからの変更点 数値をコマンドライン入力させるように変更。 to_iを使い整数値を表示できるように変更。 d. プログラムを実行した結果画面 irsv{c106048}% ./twomulti.rb 2 45 [~/Ruby] かけ算をします。 数字1: 2 数字2: 45 Answer: 90!! ◯確かめ◯ irsv{c106048}% bc -l [~/Ruby] 2*45 90 irsv{c106048}% ./twomulti.rb 33 25 [~/Ruby] かけ算をします。 数字1: 33 数字2: 25 Answer: 825!! ◯確かめ◯ irsv{c106048}% bc -l [~/Ruby] 33*25 825 e. 導き出された結果の考察 しっかりと計算式が実行された。 bc -l で確かめをしたので間違っていないと わかった。 f. 参考文献 西村まどか先生のHP 階乗計算 "http://roy/~madoka/2007/r2/06/06-06-factorial.html"より C. multi2.rb のプログラム a. 考えた設定 数字を6つで入力させて、計算させるようにプログラムを考えた。 b. 作成したプログラムコードそのもの #!/usr/koeki/bin/ruby def kakezan1(xman) #計算式をdefでさせる return xman += 1 #returnで計算式を返す end def kakezan(one,two) return one * two #returnで計算式を返す end #def kakezan2(yman) # return yman += 1 #end if ARGV[0|1] == nil #ARGVに入っている要素がnilになっているか確認 STDERR.print("数字を入力して下さい。\n") STDERR.print("6つの数字まで大丈夫です。\n") exit(1) end n = 0 #変数を初期化にする kazu = Array.new while 6 > n #ここで6つまでの数字を示す、 if n == nil #nが6より小さい場合は、breakで終らせる break else #それ以外の場合は kazu[n] = ARGV[n].to_i #数値をコマンドライン入力させる n = kakezan1(n) #n += 1 #ここの計算式を上のdef文で実行させる end end suu = 0 #変数を初期化にする kei = 1 while n > suu if suu == 0 printf(" %d",kazu[suu]) else printf(" * %d",kazu[suu]) end kei = kakezan(kei,kazu[suu]) suu = kakezan1(suu) #suu += 1 #ここの計算式を上のdef文で実行させる。 end printf(" = %d\nです。\n",kei) c. もとにしたプログラムからの変更点 def文を追加した。 変数の変更。 whil文で計算させるように変更。 d. プログラムを実行した結果画面 irsv{c106048}% ./multi2.rb 1 8 3 4 3 44 [~/Ruby] 1 * 8 * 3 * 4 * 3 * 44 = 12672 です。 ●駄目な場合● irsv{c106048}% ./multi2.rb 1 8 3 4 3 [~/Ruby] 1 * 8 * 3 * 4 * 3 * 0 = 0 です. ●bc -lで確かめ● irsv{c106048}% bc -l [~/Ruby] 1*8*3*4*3*44 12672 e. 導き出された結果の考察 初め、def文での計算式を2つで作成していましたが、後々考えてみたところ、計 算式が同じだと発見し、1つの計算式で作成してみたところ実行したのでプログ ラムは間違っていないと分かりました。def文を習ったのでたくさん使って計算 させるプログラムを実行できた。 f. 参考文献 西村まどか先生のHP 階乗計算 "http://roy/~madoka/2007/r2/06/06-06-factorial.html"より 3. 感想。 今日は、コマンドライン入力を使ったプログラムを作成し、忘れていた while-endを復習しながら、プログラムに取り入れながらできました。後は、自 分なりに途中に入れた計算式なども工夫できました。def文の発見もできました。 この調子で来週も頑張ります。