前提・実現したいこと
Javaのアルゴリズムで「何日前/後の日付を決める」メソッドの意味を詳しく知りたいです。
■■な機能を実装中に以下のエラーメッセージが発生しました。
エラーはありません。
発生している問題・エラーメッセージ
エラーはありません。
該当のソースコード
Java
1import java.util.Scanner; 2 3class YMD { 4 int y; // 西暦年 5 int m; // 月(1~12) 6 int d; // 日(1~31) 7 8 //--- 各月の日数 ---// 9 static int[][] mdays = { 10 {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, // 平年 11 {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, // 閏年 12 }; 13 14 //--- 西暦year年は閏年か(閏年:1/平年:0) ---// 15 static int isLeap(int year) { 16 return (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? 1 : 0; 17 } 18 19 //--- コンストラクタ(与えられた日付に設定)---// 20 YMD(int y, int m, int d) { 21 this.y = y; 22 this.m = m; 23 this.d = d; 24 } 25 26 //--- n日後の日付を返す ---// 27 YMD after(int n) { 28 YMD temp = new YMD(this.y, this.m, this.d); 29 if (n < 0) 30 return (before(-n)); 31 32 temp.d += n; 33 34 while (temp.d > mdays[isLeap(temp.y)][temp.m - 1]) { 35 temp.d -= mdays[isLeap(temp.y)][temp.m - 1]; 36 if (++temp.m > 12) { 37 temp.y++; 38 temp.m = 1; 39 } 40 } 41 return temp; 42 } 43 44 //--- n日前の日付を返す ---// 45 YMD before(int n) { 46 YMD temp = new YMD(this.y, this.m, this.d); 47 if (n < 0) 48 return (after(-n)); 49 50 temp.d -= n; 51 52 while (temp.d < 1) { 53 if (--temp.m < 1) { 54 temp.y--; 55 temp.m = 12; 56 } 57 temp.d += mdays[isLeap(temp.y)][temp.m - 1]; 58 } 59 return temp; 60 } 61 62 public static void main(String[] args) { 63 Scanner stdIn = new Scanner(System.in); 64 65 System.out.print("日付を入力してください。\n"); 66 System.out.print("年:"); int y = stdIn.nextInt(); 67 System.out.print("月:"); int m = stdIn.nextInt(); 68 System.out.print("日:"); int d = stdIn.nextInt(); 69 YMD date = new YMD(y, m, d); 70 71 System.out.print("何日前/後の日付を求めますか:"); 72 int n = stdIn.nextInt(); 73 74 YMD d1 = date.after(n); 75 System.out.printf("%d日後の日付は%d年%d月%d日です。\n", n, d1.y, d1.m, d1.d); 76 77 YMD d2 = date.before(n); 78 System.out.printf("%d日前の日付は%d年%d月%d日です。\n", n, d2.y, d2.m, d2.d); 79 } 80}
試したこと
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
ソースコードは, "ソースコード" と書かれている, "```" で囲まれた中に書いて頂けますか.
そして, 先頭の "```" の直後に "java" と言語名を書いておいていただけると, より分かり易くなりますので.
日付に日を足して/引いて, 日付として正しい月や年になるよう修正しているように見えますが, 具体的にどの箇所がお分かりにならないのでしょうか.
遅くなって申し訳ありません。
while (temp.d > mdays[isLeap(temp.y)][temp.m - 1]) {
temp.d -= mdays[isLeap(temp.y)][temp.m - 1];
if (++temp.m > 12) {
temp.y++;
temp.m = 1;
と
while (temp.d < 1) {
if (--temp.m < 1) {
temp.y--;
temp.m = 12;
}
temp.d += mdays[isLeap(temp.y)][temp.m - 1];
の部分の意味が分かりません。
お時間を取らせてしまい申し訳ありません。
前半部分は, 日が月の最終日を越えていたら, 翌月の日付にしています. さらに月が年の最終月(12)を越えていたら翌年の日付(1月)にしています.
後半部分は, 日が1未満になっていたら, 前月の日付にしています. さらに月が年の開始月(1)未満になっていたら, 前年の日付(12月)にしています.
...コードそのままです.
ありがとうございます。
前半部も後半部もif~の部分がとても分かりやすかったです!
temp.d -= mdays[isLeap(temp.y)][temp.m - 1];の[temp.m - 1]は月の最終日を表しているのでしょうか?
月の最終日は2次元配列 mdays に並べられています.
"temp.m-1" という式は, temp.m が月を 1~12 という値の範囲で保持していますが, 配列の範囲は 0~11 のため, -1 しています.
貴重な時間を質問に答えていただきありがとうございます。
納得です!
ソースコードの記述の修正, ありがとうございます. インデントが付いたりで見やすくなりました^^
"該当のソースコード" の下から修正頂いたソースコードの間のコードは, YMDクラスの一部でしょうか. もしお時間ありましたら, 削除頂いてもよろしいでしょうか.
修正いたしました。
これでよろしかったでしょうか?
きめ細やかに教えて下さりありがとうございます。
何度も申し訳ないです. 折角なので最後に一つ?だけ宜しいでしょうか.
"Javaここに言語名を入力" ですが, 「ここに言語名を入力」は削除頂いて大丈夫です. そうしますと, コードの表示枠の左上に java と表示されます.
直下の「ソースコード」も削除頂いて大丈夫です.
どちらの文言も記入する際に上書きする様になっているものと思いますが, 若干分かりにくいですね><
書き方も勉強になりました!
以後気を付けます。
誠にありがとうございますm(__)m
修正依頼のほうが長くなってしまったようですいませんでした.
お疲れ様でした(_ _;
いえいえ!
こちらの至らなさでたくさんお気を使わせてしまって、こちらこそすみませんでしたm(__)m
あなたの回答
tips
プレビュー