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

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

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

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

2回答

4532閲覧

javaでの学年の計算

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2015/11/15 12:31

編集2015/11/15 12:38

javaにて、学年を計算して表示するプログラムを作っています。

入学した年月日をはじめに定義して、
カレンダーで、今日の年月日をからめて、学年を算出します。

4月1日~3月31日までは、
1つの学年であるサイクルです。

例えば、
2012年4月1日に入学した人の場合、
今日では、Grade=4(年生)、

今日に入学した人の場合、
今日では、Grade=1(年生)、

明日以降の日付に定義した場合、
今日では、Grade=0(年生)というような感じです。

留年という概念はないものとしてお願いします。

以下に示すプログラムは条件分岐がありません。
どのように改良したらよいでしょうか?

import java.util.Calendar;
import java.util.Date;
省略

int Grade = 0; int enter_year = 2012; int enter_month = 4; int enter_day = 1; Calendar cal = Calendar.getInstance(); // 学年を計算する。。※Gradeに1を加える場合がある Grade = cal.get(Calendar.YEAR) - enter_year; System.out.println(Grade);

省略

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

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

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

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

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

guest

回答2

0

ベストアンサー

「入学年月日の属する年度の4月1日」を基準に考えたほうがわかりやすいかと思います。

現在年月日が入学年月日より前 --YES--> 学年 = 0
|
NO

入学の月日が4月1日より後 -> 基準年 = 入学年
入学の月日が4月1日より前 -> 基準年 = 入学年 - 1

学年 = 現在の年 - 基準の年 + 1

現在の月日が4月1日より前 -> 学年++

これをコード化すればいいと思います。
「月日が4月1日より前か後か」は、cal.get(Calendar.MONTH)Calendar.APRILの比較が簡単です。

投稿2015/11/15 12:42

編集2015/11/15 15:04
swordone

総合スコア20651

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

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

退会済みユーザー

退会済みユーザー

2015/11/15 13:56

回答ありがとうございます。 anotherCal.set(Calendar.MONTH, 4); anotherCal.set(Calendar.DATE, 1);の中の、 4と1は、比較対象としての定数ですか? それとも、任意で決める変数ですか? 色々なパターンを試しましたが、 全てうまくできませんでした。 以下の項目が確認できませんでした。 ・1月1日から3月31日の入学も、 前年4月1日以降に入学した人と同じ学年である。 ・明日以降の日付では0年生である。
swordone

2015/11/15 14:16

すいません、勘違いしていたようで、同じ年度内に入学した人は全て同じ学年と判定したいのですか? 「明日以降の日付」というのが、何の明日なのかがわからないので…
退会済みユーザー

退会済みユーザー

2015/11/15 14:25

はい、 同じ年度内4月1日から翌年3月31日に入学した人は、 全て同じ学年と判定したいです。 今日が2015/11/15であり、今日入学するときは1年生で、 2015/11/16や2016/1/1でも、明日以降に入学する場合は0年生です。
guest

0

ご質問の主旨とは少しズレますが、参考までに、Java8から使えるようになった日時APIを使った場合を考えてみました。

もう少しスッキリ書けると思いましたが、そうでも無かったです...

(追記)
swordoneさんのご指摘を元に(というかそのまま)コードを修正してみました。
かなりスッキリしましたね。

lang

1// Java8以降 2 3// import java.time.*; 4// import java.time.temporal.ChronoUnit; 5 6static int calculateGrade(int year, int month, int day) { 7 LocalDate today = LocalDate.now(); 8 // 入力日付 9 LocalDate input = LocalDate.of(year, month, day); 10 if (input.isAfter(today)) { 11 // 今日より後ならゼロ 12 return 0; 13 } 14 15 // 入学年度初日を算出 16 LocalDate first = LocalDate.of(year, 4, 1); 17 if (first.isAfter(input)) { 18 // 入学年度の4月1日が未来日なら1年前の同日 19 first = first.minusYears(1); 20 } 21 // 開始する数(1)+(入学年度-当日年) ※intのmaxを超えるケースは無視 22 return 1 + (int)ChronoUnit.YEARS.between(first, today); 23}

投稿2015/11/15 14:45

編集2015/11/16 03:26
argius

総合スコア9388

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

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

退会済みユーザー

退会済みユーザー

2015/11/16 01:35

ご回答ありがとうございます。 プログラムを実行してみたところ、 2012年4月1日に入学すると現在4年生で、 2013年1月1日から2013年3月31日に入学すると 現在4年生になり、合ってますが、 2012年4月2日から2012年12月31日までに入学すると 現在3年生になってしまいます。 2012年4月2日から2012年12月31日も、 2013年3月31日までは、現在4年生にするには、 どのようにしたらよいでしょうか?
swordone

2015/11/16 02:00 編集

比較対象は「入学日と今年度初日」ではなく、「入学年度初日と今日」にするべきですね。 --- // 年度初日を算出 の部分から //入力された「入学日」と同じ年の4月1日 LocalDate first = LocalDate.of(year, 4, 1); if (first.isAfter(input)) { //入学年の4月1日が入学日よりも後なら、入学年度初日は1年前の4月1日 first = first.minusYears(1); } // 年の差分を加算 (intのmaxを超えるケースは無視) grade += ChronoUnit.YEARS.between(first, today); return grade; //あるいはgradeという変数を消して //return (int)ChronoUnit.YEARS.between(first, today) + 1; --- これなら、この後のif文はいらないと思います。
argius

2015/11/16 03:31

mo878moさん すみません、swordoneさんのご指摘通りです。 swordoneさん ご指摘&修正ありがとうございます。 テストはしたんですが、テストが間違っていました。 一晩経ってから見てみたら、ロジックがめちゃくちゃですねこれ。 改めてよく考えてみたら、理解できました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問