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

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


問題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 は、クラスライブラリを利用する際に使います。
アスタリスクがあったり、セミコロンがあったり謎な書式ですが、
今はまだ詳しく知らなくても良いみたいです。

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( … ){ … } で処理します。
たぶん IOException は一般的なエラーに対応し、
NumberFormatException は数値関係のエラーに対応するのでしょう。
私は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){
にワープします。

ラッパークラス一覧

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

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

問題3-2-2 九九練習プログラムを作って下さい。

○答え

長いので、別窓でご用意致しました。
九九練習プログラム

○概要

プログラムは長いが、大したことはやっていない。
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 という修飾子を付けると定数になります。
あれ?static はどうしちゃったの?と私も思いますが、今は気にしないことにしましょう(笑)。
ところで、宣言されている場所に注目して下さい。
いつもみたいにメソッド内部ではなく、メソッド外部、クラス内部で宣言されていますね。
したがって、MAX_QUESTION は変数ではなく、Kuku クラスの static フィールドです。
フィールドも今は気にしないということで(笑)。

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>

//補足

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

//補足2

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


戻る / ホーム