###前提・実現したいこと
Pyhonでキーボードから「1994/1」のように「年/月」という形式の文字列をコンソールに入力すると、キャンバス上にその月のカレンダーを表示するプログラムを作っているのですが、難しくて何も進めることができておりません。
また、できれば以下のようなこともできるようにしたいです。
・土曜日や日曜日を別の色で描画する。
・キャンバス上に「進む」「戻る」を表すボタンを描画し、クリックするとそれぞれ「次の月」「前の月」のカレンダーに切り替わる
###発生している問題・エラーメッセージ
エラーメッセージ以前に問題が解けません。
###課題で与えられたヒント
ヒント1 まず、指定された月の「一日(ついたち)の曜日」を調べる必要があります。 「ツェラーの公式」を利用すると便利なので、調べてみましょう。 また、上記の公式を関数として利用できるようにしておくと便利です。 なお、小数点以下切り捨てで割り算を行いたい場合、 a / b と割り算をするところを、 割り算ごとに int(a / b) のように書きましょう。 または、 a // b とすると、割った結果に床関数( floor )を適用するため、 「 a / b 以下の最大の整数」を計算できます。 ヒント2 「年」と「月」の値を引数に取り、その月の「日数」を返す関数を作りましょう。 ただし、「2月」だけは閏年の関係で年ごとに日数が異なるため、注意が必要です。 閏年の計算は次のようにできます。 •「年」が400で割り切れれば閏年 •そうでなく、「年」が100で割り切れれば閏年でない •そうでなく、「年」が4で割り切れれば閏年 •そうでない場合は閏年でない 上記についても、「閏年かどうかを判別する関数」というのを別途定義するのが良いかもしれません。 ヒント3 カレンダーは最大で6行になります。 プログラムの実現方法は無数にありますが、 たとえば2015年5月(2015/5/1は金曜日)のカレンダーを 表示しようとする場合、先に次のような形式のデータを 作っておくとやりやすいかもしれません。 calendar_data = [ 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31] 上記は、先頭に余計な 0 が含まれている以外は描画しようと しているカレンダー(日曜日始まり)の内容と同じです。 なお、わかりやすいように7列ごとに改行をしていますが、 実際にはただの1次元リストです。 上記のようなデータを作ったら、キャンバス上のそれぞれの値ごとに 決まった位置に日付を描画していきます。 ただし、値が 0 になっている箇所は その月以外の日付ですので、描画を行いません。 この「決まった位置」は、次のように計算できます(先頭の要素が「0行0列目」です)。 •行番号は int(要素のインデックス / 7) で計算できる •列番号は 要素のインデックス % 7 で計算できる 例えば、上記の例で「2015年5月6日」の要素のインデックスは 10 ですので、 以下のようになります。 • int(10 / 7) = 1 • 10 % 7 = 3 つまり、「2015年5月6日」は「1行3列目」にくることになります。 この情報を元に、キャンバス上の適切な位置に「 6 」という日付を 描画すればいいことになります。 さらに、上記の6行7列の すべてにこれを繰り返せば、カレンダーを描画できます。 このような方式で進める場合は、キャンバスのことを一回忘れて、 キーボードから入力した年月から上記のデータを作ることにまず専念しましょう。 ヒント4 ヒント3のデータを作るには、以下のように考えると良いでしょう。 •先頭の 0 ◦一日(ついたち)が日曜日の場合、なにもしない(日曜日始まりの場合、週の先頭になる) ◦一日(ついたち)が月曜日の場合、リストの先頭に1個の 0 を追加する ◦一日(ついたち)が火曜日の場合、リストの先頭に2個の 0 を追加する ◦... ◦一日(ついたち)が土曜日の場合、リストの先頭に6個の 0 を追加する •中央の日付 ◦リストに 1 から対象の月の日数までの整数を順番に追加する
ヒントを読んでもあまりつかめません…
疑似コードのみでもいいのでどうか回答よろしくお願いします。
###補足情報(言語/FW/ツール等のバージョンなど)
使用ツール:Python3.5.1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/22 23:30
2016/07/23 04:13