このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1325685876/361
#  [2] 問題文(含コード&リンク): 構造体  
#   
#  ある人の生まれた年,生まれた月をそれぞれ構造体で内部的に表現する. 2人分のデータを入力した後,2人の年令の差(年,月まで)を 計算して以下のような結果を示すプログラムを作成する. 
#  実行例 
#  ----------------------------------------------------- 
#   [1] Aさんのデータを入力 
#   [2] Bさんのデータを入力 
#   [3] 結果表示 
#   [9] 終了 
#  ----------------------------------------------------- 
#   
#  #コマンドを入力して下さい:1 
#  Aさんの生れた年は?:1967 
#  Aさんの生れた月は?:8 
#   
#  #コマンドを入力して下さい:3 
#  まだBさんのデータが入力されていません! 
#   
#  #コマンドを入力して下さい:2 
#  Bさんの生れた年は?:1987 
#  Bさんの生れた月は?:10 
#   
#  #コマンドを入力して下さい:3 
#  Aさんは 20年と2ヶ月 Bさんより年上です. 
#   
#  #コマンドを入力して下さい:9 
#  留意点 
#  ・メニュー形式で実装. 
#  ・関数化を行うこと. 
#   main 関数のみのプログラムは不可とします. 
#  [3.3] 言語: c言語  
#  [4] 期限: 1月20日 
# 

'ある人の生まれた年,生まれた月をそれぞれ構造体で内部的に表現する.2人分のデータを入力した後,2人の年令の差(年,月まで)を 計算して以下のような結果を示すプログラムを作成する.' :-
        write('-----------------------------------------------------\n[1] Aさんのデータを入\n[2] Bさんのデータを入力\n[3] 結果表示\n[9] 終了\n-----------------------------------------------------\n'),
        コマンドの入力(_コマンド),
        コマンドの選択実行(_コマンド).
'ある人の生まれた年,生まれた月をそれぞれ構造体で内部的に表現する.2人分のデータを入力した後,2人の年令の差(年,月まで)を 計算して以下のような結果を示すプログラムを作成する.' :-
        'ある人の生まれた年,生まれた月をそれぞれ構造体で内部的に表現する.2人分のデータを入力した後,2人の年令の差(年,月まで)を 計算して以下のような結果を示すプログラムを作成する.'.


コマンドの入力(_コマンド) :-
        write('#コマンドを入力して下さい: '),
        get_line(_コマンド). 

コマンドの選択実行('9') :- !.
コマンドの選択実行('1') :-
        get_integer(_生まれた年),
        get_integer(_生まれた月),
        'ある人の生まれた年,生まれた月をそれぞれ構造体で内部的に表現する.'('A',_生まれた年,_生まれた月).
コマンドの選択実行('2') :-
        get_integer(_生まれた年),
        get_integer(_生まれた月),
        'ある人の生まれた年,生まれた月をそれぞれ構造体で内部的に表現する.'('B',_生まれた年,_生まれた月).
コマンドの選択実行('3') :-
        '2人の年令の差(年,月まで)を 計算して以下のような結果を示す'.

'2人の年令の差(年,月まで)を 計算して以下のような結果を示す' :-
        findall([_生まれた年,_生まれた月],(
                    'ある人の生まれた年,生まれた月'(_,_生まれた年,_生まれた月)),
                [[_Aの生まれた年,_Aの生まれた月],[_Bの生まれた年,_Bの生まれた月]]),
        年齢差の計算(_Aの生まれた年,_Aの生まれた月,_Bの生まれた年,_Bの生まれた月,_表示文),
        writef('%t',[_表示文]).

'ある人の生まれた年,生まれた月をそれぞれ構造体で内部的に表現する.'(_ある人,_生まれた年,_生まれた月) :-
        assertz('ある人の生まれた年,生まれた月'(_ある人,_生まれた年,_生まれた月)).

年齢差の計算(_生まれた年,_生まれた月,_生まれた年,_生まれた月,'AさんとBさんは同じ年の同じ月の生まれです') :- !.
年齢差の計算(_Aの生まれた年,_Aの生まれた月,_Bの生まれた年,_Bの生まれた月,_表示文) :-
        M_1 is _Aの生まれた年 * 12 + _Aの生まれた月,
        M_2 is _Bの生まれた年 * 12 + _Bの生まれた月,
        年齢差の計算(M_1,M_2,_表示文).
年齢差の計算(M_1,M_2,_表示文) :-
        M_1 > M_2,
        S is M_1 - M_2,
        _年 is S // 12,
        _月 is S mod 12,
       swritef(_表示文,'Aさんは %t年と%tヶ月 Bさん%tです.\n',[_年,_月,より年上]).
年齢差の計算(M_1,M_2,_表示文) :-
        M_1 < M_2,
        S is M_2 -  M_1,
        _年 is S // 12,
        _月 is S mod 12,
       swritef(_表示文,'Aさんは %t年と%tヶ月 Bさん%tです.\n',[_年,_月,より年下]).