このディレクトリの索引
#  出典 :: C/C++の宿題片付けます 133代目 #67
#  [1] 授業単元:プログラミング演習 
#  [2] 問題文(含コード&リンク): 
#  http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10263.txt 
#   
#  元号年の元号の頭文字,年,月および日で表記された日付を入力させ,その年の元日からその日付
#  までの日数を計算し,結果を表示するプログラムを作成したい.
#  明治7 年1 月32 日,大正7 年13 月14 日,昭和65 年1 月14 日,平成7年1 月14 日
#  および生年月日(昭和47年3月23日)を例に動作確認しなさい(以下の実行結果を参照).
#  
#  「元号年月日」を入力してください: M 7 1 32
#  そのような元号または年月日はありません
#  「元号年月日」を入力してください: T 7 13 14
#  そのような元号または年月日はありません
#  「元号年月日」を入力してください: S 65 1 14
#  そのような元号または年月日はありません
# 「元号年月日」を入力してください: H 7 1 14
#   西暦1995 年1 月14 日は元日から14 日目です


'元号年の元号の頭文字(ローマ字),年,月および日で表記された日付を入力させ,その年の元日からその日付までの日数を計算し,結果を表示する' :- 
'元号年の元号の頭文字(ローマ字),年,月および日で表記された日付を入力する'(_元号の頭文字,_年,_月,_日),
西暦の年を得る(_元号の頭文字,_年,_西暦年),
'その年の元日からその日付までの日数を計算し、結果を表示する'(_西暦年,_月,_日,_日数).


'元号年の元号の頭文字(ローマ字),年,月および日で表記された日付を入力する'(_元号年の元号の頭文字,_年,_月,_日) :- 
write('元号の頭文字 年 月 日 (スペース区切りで) :'), 
readln([_元号年の元号の頭文字,_年,_月,_日]). 


西暦の年を得る(_元号の頭文字,_年,_西暦年) :-
元号の頭文字をローマ字変換した時の最初の文字(_元号,_元号の頭文字),
元年の西暦は(_元号,_元年の西暦年),
_西暦年 is _元年の西暦年 + _年 - 1.


'その年の元日からその日付までの日数を計算し、結果を表示する'(_西暦年,_月,_日,_日数) :-
'その年の元日からその日付までの日数を計算し、'(_西暦年,_月,_日,_日数),
'結果を表示する'(_日数).


'その年の元日からその日付までの日数を計算し、'(_西暦年,1,_日数,_日数) :- !. 
'その年の元日からその日付までの日数を計算し、'(_西暦年,_月,_日,_日数) :- 
'その年の元日からその日付までの日数は年初から前月末日までの日数に_日を加えたものである'(_西暦年,_月,_日,_日数).


'その年の元日からその日付までの日数は年初から前月末日までの日数に_日を加えたものである'(_西暦年,_月,_日,_日数) :-
年初から前月末日までの日数に(_西暦年,_月,_前月末日までの日数), 
'_日を加えたものである'(_前月末日までの日数,_日,_日数).


'_日を加えたものである'(_前月末日までの日数,_日,_日数) :-
_日数 is _前月末日までの日数 + _日. 


年初から前月末日までの日数に(_西暦年,_月,_前月末日までの日数) :- 
_前月 is _月 - 1,
年初から前月までの月日数の合計(_西暦年,_前月,_前月末日までの日数). 


年初から前月までの月日数の合計(_西暦年,_前月,_前月末日までの日数) :-
年初から前月までの月日数ならび(_西暦年,_前月,_前月末日までの月日数ならび),
合計(_前月末日までの月日数ならび,_前月末日までの日数).


年初から前月までの月日数ならび(_西暦年,_前月,_前月末日までの月日数ならび) :-
findall(_月日数,(
年初から前月までの月日数(_西暦年,_前月,_月日数)),_前月末日までの月日数ならび).


年初から前月までの月日数(_西暦年,_前月,_月日数) :-
between(1,_前月,_月),
月の日数(_西暦年,_月,_月日数).


合計(_前月末日までの月日数ならび,_前月末日までの日数) :-
sum_list(_前月末日までの月日数ならび,_前月末日までの日数).


元号の頭文字をローマ字変換した時の最初の文字(明治,m).
元号の頭文字をローマ字変換した時の最初の文字(明治,'M').
元号の頭文字をローマ字変換した時の最初の文字(大正,t).
元号の頭文字をローマ字変換した時の最初の文字(大正,'T').
元号の頭文字をローマ字変換した時の最初の文字(昭和,s).
元号の頭文字をローマ字変換した時の最初の文字(昭和,'S').
元号の頭文字をローマ字変換した時の最初の文字(平成,h).
元号の頭文字をローマ字変換した時の最初の文字(平成,'H').


元年の西暦は(明治,1868).
元年の西暦は(大正,1912).
元年の西暦は(昭和,1926).
元年の西暦は(平成,1989).


うるう年(_年) :-
'400で割り切れる年はうるう年である'(_年),!.
うるう年(_年) :-
'4で割り切れる年で100で割り切れない年がうるう年である'(_年).


'400で割り切れる年はうるう年である'(_年) :-
0 is _年 mod 400,!.


'4で割り切れる年で100で割り切れない年がうるう年である'(_年) :-
0 is _年 mod 4,
\+(0 is _年 mod 100).


月の日数(_,_月,_日) :-
'大の月は31日、小の月は30日'(_月,_日).
月の日数(_年,2,_日) :-
'二月はうるう年の場合29日、うるう年でなければ28日'(_年,_日).


'大の月は31日、小の月は30日'(_月,31) :-
大の月(_月).
'大の月は31日、小の月は30日'(_月,30) :-
小の月(_月).


大の月(_月) :-
member(_月,[1,3,5,7,8,10,12]).


小の月(_月) :-
member(_月,[4,6,9,11]).


'二月はうるう年の場合29日、うるう年でなければ28日'(_年,29) :-
うるう年(_年).
'二月はうるう年の場合29日、うるう年でなければ28日'(_年,28) :-
\+(うるう年(_年)).


'結果を表示する'(_日数) :-
writef('その年の元旦からの日数は%t日です。\n',[_日数]).