2009-01-12
■[プログラミング][初心者]カレンダーの作り方
お題はこんな感じで。
「年月を入力するとその月のカレンダーを表示するプログラムを作成」
どげんかせんといかん事を一個づつ分解していきませう。
まず
1.年と月の入力を受け取る。
シンプルですね簡単ですね。このレベルで躓くなら、対象言語の入門書あたりを確認してください。
で…
1-1.入力がない、もしくは入力が無効の場合、デフォルトを「今」にする
こんなちょっとした小技がステキだったりします。小枝は美味しいのですが。
つぎ。ここらあたりから微妙に本題。
2.対象年月の「末日」を求める
ここで「ふふん簡単」とか思うと、閏年問題に引っかかりますのでご注意を。
んで。
3.1日から「末日」までの数字をとりあえず出力する
いったんは「数字だけ」。その後で、テーブルタグだのcssだのを使って「縦に」出力したり「横に」出力したりして遊んでおくと後々便利です。
そろそろ面白く。
4.3番の日付に「曜日」を付け足して表示する
曜日の算出方法は色々ありますが。言語が持ってるなんらかのお便利なclassがない場合とか頑張ってみたいとかいう場合、「ツェラーの公式(Zeller's congruence)」を用いてみるとよいでせう。
ここでも、すこ〜し表示で遊んでみると面白いです。
ちなみに、ここで最低限の「カレンダー」は完成だったりしますw
でもまぁせっかくなので、いわゆる「四角いの」を考えて見ませう。
四角いカレンダーを作る場合。最大のポイントは「どこで改行するか?」に尽きます。
とりあえず、多分一般的だと思う「日〜土」の並びで考えてみますが。
回答を書いてしまうと
for(day = 1; day >= 末日; day ++;) {
日付の出力処理
if (true == is土曜日(day)) {
改行処理
}
}
概ねこんな感じです…でだまされると酷い事になりますw
第一週が変に左よりになっちゃうんですね。
なので。ループの前に、こんな処理を入れてあげます。
if (1日が月曜日なら) {
空白を1つ
} else
if (1日が火曜日なら) {
空白を2つ
} else
if (1日が水曜日なら) {
空白を3つ
} else
if (1日が木曜日なら) {
空白を4つ
} else
if (1日が金曜日なら) {
空白を5つ
} else
if (1日が土曜日なら) {
空白を6つ
}
for(day = 1; day >= 末日; day ++;) {
日付の出力処理
if (true == is土曜日(day)) {
改行処理
}
}
とりあえず出来ますが…うんぶっちゃけ「うざい」。
ここで。曜日の数値に注目します。多くのツェラーの公式では、0が日曜日〜6が土曜日になります*1。
あれ?
ほら冷静に、上のプログラムをもう一度。
ツェラーの公式では、1なら月曜日、2なら火曜日、3なら水曜日、以下略。
…なんか共通点見えてきません?
ってなわけで、改造。
n = ツェラーの公式(1日)
空白をnつ
for(day = 1; day >= 末日; day ++;) {
日付の出力処理
if (true == is土曜日(day)) {
改行処理
}
}
ほぉらシンプル。
これで概ねカレンダーができあがります。
OKざましょか?
余談
多分、やると怒られるか、或いは怒ってすら貰えない別解。とりあえずPHPで。
$y、$mに年と月が入ってるとします。
$s = `cal $m $y`; print $s ;
おそまつ。
- 34 http://reader.livedoor.com/reader/
- 13 http://mixi.jp/view_bbs.pl?id=11919498&comment_count=968&comm_id=59939
- 9 http://mixi.jp/view_diary.pl?id=1049707817&owner_id=6707097
- 5 http://www.google.co.jp/reader/view/
- 5 http://www.google.co.jp/reader/view/?tab=my
- 4 http://www.google.com/reader/view/
- 4 http://www.new-akiba.com/archives/2008/12/post_12788.html
- 3 http://209.85.175.132/search?q=cache:551H9JSIY9kJ:logic.stepserver.jp/memo.cgi/archive/506/+php+文字列 比較&hl=ja&ct=clnk&cd=1&gl=jp&lr=lang_ja&client=firefox-a
- 3 http://logic.stepserver.jp/memo.cgi/archive/506/
- 3 http://mixi.jp/view_bbs.pl?id=38665052&comm_id=3917430