読者です 読者をやめる 読者になる 読者になる

YAMAGUCHI::weblog

土足で窓から失礼いたします。今日からあなたの息子になります。 当年とって92歳、下町の発明王、エジソンです。

Objective Caml 入門 手習い(2章)

OCaml

第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を使っての四捨五入を直しました。