作って覚えるプログラミング精選課題集(Java基礎編）

文法はそれなりに覚えたからそろそろ何か作ってみたいという人向けに、手頃そうな課題を集めて整理してみました。どれも独立しているのでどこからでも取り組めます。
Java以外でも使えるかも？新人教育や暇つぶしに活用してみてください。

#目次

[レベル1 FizzBuzz](http://qiita.com/s_hino/items/85ce20cb675484d300f0#%E3%83%AC%E3%83%99%E3%83%AB1-fizzbuzz) ※時間目安 1時間
ウォーミングアップ

[レベル2 掛け算九九](http://qiita.com/s_hino/items/85ce20cb675484d300f0#%E3%83%AC%E3%83%99%E3%83%AB2-%E6%8E%9B%E3%81%91%E7%AE%97%E4%B9%9D%E4%B9%9D) ※時間目安 2時間
ループの使い方、関数化

[レベル3 干支の計算](http://qiita.com/s_hino/items/85ce20cb675484d300f0#%E3%83%AC%E3%83%99%E3%83%AB3-%E5%B9%B2%E6%94%AF%E3%81%AE%E8%A8%88%E7%AE%97) ※時間目安 4時間
少し複雑なロジック（引数、二次元配列）

[レベル4 会員登録機能](http://qiita.com/s_hino/items/85ce20cb675484d300f0#%E3%83%AC%E3%83%99%E3%83%AB4-%E4%BC%9A%E5%93%A1%E7%99%BB%E9%8C%B2%E6%A9%9F%E8%83%BD) ※時間目安 6時間
クラスとインスタンス、JavaBeans

[レベル5 ミュージックプレイヤー](http://qiita.com/s_hino/items/85ce20cb675484d300f0#%E3%83%AC%E3%83%99%E3%83%AB5-%E3%83%9F%E3%83%A5%E3%83%BC%E3%82%B8%E3%83%83%E3%82%AF%E3%83%97%E3%83%AC%E3%82%A4%E3%83%A4%E3%83%BC) ※時間目安 8時間
継承とインターフェース

※開発環境を構築してあることが前提です。
　想定環境 Java8

#レベル1 FizzBuzz

まずはこれでウォーミングアップします。
想定所要時間：1時間

##仕様

3の倍数の時に「Fizz」、5の倍数の時に「Buzz」、3と5の両方で割り切れる場合に「FizzBuzz」と出力する。

##プログラム一覧

- FizzBuzz.java
 - public static void main(String args[])  
計算と条件分岐を行いコンソールに出力する

#レベル2 掛け算九九

ループの使い方に慣れることが目標です。
想定所要時間：3時間

##仕様

こんな感じでコンソール出力する

> 1  2  3  4  5  6  7  8  9
> 2  4  6  8 10 12 14 16 18
> 3  6  9 12 15 18 21 24 27
> 4  8 12 16 20 24 28 32 36
> 5 10 15 20 25 30 35 40 45
> 6 12 18 24 30 36 42 48 54
> 7 14 21 28 35 42 49 56 63
> 8 16 24 32 40 48 56 64 72
> 9 18 27 36 45 54 63 72 81


文字と文字の間はタブ文字を挿入する

##プログラム一覧

- Kakezan.java
 - public static void main(String args[])  
「kuku」メソッドを呼び出す
 - private void kuku()  
掛け算をしてコンソールに出力する

##ヒント

- 掛け算は二重ループを使う
- 文字間と改行はエスケープシーケンスを使う

#レベル3 干支の計算

西暦4桁から干支を算出するプログラムです。
ちょっと複雑なロジックに慣れることが目標です。
>■メッセージの例
>2017年の干支は丁酉（ひのととり）です。

想定所要時間：6時間

##仕様

以下を参照する
http://hishoshou.blog108.fc2.com/blog-entry-6.html

##プログラム一覧

- Eto.java
 - public static void main(String args[])  
seinenを引数にしてgetJikkanを呼び出し、結果を文字列型で受け取る  
seinenを引数にしてgetJunishiを呼び出し、結果を文字列型で受け取る  
コンソールに出力する     
 - private enum jikkan  
  十干をenum型で定義する  
　例：KANOE("庚"),KANOTO("庚")･･･ 
 - private String getJikkan(int year)  
yearをもとに十干を算出して文字列の形でreturnする
 - private enum junishi  
  十二支をenum型で定義する  
　例：SARU("申"),TORI("酉")･･･  
 - private String getJunishi(int year)  
yearをもとに十二支を計算して文字列の形でreturnする

##ヒント

十日と十干は特定の数値でyearを割った余りの値を元に算出します。
十干と十二支はenumで定義し、上で算出したものを返却します。例えばyearから算出した結果が0だった場合、結果は「庚」となります。
enumを用いた実装を想定していますが、どうしてもわからず詰まってしまった場合にはif文での条件分岐やswitch文を用いた実装でも構いません。


#レベル4 会員登録機能

クラスとインスタンス、JavaBeansの使い方に慣れることが目標です。
想定所要時間：6時間

##仕様

3人分の会員情報を登録し、コンソールに以下のような文言を出力してください。
<例>
山田太郎さんの会員IDは0001です。登録：2017年4月1日

登録会員
>①ID：0001 名前：山田太郎 登録日時：現在日時(yyyy/mm/dd)
>②ID：0002 名前：鈴木花子 登録日時：現在日時(yyyy/mm/dd)
>③ID：0003 名前：佐藤琢磨 登録日時：現在日時(yyyy/mm/dd)

出力はプログラムの最後にまとめて行ってください。
※データベースに登録するわけではないので「なんちゃって」会員登録です

##プログラム一覧

すべてのjavaファイルはjp.co.kenshuパッケージ内に作成すること

- Kaiin.java

　int型「id」
　String型「name」
　Date型「addDate」
　※それぞれgetter/setterを作成する

- Register.java
 - public static void main(String args[])  
ArrayListクラスを使ってKaiin型の動的配列「kaiinAll」を作成する。  
kaiinAddメソッドを呼び出して結果をKaiinAllに追加する。※登録会員数分繰り返す  
KaiinAllに入っているすべての会員情報をコンソールに出力する  
 - private Kaiin kaiinAdd(int id,String name)   
Kaiinクラスのインスタンスを作成する  
引数を使ってIDと名前をsetする。登録日時はDate関数を使う  
データをセットしたインスタンスをreturnする  

##ヒント

ポイントはKaiin型の動的配列を作るところです。
作ったデータがどこにいるのかをよく追いかけながら作成してみてください。

#レベル5 ミュージックプレイヤー

継承とインターフェースの使い方に慣れることが目標です。
想定所要時間：8時間

##仕様

ウォークマン(walkman)とiPod(iPod)の２種類の音楽プレイヤーを作成してください。
どちらにも再生・一時停止・停止の機能が備わっています。
任意の曲名とアーティスト名を入れられるようにしてください。
操作はmainメソッドを使用して行ってください。
>■使用開始メッセージの例
>iPodの使用を開始します。
>
>■曲名・アーティストのメッセージの例
>いきものがかり の ブルーバード を再生します。

また、ウォークマンとiPodの機能特徴は以下の通りですので個別のメソッドで実装してください。

>■ウォークマン
>再生：「爆音で再生します」
>一時停止：「3分間待ってやる」
>停止：「停止しました」
>
>■iPod
>再生：「ひかえめに再生します」
>一時停止：「かしこまりました、一時停止します」
>停止：「再生を停止しました」


##プログラム一覧

すべてのjavaファイルはjp.co.kenshuパッケージ内に作成すること

- Player.java  
※インターフェースです。戻り値なし、引数なしで以下のメソッドを定義  
再生(start)  
一時停止(pause)  
停止(stop）  
- Title.java  
 - protected void display(String music,String artist)  
曲名とアーティスト名をコンソールに出力する
- Ipod.java  
  ※Titleを継承、Playerを実装する  
 - public void useIpod(String music,String artist)  
コンストラクタでiPod使用開始メッセージを出力する  
もし曲名もしくはアーティスト名がnullか0文字だったら
「再生に失敗しました」と出力して処理を終了する  
曲名とアーティスト名をコンソールに出力する  
ふるまいを上記の仕様通りに実装する  
- Walkman.java
　※Titleを継承、Playerを実装する  
 - public void useWalkman(String music,String artist)  
コンストラクタでWalkman使用開始メッセージを出力する  
もし曲名もしくはアーティスト名がnullか0文字だったら
「再生に失敗しました」と出力して処理を終了する  
曲名とアーティスト名をコンソールに出力する  
ふるまいを上記の仕様通りに実装する
- MusicPlayAction.java
 - public static void main(String args[])
WalkManクラスのインスタンスを作成する  
曲名とアーティスト名を引数にしてWalkｍanを使用してみる  
iPodクラスのインスタンスを作成する  
曲名とアーティスト名を引数にしてiPodを使用してみる  

##ヒント

プログラム数が多いですが、それぞれの役割を理解して進めてみるといいと思います。

>Player.java 共通の動作のみを定義するインターフェース
>Title.java 曲名とアーティストを表示する処理を抽出したスーパークラス
>Walkman.java ウォークマンの動作を記述するクラス
>Ipod.java iPodの動作を記述するクラス
>MusicPlayAction.java 処理を呼び出すクラス（Mainメソッド）


#あとがき
いかがでしたでしょうか。結構いいトレーニングになるのではと思います。
不足や動かない等ありましたら教えてください。
次回Webアプリ編を予定しています。