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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

4回答

13203閲覧

うるう年を判別するコードについて

ksk_2200

総合スコア8

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2017/07/26 01:50

java初心者です。
うるう年かどうかを出力するコードを作ったのですがうるう年でも、うるう年と出力できず、「うるう年ではない」となります。
こちらの問題点がわからないので教えていただけないでしょうか。
うるう年であると出力する条件式のところがなにかおかしいまではわかるのですが解決策が思い浮かびません。
お手数ですが改善策をよろしくお願いします。
問題のコード
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

//西暦が4で割り切れる年は閏年である。
//ただし、100で割り切れる年は閏年ではない。
//ただし、400で割り切れる年は閏年である。
public class Uru_year {
public static void main(String[]args)throws IOException{

System.out.println("西暦で年号を入力してください"); BufferedReader br= new BufferedReader(new InputStreamReader(System.in)); try{ String num=br.readLine(); int year=Integer.parseInt(num); if(year<1898){ System.out.println(year+"年は日本がまだ閏年を考えた暦を採用していません。wiki参照。"); }else if(year%4==0 && year%400==0 && year%100!=0){ System.out.println(year+"年は閏年です。"); }else if(year%4==0 && year%400==0 && year%100==0){ System.out.println(year+"年は閏年ではありません"); }else if(year>2100&&year<2999){ System.out.println(year+"年はあまり現実的ではありません。"); }else{ System.out.println(year+"年は閏年ではありません"); } } catch(NumberFormatException e){ System.out.println(e); System.out.println("数字が入力されていません。"); }

}
}

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2017/07/26 01:52

プログラムコードは```で囲ってください。(わからなければ質問編集画面でコード部分を選択し<code>ボタンを押してください)
m.ts10806

2017/07/26 01:53

「うるう年ではない」となるときのInputはどのような値でしょう?
ksk_2200

2017/07/26 01:53

ご指摘ありがとうございます!!
guest

回答4

0

javaのプログラムの問題というよりは論理の問題といえるかと思います。

year%4==0 && year%400==0 && year%100!=0

この条件式を考えてみましょう。4で割り切れて400で割り切れたとしましょう。400で割り切れるのですから100で割り切れるのは自明です。にもかかわらず100で割り切れないという条件は意味がありませんん。うるう年の定義を素直に実装すると以下のようになります。

java

1if (year % 4 == 0) { 2 // うるう年である確率が高い。しかし例外があるからそれを判定 3 if (year % 100 == 0) { 4 // うるう年でない例外的な年である確率が高い。しかしまだ例外があるからそれを判定 5 if (year % 400 == 0) { 6 // 4で割り切れて100でも割り切れて400でも割り切れるなら、うるう年である 7 } else { 8 // 4で割り切れて100でも割り切れて400では割り切れないなら、うるう年でない 9 } 10 } else { 11 // 4で割り切れて100で割り切れないなら、うるう年である 12 } 13} else { 14 // 4で割り切れないなら、うるう年でない 15}

これでは長ったらしいということで、「うるう年の条件を完全に満たす条件は何か」を考えてみれば例えば次のようになります。

4で割り切れるか100で割り切れるか400で割り切れるかうるう年か
nono(自明)no(自明)no
yesnono(自明)yes
yesyesnono
yesyesyesyes

上の表の「うるう年がyes」になる条件の組み合わせを考えてみればよいわけです。条件判定は一通りではありませんが例えば以下のようにすればよいです。(&&,||の演算子の優先順位の仕様から括弧は必要ありませんが、分かり易さのためにあえて入れています)

java

1if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { 2 // うるう年である 3} else { 4 // うるう年でない 5}

条件を満たすように条件の組み合わせを注意深く吟味するという点が要点だと思います。

投稿2017/07/26 02:21

編集2017/07/26 02:28
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

うるう年だと判定する部分がここですが、

java

1else if(year%4==0 && year%400==0 && year%100!=0)

「4で割り切れ、かつ400で割り切れ、かつ100で割り切れない」
という数は存在しません。400で割り切れれば必ず100で割り切れるので。
なので、「4で割り切れる」の中で場合分けが必要になります。

java

1if (year % 4 == 0) { 2 if (year % 400 == 0 || year % 100 != 0) { 3 //うるう年 4 } else{ 5 //平年 6 } 7}

投稿2017/07/26 02:02

編集2017/07/26 02:06
swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

4で割り切れるけど400で割り切れない数字の時は全部elseに行っちゃってますね

}else if(year%4==0 && year%400==0 && year%100==0){
System.out.println(year+"年は閏年ではありません");

400で割り切れているのにうるう年ではありませんになってますね

投稿2017/07/26 01:57

編集2017/07/26 02:03
hillacken

総合スコア359

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Java8をお使いでしたら、LocalDate#isLeapYear() で判定できます。

投稿2017/07/26 02:27

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2017/07/26 02:30

YearクラスにisLeapメソッドがあります。こちらはstaticメソッドもあるのでインスタンス生成の必要もないです(内部で生成しているかも)
A-pZ

2017/07/26 02:46

なるほど確かにもっといいのありましたね~!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問