4 入出力の基本として ディスプレイへの文字出力と キーボードからの文字入力の方法を学びます 入出力とは何か 標準出力 標準入力 43
4.1. 入出力とは プログラムと外部機器の間でデータをやりとりすることをいいます プログラムから出て行く方向が 出力 プログラムに入って来る方向が 入力 です 出力 外部機器 プログラム 入力 外部機器 外部機器はさまざまな種類があります 出力を行うには ディスプレイ プリンタ スピーカなどが 入力を行うには キーボード マウス マイクなどが使われています プログラムでは通常 標準の出力機器として ディスプレイ 標準の入力機器として キーボード が指定されています これらとやりとりすることを 標準入出力 と呼びます Java 言語では 標準出力を System.out 標準入力を System.in というキーワードで示します プログラム 標準出力 ディスプレイ System.out 標準入力 キーボード System.in この章では 標準出力と標準入力を使って 文字をやりとりする方法を説明します 44
4.2. 次の命令は カッコの中に書いた文字列または変数の値を ディスプレイへ表示します 文字のディスプレイ表示 ( 改行あり ) System.out.println(" 文字列 " または変数 ); 文字のディスプレイ表示 ( 改行なし ) System.out.print(" 文字列 " または変数 ); 使用例 int a = 5; System.out.println("a"); System.out.println(a); a 5 値は そのまま表示 変数は 中身が表示 使用例 System.out.println(" こんにちは "); System.out.println(" さようなら "); System.out.print(" こんにちは "); System.out.print(" さようなら "); こんにちは さようなら こんにちは さようなら println() は行末で改行 print() は行末で改行されないので 次の文字列が右側に表示されます 上記の命令で 複数の文字列や変数を連結させるには 文字列連結演算子の + を使います ( ここでの記号 + は 数学の加算とは違います 文字列をつなぐだけです ) 半角スペース 使用例 連結 変数 aの値 変数 b の値 int a = 5, b = 10; System.out.println(a + " " + b); 5 10 System.out.println(" 変数の値は " + a + " です "); 変数の値は 5 です 値の途中で改行してはダメです 1つの値は 複数行にまたがることはできません 連結 文字列 変数 a の値 文字列 System.out.println( こんにちは さようなら ); これはふつうの書き方なので OK System.out.println( こんにちは さようなら ); 値の途中で改行しているからダメ 45
Java では 表示する桁数などの書式指定を行う方法が複数あります ここでは C 言語とほぼ同じ書式で利用できる printf 文について説明します printf 文の書式 System.out.printf(" 文字列または変換指定子 ", 変数, 変数, ); printf 文の文字列中では % に続く文字は 変換指定子 と呼ばれる特殊な文字です 変数を指定された書式へ変換してから表示する役割を持ちます 主な変換指定子 変換指定子 意味 使われる型 %c 1 文字を出力する char %s 文字列を出力する String %d 整数 (10 進数 ) で出力する byte %x 整数 (16 進数 ) で出力する short %o 整数 (8 進数 ) で出力する int long %f 浮動小数点型を出力する float %e 浮動小数点型を指数形式で出力する double %b 判断型を出力する boolean 普通の文字として % を表示したいときは %% のように2つ並べる さらに桁数などを % の直後につけて指定できます 記号 ( 数値 ) 説明使用例 - 左詰めに表示 ( 普通は右詰め ) %-d + プラス符号も表示 ( 普通はマイナス符号のみ表示 ) %+d %+ld 整数 実数 桁数を指定します ( 整数を表示するとき 先頭に 0 を付けると空いている桁を 0 でうめます ) 実数の小数点以下の桁数を指定します整数部 : 小数点を含めたすべての桁数小数部 : 小数点以下の桁数 %10d %8s %04d %9.2f %12.6f 整数の 12 を %d の書式指定を使い分けて表示すると 次のようになります %d 12 左寄せで表示します %4d 12 指定された桁数内で 右寄せで表示します %04d 0012 空いた桁をゼロで埋めて表示します 46
浮動小数点型用の %f は 桁数指定の範囲に気をつけましょう %9.3f 小数部の桁数 12345.678 全体の桁数 ( 小数点も含む ) 変換指定子は printf 文の文字列中で複数指定できますが 対応する変数と 個数と順序を一致させる必要があります int i; double a, b; ( 中略 ) System.out.printf("%04d %9.2f %9.2f n", i, a, b); 使用例 1) 1つの変数だけ表示 int a = 10; System.out.printf("%d n", a); 10 2) 文字列と変数を一緒に表示 double x = 1.23; System.out.printf("answer = %f n", x); answer = 1.23 3) 複数の文字列と変数を一緒に表示 int i = 1; double a = 1.23, b = 4.56; System.out.printf(" 番号は %d a は %f b は %f です n", i, a, b); 番号は 1 a は 1.23 b は 4.56 です 47
print println printf 文を使って文字列を画面表示します 文字列を連結してから表示カッコ () の中に何も書かないと改行だけ行われる %s の部分が 文字列に置き換わって表示される %s の間に数字を入れると桁数を指定できる PrintTest1.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 /* 例題 4-1 文字列の書式設定付き画面表示 組番号氏名 */ public class PrintTest1 public static void main(string[] args) // 文字列を表示 String s1 = " 東海太郎 "; System.out.print(" メッセージ : "); System.out.println(" 私の名前は " + s1 + " です "); System.out.println(); // 改行だけ行う System.out.printf("%s, World. n", "Hello"); // 文字列 Hello を表示 System.out.printf("%10s, World. n", "Hello"); // 桁数を指定 ( 右寄せ ) System.out.printf("%-10s, World. n", "Hello"); // 桁数を指定 ( 左寄せ ) 実行結果 48
printf 文を使って書式設定付きで数値を画面表示します PrintTest2.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 /* 例題 4-2 数値の書式設定付き画面表示 組番号氏名 */ public class PrintTest2 public static void main(string[] args) %d の部分が 整数に置き換わっ // 整数の書式設定て表示される int a = 12; %d の間に数字を入れると桁数を System.out.printf("%d n", a); // 変数 aの値を表示指定できる System.out.printf("%4d n", a); // 桁数を指定 ( 右寄せ ) System.out.printf("%04d n", a); // 桁数を指定 ( 右寄せ 空いている桁をゼロで埋める ) System.out.println(); // 改行だけ行う // 浮動小数点数の書式設定 double x = 0.0123; System.out.printf("%f n", x); // 変数 x の値を表示 System.out.printf("%9.3f n", x); // 桁数を指定 System.out.printf("%.3f n", x); // 小数部の桁数だけ指定 System.out.printf("%e n", x); // 指数表現で表示 %f の部分が 浮動小数点数に置き換わって表示される %f の間に数字を入れると 全体と小数部の桁数を指定できる %e の部分が 浮動小数点数に置き換わって指数表現で表示される 実行結果 49
4.3. Java では様々な入力方法が用意されています ここでは代表的な 2 つの方法について説明します Scanner は文字を区切り記号ごとに 文字列を取得する機能を持っています これをキー入力に利用すると 直接型を指定してキー入力した値を変数に入れることができます 基本データ型への入力命令 メソッド名 機能 取得する型 next() 文字列を読み込みます String nextbyte() byte 型の整数を読み込みます byte nextshort() short 型の整数を読み込みます short nextint() int 型の整数を読み込みます int nextlong() long 型の整数を読み込みます long nextfloat() float 型の浮動小数点数を読み込みます float nextdouble() double 型の浮動小数点数を読み込みます double nextboolean() boolean 型の値を読み込みます boolean これらの命令は 半角スペースで区切られた値を1つ取得します 値を入力してから Enter キーを押すと取得されます Enter キーを押さないと 入力待ち状態で プログラムの実行が一時停止したまま先へ進まなくなります プログラム実行時に間違った型をキー入力すると エラーが出て異常終了します 命令を呼び出す前に 準備をする命令が必要になります 次に nextint() で一つの整数を読み込む場合の書き方を説明します 一行分の文字列を読み込む場合の書き方 import java.util.scanner; 1 ソースコードの最初に書く class Sample public static void main(string[] args) Scanner sc = new Scanner(System.in); 注 1) int a = sc.nextint(); 2 キー入力する前に書く ブロック内で一度書けば良い 3 キー入力したい所に書く 注 1) 2の命令で sc は変数名なので違う名前にしても大丈夫です ただし 3の命令の sc と関連付けられているので 2と3で同じ変数名にしないといけません また 2の命令はブロック内では 1 つだけ書けば良いので キー入力を繰り返したい場合は3 の命令だけを複数書けば良いことになります 50
キー入力を行い 様々な型で読み込みます InputTest1.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 /* 例題 4-3 キー入力組番号氏名 */ import java.util.scanner; public class InputTest1 public static void main(string[] args) Scanner sc = new Scanner(System.in); // 文字列の取得 System.out.println(" 文字列を入力して下さい "); String s = sc.next(); System.out.println(" " + s + " がキー入力されました "); // 整数の取得 System.out.println(" 整数を入力して下さい "); int a = sc.nextint(); System.out.println(" " + a + " がキー入力されました "); // 浮動小数点数の取得 System.out.println(" 実数を入力して下さい "); double x = sc.nextdouble(); System.out.println(" " + x + " がキー入力されました "); キー入力命令を使う場合に ソースコード先頭部分で必要入力元を キーボードに設定キー入力した値を String 型で読み込みで 値を変数 s へ代入キー入力した値を int 型で読み込んで 値を変数 a へ代入キー入力した値を double 型で読み込んで 値を変数 x へ代入 実行結果例 自分で値を入力して Enter キーを押す 51
一文字や 一行をまるごと 文字列 として取得する方法です あとで説明するファイル入出力などに応用しやすいのですが 複数の場所に命令文をたくさん書かなければならないのが欠点です 一行分の文字列を読み込み readline(); 一行の区切りを Enter キーの入力で判別する 一文字を読み込み read(); これらの命令は 単独で使うことができません 命令を呼び出す前に 準備をする命令が必要になります 次に readline() で一行分の文字を読み込む場合の書き方を説明します 一行分の文字列を読み込む場合の書き方 import java.io.*; 1 ソースコードの最初に書く 2 main() メソッドの ) と の間に書く class Sample public static void main(string[] args) throws IOException BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 注 1) String s = br.readline(); 3 main() メソッドのブロック内で 先頭の方に書く 注 2) 4 キー入力したい所に書く 注 1) 3の命令で br は変数名なので違う名前にしても大丈夫です ただし 4の命令の br と関連付けられているので 3と4で同じ変数名にしないといけません また 3の命令はブロック内では 1 つだけ書けば良いので キー入力を繰り返したい場合は4 の命令だけを複数書けば良いことになります 注 2) readline() は一行分の文字つまり 文字列 を読み込むので 値を保管するのは String 型の変数が必要になります s は変数名なので違う名前にしても大丈夫です また readline() は一行の区切りを Enter キーの入力で判別するので 文字をキーで打っても Enter キーが押されるまでは変数に読み込まれません したがって Enter キーが押されるまではプログラムが一時停止した状態になります 52
次の仕様を満たすプログラムのソースコードを記述しなさい 画面表示は下図に示す実行例の書式にしたがうこと ソースファイル名は Human.java とする 入力: 次の 3 つの値をキー入力する氏名 (String 型 ) 年齢(int 型 ) 身長(double 型 ) 出力: 入力した値を結合して 次のように一文の文章として画面表示する ( 氏名 ) は ( 年齢 ) 歳で 身長は ( 身長 )cm です カッコで示した部分には 入力した値が入る 身長の値は 小数点以下 1 桁まで表示すること 変数名は 自分で適当な名前を考えて付ける 実行例 ( 太字は入力した値 ) 氏名は? 東海太郎年齢は? 21 身長は? 162 東海太郎は 21 歳で 身長は 162.0cm です 以上 53
< 入出力とは何か> (1) プログラムから外部機器へ出て行く方向のデータの流れを何と呼ぶか書きなさい (2) 外部機器からプログラムへ入って来る方向のデータの流れを何と呼ぶか書きなさい (3) 通常の標準出力の装置は何か書きなさい (4) 通常の標準入力の装置は何か書きなさい (5) Java において 標準出力を示すキーワードを書きなさい (6) Java において 標準入力を示すキーワードを書きなさい < 標準出力 > (7) 文字列 Hello を表示してから改行する命令を一文で書きなさい (8) 文字列 Hello を表示するが改行しない命令を一文で書きなさい (9) 数値 123 を表示してから改行する命令を一文で書きなさい (10) 数値が入った変数 x を 全体の桁数 6 小数部の桁数 2 で表示する命令を一文で書きなさい 変数の宣言は書かなくて良い < 標準入力 > (11) Scanner を利用する時 ソースコード先頭付近で必要な命令を 1 つ書きなさい (12) Scanner で読み込み先を標準入力に指定する命令を 1 つ書きなさい (13) Scanner を利用する時 int 型の値を読み込んで int の変数 b に代入する命令を一文で書きなさい (14) キー入力命令で 実行時に注意すべきことを 2 つ挙げなさい 54