このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1357748713/94
#  [1] 授業単元: Cコーディング初級 
#  [2] 問題文(含コード&リンク): 
#  
#  プログラムを実行した日がその年の第何週目にあるかを終了コードとして整数で返す 
#  
#  [3] 環境 
#   [3.1] OS: Windows 
#   [3.2] gcc 4.3.4 
#   [3.3] 言語: C 
#  [4] 期限: 1/17 
#  [5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々) 
time.h を使います 
#  週の頭は日曜から始まります 
#  1月1日を含む週に4日以上ある場合に第1週となります 
#  つまり1月1日が日曜から始まっているときはその週が第1週ですが 
#  1月4日が日曜から始まっているときはその週が第1週になります 


'プログラムを実行した日がその年の第何週目にあるかを終了コードとして整数で返す
週の頭は日曜から始まります
1月1日を含む週に4日以上ある場合に第1週となります
つまり1月1日が日曜から始まっているときはその週が第1週ですが
1月4日が日曜から始まっているときはその週が第1週になります'(_その年の第何週目) :-
        プログラムを実行した日が(_年,_月,_日),
        'その年の第何週目にあるかを終了コードとして整数で返す
1月1日を含む週に4日以上ある場合に第1週となります
つまり1月1日が日曜から始まっているときはその週が第1週ですが
1月4日が日曜から始まっているときはその週が第1週になります'(_年,_月,_日,_その年の第何週目).

プログラムを実行した日が(_年,_月,_日) :-
        date(_年,_月,_日).

'その年の第何週目にあるかを終了コードとして整数で返す
1月1日を含む週に4日以上ある場合に第1週となります
つまり1月1日が日曜から始まっているときはその週が第1週ですが
1月4日が日曜から始まっているときはその週が第1週になります'(_年,_月,_日,_その年の第何週目) :-
        'Zellerの公式を用いて曜日を得る'(_年,1,1,_曜日を表す値,_曜日),
        _曜日を表す値 >= 4,
        _今年に入ってからの第一週以前の日数 is 7 - _曜日を表す値,
        一月一日からの累積日数(_年,_月,_日,_一月一日からの累積日数),
        _その年の第何週目 is (_一月一日からの累積日数 - _今年に入ってからの第一週以前の日数) // 7 + 1.
'その年の第何週目にあるかを終了コードとして整数で返す
1月1日を含む週に4日以上ある場合に第1週となります
つまり1月1日が日曜から始まっているときはその週が第1週ですが
1月4日が日曜から始まっているときはその週が第1週になります'(_年,_月,_日,_その年の第何週目) :-
        'Zellerの公式を用いて曜日を得る'(_年,1,1,_曜日を表す値,_曜日),
        _曜日を表す値 < 4,
        一月一日からの累積日数(_年,_月,_日,_一月一日からの累積日数),
        _その年の第何週目 is _一月一日からの累積日数 // 7 + 1.

一月一日からの累積日数(_年,_月,_日,_一月一日からの累積日数) :-
        うるう年(_年),
        findsum(_日数,(
                        nth1(_nth1,[31,29,31,30,31,30,31,31,30,31,31],_日数),
                        _nth1 < _月),
                累積日数_1),
        _累積日数 is _累積日数 + _日.
一月一日からの累積日数(_年,_月,_日,_一月一日からの累積日数) :-
        \+(うるう年(_年)),
        findsum(_日数,(
                        nth1(_nth1,[31,28,31,30,31,30,31,31,30,31,31],_日数),
                        _nth1 < _月),
                累積日数_1),
        _累積日数 is _累積日数 + _日.

'Zellerの公式を用いて曜日を得る'(_年,1,_日,_曜日を表す値,_曜日) :-
        _年_1 is _年 - 1,
        'Zellerの公式を用いて曜日を得る'(_年_1,13,_日,_曜日を表す値,_曜日),!.
'Zellerの公式を用いて曜日を得る'(_年,2,_日,_曜日を表す値,_曜日) :-
        _年_1 is _年 - 1,
        'Zellerの公式を用いて曜日を得る'(_年_1,14,_日,_曜日を表す値,_曜日),!.
'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :-
        _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7,
        'Zellerの公式で使う曜日を表す値'(_曜日を表す値,_曜日),!.

'Zellerの公式で使う曜日を表す値'(0,'日曜').
'Zellerの公式で使う曜日を表す値'(1,'月曜').
'Zellerの公式で使う曜日を表す値'(2,'火曜').
'Zellerの公式で使う曜日を表す値'(3,'水曜').
'Zellerの公式で使う曜日を表す値'(4,'木曜').
'Zellerの公式で使う曜日を表す値'(5,'金曜').
'Zellerの公式で使う曜日を表す値'(6,'土曜').

うるう年(_年) :-
        0 is _年 mod 400,!.
うるう年(_年) :-
        0 is _年 mod 100,
        !,fail.
うるう年(_年) :-
        0 is _年 mod 4,!.
うるう年(_年) :-
        \+(0 is _年 mod 4),
        fail.