第 7 回 専門演習紹介 レポート課題 氏名:高橋岬 学籍番号:c1110973 語学クラス:英語5 コース:環境サイエンスコース 1.A.a.企画書 企画書 題名 誰でも計算機 企画内容 レポート課題で解い計算問題を一つのプログラムで解けるようにした 計算出来るのは ・規則正しい数値 ・ランダムに入力した数値 ・進数変換 規則正しい数値の計算とランダムに入力した数値は、四則演算を行うことができる。 計算機と違うところは、◯◯し続けるところ。 範囲を決めるか入力を終了しない限り、連続して四則演算(1+3+5+…,14*29*3*…)を行う。 また、ランダムに入力した数値の加法では、平均/分散/標準偏差を求められる。 進数変換はめんどくさかった進数(2, 10, 16)をそれぞれの進数に変換できる。 100から200までの偶数だけを足したい、進数変換をさっとやりたい、誰にでも使えるプログラム が作りたかった。 今後の課題 今回のプログラムは前回のレジスターに比べて、改良点がたくさんある。 まず、プログラム・計算式をもっと簡略化出来ると思う。 何度も見直して行くうちに、なんでこんな回りくどいことをしているんだ?と思うことがあるので、まだまだ改良の余地がある。 つぎに、計算が正しくない。 計算機にとってあるまじきことなのだが、規則正しい数値の計算において範囲指定したときに、除法・乗法が上手くいくときと失敗するときがある。 自分の思いつく限りのことをやって改良したつもりだが、この問題を解決することができなかった。 また、今後もっと計算パターンを増やしていきたい。 取り扱い説明書 取扱説明書 誰でも計算機 何回もかけなきゃいけない…、ここからここまで足さなきゃいけない、進数を変換しなければいけない… そんなときに使えるプログラムを作りました。 ダウンロードファイル 計算するためのダウンロードファイルは以下の通りです。 取扱説明書 00readme プログラムファイル math.rb 使い方 Ruby にダウンロード kterm で chmod +x math.rb と入力 → ./math.rb と入力 プログラムを使用できるようになります。 規則正しい数値の計算は 1,3,5,7,9,… や 109,93,77,… などの等差になってる数字を四則演算できます。 表示された文章(始まりの数値、終わりの数値、差)を入力すると、自動的に計算されます。 ランダムに入力した数値の計算は 身長、体重、テストの成績を扱うのに持って来いです。 加法では、平均/分散/標準偏差を求められます。 進数変換は めんどくさい進数の変換を変わりにやってくれます。 数字の左側から1桁ずつ入力して下さい。 著作権 このプログラムは 東北公益文科大学 高橋岬/C1110973 が著作権を保有しています。 このプログラムは、入手・実行・改変はいずれも自由ですが、 そこで生じたいかなる結果に対しても責任を負いません。 このプログラムに対する意見、感想などは下記のアドレスまでお願いします。 c111097@g.koeki-u.ac.jp 1.A.b.math.rb 作成したプログラム #!/usr/koeki/bin/ruby #coding: euc-jp def purasu(suji) # 変数 suji についての関数 purasu sum = 0 # 変数 sum を0とする for kazus in suji # suji から持って来たものを kazus とする sum += kazus # sum に kazus を足す end sum # 最終的な sum end def purasu2(sujitachi, heikin) # 変数 sujitachi , heikin についての関数 purasu2 sum2 = 0 # 変数 sum2 を0とする for kazutachi in sujitachi # sujitachi から 持って来たものを kazutachi とする sum2 += (kazutachi - heikin)**2 # sum2 に kazutachi から heikin を引き、2乗したもの足す end sum2 # 最終的な sum2 end def mainasu(suji) # 変数 suji についての関数 mainasu sum = suji[0] # 変数 sum を suji[0] とする(引算をするため) for kazus in suji # suji から持って来たものを kazus とする sum -= kazus # sum から kazus を引く end sum + suji[0] # 最終的な sum は suji[0] が含まれていないので足す end def kakeru(suji) # 変数 suji についての関数 kakeru sum = 1 # 変数 sum を1とする(かけ算だから) for kazus in suji # suji から持って来たものを kazus とする sum *= kazus # sum に kazus をかける end sum # 最終的な sum end def waru(suji) # 変数 suji についての関数 waru sum = (suji[0] * suji[0]) # 変数 sum を suji[0] の2乗とする(割り算なので) for kazus in suji # suji から持って来たものを kazus とする sum /= kazus.to_f # sum を kazus(の小数値) でわる end sum.to_f # 最終的な sum(小数値) end def bse(number, keta) # 変数 number , keta についての関数 bse number * (2 ** keta) # number に、2を keta 乗したものをかける end def dec(number, keta) # 変数 number , keta についての関数 dec number * (10 ** keta) # number に、10を keta 乗したものをかける end def hex(number, keta) # 変数 number , keta についての関数 hex number * (16 ** keta) # number に、16を keta 乗したものをかける end print("\n計算プログラム\nあなたの用途に従って計算します\n") print("\n何をしますか?\n") while true STDERR.print("\t1.規則正しい数値\n\t2.ランダムに入力した数値\n\t3.進数変換\n\t\t→ ") sean = gets.to_i # 変数 sean を整数値として得る if sean == 1 # sean が1だったら STDERR.printf("\n\n今から入力する数値を\n\t1.+\n\t2.−\n\t3.×\n\t4.÷\n\t\t→ ") sign = gets.to_i print("\n計算させたい数値を入力してください\n") while true STDERR.print("スタート: ") start = gets.to_i STDERR.print("ゴール: ") stop = gets.to_i STDERR.print("きざみ: ") delta = gets.to_i if sign == 1 sum = 0 printf("%3d", start) (start + delta).step(stop, delta) do |odd| printf(" +%3d",odd) sum += odd end printf("\n\t= %d\n", sum + start) elsif sign == 2 sum = start hensu = start - delta printf("%3d", start) hensu.downto(stop) do |ot| add = (hensu - ot) * delta printf(" -%3d",hensu - add) sum -= (hensu - add) if (hensu - add) <= stop break end end printf("\n\t= %d\n", sum) elsif sign == 3 sum = start printf("%3d", sum) (start + delta).step(stop, delta) do |odd| printf(" *%3d",odd) sum *= odd end printf("\n\t= %d\n", sum) elsif sign == 4 sum = start hensu = start - delta printf("%3d", start) hensu.downto(stop) do |ot| add = (hensu - ot) * delta printf(" /%3d",hensu - add) sum /= (hensu - add).to_f if (hensu - add) <= stop break end end printf("\n\t= %f\n", sum.to_f) end break end break elsif sean == 2 # sean が2だったら i = 0 random = Array.new STDERR.printf("\n今から入力する数値を\n\t1.+\n\t2.−\n\t3.×\n\t4.÷\n\t\t→ ") sign = gets.to_i print("\n計算させたい数値を入力してください(終了:q)\n") while true STDERR.printf("%d : ",i+1) kazu = gets.chomp if kazu == "q" break end random << kazu.to_i i += 1 end if sign == 1 printf("\n\t= %d\n", purasu(random)) printf("\n 平均/分散/標準偏差 を求めることも出来ます\n") STDERR.print("\t1.求める\n\t2.今回は辞めておく\n\t\t→") more = gets.to_i if more == 1 ave = purasu(random) / i printf(" 平均 : %3.2f\n", ave) printf(" 分散 : %3.2f\n", purasu2(random, ave) / i) printf("標準偏差 : %3.2f\n", Math::sqrt(purasu2(random, ave) / i)) end elsif sign == 2 printf("\n\t= %d\n", mainasu(random)) elsif sign == 3 printf("\n\t= %d\n", kakeru(random)) elsif sign == 4 printf("\n\t= %f\n", waru(random)) end break elsif sean == 3 # sean が3だったら sum = 0 STDERR.printf("\n元の進数は\n\t1.2進数\n\t2.10進数\n\t3.16進数\n\t\t→ ") adic = gets.to_i printf("\n左の数字から入力して下さい。(終了:q)\n") i = 0 while true printf("%d 桁目 : ", i+1) num = gets.chomp if num == "q" print("\n") break elsif num == "a" num = 10 elsif num == "b" num = 11 elsif num == "c" num = 12 elsif num == "d" num = 13 elsif num == "e" num = 14 elsif num == "f" num = 15 end num = num.to_i if adic == 1 sum += bse(num, i) elsif adic == 2 sum += dec(num, i) elsif adic == 3 sum += hex(num, i) end i += 1 end if adic == 1 printf("\n10進数 : %d\t16進数 : %x\n", sum, sum) elsif adic == 2 printf("\n2進数 : %b\t16進数 : %x\n", sum, sum) elsif adic == 3 printf("\n2進数 : %b\t10進数 : %d\n", sum, sum) end break else # 3パターンのどれでもなかったら print("erorr...again\n") end end 実行結果 a.pan{TAKAHASHI Misaki}% ./math.rb [~/public_html/adv2] 計算プログラム あなたの用途に従って計算します 何をしますか? 1.規則正しい数値 2.ランダムに入力した数値 3.進数変換 → 1 今から入力する数値を 1.+ 2.− 3.× 4.÷ → 3 計算させたい数値を入力してください スタート: 1 ゴール: 50 きざみ: 6 1 * 7 * 13 * 19 * 25 * 31 * 37 * 43 * 49 = 104463111025 b.pan{c111097}% ./math.rb [~/public_html/adv2] 計算プログラム あなたの用途に従って計算します 何をしますか? 1.規則正しい数値 2.ランダムに入力した数値 3.進数変換 → 2 今から入力する数値を 1.+ 2.− 3.× 4.÷ → 1 計算させたい数値を入力してください(終了:q) 1 : 98 2 : 34 3 : 58 4 : 71 5 : 60 6 : q = 321 平均/分散/標準偏差 を求めることも出来ます 1.求める 2.今回は辞めておく →1 平均 : 64.00 分散 : 431.00 標準偏差 : 20.76 c.pan{c111097}% ./math.rb [~/public_html/adv2] 計算プログラム あなたの用途に従って計算します 何をしますか? 1.規則正しい数値 2.ランダムに入力した数値 3.進数変換 → 3 元の進数は 1.2進数 2.10進数 3.16進数 → 3 左の数字から入力して下さい。(終了:q) 1 桁目 : f 2 桁目 : a 3 桁目 : 1 4 桁目 : q 2進数 : 110101111 10進数 : 431 考察 a.1から50までの間で等差が6であるとき 計算に使われる数字は 1, 7, 13, 19, 25, 31, 37, 43, 49 である。 これらをかけると 1 * 7 * 13 * 19 * 25 * 31 * 37 * 43 * 49 = 104463111025 となる。 b.合計 : 98 + 34 + 58 + 71 + 60 = 321 平均 : (98 + 34 + 58 + 71 + 60) / 5 = 64.20 分散 : ((98-64.20)^2 + (34-64.20)^2 + (58-64.20)^2 + (71-64.20)^2 + (60-64.20)^2) / 5 = 431.3600 標準偏差 : squr(431.3600) = 20.76920797719547128325 c.a = 10, f = 15 10進数 : 16^2*1+16^1*10+16^0*15 = 431 2進数 : 1→0001, 10→1010, 15→1111 = 110101111 これらの計算結果より、このプログラムは正しく起動している。 1.B.以下のページより確認 a.http://roy/~c111097/index.html b.企画書 : http://roy/~c111097/adv2/plan.txt 取り扱い説明書 : http://roy/~c111097/adv2/00readme c.http://roy/~c111097/adv2/math.rb 2.感想 前期に比べると劣ってしまう気がする。 知識が増えたのにも関らず、その知識を上手く活用できていない。 もっともっとつめて、いい作品が作りたい。 ----------------------------- 高橋 岬 東北公益文科大学 2年 c111097@g.koeki-u.ac.jp -----------------------------