第2回java-ja温泉に来ています。翻訳とOCamlをするぞ、ということで夜はOCamlの手習いです。
今日は2章の演習問題をやってみました。
Exercise 6-1,2,3
問題
1. USドル(実数)を受け取って円(整数)に換算する関数(ただし1円以下四捨五入). (入力は小数点以下2桁で終わるときに働けばよい.)レートは 1$ = 111.12 円とする.
2. 円(整数)を受け取って,USドル(セント以下を小数にした実数)に換算 する関数(ただし1セント以下四捨五入).レートは 1$ = 111.12 円とする.
3. USドル(実数)を受け取って,文字列 "⟨ ドル ⟩ dollars are ⟨ 円 ⟩ yen." を返す関数.
自分の答え
open Printf let rate = 111.12;; let usd_to_jpy usd = let jpy_base = floor (usd *. rate + 0.5) in int_of_float jpy_base ;; let jpy_to_usd jpy = floor (float_of_int jpy *. 10.0 /. rate) /. 10.0 ;; let print_usd_to_jpy usd = let jpy_str = string_of_int (usd_to_jpy usd) in Printf.printf "%s dollars are %s yen\n" (string_of_float usd) jpy_str ;; let print_jpy_to_usd jpy = let usd_str = string_of_float (jpy_to_usd jpy) in Printf.printf "%s yen are %s dollars\n" (string_of_int jpy) usd_str ;; print_usd_to_jpy 4000.00;; print_jpy_to_usd 100000;;
Exercise 6-4
問題
4. 文字を受け取って,アルファベットの小文字なら大文字に,その他の文 字はそのまま返す関数 capitalize.(例: capitalize 'h' ⇒ 'H', capitalize '1' ⇒ '1')
自分の答え
open Printf let is_lowercase c = let n = int_of_char c in if n >= 97 && n <= 122 then true else false ;; let capitalize c = if is_lowercase c then let c_ = (int_of_char c) - 32 in char_of_int c_ else c ;; let uppercase str = let len = String.length str in let ret = String.make len '0' in begin for i = 0 to len - 1 do let c = str.[i] in ret.[i] <- (capitalize c) done; end ret ;; Printf.printf "%s\n" (uppercase "abcdEFG");;
なんか問題を勘違いして文字列全体を大文字にすると思って実装を始めてしまった。それにしてもuppercaseはもっとさっくり書きたいですよね。
追記
id:camlspotter に添削していただいたのでインデントやfloorを使っての四捨五入を直しました。