今まで、"x = 100, y = 200."のようにデータを出力するときは、文字列の出力と整数の出力を組み合わせて使ってきました。
/* 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(
データ
);
の「
データ
」の所では、文字列と整数などを演算子
+
で結ぶことができます。
/* 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"
でした。
実は、書式にはもっと機能があります。
%%
、改行は
%n
と書く。
%d
や
%f
を複数書くと、複数の式の値が順に当てはめられる。
以下の例では、「
書式
」に
%d
を2回書いて、それぞれ
x
と
y
の値を当てはめています。
また、最後に
%n
で改行しています。
/* 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
前回の授業では、繰返し文を紹介しました。 何回繰り返すか分かっているときはfor文、分かっていないときは while文 ( while statement )を使うと説明しました。 今日はwhile文を使います。
while文の形式は以下のとおりです。
while (条件) { 文; ... }
これで、「 条件 」が成り立っている間、「 文 」 ... が繰り返し実行されます。 while文の実行の流れは以下のとおりです。
例えば、OKと10回出力するプログラムをwhile文で書くと、次のようになります。 10回繰り返す仕組みはfor文と同じで、変数 i が10未満の間、OKの出力と i の増加を繰り返します。
/* 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と出力しません。
/* 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
最初から成り立たない条件の反対で、永久に成り立つ条件を与えると、今度は永久に繰り返してしまいます。 永久に繰り返す繰返しを、 無限ループ ( infinite loop )と呼びます。 もし、プログラムが無限ループに陥ったら、Ctrlキーを押しながらCキーを押して、プログラムを強制終了してください。
while文は「 文 」 ... を実行する前に「 条件 」を確認しますが、「 文 」 ... を実行した後で「 条件 」を確認するという繰返し文もあります。 それが、 do-while文 ( do-while statement )です。
do-while文の形式は以下のとおりです。
do { 文; ... } while (条件);
「 条件 」が成り立っている間、「 文 」 ... が繰り返し実行されることはwhile文と同じですが、do-while文は「 文 」 ... を実行した後で「 条件 」を確認します。 do-while文の実行の流れは以下のとおりです。
do-while文を使っても、10回OKと出力するプログラムが書けます。
/* 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と出力します。
/* 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
while文は「 文 」 ... を実行する前に「 条件 」を確認し、do-while文は「 文 」 ... を実行した後で「 条件 」を確認します。 では、「 文 」 ... を実行している途中で「 条件 」を確認するには、どうしたらよいでしょうか。 これは、 break文 ( break statement )を使うとできます。
break文は、for文やwhile文、do-while文の中で使い、break文を実行すると、繰返しを途中で終了します。
break文の典型的な使い方は、while文の「 条件 」をtrue(成り立つ)にして無条件に繰り返し、その中のif文で「 条件 」を確認して、break文で繰返しを途中で終了するというものです。
このパターンで10回OKと出力するプログラムを書くと、次のようになります。
/* 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文で繰返しを途中で終了することにします。
/* 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重ループ ( nested loop )と呼ぶことがあります。 3重ループやそれ以上も考えられます。
一般的に、2重ループではループ変数を2つ用意します。 変数が i と j ならば、 i を外側のループ変数とし、 j を内側のループ変数とします。
次のプログラムは、出力を4回繰り返すことを3回繰り返すものです。 変数 i と j がどのように変化するかを見てください。
/* 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重ループを使うと、うまく作れます。 ループ変数 i と j を、1から9まで変化させればよいのです。
出力では、書式を利用して、1桁*1桁=2桁となるようにしています。
/* 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回繰り返しています。
/* 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
次は直角三角形です。 星印を出力するのは、
なので、
とします。
/* 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
以下のような、二等辺三角形のアスキーアートを出力するプログラムを作成してください。
星印は
です。
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月6日)を明記してください。