アルゴリズムとプログラミング

アルゴリズムとプログラミング
(Algorithms and Programming)
第3回:条件分岐と繰り返し
•(前回補足)文字型に関して
•条件分岐
• if() ~ else
• switch ~ case
•繰り返し
•for(;;)
•do ~ while()
•while()~
講義資料等: http://www.pe.titech.ac.jp/~watanabe/lecture/ap/index-j.html
条件分岐(1) if() - else
(もし、()ならば~、そうでないなら~)
関係演算子
==
!=
>
<
>=
<=
式が真(True)となる条件
右辺と左辺が等しい
右辺と左辺が等しくない
左辺が右辺より大きい
左辺が右辺より小さい
左辺は右辺より大きいか等しい
左辺は右辺より小さいか等しい
条件式
例) if ( i == 1 ) {
iが1と等しかったときの処理;
}
else {
そうでないときの処理;
}
中カッコで囲んで
複数の文を記述
if-else文の注意点
• { }を省略すると、直後の1行のみが実行の対象とな
る。(1行のみでもなるべく中カッコを使った方がわかりやすい)
• else文は不要なら省略可
• インデントは文法的には無意味だが、見やすさ、わ
かりやすさのためには大変重要!!
• コメント文とインデントを効果的に活用しよう
例)実行結果は?
i = 1 ;
if ( i > 1 )
System.out.println( i );
System.out.println( 2 * i );
論理演算子
演算子
演算名
演算結果が真となる条件
&
論理積
左辺と右辺の両方が真
|
論理和
左辺と右辺のどちらか、または両方が真
^
排他的論理和
!
否定
&&
論理積
&と同じだが左辺がfalseなら右辺の評価は行わない
||
論理和
|と同じだが左辺がtrueなら右辺の評価は行わない
左辺と右辺のどちらか一つだけが真
真偽の反転
if ( i > 0 && i <= 10 ) {
iが0より大きくかつ10以下の場合の処理;
}
else {
そうでないときの処理;
}
if文のネスト(入れ子)
(~の条件を満たした上でさらに、もし、~だったら..)
if ( m > 0 && m <= 12 ) {
if ( d > 0 && d <=31 ) {
System.out.println( “m= “ + m + “d= “ + d );
}
else {
System.out.println( “dの値が不正です” );
}
}
else {
System.out.println( “mの値が不正です” );
}
複数の条件で条件分岐 ( else if )
(~ではなく、もし、~だったら..)
if ( m > 0 && m <= 9 ) {
System.out.println( “m=0“ + m );
}
else if ( m > 9 && m <=12 ){
System.out.println( “m=“ + m );
}
else {
System.out.println( “mの値が不正です“ );
}
m=5のときの動作
True
m=5
if ( m > 0 && m <= 9 ) {
System.out.println( “m=0“ + m );
}
else if ( m > 9 && m <=12 ){
System.out.println( “m=“ + m );
}
else {
System.out.println( “mの値が不正です“ );
}
実行結果
m=05
m=10のときの動作
False
m=10 if ( m > 0 && m <= 9 ) {
System.out.println( “m=0“ + m );
}
True
else if ( m > 9 && m <=12 ){
System.out.println( “m=“ + m );
}
else {
System.out.println( “mの値が不正です“ );
}
実行結果
m=10
m=15のときの動作
False
m=15 if ( m > 0 && m <= 9 ) {
System.out.println( “m=0“ + m );
}
False
else if ( m > 9 && m <=12 ){
System.out.println( “m=“ + m );
}
else {
System.out.println( “mの値が不正です“ );
}
実行結果
mの値が不正です
if else の省略表記(条件演算子?:)
Sample1804.java
class Sample1804 {
public static void main(String[] args) {
int i = 200 ;
int j = (i > 100) ? 1 : 0 ;
System.out.println(j);
}
}
int j ;
if( i > 100) j = 1 ;
else j = 0 ;
値で条件分岐 switch() case
switch ( 条件式 ) {
case ラベル1: 処理1
case ラベル2: 処理2
case ラベル3: 処理3
...
default: 処理
}
•条件式とcaseラベルを上から順に
比較していき、一致したところで処
理の実行に入る
•一旦実行に入ったら、caseラベル
との比較は行われず、上から順に
文が実行されるのみ
•caseラベルは単にエントリーポイ
ントを決めるだけ
•処理から抜けるにはbreak文の挿
入が必要
•caseのどれとも一致しない場合は
default:文が実行される(省略可)
switch caseのサンプル:i=3の場合
class Sample1805 {
public static void main(String[] args) {
int i = 3 ;
i=3
switch( i ) {
case 1:
iとの比較の結果、値が異なる!→次のcaseへ
System.out.println( “one” );
break;
case 2:
値が異なる!→次のcaseへ移る
case 3:
値が一致!→対応する処理を実行する
System.out.println( “two or three” );
break;
switchの外へ抜ける
default:
System.out.println( “Out of range” ); break;
}
}
}
i = 2の場合
class Sample1805 {
public static void main(String[] args) {
int i = 2 ;
i=2
switch( i ) {
case 1:
iとの比較の結果、値が異なる!→次のcaseへ
System.out.println( “one” );
break;
case 2:
値が一致!→ここから文の実行を開始する
case 3:
ラベルとの比較は行われず、文が逐次実行される
System.out.println( “two or three” );
break;
switchの外へ抜ける
default:
System.out.println( “Out of range” ); break;
}
}
}
i = 1の場合
class Sample1805 {
public static void main(String[] args) {
int i = 1 ;
i=1
switch( i ) {
case 1:
値が一致!→ここから文の実行を開始する
System.out.println( “one” );
break;
switchの外へ抜ける
case 2:
case 3:
System.out.println( “two or three” );
break;
default:
System.out.println( “Out of range” ); break;
}
}
}
switch case文の動作と注意点
• caseラベルの値が上から順番に評価され、不一致な
ら次のラベルの評価へ飛ぶ.一致すれば実行開始.
• breakを入れないと、ラベルが不一致でも、次の文が
実行される
• break文の後ろにもセミコロン ; が必要!
• caseのどれにも当てはまらない場合はdefaultが実
行される。(省略可)
• caseで指定できる値
– 数値リテラル
– 文字リテラル
– 変数や、文字列リテラルは不可
繰り返し(1)
for文
for(開始時の実行文; 繰り返しの続行判断式 ; 繰り返すごとに最後に実行する文) {
繰り返したい内容;
}
class Sample1901 {
public static void main(String[] args) {
int i ;
System.out.println(“ループに入ります”);
for( i = 0 ; i < 10 ; i++ ){
System.out.println(“まわっています ” + i );
}
System.out.println(“ループ終了しました!”);
}
class Sample1901 {
public static void main(String[] args) {
int i ;
System.out.println(“ループに入ります”);
True
for( i = 0 ; i < 2 ; i++ ){
System.out.println(“まわっています ” + i );
}
System.out.println(“ループ終了しました!”);
}
実行結果
ループに入ります
まわっています 0
変数の値
0
i=1
class Sample1901 {
public static void main(String[] args) {
int i ;
System.out.println(“ループに入ります”);
False
for( i = 0 ; i < 2 ; i++ ){
System.out.println(“まわっています ” + i );
}
System.out.println(“ループ終了しました!”);
}
実行結果
ループに入ります
まわっています 0
まわっています 1
ループ終了しました!
変数の値
i=2
1
for文の中だけで見える変数を宣言
class Sample1902 {
public static void main(String[] args) {
System.out.println(“ループに入ります”);
for( int i = 0 ; i < 10 ; i++ ){
System.out.println(“まわっています ” + i );
}
System.out.println(“ループ終了しました!”);
}
for文の外では変数iの値は参照・変更不可
for文のネスト
ファイル名:Sample1903.java
class Sample1903 {
public static void main(String[] args) {
System.out.println(“ループに入ります”);
for( int i = 0 ; i < 3 ; i++ ){
for( int j = 0 ; j < 2 ; j++ ){
System.out.println(“まわっています ”
+ “i=“ + i + “ j=“ + j );
}
}
System.out.println(“ループ終了しました!”);
}
}
繰り返し(2) while文, do while文
while(条件式){
繰り返し処理の内容
}
do {
繰り返し処理の内容
}while(条件式);
セミコロンを忘
れない!!
条件式を評価するタイミング:
処理を実行する前か、一度実行した後か
クイズ:for文はどちらに近いか?
while文の例
class Sample2001 {
public static void main(String[] args) {
int i = 0;
System.out.println(“ループに入ります”);
while( i < 10 ){
System.out.println(“i=” + i );
i++;
}
System.out.println(“ループ終了しました!”);
}
do while文の例
class Sample2002 {
public static void main(String[] args) {
int i = 0;
System.out.println(“ループに入ります”);
条件によらず必ず1度は実行される
do {
System.out.println(“i=” + i );
i++;
} while( i < 10 );
System.out.println(“ループ終了しました!”);
}
途中で強制的にループを抜ける
(for, while, do whileループ中で使用可)
break文:
breakが含まれているループの外へ強制脱出
continue文:
ループブロック内で、continueより後ろに残っ
ている文の実行を中止(ループからは脱出し
ない)
break文のサンプル
class Sample2003 {
public static void main(String[] args) {
int i = 0;
System.out.println(“ループに入ります”);
while( i < 10 ){
System.out.println(“i=” + i );
if( i == 5 ) break;
ループの外へ
i++;
}
System.out.println(“ループ終了しました!”);
}
continue文のサンプル
class Sample2004 {
public static void main(String[] args) {
System.out.println(“ループに入ります”);
for(int i = 0;i < 3; i++) {
for(int j = 0;j < 3; j++) {
if( j == 1 ) continue ;
System.out.println(“i=” + i +
“ j=“ + j );
}
continue文の実行により、forループの残りの
文がスキップされる。ループからは出ない。
}
System.out.println(“ループ終了しました!”);
}
}
まとめ
• 条件分岐
– if-else
– switch case
– 関係演算子、論理演算子
• 繰り返し
– for
– while
– do while
– break, continue