キーボードからの文字列入力

<概要>キーボードからの文字列入力を取得する方法を学びます。
ところが、場違いに難しかったりするわけで……。
今はまだ知らなくても良いことがたくさん出てくるので、割り切って読んで下さい(笑)。


例題3-2-1 名前と年齢を尋ねるプログラム。

○プログラム

import java.io.*;

public class HowOldAreYou{
  public static void main(String[] args){
    System.out.println("あなたの名前を入力して下さい。");
    BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
    try{
      String line=reader.readLine();
      System.out.println(line+"さん、こんにちは。");
      System.out.println("年齢を入力してください。");
      line=reader.readLine();
      int age=Integer.parseInt(line);
      System.out.println("いま"+age+"歳とすると、10年後は"+(age+10)+"歳ですね。");
    }catch(IOException e){
      System.out.println(e);
    }catch(NumberFormatException e){
      System.out.println("年齢が正しくありません。");
    }
  }
}


○注意

重要なのは try ブロック内部。
readLine メソッドが文字列を1行分取得します。
難しい一文を飛ばして読むと全体が見えてくるかも。
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));

○実行例

D:\atsushi\Java\List3-5>java HowOldAreYou
あなたの名前を入力して下さい。
atsushi
atsushiさん、こんにちは。
年齢を入力してください。
20xx
年齢が正しくありません。
-- Press any key to exit (Input "c" to continue) --
-- Input "exit" to exit from CommandPrompt --

D:\atsushi\Java\List3-5>java HowOldAreYou
あなたの名前を入力して下さい。
atsushi
atsushiさん、こんにちは。
年齢を入力してください。
100
いま100歳とすると、10年後は110歳ですね。

D:\atsushi\Java\List3-5>

○解説

1. import java.io.*;

import は、クラスライブラリを利用する際に使います。
C言語、C++言語の include みたいな感じ。
詳しくは「パッケージ」で解説します。

6. BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));

BufferedReader はバッファリングしながらデータの読み込みを行う為のクラスです。
次に new ですが、Java言語では、new の後ろにクラスの名前を書いて括弧 () を付けると
「そのクラスに属するオブジェクトを作れ」という命令になります。
C++言語では、動的変数、動的オブジェクト作成(メモリ領域の確保)に new を使いましたが、それと同じです。
したがって、new BufferedReader( … ); は
「BufferedReader クラスに属するオブジェクトを新しく作れ」という命令になります。
ところが、括弧の中を見ると更に new があります。
new InputStreamReader(System.in) は、
「標準入力 System.in をもとに、InputStreamReader クラスに属するオブジェクトを新しく作れ」という命令です。
つまり、6行目の一文をまとめると……
・標準入力 System.in をもとに、InputStreamReader オブジェクトを作り、
・それをもとに、BufferedReader オブジェクトを作り、
・変数 reader を、その BufferedReader オブジェクトで初期化する

ということになります。
これ以上の詮索は無用です(笑)。
reader という変数はデータの読み込みが出来るんだ、
ということだけ分かればこのプログラムを読むのに十分でしょう。
詳しくは「例外」で解説します。

7. try{
14. }catch(IOException e){
16. }catch(NumberFormatException e){

これは例外処理と呼ばれるエラー処理の一種です。
try{ … } の中で起こったエラーを catch( … ){ … } で処理します。
私はC言語やC++言語で例外処理を実装する方法を知りませんが、
Java言語では意外と簡単に出来てしまうんですね。

8. String line=reader.readLine();

String は文字列を表すクラスです。
readLine メソッドは文字列を1行分取得するメソッドです。

C言語の scanf は指定した型に変換してくれましたし、
C++言語の cin は適切な型に変換してくれましたが、
readLine メソッドの返却値型は String と決まっています。

12. int age=Integer.parseInt(line);

Integer は int 型に関連した便利な機能をたくさん持つクラスです。
このような基本型に対応したクラスのことをラッパークラスといいます。
parseInt メソッドは(文字の)数字を整数値に変換します。
ここで、変換に失敗すると例外が発生し、それ以降の処理を中断して、
16. }catch(NumberFormatException e){
にジャンプします。

実行例より「20xx」という数字に変換できない文字列を入力すると
「年齢が正しくありません。」と表示され、
「100」という数字に変換できる文字列を入力すると
「いま100歳とすると、10年後は110歳ですね。」(←生きていればネ!)と表示されます。

ラッパークラス一覧

基本型 ラッパークラス
boolean Boolean
byte Byte
char Character
double Double
float Float
int Integer
long Long
short Short
void Void

例題3-2-2 九九練習プログラム。

○プログラム

長いので、別窓でご用意致しました( click here )。

○注意

プログラムは長いが、大したことはやっていない。
public static boolean showQuestion(int questno) というメソッドを自作しているのに注意。
プログラムとは関係ないけど、メモ帳に貼り付けてもプログラムの体裁が完全に保たれるのは凄い!
VC++.NET だと、どんなに頑張っても完全に保つことは不可能だったというのに……CPad バンザーイ(笑)!

○実行例

D:\atsushi\Java\List3-7>java Kuku
これから九九の問題を10問出します。
[第1問] 9×1=?
9
はい、正しいです。
[第2問] 2×9=?
18
はい、正しいです。
[第3問] 9×1=?
nine
入力が正しくありません。
[第4問] 5×2=?
52
残念、まちがいです。
[第5問] 9×3=?
27
はい、正しいです。
[第6問] 9×4=?
36
はい、正しいです。
[第7問] 1×7=?
0
残念、まちがいです。
[第8問] 3×3=?
9
はい、正しいです。
[第9問] 4×4=?
16
はい、正しいです。
[第10問] 9×6=?
gojuyon
入力が正しくありません。

問題は10問ありました。
正しく答えられたものは6問で、
間違ってしまったのは4問です。
正答率は60.0%です。

お疲れさま
-- Press any key to exit (Input "c" to continue) --

○解説

13. public static final int MAX_QUESTION=10;

final という修飾子を付けると定数になります。
あれ!?const はどうしちゃったの〜?
const は予約語ですが、使えません。
ところで、宣言されている場所に注目して下さい。
いつもみたいにメソッド内部ではなく、メソッド外部、クラス内部で宣言されていますね。
したがって、MAX_QUESTION は変数ではなく、Kuku クラスのフィールドです。
フィールドの詳細は「オブジェクト指向へ向けて」で解説します。

46. int x=(int)(Math.random()*9)+1;

Math クラスの random メソッドは、0.0以上1.0未満の double 型乱数を返します。
Math.random()*9 より、0.0以上9.0未満の乱数になり、
(int) でキャストすることにより、0以上8以下の int 型乱数になります。
キャストの方法はC言語、C++言語のそれと一緒ですね。
したがって、(int)(Math.random()*9)+1 は1以上9以下の int 型乱数を返します。

*=*=*=*=*=*=*=*=*=*= コメント *=*=*=*=*=*=*=*=*=*=

// …     一行コメント
/* … */   通常のコメント
/** … */  ドキュメンテーション・コメント

さり気なく /** … */ が使われているのに気付いたでしょうか?
ドキュメンテーション・コメントは、
プログラムの説明文章を機械的に生成するために用いられる特殊なコメントです。

ここに書かれた文章から、JDKの javadoc というツールを使って
自動的にマニュアルを作成することができます。

それでは、実際にやってみましょう。
方法は簡単で、コマンドラインから javadoc Kuku.java と入力するだけです。

□実行結果

D:\atsushi\Java\List3-7>javadoc Kuku.java
ソースファイル Kuku.java を読み込んでいます...
Javadoc 情報を構築しています...
標準 Doclet バージョン 1.4.2_05
constant-values.html の生成
全パッケージとクラスの階層ツリーを作成しています...
全パッケージとクラスのインデックスを作成しています...
overview-tree.html の生成
index-all.html の生成
deprecated-list.html の生成
全クラスのインデックスを作成しています...
allclasses-frame.html の生成
allclasses-noframe.html の生成
index.html の生成
packages.html の生成
Kuku.html の生成
package-list の生成
help-doc.html の生成
stylesheet.css の生成

D:\atsushi\Java\List3-7>

□解説

生成されたドキュメントの現物はこちらです。
使いこなせればかなり便利かも!?
タグやらオプションやら面倒くさいですが。

□補足

通常コメント、ドキュメンテーション・コメント共に、
各行の先頭は「* 」とするのがマナーみたいですね。
とりわけ、ドキュメンテーション・コメントの場合、
CPad は自動的に「* 」を入力してくれましたから。


戻る / ホーム