夢追い人

"It takes a dreamer to make a dream come true."―Vincent Willem van Gogh

Java入門#3

はい。ということでですね。。。


書きます(笑)
自分なりにわかりやすい解説と言うものをしっかり考えて見たので、どうぞよろしく。



2-3.制御構文

ということで、今回はプログラミング入門書とか見てると

「ここからがおもしろくなるところです!」

とか言っている制御構文のお話です。
Javaではif, for, while, do while, switch, break, continueという制御構文があります。大体(というよりほとんど)C言語と同じです。ではそれぞれの使い方を見ていきましょう。
もし-if
まずはifです。いきなり使い方を示してしまいますと次のようになります。

if (/*条件式*/) {
// 処理
}

え~と、これが一番簡単な使い方ですね。簡単に説明すると、条件式が成り立つときに{}内の処理を実行するということになります。
応用(?)としてelse文があります。

if (/*条件式*/) {
// 処理A
} else {
// 処理B
}

これは条件式が成り立ったならば処理Aを、成り立たなければ処理Bを実行します。
そして、いくつもの「もし…」をつなげたいなら次のようにします。

if (/*条件式a*/) {
// 処理A
} else if (/*条件式b*/) {
// 処理B
} else if (/*条件式c*/) {
// 処理C
} else {
// 処理D
}

こうすることで、もし条件式aが成立すれば処理A、条件式bが成立すれば処理B、条件式cが成立すれば処理C、どれも成立しなければ処理Dを実行させることができます。ここでのelse if文の数はいくつでもよく、またプログラムによっては最後のelse文がなくても正常に動くことができます。
繰り返し-for
続いてはfor。これは個人的見解だと定義文が最初は分かりにくいところもあると思いますが、とにかく例示してみましょう。

int i; /* 
    * 条件式に使う変数の定義。ifなどは自然とやってしまうだろうが、
    * forだと条件式で初期化しているので忘れがち。というわけで、
    * あえて強調させていただく。 
    */ 
for (i=0/*変数の初期化*/; i < 5/*条件式*/; i++/*最後の処理*/;) {
// 処理
}

ちょっとコメントだけだと分かりにくいかな?つまりループに入る一番最初に変数の初期化(i=0)をし、その後{}内の処理をしたあとにi++をしてまた処理をするというのを条件式(i<5)が成り立つ間繰り返すというものです。ようするに今回は処理が5回されるわけですな。
繰り返し-while
今回のはいたってシンプルです。というよりforの定義文の要素をいくつか()内から追い出したって言えばいいのかな?使い分けは、なれると分かると思います。では例を見てみましょう。

int a = 0;  // 初期化はループの外で行う。
while (/*条件式*/) {
// 処理
a++; // 変数の変化
}

forでははしょりましたが、最後の変数の変化をさせる処理でループ回数が決まるようなものなので実は重要だったりします。
で、これは条件式が成立している間処理を繰り返します。うい。
繰り返し-do while
これはほとんどwhileと同じですが、同じ条件式でも処理回数が異なります。そのことは後回しにして、とりあえず使い方を見てみましょう。

int a = 0;
do {
// 処理
a--; // ちょっと気分を変えてみた。
} while (/*条件式*/);

使い方を見て感づいた人もいるかもしれませんが、do while文はwhile文とちがって初めから条件式が成立していなくても必ず一回は処理をします。ようするにプログラムの通りに上から下へ実行していくわけですね。変数を初期化したのち処理をやってa--やってその後条件式が成立していればdoのところからまた実行する…と言った具合に。
分岐-switch
このswitch文はif~else ifの構文を簡単にしたもの…と思ってくれればOKです。例を見てみますと…

int n = 3;    // nを定義
switch (n) { // nについて条件分岐をする。
case 1:
// 処理a
break; // 後で説明します。
case 2:
// 処理b
break;
case 3:
// 処理c
break;
default:
// 処理d
break;
}

これはcase文で条件分岐しています。今回の場合、case 1:というのはif (n=1) {}という文に、case 2:というのはif (n=2) {}という文に、(中略)default:とうのはelse {}という文に相等します。つまり今回はn=3と定義しておいたので、case 3:の処理、つまりは処理cが実行されるわけです。またdefaultは…何を言いたいかはお察しください。
処理を抜ける-break
先ほどのコードにも出てきましたがbreakです。これは一応先ほどのコードで例示は済んでいるとみて言葉のみで説明させていただきます。

breakとはいままで出てきた制御構造の処理を途中で抜けるときに使います。よって必然的にif文とセットで出てくることが多くなっています。たとえば、while文のなかでbreakを使ったif文をいれておけば、ifが成立したらwhile文の処理が残っているか残っていないかに関係なくwhile文の繰り返し処理を終了させて次の処理(while文の外の処理)を始めます。またswitch文では、一つのcaseが成立したら後の処理をする意味がないのでbreak文を使い後の条件分岐を飛ばしています。

また一度に多くのループを抜けることもできます。これについては一応例示しておきましょう。

loop1:  for (i = 0; i < 10; i++) {
for (j = 0; j < 10; j++) {
if ((i == 1) && (j == 5)) {
break loop1;
}
}
}

loop1というラベルをつけることで、上の場合i==1,j==5がどちらも成立したときにfor (i=0; i<10; i++)というループとfor(j=0; j<10; j++)というループを一気に抜けることができます。
処理を繰り返す-continue
なんだか分かりにくいかもしれませんが、使い方はほぼbreakと同じです。ですが、実行された後になされる処理が違います。
for (i = 0; i < 10; i++) {
if (i == 5) {
continue;
}
System.out.println(i);
}

この場合もしcontinueでは無くbreakだとiが5になったところでfor文を終了してしまい、5以降の数字がなにも表示されなくなりますが、continueだとiが5の時だけif文以降の処理をしない…つまり数字を表示しませんが、for文はまたi=6の処理から続けられます。 わかりやすいように出力結果を示すと…
※breakの場合
0
1
2
3
4
※continueの場合
0
1
2
3
4
6
7
8
9

というわけで制御構文については以上です。
まだまだ続きます(汗
自分が先に覚えて…などと思っていたのですが、なんかそれだと連載がひどく遅れてしまうようなので同時平行で勉強しようと考えています。

つ…ま…り…

皆さんと僕は同じレベルなわけですな(笑) それではまた!

過去記事、HTML版(準備中)はコチラ
[参考URL]




おっと忘れるとこでした。。。
Pythonで書いたFizzBuzz問題の僕なりな模範解答をお見せします。

#! /usr/bin/python

def FizzBuzz(n):
for i in range(1, n):
if i % 3 == 0 and not i % 5 != 0 and i % 5 == 0:
print "FizzBuzz",
elif i % 3 == 0:
print "Fizz",
elif i % 5 == 0:
print "Buzz",
else:
print i,

本当は最初のif文をもっとコンパクトにしたかったのですが、pythonのブール演算子が短絡演算子といって、左から条件をみていって条件が成立した時点で、そこから右の条件を無視してしまう演算子になっているらしく、やむなくこうなりました。ちなみにこれで処理が正しくなるのは、ブール演算子の優先順位がnot→andとなっておりnotを先に判定するためです。

そしてこの問題は工夫次第でとっても難しい問題となります。今回やったのは一番簡単なものであったので、これからはさらに難しいものにも挑戦していこうと思います。