今まで、"x = 100, y = 200."のようにデータを出力するときは、文字列の出力と整数の出力を組み合わせて使ってきました。
class PlusFormatTest { // 文字列の出力と整数の出力 public static void main (String[] args) { int x = 100, y = 200; System.out.print("x = "); // 文字列の出力 System.out.print(x); // 整数の出力 System.out.print(", y = "); System.out.print(y); System.out.println("."); } }
PS ...\Desktop\java1> & ... 'PlusFormatTest' x = 100, y = 200. PS ...\Desktop\java1>
データの出力で使う
System.out.println(
データ
);
や
System.out.print(
データ
);
の「
データ
」の所では、文字列と整数などを演算子
+
で結ぶことができます。
class PlusFormatTest2 { // 文字列と整数を連結する public static void main (String[] args) { int x = 100, y = 200; System.out.println("x = " + x + ", y = " + y + "."); // 連結 } }
PS ...\Desktop\java1> & ... 'PlusFormatTest2' x = 100, y = 200. PS ...\Desktop\java1>
実は、この演算子
+
は文字列の連結です。
一方だけが文字列のときは、他方を文字列に変換して連結するという約束になっています。
整数と整数の足し算も
+
なので、混乱しそうなら、括弧を使ってください。
もう一つの方法は、書式を利用するものです。
書式は、
System.out.printf(
書式
,
式
);
という形で使われ、整数を出力する場合は「
書式
」は
"%d"
、実数を出力する場合は「
書式
」は
"%f"
でした。
実は、書式にはもっと機能があります。
%%
、改行は
%n
と書く。
%d
や
%f
を複数書くと、複数の式の値が順に当てはめられる。
以下の例では、「
書式
」に
%d
を2回書いて、それぞれ
x
と
y
の値を当てはめています。
また、最後に
%n
で改行しています。
class PlusFormatTest3 { // 普通の文字を含んだ書式 public static void main (String[] args) { int x = 100, y = 200; System.out.printf("x = %d, y = %d.%n", x, y); // 整数を順に当てはめる } }
PS ...\Desktop\java1> & ... 'PlusFormatTest3' x = 100, y = 200. PS ...\Desktop\java1>
前回の授業では、繰返し文を紹介しました。 何回繰り返すか分かっているときはfor文、分かっていないときは while文 ( while statement )を使うと説明しました。 今日はwhile文を使います。
while文の形式は以下のとおりです。
while (条件) { 文; ... }
これで、「 条件 」が成り立っている間、「 文 」 ... が繰り返し実行されます。
注意:
while文のブレース
{
...
}
は、文が1つなら省略できます。
while文の実行の流れは以下のとおりです。
例えば、OKと10回出力するプログラムをwhile文で書くと、次のようになります。 10回繰り返す仕組みはfor文と同じで、変数 i が10未満の間、OKの出力と i の増加を繰り返します。
class WhileTest { // while文のテスト public static void main (String[] args) { int i = 0; while (i < 10) { // i<10の間繰り返す System.out.println("OK"); i++; } } }
PS ...\Desktop\java1> & ... 'WhileTest' OK OK OK OK OK OK OK OK OK OK PS ...\Desktop\java1>
while文は、「 文 」 ... を実行する前に「 条件 」を確認します。 したがって、「 条件 」によっては「 文 」 ... が1回も実行されないことがあります。 次のプログラムでは、最初から成り立たない条件( i ≠0)を与えることよって、1回もOKと出力しません。
class WhileTest2 { // while文のテスト2 public static void main (String[] args) { int i = 0; while (i != 0) { // 最初から成り立たない System.out.println("OK"); } } }
PS ...\Desktop\java1> & ... 'WhileTest2' PS ...\Desktop\java1>
最初から成り立たない条件の反対で、永久に成り立つ条件を与えると、今度は永久に繰り返してしまいます。 永久に繰り返す繰返しを、 無限ループ ( infinite loop )と呼びます。 もし、プログラムが無限ループに陥ったら、Ctrlキーを押しながらCキーを押して、プログラムを強制終了してください。
while文は「 文 」 ... を実行する前に「 条件 」を確認しますが、「 文 」 ... を実行した後で「 条件 」を確認するという繰返し文もあります。 それが、 do-while文 ( do-while statement )です。
do-while文の形式は以下のとおりです。
do { 文; ... } while (条件);
「 条件 」が成り立っている間、「 文 」 ... が繰り返し実行されることはwhile文と同じですが、do-while文は「 文 」 ... を実行した後で「 条件 」を確認します。
注意:
do文のブレース
{
...
}
は、文が1つなら省略できます。
do-while文の実行の流れは以下のとおりです。
do-while文を使っても、10回OKと出力するプログラムが書けます。
class DoWhileTest { // do-while文のテスト public static void main (String[] args) { int i = 0; do { System.out.println("OK"); i++; } while (i < 10); // i<10の間繰り返す } }
PS ...\Desktop\java1> & ... 'DoWhileTest' OK OK OK OK OK OK OK OK OK OK PS ...\Desktop\java1>
while文は「 文 」 ... を1回も実行しないかもしれないのに対して、do-while文は少なくとも1回は実行します。 以下のように、最初から成り立たない条件( i ≠0)を与えても、1回だけOKと出力します。
class DoWhileTest2 { // do-while文のテスト2 public static void main (String[] args) { int i = 0; do { System.out.println("OK"); } while (i != 0); // 最初から成り立たない } }
PS ...\Desktop\java1> & ... 'DoWhileTest2' OK PS ...\Desktop\java1>
while文は「 文 」 ... を実行する前に「 条件 」を確認し、do-while文は「 文 」 ... を実行した後で「 条件 」を確認します。 では、「 文 」 ... を実行している途中で「 条件 」を確認するには、どうしたらよいでしょうか。 これは、 break文 ( break statement )を使うとできます。
break文は、for文やwhile文、do-while文の中で使い、break文を実行すると、繰返しを途中で終了します。
break文の典型的な使い方は、while文の「 条件 」をtrue(成り立つ)にして無条件に繰り返し、その中のif文で「 条件 」を確認して、break文で繰返しを途中で終了するというものです。
このパターンで10回OKと出力するプログラムを書くと、次のようになります。
class BreakTest { // break文のテスト public static void main (String[] args) { int i = 0; while (true) { // 無条件に繰り返す if (i >= 10) { break; // 途中で繰返しを終了 } System.out.println("OK"); i++; } } }
PS ...\Desktop\java1> & ... 'BreakTest' OK OK OK OK OK OK OK OK OK OK PS ...\Desktop\java1>
注意:
break文に似たものにcontinue文があります。
繰り返し中で
break;
を実行すると、その回だけでなく、残りの回も中止しますが、
continue;
を実行すると、その回だけ中止し、次の回から再開します。
繰返しの回数が問題になる例として、レジのような計算を考えます。 つまり、整数を次々と入力してもらい、最後にその合計を出力するというプログラムです。 最後の目印として、0が入力されたら合計を出力して終了することにします。
PS ...\Desktop\java1> & ... 'InputTotal' 整数を入力してください: 100 整数を入力してください: 200 整数を入力してください: 300 整数を入力してください: 0 合計は600です。 PS ...\Desktop\java1>
繰返しの回数が分からないので、for文は使わず、while文を使うかdo-while文を使うか考えます。 入力を求める部分は、必ず1回は実行するので、do-while文が良さそうです。 一方、合計を計算する部分は、1回も実行しないかもしれないので、while文が良さそうです。 結局、どっちもどっちなので、while文で無条件に繰り返し、break文で繰返しを途中で終了することにします。
import java.util.Scanner; class InputTotal { // 入力の合計 public static void main (String[] args) { Scanner stdIn = new Scanner(System.in); int x, total = 0; while (true) { // 無条件に繰り返す System.out.print("整数を入力してください: "); x = stdIn.nextInt(); if (x == 0) { break; // 途中で繰返しを終了 } total += x; } System.out.println("合計は" + total + "です。"); } }
繰返しの繰返し、すなわち、繰返し文の中にさらに繰返し文を書くこともできます。 このような繰返しを、 2重ループ ( nested loop )と呼ぶことがあります。 3重ループやそれ以上も考えられます。
一般的に、2重ループではループ変数を2つ用意します。 変数が i と j ならば、 i を外側のループ変数とし、 j を内側のループ変数とします。
次のプログラムは、出力を4回繰り返すことを3回繰り返すものです。 変数 i と j がどのように変化するかを見てください。
class NestedLoop { // 2重ループ public static void main (String[] args) { for (int i = 0; i < 3; i++) { // 3回繰り返す for (int j = 0; j < 4; j++) { // 4回繰り返す System.out.println("i = " + i + ", j = " + j + "."); } } } }
PS ...\Desktop\java1> & ... 'NestedLoop' 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. PS ...\Desktop\java1>
繰返し文の使用例として、九九の表を作成します。 九九の表は、2重ループを使うと、うまく作れます。 ループ変数 i と j を、1から9まで変化させればよいのです。
出力では、書式を利用して、1桁*1桁=2桁となるようにしています。
class MultiplicationTable { // 九九の表 public static void main (String[] args) { for (int i = 1; i <= 9; i++) { // 9回繰り返す for (int j = 1; j <= 9; j++) { // 9回繰り返す System.out.printf("%1d*%1d=%2d ", i, j, i * j); } System.out.println(); // 改行 } } }
PS ...\Desktop\java1> & ... 'MultiplicationTable' 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 PS ...\Desktop\java1>
アスキーアート ( ASCII art )とは、大量の文字を組み合わせ、一つの絵のように見せるものです。 ここでは、アスキーアートの要領で、ターミナルに図形を表示してみます。
まずは長方形です。 以下のプログラムでは、星印を40回出力してから改行することを、10回繰り返しています。
class AsciiRectangle { // アスキーアートの長方形 public static void main (String[] args) { for (int i = 0; i < 10; i++) { // 10回繰り返す for (int j = 0; j < 40; j++) { // 40回繰り返す System.out.print("*"); } System.out.println(); // 改行 } } }
PS ...\Desktop\java1> & ... 'AsciiRectangle' **************************************** **************************************** **************************************** **************************************** **************************************** **************************************** **************************************** **************************************** **************************************** **************************************** PS ...\Desktop\java1>
次は直角三角形です。 星印を出力するのは、
なので、
とします。
class RightTriangle { // 直角三角形 public static void main (String[] args) { for (int i = 0; i < 10; i++) { // 10回繰り返す for (int j = 0; j < 40; j++) { // 40回繰り返す if (0 <= j && j < 2 + 4 * i) { // 0字目以上2+4×i字目未満 System.out.print("*"); } else { System.out.print("."); } } System.out.println(); // 改行 } } }
PS ...\Desktop\java1> & ... 'RightTriangle' **...................................... ******.................................. **********.............................. **************.......................... ******************...................... **********************.................. **************************.............. ******************************.......... **********************************...... **************************************.. PS ...\Desktop\java1>
以下のような、二等辺三角形のアスキーアートを出力するプログラムを作成してください。
星印は
です。
class IsoscelesTriangle { public static void main (String[] args) { } }
PS ...\Desktop\java1> & ... 'IsoscelesTriangle' ...................**................... .................******................. ...............**********............... .............**************............. ...........******************........... .........**********************......... .......**************************....... .....******************************..... ...**********************************... .**************************************. PS ...\Desktop\java1>
余力のある人は、平行四辺形、ひし形など、自分で考えた図形のアスキーアートを出力するプログラムを作成してください。
今日の演習7の答案(Javaプログラム)をメールで提出してください。 差出人は大学発行のメール・アドレス(学生番号@cis.twcu.ac.jp)とし、宛先はkonishi@cis.twcu.ac.jpとします。 メールの本文には、学生番号、氏名、科目名、授業日(5月23日)を明記してください。