(* 学生ひとり分のデータを表す型 *) type gakusei_t = { namae : string; (* 名前 *) tensuu : int; (* 点数 *) seiseki : string; (* 成績 *) } (* 学生データの例 *) let gakusei1 = {namae="asai"; tensuu=70; seiseki="B"} let gakusei2 = {namae="tanaka"; tensuu=90; seiseki="A"} let gakusei3 = {namae="yamada"; tensuu=60; seiseki="C"} (* 学生リストの例 *) let gakusei_list = [gakusei1; gakusei2; gakusei3] (* 目的:指定された学生の成績を返す *) (* get_seiseki : string -> gakusei_t list -> string option *) let rec get_seiseki name lst = match lst with [] -> None | {namae=n; tensuu=t; seiseki=s} :: rest -> if n = name then Some (s) else get_seiseki name rest (* 目的:指定された学生の成績通知文を返す *) (* tsuuchi : string -> gakusei_t list -> string *) let tsuuchi name lst = match get_seiseki name lst with None -> name ^ " さんのデータがありません" | Some (seiseki) -> name ^ " さんは " ^ seiseki ^ " です" (* テスト *) let test1 = tsuuchi "asai" gakusei_list = "asai さんは B です" let test2 = tsuuchi "tanaka" gakusei_list = "tanaka さんは A です" let test3 = tsuuchi "yamada" gakusei_list = "yamada さんは C です" let test4 = tsuuchi "yoshida" gakusei_list = "yoshida さんのデータがありません" (* 例外を使ったプログラム *) (* データがないことを示す例外 *) exception DataNashi (* 目的:指定された学生の成績を返す *) (* 学生が見つからなかったら例外 DataNashi を起こす *) (* get_seiseki : string -> gakusei_t list -> string *) let rec get_seiseki name lst = match lst with [] -> raise DataNashi | {namae=n; tensuu=t; seiseki=s} :: rest -> if n = name then s else get_seiseki name rest (* 目的:指定された学生の成績通知文を返す *) (* tsuuchi : string -> gakusei_t list -> string *) let tsuuchi name lst = try let seiseki = get_seiseki name lst in name ^ " さんは " ^ seiseki ^ " です" with DataNashi -> name ^ " さんのデータがありません" (* テスト *) let test5 = tsuuchi "asai" gakusei_list = "asai さんは B です" let test6 = tsuuchi "tanaka" gakusei_list = "tanaka さんは A です" let test7 = tsuuchi "yamada" gakusei_list = "yamada さんは C です" let test8 = tsuuchi "yoshida" gakusei_list = "yoshida さんのデータがありません"