SlideShare ist ein Scribd-Unternehmen logo
1 von 59
Downloaden Sie, um offline zu lesen
第2回 繰り返しとネスト+α
参考書:スッキリわかるJava入門 第2版
目次
• while
• for
• スコープ
• ネスト
• 繰り返しの中断
• 演習
2
目次
• while
• for
• スコープ
• ネスト
• 繰り返しの中断
• 演習
3
while
英語では「~する間」などの意味
「繰り返し」を行う方法のひとつ
while( 条件式 ){
「条件式」がtrueのときに
繰り返される処理;
}
4
似てる?
while( 条件式 ){
「条件式」が
trueのときに
行われる処理;
}
5
if( 条件式 ){
「条件式」が
trueのときに
行われる処理;
}
フローチャート
プログラムの流れを図で示したもの
6
while開始
while終了
条件式
処理
true
false
do-while
条件式の判定よりも先に処理をする
do{
最低でも1回は行われる処理;
} while( 条件式 );
7
フローチャート
8
do-while開始
do-while終了
条件式
処理
true
false
実演
9
実演
10
実演
11
実演
12
実演
13
実演
14
実演
15
実演
16
バラバラ
17
目次
• while
• for
• スコープ
• ネスト
• 繰り返しの中断
• 演習
18
for
英語では「~へ向けて」などの意味
多くの場合、回数が決められた繰り返しを行う
for( 初期化; 繰り返し条件; 繰り返し時の処理 ){
繰り返す処理;
}
19
whileで言うと
20
初期化
繰り返し時の処理
繰り返し条件
forで「10回繰り返す」
for( int i = 0; i < 10; i++ ){
System.out.println( i + “回目” );
}
21
こんなことも可能
22
こんなことも可能
23
フローチャート
24
for開始
for終了
初期化
繰り返し時の
処理
繰り返す処理
繰り返し
条件
true
false
実演
25
実演
26
実演
27
実演
28
「i」の使える範囲
29
「i」の使える範囲
30
目次
• while
• for
• スコープ
• ネスト
• 繰り返しの中断
• 演習
31
スコープ
変数が利用可能な範囲のこと
変数の寿命、とも言われる
ブロック内で宣言された変数は
そのブロックが終わると同時に消滅する
32
ブロック
{ }の中のこと
33
ブロック
forでも考える
34
ネストは「forとifの合わせ技もできる!」とかって言って、「今までは
mainの中にifとかforとか書いてきた。同じようにforの中にifとか、ifの
中にforとか書ける」っていう感じで実際に書く
で、forの中のforだけちょっとややこしいってことも説明
35
目次
• while
• for
• スコープ
• ネスト
• 繰り返しの中断
• 演習
36
ネスト
forやifの合わせ技
入れ子、とも言う
ifの中のfor
ifの中のif
forの中のif
forの中のfor
37
ifの中のfor
38
ifの中のfor
39
ifの中のif
40
ifの中のif
41
forの中のif
42
forの中のif
43
forの中のfor
44
forの中のfor
45
forの中のfor
46
「i」:0回目
「i」:1回目
「i」:2回目
「深い」ネスト
47
目次
• while
• for
• スコープ
• ネスト
• 繰り返しの中断
• 演習
48
break
最も内側の繰り返しブロックから抜け出す命令
無限ループからも抜け出せる
break;
49
実演
50
実演
51
continue
今の周回を中断して、次の周回に進む
繰り返しの一部を飛ばしたいときに使える
continue;
52
実演
53
実演
54
目次
• while
• for
• スコープ
• ネスト
• 演習
55
演習①
int型の変数num1とnum2を用意し、それらに好きな値を入れる。
whileの中でどちらか一方の値を変化させ、2つの変数の値が一致し
たとき、whileから抜け出すプログラムを作成せよ。ただし、ネストして
はいけない。
56
演習②
forを用いて、5の階乗を計算するプログラムを作成せよ。
※階乗:「5!」で「5の階乗」と読み、意味は
5×4×3×2×1
である。
57
演習③
forのネストを利用して、次のページのように出力を行うプログラムを
作成せよ。
58
演習③
59

Weitere ähnliche Inhalte

Mehr von XMLProJ2014

Mehr von XMLProJ2014 (20)

Java班講義資料第3回
Java班講義資料第3回Java班講義資料第3回
Java班講義資料第3回
 
第1回Java講義資料
第1回Java講義資料第1回Java講義資料
第1回Java講義資料
 
00環境構築
00環境構築00環境構築
00環境構築
 
Mash up awards(クリスマス会)
Mash up awards(クリスマス会)Mash up awards(クリスマス会)
Mash up awards(クリスマス会)
 
きのこたけのこ戦争
きのこたけのこ戦争きのこたけのこ戦争
きのこたけのこ戦争
 
クリパ用Lt2014
クリパ用Lt2014クリパ用Lt2014
クリパ用Lt2014
 
ポケモン解説
ポケモン解説ポケモン解説
ポケモン解説
 
クリスマス会Lt
クリスマス会Ltクリスマス会Lt
クリスマス会Lt
 
一年ツイッター
一年ツイッター一年ツイッター
一年ツイッター
 
C++班
C++班C++班
C++班
 
C#班
C#班C#班
C#班
 
Web班
Web班Web班
Web班
 
Web 11
Web 11Web 11
Web 11
 
Web 09
Web 09Web 09
Web 09
 
Android班第4回
Android班第4回Android班第4回
Android班第4回
 
Web 10
Web 10Web 10
Web 10
 
OpenSource
OpenSourceOpenSource
OpenSource
 
百合について
百合について百合について
百合について
 
Web 08
Web 08Web 08
Web 08
 
Web 08
Web 08Web 08
Web 08
 

Java班講義資料第2回

Hinweis der Redaktion

  1. ここからプログラムの動きが多少複雑になってくる 覚えることは少ないけれど、流れをきちんと追えるよう、頭を使う
  2. 条件式がtrueである限り、処理を繰返し続けるので、whileの中で条件式に何らかの影響を与えていかないと、いわゆる「無限ループ」に陥る 逆に言えば、whileで無限ループが作れる。たまにやる。 そういうときはswitch文で使ったbreakが役立つ breakは{}から抜け出す命令
  3. 形は何となく似てる でも「繰り返す」ので、プログラムの動きはちょっと複雑
  4. フローチャート:プログラムの流れを図で示したもので、決まった書き方や図の使い方がある。結構使われるけど複雑なものではなく、詳しくなくても何となくわかるので何かと便利。 whileが開始されると、まず条件式の判定 trueなら処理が行われ、falseなら終わる 判定→処理の流れが、falseになるまで繰り返される そのため、条件式が最初からfalseだった場合、処理を行わずに終了する
  5. 条件式の判定に関わらず、最低でも1回は処理を必ず行ってほしい、という場合に使える 最後に「;」をつけなければならないことに注意
  6. do-whileが開始されると、まず処理が行われる そのあとに条件式の判定が行われ、trueならもう一度処理、falseなら終わる whileでは判定→処理の流れだったが do-whileでは処理→判定の流れなので、確実に一度は処理が行われる
  7. 0から始まって1ずつ増えていくので0~9の10回であることに注意
  8. 10回繰り返すために使う 変数、条件、処理 がバラバラになっている 今は短くてシンプルだからいいけど、もっと複雑なプログラムになってくると、わかりにくい
  9. 初期化:繰り返しの軸となる変数を作る 繰り返し条件:処理をするかどうか、初期化した変数を基準に判定するための条件式 繰り返し時の処理:繰り返す処理が行われた後、繰り返し条件に影響を与えるような変化を初期化した変数に与える いまいちピンとこないかもしれないので、whileで見てみる
  10. 初期化:繰り返しの軸となる変数を作る 繰り返し条件:処理をするかどうか、初期化した変数を基準に判定するための条件式 繰り返し時の処理:繰り返す処理(今回はsysoutで文字列を出力)が行われた後、繰り返し条件に影響を与えるような変化を初期化した変数に与える これらをforにしてみると
  11. 初期化:繰り返しの軸となる変数を作る 繰り返し条件:処理をするかどうか、初期化した変数を基準に判定するための条件式 繰り返し時の処理:繰り返す処理(今回はsysoutで文字列を出力)が行われた後、繰り返し条件に影響を与えるような変化を初期化した変数に与える ちなみに、「i」というのも変数だから名前はなんでもいい。繰り返しの基準にするだけだから適当に1文字でもいい、という感じなだけ ただし、この「初期化」「繰り返し条件」「繰り返し時の処理」の説明はあくまで「基本的にはこういうもの」というだけ
  12. 「初期化」、「繰り返し条件」、「繰り返し時の処理」の基本的な役割を全て無視して、こんなことをしても大丈夫 初期化:「i」は繰り返しの軸になってない 繰り返し条件:初期化した変数使ってない 繰り返し時の処理:繰り返し条件に影響を与えない 今回は全く無意味なものだが、場合によっては、あえて無視することで良くなることもある 要するに、基本的な書き方だけでなく、色々と手を加えて柔軟な処理が行えることも覚えておこうという話
  13. 実行結果はjが10で初期化されているので、もちろん「何も表示されない」
  14. 左上から始まり、右下で終わる 同じ色の丸へ繋がっている 「初期化」はforの最初に1回だけ実行される 「繰り返し条件」は「繰り返す処理」の前。forでは、do-whileのように後で判定することはできない。 「繰り返し時の処理」は「繰り返す処理」が終わった後に実行される。
  15. さっきまでは0から1ずつ増えていたが、減らしていくことももちろんできる
  16. 10から始まり、変数「i」の値を出力した後、2ずつ減らされている
  17. 全く意味がないけれど、whileっぽく書くことだってできる 「初期化」と「繰り返し時の処理」が省略され、それぞれ別の場所に書かれている ちなみに、「初期化」「繰り返し条件」「繰り返し時の処理」の3つすべてを省略して、2つの「;」だけを書くと、while(true)のときと同じように無限ループになる
  18. さりげなく使っている「i」だが、使える範囲は限られている 10回繰り返した後、最後に「10回繰り返した」と出力しようと思って、「i」を使おうとした forの中なら何も言われないけど、forの外だと赤い波線が引かれる
  19. 赤い波線が引かれた状態で実行すると、このようにエラーが出る 「iを変数に解決できません」とはつまり、「iなんて名前の変数は存在しないので使えない」ということ ⇒「i」(forの最初で初期化した変数)はforの中でしか使えない! 実は、今まで使ってきた普通の変数にも、「使える範囲」というものが存在する
  20. ブロックという新しい単語が出てきたが、なんてことはない、「{}」の中、という意味 詳しくは次のページ
  21. 分かり易いifで考える 変数numを用意して、それが0のときはifの中に入り、sumという変数を用意して、sumの値ぶんnumに足す。最後に、sumぶん足した結果numはどれくらいになったかを出力しようとした 赤い枠はmainのブロック、水色の枠はifのブロック 変数numはmainのブロックに所属しているため、消滅するのはmainの「}」の後 しかし変数sumはifのブロックに所属しているため、消滅するのはifの「}」の後 そのあとでsumを使おうとしても、消滅してしまっているから使えない、ということ
  22. forの場合、「i」は一見、forのブロックには所属していないように見えるが、フローチャートにも書いたように、この「i」はforの処理が開始された後に作られる。そのため、厳密にはブロックに入っていないものの、スコープはforが終わるまで、となっている。
  23. ifとforしか出てないけど、もちろんswitchやwhileでもOK これはもう見た方が早い
  24. numが0なら、10回、2を足す
  25. numが0なら、canSumがtrueのときインクリメント、falseならデクリメント
  26. 5回繰り返すうち、iが0のときとそうでないときで出力が変わる
  27. 「i」を使うforの繰り返しを行う中で、「j」を使うforの繰り返しが行われる ⇒3×3=9
  28. 「i」を使うforの繰り返しを行う中で、「j」を使うforの繰り返しが行われる ⇒「i」は3回しか出てこないが、「i」1回ごとに「j」は3回繰り返されるので、「j」は9回出てくる。
  29. ifを7つ連ねてみた。この状態でもパッと見で何個あるか見辛いのに、さらに条件式とか処理とかが入ってくるとなると、とんでもない見辛さになる。 ⇒ネストを深くすることは極力避ける。これもまた、見やすいソースコードを作るため。
  30. forやwhileから途中で抜け出す方法が、2つある
  31. switchでも使ったbreakという命令は、そのbreakを囲んでいる最も内側の繰り返しブロックから抜け出す、というもの これを使えば無限ループからでも簡単に抜けられる 使い方は「break;」と書くだけ
  32. forの2重ループになっている さらに「j」を使うforは100回も繰り返すことになっている! が、「j」を使うforに入って文字列を出力した後にすぐbreakが入る このbreakを囲んでいる最も内側の繰り返しブロックは「j」を使うfor なので、結局「すぐ脱出」と5回出力されて終わる
  33. continueは「今の周回を中断して、同じ繰り返しの次の周回に進む」 breakはブロックから一気に抜け出してしまったが、continueはその周回だけを中断させる 使い方はbreakと同じでただ書くだけ
  34. 最初、「i」が0のときはifに入らないので「0回目」と出力されるが、そのあと、「i」の値がインクリメントされるとifの中に入るようになり、その都度continueにより中断されてsysoutまでたどり着けないので、それ以降はforが終わるまで何も出力されない