[小西ホームページ]   [目次・索引]   [前の授業]   [次の授業]

情報処理技法(Javaプログラミング)I 第7回

目次
索引

データの入出力(3)

文字列の連結

今まで、"x = 100, y = 200."のようにデータを出力するときは、文字列の出力と整数の出力を組み合わせて使ってきました。

PlusFormatTest.java
/*  1*/ class PlusFormatTest { // 文字列の出力と整数の出力
/*  2*/     public static void main (String[] args) {
/*  3*/         int x = 100, y = 200;
/*  4*/         System.out.print("x = "); // 文字列の出力
/*  5*/         System.out.print(x); // 整数の出力
/*  6*/         System.out.print(", y = ");
/*  7*/         System.out.print(y);
/*  8*/         System.out.println(".");
/*  9*/     }
/* 10*/ }
コンソール
x = 100, y = 200.

Completed with exit code: 0

データの出力で使う System.out.println( データ ); System.out.print( データ ); の「 データ 」の所では、文字列と整数などを演算子 + で結ぶことができます。

PlusFormatTest2.java
/*  1*/ class PlusFormatTest2 { // 文字列と整数を連結する
/*  2*/     public static void main (String[] args) {
/*  3*/         int x = 100, y = 200;
/*  4*/         System.out.println("x = " + x + ", y = " + y + "."); // 連結
/*  5*/     }
/*  6*/ }
コンソール
x = 100, y = 200.

Completed with exit code: 0

実は、この演算子 + は文字列の連結です。 一方だけが文字列のときは、他方を文字列に変換して連結するという約束になっています。 整数と整数の足し算も + なので、混乱しそうなら、括弧を使ってください。

書式の機能

もう一つの方法は、書式を利用するものです。 書式は、 System.out.printf( 書式 , ); という形で使われ、整数を出力する場合は「 書式 」は "%d" 、実数を出力する場合は「 書式 」は "%f" でした。

実は、書式にはもっと機能があります。

以下の例では、「 書式 」に %d を2回書いて、それぞれ x y の値を当てはめています。 また、最後に %n で改行しています。

PlusFormatTest3.java
/*  1*/ class PlusFormatTest3 { // 普通の文字を含んだ書式
/*  2*/     public static void main (String[] args) {
/*  3*/         int x = 100, y = 200;
/*  4*/         System.out.printf("x = %d, y = %d.%n", x, y); // 整数を順に当てはめる
/*  5*/     }
/*  6*/ }
コンソール
x = 100, y = 200.

Completed with exit code: 0

繰返し文(2)

while文

前回の授業では、繰返し文を紹介しました。 何回繰り返すか分かっているときはfor文、分かっていないときは while文 while statement )を使うと説明しました。 今日はwhile文を使います。

while文の形式は以下のとおりです。

while (条件) {
    ; ...
}

これで、「 条件 」が成り立っている間、「 ... が繰り返し実行されます。 while文の実行の流れは以下のとおりです。

while文の実行の流れ
while文の実行の流れ

例えば、OKと10回出力するプログラムをwhile文で書くと、次のようになります。 10回繰り返す仕組みはfor文と同じで、変数 i が10未満の間、OKの出力と i の増加を繰り返します。

WhileTest.java
/*  1*/ class WhileTest { // while文のテスト
/*  2*/     public static void main (String[] args) {
/*  3*/         int i = 0;
/*  4*/         while (i < 10) { // i<10の間繰り返す
/*  5*/             System.out.println("OK");
/*  6*/             i++;
/*  7*/         }
/*  8*/     }
/*  9*/ }
コンソール
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK

Completed with exit code: 0

while文は、「 ... を実行する前に「 条件 」を確認します。 したがって、「 条件 」によっては「 ... が1回も実行されないことがあります。 次のプログラムでは、最初から成り立たない条件( i ≠0)を与えることよって、1回もOKと出力しません。

WhileTest2.java
/*  1*/ class WhileTest2 { // while文のテスト2
/*  2*/     public static void main (String[] args) {
/*  3*/         int i = 0;
/*  4*/         while (i != 0) { // 最初から成り立たない
/*  5*/             System.out.println("OK");
/*  6*/         }
/*  7*/     }
/*  8*/ }
コンソール

Completed with exit code: 0
条件が成り立たないwhile文
条件が成り立たないwhile文

最初から成り立たない条件の反対で、永久に成り立つ条件を与えると、今度は永久に繰り返してしまいます。 永久に繰り返す繰返しを、 無限ループ infinite loop )と呼びます。 もし、プログラムが無限ループに陥ったら、Ctrlキーを押しながらCキーを押して、プログラムを強制終了してください。

do-while文

while文は「 ... を実行する前に「 条件 」を確認しますが、「 ... を実行した後で「 条件 」を確認するという繰返し文もあります。 それが、 do-while文 do-while statement )です。

do-while文の形式は以下のとおりです。

do {
    ; ...
} while (条件);

条件 」が成り立っている間、「 ... が繰り返し実行されることはwhile文と同じですが、do-while文は「 ... を実行した後で「 条件 」を確認します。 do-while文の実行の流れは以下のとおりです。

do-while文の実行の流れ
do-while文の実行の流れ

do-while文を使っても、10回OKと出力するプログラムが書けます。

DoWhileTest.java
/*  1*/ class DoWhileTest { // do-while文のテスト
/*  2*/     public static void main (String[] args) {
/*  3*/         int i = 0;
/*  4*/         do {
/*  5*/             System.out.println("OK");
/*  6*/             i++;
/*  7*/         } while (i < 10); // i<10の間繰り返す
/*  8*/     }
/*  9*/ }
コンソール
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK

Completed with exit code: 0

while文は「 ... を1回も実行しないかもしれないのに対して、do-while文は少なくとも1回は実行します。 以下のように、最初から成り立たない条件( i ≠0)を与えても、1回だけOKと出力します。

DoWhileTest2.java
/*  1*/ class DoWhileTest2 { // do-while文のテスト2
/*  2*/     public static void main (String[] args) {
/*  3*/         int i = 0;
/*  4*/         do {
/*  5*/             System.out.println("OK");
/*  6*/         } while (i != 0); // 最初から成り立たない
/*  7*/     }
/*  8*/ }
コンソール
OK

Completed with exit code: 0
条件が成り立たないdo-while文
条件が成り立たないdo-while文

break文

while文は「 ... を実行する前に「 条件 」を確認し、do-while文は「 ... を実行した後で「 条件 」を確認します。 では、「 ... を実行している途中で「 条件 」を確認するには、どうしたらよいでしょうか。 これは、 break文 break statement )を使うとできます。

break文は、for文やwhile文、do-while文の中で使い、break文を実行すると、繰返しを途中で終了します。

break文の典型的な使い方は、while文の「 条件 」をtrue(成り立つ)にして無条件に繰り返し、その中のif文で「 条件 」を確認して、break文で繰返しを途中で終了するというものです。

break文の実行の流れ
break文の実行の流れ

このパターンで10回OKと出力するプログラムを書くと、次のようになります。

BreakTest.java
/*  1*/ class BreakTest { // break文のテスト
/*  2*/     public static void main (String[] args) {
/*  3*/        int i = 0;
/*  4*/        while (true) { // 無条件に繰り返す
/*  5*/            if (i >= 10) {
/*  6*/                break; // 途中で繰返しを終了
/*  7*/            }
/*  8*/            System.out.println("OK");
/*  9*/            i++;
/* 10*/         }
/* 11*/     }
/* 12*/ }
コンソール
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK

Completed with exit code: 0

繰返しの回数が問題になる例として、レジのような計算を考えます。 つまり、整数を次々と入力してもらい、最後にその合計を出力するというプログラムです。 最後の目印として、0が入力されたら合計を出力して終了することにします。

コンソール
整数を入力してください: 100
整数を入力してください: 200
整数を入力してください: 300
整数を入力してください: 0
合計は600です。

Completed with exit code: 0

繰返しの回数が分からないので、for文は使わず、while文を使うかdo-while文を使うか考えます。 入力を求める部分は、必ず1回は実行するので、do-while文が良さそうです。 一方、合計を計算する部分は、1回も実行しないかもしれないので、while文が良さそうです。 結局、どっちもどっちなので、while文で無条件に繰り返し、break文で繰返しを途中で終了することにします。

InputTotal.java
/*  1*/ import java.io.*;
/*  2*/ 
/*  3*/ class InputTotal { // 入力の合計
/*  4*/     public static void main (String[] args) throws IOException {
/*  5*/         InputStreamReader isr = new InputStreamReader(System.in);
/*  6*/         BufferedReader br = new BufferedReader(isr);
/*  7*/         int x, total = 0;
/*  8*/         while (true) { // 無条件に繰り返す
/*  9*/             System.out.print("整数を入力してください: ");
/* 10*/             x = Integer.parseInt(br.readLine());
/* 11*/             if (x == 0) {
/* 12*/                 break; // 途中で繰返しを終了
/* 13*/             }
/* 14*/             total += x;
/* 15*/         }
/* 16*/         System.out.println("合計は" + total + "です。");
/* 17*/     }
/* 18*/ }

2重ループ

繰返しの繰返し、すなわち、繰返し文の中にさらに繰返し文を書くこともできます。 このような繰返しを、 2重ループ nested loop )と呼ぶことがあります。 3重ループやそれ以上も考えられます。

一般的に、2重ループではループ変数を2つ用意します。 変数が i j ならば、 i を外側のループ変数とし、 j を内側のループ変数とします。

次のプログラムは、出力を4回繰り返すことを3回繰り返すものです。 変数 i j がどのように変化するかを見てください。

NestedLoop.java
/*  1*/ class NestedLoop { // 2重ループ
/*  2*/     public static void main (String[] args) {
/*  3*/         int i, j;
/*  4*/         for (i = 0; i < 3; i++) { // 3回繰り返す
/*  5*/             for (j = 0; j < 4; j++) { // 4回繰り返す
/*  6*/                 System.out.println("i = " + i + ", j = " + j + ".");
/*  7*/             }
/*  8*/         }
/*  9*/     }
/* 10*/ }
コンソール
i = 0, j = 0.
i = 0, j = 1.
i = 0, j = 2.
i = 0, j = 3.
i = 1, j = 0.
i = 1, j = 1.
i = 1, j = 2.
i = 1, j = 3.
i = 2, j = 0.
i = 2, j = 1.
i = 2, j = 2.
i = 2, j = 3.

Completed with exit code: 0

繰返し文の使用例(2)

繰返し文の使用例として、九九の表を作成します。 九九の表は、2重ループを使うと、うまく作れます。 ループ変数 i j を、1から9まで変化させればよいのです。

出力では、書式を利用して、1桁*1桁=2桁となるようにしています。

MultiplicationTable.java
/*  1*/ class MultiplicationTable { // 九九の表
/*  2*/     public static void main (String[] args) {
/*  3*/         int i, j;
/*  4*/         for (i = 1; i <= 9; i++) { // 9回繰り返す
/*  5*/             for (j = 1; j <= 9; j++) { // 9回繰り返す
/*  6*/                 System.out.printf("%1d*%1d=%2d    ", i, j, i * j);
/*  7*/             }
/*  8*/             System.out.println(); // 改行
/*  9*/         }
/* 10*/     }
/* 11*/ }
コンソール
1*1= 1    1*2= 2    1*3= 3    1*4= 4    1*5= 5    1*6= 6    1*7= 7    1*8= 8    1*9= 9
2*1= 2    2*2= 4    2*3= 6    2*4= 8    2*5=10    2*6=12    2*7=14    2*8=16    2*9=18
3*1= 3    3*2= 6    3*3= 9    3*4=12    3*5=15    3*6=18    3*7=21    3*8=24    3*9=27
4*1= 4    4*2= 8    4*3=12    4*4=16    4*5=20    4*6=24    4*7=28    4*8=32    4*9=36
5*1= 5    5*2=10    5*3=15    5*4=20    5*5=25    5*6=30    5*7=35    5*8=40    5*9=45
6*1= 6    6*2=12    6*3=18    6*4=24    6*5=30    6*6=36    6*7=42    6*8=48    6*9=54
7*1= 7    7*2=14    7*3=21    7*4=28    7*5=35    7*6=42    7*7=49    7*8=56    7*9=63
8*1= 8    8*2=16    8*3=24    8*4=32    8*5=40    8*6=48    8*7=56    8*8=64    8*9=72
9*1= 9    9*2=18    9*3=27    9*4=36    9*5=45    9*6=54    9*7=63    9*8=72    9*9=81

Completed with exit code: 0

アスキーアート ASCII art )とは、大量の文字を組み合わせ、一つの絵のように見せるものです。 ここでは、アスキーアートの要領で、コンソールに図形を表示してみます。

まずは長方形です。 以下のプログラムでは、星印を40回出力してから改行することを、10回繰り返しています。

AsciiRectangle.java
/*  1*/ class AsciiRectangle { // アスキーアートの長方形
/*  2*/     public static void main (String[] args) {
/*  3*/         int i, j;
/*  4*/         for (i = 0; i < 10; i++) { // 10回繰り返す
/*  5*/             for (j = 0; j < 40; j++) { // 40回繰り返す
/*  6*/                 System.out.print("*");
/*  7*/             }
/*  8*/             System.out.println(); // 改行
/*  9*/         }
/* 10*/     }
/* 11*/ }
コンソール
****************************************
****************************************
****************************************
****************************************
****************************************
****************************************
****************************************
****************************************
****************************************
****************************************

Completed with exit code: 0

次は直角三角形です。 星印を出力するのは、

なので、

とします。

RightTriangle.java
/*  1*/ class RightTriangle { // 直角三角形
/*  2*/     public static void main (String[] args) {
/*  3*/         int i, j;
/*  4*/         for (i = 0; i < 10; i++) { // 10回繰り返す
/*  5*/             for (j = 0; j < 40; j++) { // 40回繰り返す
/*  6*/                 if (0 <= j && j < 2 + 4 * i) { // 0字目以上2+4×i字目未満
/*  7*/                     System.out.print("*");
/*  8*/                 } else {
/*  9*/                     System.out.print(".");
/* 10*/                 }
/* 11*/             }
/* 12*/             System.out.println(); // 改行
/* 13*/         }
/* 14*/     }
/* 15*/ }
コンソール
**......................................
******..................................
**********..............................
**************..........................
******************......................
**********************..................
**************************..............
******************************..........
**********************************......
**************************************..

Completed with exit code: 0

演習7

以下のような、二等辺三角形のアスキーアートを出力するプログラムを作成してください。

星印は

です。

IsoscelesTriangle.java
class IsoscelesTriangle {
    public static void main (String[] args) {



    }
}
コンソール
...................**...................
.................******.................
...............**********...............
.............**************.............
...........******************...........
.........**********************.........
.......**************************.......
.....******************************.....
...**********************************...
.**************************************.

Completed with exit code: 0

余力のある人は、平行四辺形、ひし形など、自分で考えた図形のアスキーアートを出力するプログラムを作成してください。


レポート課題

今日の演習7の答案(Javaプログラム)をメールで提出してください。 差出人は大学発行のメール・アドレス(学生番号@cis.twcu.ac.jp)とし、宛先はkonishi@cis.twcu.ac.jpとします。 メールの本文には、学生番号、氏名、科目名、授業日(11月5日)を明記してください。


参考文献


[小西ホームページ]   [目次・索引]   [前の授業]   [次の授業]

2021年11月5日更新
小西 善二郎 <konishi@cis.twcu.ac.jp>
Copyright (C) 2021 Zenjiro Konishi. All rights reserved.