summer camp2015
TRANSCRIPT
計算機を作ってみたabc3141
1. どんな機能があるもの ?① 足し算② 引き算③ 掛け算④ 割り算⑤ 計算順序
… 読んだ本に書いてあったので実装したくなった⑥ if then else 文
1. どんな機能があるもの ?① 足し算② 引き算③ 掛け算④ 割り算⑤ 計算順序
… 読んだ本に書いてあったので実装したくなった⑥ if then else 文
これらと例外処理の 4 つで苦労したのでそのことについて話します
2-1. 困った点その1:割り算→ 整数でなくなって普通の int 型では管理ができない!
4 ÷ 3 = 1.33333333…
どこで困るのか?
→ でも誤差のせいで正確な値を出せない(例 )
じゃあ double 型を使えばよいのでは ?
→ 分子と分母を別々に管理しよう !
2-1. 困った点その1:割り算分子と分母に分けて処理することで、他の演算の処理が少し複雑になるが誤差死よりはまし実装の仕方によっては分母 0 の場合に注意しなければならない
2-2. 困った点その2:計算順序計算の順序を決めるものには何があるか?
演算の種類 ( 掛け算・割り算は足し算・引き算より前 )
かっこ①
②
つき方がたくさんあって面倒くさい
2-2. 困った点その2:計算順序① かっこに囲まれている部分のうち最も内側を取る
対策
② ① で選んだ部分を計算してそこのデータを書き換える
例えば…
2-2. 困った点その2:計算順序(4−1 )∗((8−5)/ 4+2)
¿ 33 /4
(例 )
2-2. 困った点その2:計算順序一番内側の () の中は掛け算・割り算と足し算・引き算の区別以外順番は関係ない
掛け算と割り算の部分だけ処理して、次に足し算と引き算のところの処理をするとよい
2-3. 困った点その3: if then else 文
if と比較演算子の間の式と、比較演算子と then の間の式との値を比較する
※ この文はできるだけ右に伸びるように () が省略されるらしいです
then と else の間の式の値を使うか、else と else のかかる終わりの所までの式の値を使うか決める
一応具体例を示します ( 簡単ですが )
2-3. 困った点その3: if then else 文𝑖𝑓 2∗ (60−3 )<2+16∗32 h𝑡 𝑒𝑛2𝑒𝑙𝑠𝑒7 /3
114
この式は true なので、式全体の値は 2 となる514¿
2-3. 困った点その3: if then else 文false とか true とかをさらに if 文に組み合わせるのはしていないが、前と同じように再帰的に計算をすればよさそうなのは分かる
ただ、 Ocaml の仕様上、な式に対しては Error を返すようなものにしなければならないので実装の手間が増える
(例 )𝑖𝑓 (𝑖𝑓 3<4 h𝑡 𝑒𝑛1𝑒𝑙𝑠𝑒2 )=¿2 h𝑡 𝑒𝑛10𝑒𝑙𝑠𝑒−1
2-4. 困った点その4:例外処理どんな時に Error が起こるのか?
① 入力の時・ 9t8 や [ や \ などの認識されない文字がある時
・ ( と ) の個数が対応していない時・ 1 番目の文字に+が書かれていたり、 ーが連続して書かれている時
・ if 構文が正しく使われていない時
・ 他にもありそう
2-4. 困った点その4:例外処理どんな時に Error が起こるのか?
② 計算の時・ 分母が 0 になる時 ( 前掲 )
・ 他にもあると思うんですが、 これしか見当たっていないので 見つかったら言ってください
・ bool 型と int 型を混同して使っている時 ( 前掲 )
3. 感想・ 全体的な本の流れが、強いアルゴリズムを 提示する、というものではなくひたすら 論理をつつくといったものだったので、 派手なことができず申し訳ございませんでした・ 本来はもっと強いことをしようと思っていたので、 Ocaml の、変数を宣言したものを対応させるものにも 挑戦したいと思います
h𝑇 𝑎𝑛𝑘 𝑦𝑜𝑢 𝑓𝑜𝑟 𝑙𝑖𝑠𝑡𝑒𝑛𝑖𝑛𝑔 .