(* 学生ひとり分のデータを表す型 *) type gakusei_t = { namae : string; (* 名前 *) tensuu : int; (* 点数 *) seiseki : string; (* 成績 *) } (* 学生データの例 *) let gakusei1 = {namae="asai"; tensuu=70; seiseki="?"} let gakusei1' = {namae="asai"; tensuu=70; seiseki="B"} let gakusei2 = {namae="tanaka"; tensuu=90; seiseki="?"} let gakusei2' = {namae="tanaka"; tensuu=90; seiseki="A"} let gakusei3 = {namae="yamada"; tensuu=60; seiseki="?"} let gakusei3' = {namae="yamada"; tensuu=60; seiseki="C"} let gakusei4 = {namae="yoshida"; tensuu=80; seiseki="?"} let gakusei4' = {namae="yoshida"; tensuu=80; seiseki="A"} let gakusei5 = {namae="kimura"; tensuu=85; seiseki="?"} let gakusei5' = {namae="kimura"; tensuu=85; seiseki="A"} let gakusei6 = {namae="kudo"; tensuu=65; seiseki="?"} let gakusei6' = {namae="kudo"; tensuu=65; seiseki="C"} let gakusei7 = {namae="ito"; tensuu=75; seiseki="?"} let gakusei7' = {namae="ito"; tensuu=75; seiseki="B"} (* 学生リストの例 *) let gakusei_list = [gakusei1; gakusei2; gakusei3; gakusei4; gakusei5; gakusei6; gakusei7] (* 成績未定 *) let gakusei_list' = [gakusei1'; gakusei2'; gakusei3'; gakusei4'; gakusei5'; gakusei6'; gakusei7'] (* 成績確定 *) (* 目的:学生データのリストに成績を入れる *) (* hyouka_list : gakusei_t list -> gakusei_t list *) let hyouka_list lst = (* 目的:学生データ(ひとり)に成績を入れる *) (* hyouka : gakusei_t -> gakusei_t *) let hyouka gakusei = match gakusei with {namae=n; tensuu=t; seiseki=s} -> {namae=n; tensuu=t; seiseki = if t >= 80 then "A" else if t >= 70 then "B" else if t >= 60 then "C" else "D"} in List.map hyouka lst (* テスト *) let test1 = hyouka_list [] = [] let test2 = hyouka_list gakusei_list = gakusei_list' (* 目的:成績が A の人の数を返す *) (* count_A : gakusei_t list -> int *) let count_A lst = (* 目的:学生(ひとり)の成績が A かを調べる *) (* seiseki_A : gakusei_t -> bool *) let seiseki_A gakusei = match gakusei with {namae=n; tensuu=t; seiseki=s} -> s = "A" in List.length (List.filter seiseki_A lst) (* テスト *) let test3 = count_A [] = 0 let test4 = count_A gakusei_list' = 3 let test5 = count_A [gakusei2'; gakusei3'; gakusei4'] = 2 (* 目的:学生リストの平均点を出す *) (* heikin : gakusei_t list -> int *) let heikin lst = (* 目的:学生(ひとり)の点数を goukei に足す *) (* add : gakusei_t -> int -> int *) let add gakusei goukei = match gakusei with {namae=n; tensuu=t; seiseki=s} -> t + goukei in (* 目的:学生の点数の合計を出す *) (* add_list : gakusei_t -> int *) let add_list lst = List.fold_right add lst 0 in add_list lst / List.length lst (* テスト *) let test6 = heikin gakusei_list' = 75 let test7 = heikin [gakusei2'; gakusei3'; gakusei4'] = 76 let test8 = heikin [gakusei2'; gakusei4'; gakusei5'] = 85 (* 目的:成績が A の人の平均点を出す *) (* heikin_A : gakusei_t list -> int *) let heikin_A lst = (* 目的:学生(ひとり)の成績が A かを調べる *) (* seiseki_A : gakusei_t -> bool *) let seiseki_A gakusei = match gakusei with {namae=n; tensuu=t; seiseki=s} -> s = "A" in (* 目的:学生(ひとり)の点数を goukei に足す *) (* add : gakusei_t -> int -> int *) let add gakusei goukei = match gakusei with {namae=n; tensuu=t; seiseki=s} -> t + goukei in let lst_A = List.filter seiseki_A lst in let goukei = List.fold_right add lst_A 0 in let ninzuu = List.length lst_A in goukei / ninzuu (* テスト *) let test6 = heikin_A gakusei_list' = 85 let test7 = heikin_A [gakusei2'; gakusei3'; gakusei4'] = 85 let test8 = heikin_A [gakusei2'; gakusei4'; gakusei5'] = 85