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

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

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

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

0回答

933閲覧

何日前/後の日付を決めるメソッドの書いてあることが分かりません。

whitehorse85921

総合スコア34

Java

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

0グッド

0クリップ

投稿2019/03/23 06:53

編集2019/03/23 08:00

前提・実現したいこと

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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

jimbe

2019/03/23 06:56

ソースコードは, "ソースコード" と書かれている, "```" で囲まれた中に書いて頂けますか. そして, 先頭の "```" の直後に "java" と言語名を書いておいていただけると, より分かり易くなりますので.
jimbe

2019/03/23 07:02

日付に日を足して/引いて, 日付として正しい月や年になるよう修正しているように見えますが, 具体的にどの箇所がお分かりにならないのでしょうか.
whitehorse85921

2019/03/23 07:05

遅くなって申し訳ありません。 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]; の部分の意味が分かりません。 お時間を取らせてしまい申し訳ありません。
jimbe

2019/03/23 07:09

前半部分は, 日が月の最終日を越えていたら, 翌月の日付にしています. さらに月が年の最終月(12)を越えていたら翌年の日付(1月)にしています. 後半部分は, 日が1未満になっていたら, 前月の日付にしています. さらに月が年の開始月(1)未満になっていたら, 前年の日付(12月)にしています. ...コードそのままです.
whitehorse85921

2019/03/23 07:26

ありがとうございます。 前半部も後半部もif~の部分がとても分かりやすかったです! temp.d -= mdays[isLeap(temp.y)][temp.m - 1];の[temp.m - 1]は月の最終日を表しているのでしょうか?
jimbe

2019/03/23 07:36

月の最終日は2次元配列 mdays に並べられています. "temp.m-1" という式は, temp.m が月を 1~12 という値の範囲で保持していますが, 配列の範囲は 0~11 のため, -1 しています.
whitehorse85921

2019/03/23 07:44

貴重な時間を質問に答えていただきありがとうございます。 納得です!
jimbe

2019/03/23 07:45

ソースコードの記述の修正, ありがとうございます. インデントが付いたりで見やすくなりました^^ "該当のソースコード" の下から修正頂いたソースコードの間のコードは, YMDクラスの一部でしょうか. もしお時間ありましたら, 削除頂いてもよろしいでしょうか.
whitehorse85921

2019/03/23 07:51

修正いたしました。 これでよろしかったでしょうか? きめ細やかに教えて下さりありがとうございます。
jimbe

2019/03/23 07:57

何度も申し訳ないです. 折角なので最後に一つ?だけ宜しいでしょうか. "Javaここに言語名を入力" ですが, 「ここに言語名を入力」は削除頂いて大丈夫です. そうしますと, コードの表示枠の左上に java と表示されます. 直下の「ソースコード」も削除頂いて大丈夫です. どちらの文言も記入する際に上書きする様になっているものと思いますが, 若干分かりにくいですね><
whitehorse85921

2019/03/23 08:02

書き方も勉強になりました! 以後気を付けます。 誠にありがとうございますm(__)m
jimbe

2019/03/23 08:20

修正依頼のほうが長くなってしまったようですいませんでした. お疲れ様でした(_ _;
whitehorse85921

2019/03/23 08:23

いえいえ! こちらの至らなさでたくさんお気を使わせてしまって、こちらこそすみませんでしたm(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問