質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.94%

java Calendar

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,774

score 20

javaでプログラムを作成しました。
教本を見ながらやってみたのですが、うまくいきません。

import java.util.Scanner;
import java.util.Calendar;

class Cale {
    public static void main(String[] args) {
        Scanner stdin = new Scanner(System.in);

        //年を入力
        int year = stdin.nextInt();

        //月を入力
        int month = stdin.nextInt()-1;

        //曜日
        System.out.println(" 日   月   火   水   木   金   土");

        //Calendarインスタンスを作成
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, year);       //入力された年
        cal.set(Calendar.MONTH, month);     //入力された月
        cal.set(Calendar.DATE, 1);          //カレンダーを1日から始める

        //1日の週の表示
        //DAY_OF_WEEKは週の何日目かを表す
        for (int i = 0; i < 7; i++) {
            System.out.print("  ");
        }
        //他の日付の出力
        while (month == cal.get(Calendar.MONTH)) {
            System.out.print(" " + cal.get(Calendar.DATE) + "  ");
            if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {
                System.out.print("\n");
            }

            //一日加算する
            cal.add(Calendar.DATE, 1);

        }
    }
}


標準入力から年月を入力して、カレンダーを作成するプログラムです。
しかし、日付部分が曜日部分とずれてしまいます。
どこを修正すれば良いでしょうか。

また、多くを教本に頼ってしまったために、自分で作成したにもかかわらずなぜそうなるかわからない部分があります。

while、if文の中身の意味やその他の部分について、解説をしていただけると助かります。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • takotakot

    2015/05/25 20:30

    実行すれば、どのようにずれたか分かるとは思いますが、「どう表示されて」「それがどうなればよい」という情報があれば、助けになると思いますよ。

    キャンセル

回答 3

checkベストアンサー

+1

なるべく元のソースに手を加えないならこんな感じでしょうか。
ちょっぴりコメントも書いてみました。

        //1週目は日曜日から1日の前日(先月の末尾)までは空欄で埋める
        for (int i = Calendar.SUNDAY; i < cal.get(Calendar.DAY_OF_WEEK); i++) {
            System.out.print("     ");
        }

        //カレンダーが当月の間、表示する(翌月まで進んだら終わり)
        while (month == cal.get(Calendar.MONTH)) {

            //2桁に埋めて出力する(1桁と2桁があるとずれてしまうので)
            System.out.printf(" %2d  ", cal.get(Calendar.DATE));

            //土曜日の場合には改行する(翌週へ)
            if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {
                System.out.print("\n");
            }

            //一日加算する
            cal.add(Calendar.DATE, 1);
        }

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

月の最初の週の1日より前に空白を表示する以下の部分ですが、
固定で7回ループしているので、入力にかかわらずいつも同じ結果になります。
ここでDAY_OF_WEEKの出番ですね。

        //1日の週の表示 
        //DAY_OF_WEEKは週の何日目かを表す 
        for (int i = 0; i < 7; i++) { 
            System.out.print("  "); 
        } 

ここまで出来ているのなら、後は何を書けばいいのかわかると思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

        for (int i = 0; i < 7; i++) { 
            System.out.print("  "); 
        } 
この部分は  という空白を7回表示するだけの文です.
この後に続けて表示する処理を行っているため,この空白の分ずれているのでは?
        //他の日付の出力 
        while (month == cal.get(Calendar.MONTH)) { 
            System.out.print(" " + cal.get(Calendar.DATE) + "  "); 
            if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) { 
                System.out.print("\n"); 
            } 

            //一日加算する 
            cal.add(Calendar.DATE, 1); 

        } 
whileの条件文month == cal.get(Calendar.MONTH)は,calが表す月が入力した月と同じである,という条件です.
calに1日ずつ足してその都度日付を取り出し表示しているわけですが,そのまま足していくと,例えば5月(month=4)の場合5/32という日付に(計算上)なります.
このときCalendarクラスは計算をしなおして6/1と認識します.この時cal.get(Calendar.MONTH)の返り値は5(6月)になり,条件文は成立せず,whileループを抜けます.
if節は,週の最後の土曜日になった場合は改行するというだけです.

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.94%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る