• 検索結果がありません。

繰り返し処理: for 文 CプログラミングⅠ

N/A
N/A
Protected

Academic year: 2021

シェア "繰り返し処理: for 文 CプログラミングⅠ"

Copied!
23
0
0

読み込み中.... (全文を見る)

全文

(1)

CプログラミングⅠ

繰り返し処理 : for文

(2)

繰り返し処理

例えば,“ Hello World ! ”を10回出力したいとき

繰り返し文 を使うと

文字列を10回表示する

1:

2:

3:

4:

5:

6:

7:

8:

9:

10:

11:

12:

13:

14:

15:

16:

17:

#include <stdio.h>

int main(void) {

printf("Hello World !¥n");

printf("Hello World !¥n");

printf("Hello World !¥n");

printf("Hello World !¥n");

printf("Hello World !¥n");

printf("Hello World !¥n");

printf("Hello World !¥n");

printf("Hello World !¥n");

printf("Hello World !¥n");

printf("Hello World !¥n");

return 0;

}

メンドクサイ!

繰り返し文を用いる

1:

2:

3:

4:

5:

6:

7:

8:

9:

10:

11:

#include <stdio.h>

int main(void) {

int i;

for(i = 0; i < 10; i++) { printf("Hello World !¥n");

}

return 0;

}

スッキリ!

(3)

繰り返し処理

繰り返し処理とは

同じ処理を何度も繰り返す

プログラム制御の基本の一つ

C言語での繰り返し処理

次の繰り返し文を用いて記述できる

for文

while文

do~while文

繰り返しの例1

資格試験に合格するまでは

勉強して,試験を受け続ける.

カウントが200未満

腕立てする.

カウントを1増やす.

腕立て伏せ 資格取得 200回

繰り返しの例2

(4)

繰り返し処理 : for文

for文

初期値設定

条件式

後処理 真

① 初期値設定(初期化)

② 条件式の判定

③-1 条件式の判定結果が真の場合

ブロック内の文を実行した後,後処理を実行し,

②に戻る

③-2 条件式の判定結果が偽の場合

ブロック内の文を実行せずに繰り返しを終了する

条件式が真の間 ブロック内の文を 繰り返し実行する for文の書式

for( 初期値設定 ; 条件式 ; 後処理 ){

文;

文;

}

(5)

繰り返し処理 : for文

for文のプログラム例

for文による文字列の繰り返し表示 1:

2:

3:

4:

5:

6:

7:

8:

9:

10:

11:

12:

#include <stdio.h>

int main(void) {

int i;

for(i = 0; i < 3; i++ ) { printf("Hello World !¥n");

}

return 0;

}

① i に0を初期設定( i に0を代入)

② i(=0)は3より小さいか?を判定

③ 小さいので,printf文を実行,

④ i を1増やす( i ←1)

⑤ i(=1)は3より小さいか?を判定

⑥ 小さいので,printf文を実行,

⑦ i を1増やす( i ←2)

⑧ i(=2)は3より小さいか?を判定

⑨ 小さいので,printf文を実行,

⑩ i を1増やす( i ←3)

⑪ i(=3)は3より小さいか?を判定

⑫ 小さくない(等しい)ので,

printf文を実行せずに繰り返し終了

③ ⑥ ⑨

(6)

繰り返し処理 : for文

for文のプログラム例

for文による文字列の繰り返し表示 1:

2:

3:

4:

5:

6:

7:

8:

9:

10:

11:

12:

#include <stdio.h>

int main(void) {

int i;

for(i = 0; i < 3; i++ ) { printf("Hello World !¥n");

}

return 0;

}

for文の処理を書き下すと・・・

1:

2:

3:

4:

5:

6:

7:

8:

9:

10:

11:

12:

13:

14:

15:

16:

17:

18:

19:

20:

i = 0;

if(i < 3){

printf("Hello World !¥n");

i++;

}

if(i < 3){

printf("Hello World !¥n");

i++;

}

if(i < 3){

printf("Hello World !¥n");

i++;

}

if(i < 3){

printf("Hello World !¥n");

i++;

} i4実行されないになっているので

(7)

繰り返し処理 : for文

for文のフローチャート

式2

処理 真 for 偽

式3

式1

式1; 式2; 式3

処理

フローチャート1

フローチャート2 繰り返し終了

この講義では,なるべく フローチャート1 の記述法を用いる.

for ( 式1; 式2; 式3 ) { 文;

・ ・ ・ }

初期化 繰り返し条件

値の更新

(後処理)

処理内容

どちらも同じ処理内容

を意味する

(8)

繰り返し処理 : for文

i <= 5 start

for

i++

i = 1

i=1; i<=5; i++

start

end

終了

i

繰り返して います.

繰り返しが終 わりました.

繰り返して います.

繰り返しが終 わりました.

end

文字列を5回表示する

1:

2:

3:

4:

5:

6:

7:

8:

9:

10:

11:

12:

13:

#include <stdio.h>

int main(void) {

int i;

for(i = 1; i <= 5; i++){

printf("繰り返しています.¥n");

}

printf("繰り返しが終わりました.¥n");

return 0;

}

for文のフローチャート例

実行結果

繰り返しています.

繰り返しています.

繰り返しています.

繰り返しています.

繰り返しています.

繰り返しが終わりました.

(9)

繰り返し処理 : for文

for文のプログラム例

繰り返し処理の中での変数の利用

繰り返し処理の中での変数の利用

1:

2:

3:

4:

5:

6:

7:

8:

9:

10:

11:

12:

13:

#include <stdio.h>

int main(void) {

int i;

for(i = 1; i <= 5; i++){

printf("%d番目の繰り返しです.¥n", i);

}

printf("繰り返しが終わりました.¥n");

return 0;

}

実行結果

1番目の繰り返しです.

2番目の繰り返しです.

3番目の繰り返しです.

4番目の繰り返しです.

5番目の繰り返しです.

繰り返しが終わりました.

繰り返し処理の中で 変数 i を利用する

繰り返しのたびに

値が1増える

(10)

繰り返し処理 : for文

for文のプログラム例

繰り返し処理の中での変数の利用

繰り返し処理の中での変数の利用

1:

2:

3:

4:

5:

6:

7:

8:

9:

10:

11:

12:

13:

#include <stdio.h>

int main(void) {

int i;

for(i = 1; i <= 5; i++){

printf("%d番目の繰り返しです.¥n", i);

}

printf("繰り返しが終わりました.¥n");

return 0;

}

実行結果

1番目の繰り返しです.

2番目の繰り返しです.

3番目の繰り返しです.

4番目の繰り返しです.

5番目の繰り返しです.

繰り返しが終わりました.

① i に1を初期設定(

i

1

を代入)

② i(

= 1

)は

5

以下か?

5

以下なので,1番目… を表示

i++

を実行(

i

← 2 )

⑤ i(

= 2 )は 5

以下か?

5

以下なので,2番目… を表示

i++

を実行(

i

← 3 )

⑧ i(

= 3

)は

5

以下か?

5

以下なので,3番目… を表示

i++

を実行( i ← 4 )

⑪ i(

= 4

)は

5

以下か?

5

以下なので,4番目… を表示

i++

を実行( i ← 5 )

⑭ i(

= 5)は 5

以下か?

5

以下なので,5番目… を表示

i++

を実行( i ← 6 )

i

= 6

)は

5

以下か?

5以下ではないので,

繰り返し終了

⑲ 繰り返しが終わりました 表示

(11)

式の値

for文における条件式の判定 : 「式の値」の判定

0以外 0

① 初期値設定

② 式の値を判定

③-1 式の値が0以外の場合,

文を実行(複数の文があれば,それらを実行)した後,

後処理を実行し,②に戻る

③-2 式の値が0の場合,

文を実行せずに繰り返しを終了する

式の値が0以外の間 文を繰り返し実行する

初期値設定

式の値

後処理

for文の書式

for( 初期値設定 ; 式の値 ; 後処理 ){

文;

文;

}

(12)

式の値

条件式の値

条件式が成り立つ(真)とき 条件式の値は1

条件式が成り立たない(偽)とき 条件式の値は0

代入文の値

代入した値が,代入文(式)の値となる

たとえば,「 i = 5;」 という代入文の値は 「5」 となる.

for(i = 5; i = 5; i++) { printf("iの値は%d¥n", i);

}

“ i の値は5”が繰り返しずっと出力される i に5が代入され続ける(式の値が5)

for(i = 5; i == 5; i++) { printf("iの値は%d¥n", i);

}

“ i の値は5”が1回だけ出力される

i が5と等しいのが最初の1回のみ

(13)

入力した数だけ*を出力

1:

2:

3:

4:

5:

6:

7:

8:

9:

10:

11:

12:

13:

14:

15:

16:

#include <stdio.h>

int main(void) {

int num;

int i;

printf("いくつ*を出力しますか?¥n");

scanf("%d",&num);

for(i = 1; i <= num; i++){

printf("*");

}

printf("¥n");

return 0;

}

for文の応用

start

end

"*"の出力.

改行

いくつ*を出力しますか?

numに入力

実行結果

いくつ*を出力しますか?

8[Enter]

********

入力値に応じた繰り返し処理(1)

i

1

から

num

まで 処理(*の出力)を繰り返す

繰り返しの 回数を入力

num個の*が出力される

入力した個数の*が出力

i <= num i = 1

i++

(14)

for文の応用

num = 5 の場合 i = 1 * を 1個表示

i = 2 * を 1個表示(1個目の * の右隣に表示)

i = 3 * を 1個表示(2個目の * の右隣に表示)

i = 4 * を 1個表示(3個目の * の右隣に表示)

i = 5 * を 1個表示(4個目の * の右隣に表示)

i = 6 繰り返し終了 改行を表示

入力値に応じた繰り返し処理(1)

「入力した数だけ * を出力」の 実行過程

start

end

"*"の出力.

改行

いくつ*を出力しますか?

numに入力

i <= num i = 1

i++

実行結果

いくつ*を出力しますか?

5[Enter]

*****

(15)

入力した数までの合計を求める

1:

2:

3:

4:

5:

6:

7:

8:

9:

10:

11:

12:

13:

14:

15:

#include <stdio.h>

int main(void) {

int num=0,sum=0;

int i;

printf("いくつまでの合計を求めますか?¥n");

scanf("%d",&num);

for(i = 1; i <= num; i++){

sum += i;

}

printf("1から%dまでの合計値は%dです.¥n", num, sum);

return 0;

}

for文の応用

実行結果

いくつまでの合計を求めますか?

10[Enter]

1から10までの合計値は55です.

入力値に応じた繰り返し処理(2)

1 + 2 + 3 + ... + num

の値を 計算するプログラム

sum

i

の値(1, 2, ... , num) を次々と足していく

start

end

合計はsumです いくつまでの合計?

numに入力

i <= num i = 1

i++

num=0 sum=0

sum += i

(16)

for文の応用

num = 5 の場合

i = 1 sum + 1 を sum に代入 (sumの値は 1 ) i = 2 sum + 2 を sum に代入 (sumの値は 3 ) i = 3 sum + 3 を sum に代入 (sumの値は 6 ) i = 4 sum + 4 を sum に代入 (sumの値は 10 ) i = 5 sum + 5 を sum に代入 (sumの値は 15 ) i = 6 繰り返し終了

sum=0

sum には 1 + 2 + 3 + 4 + 5 の値が入る 繰り返し開始前

入力値に応じた繰り返し処理(2)

「入力した数までの合計を求める」の 実行過程

start

end

合計はsumです いくつまでの合計?

numに入力

i <= num i = 1

i++

num=0 sum=0

sum += i

(17)

文のネスト

ネスト

入れ子(箱の中に箱が入っている)

プログラミング言語では,なんらかの構文中の処理の中に 構文を記述することを『ネスト』するという

for文のブロック中にfor文を記述する(2重ループ)

for文のネスト

構文

for (式1-1; 式1-2; 式1-3) {

・ ・ ・

for (式2-1; 式2-2; 式2-3) {

・ ・ ・

}

}

for ( ) {

}

for

文の中に

for

文を書ける

for ( ) { }

(18)

for文をネストする 1:

2:

3:

4:

5:

6:

7:

8:

9:

10:

11:

12:

#include <stdio.h>

int main(void) {

int i, j;

for(i = 0; i < 5; i++){

for(j = 0; j < 3; j++){

printf("iは%d:jは%d¥n", i, j);

} }

return 0;

}

文のネスト

iは0:jは0 iは0:jは1 iは0:jは2 iは1:jは0 iは1:jは1 iは1:jは2 iは2:jは0 iは2:jは1 iは2:jは2

実行 結果

iは3:jは0

iは3:jは1 iは3:jは2 iは4:jは0 iは4:jは1 iは4:jは2

ネストした ブロックは 一段字下げ

for文をネストする

for文がネストされている

start

end j < 3 j = 0

i++

i=0

j++

"iは%d:jは%d¥n"

i < 5

(19)

for文をネストする 1:

2:

3:

4:

5:

6:

7:

8:

9:

int i, j;

for(i = 0; i < 5; i++){

for(j = 0; j < 3; j++){

printf("iは%d:jは%d¥n", i, j);

} }

文のネスト

for文をネストする 実行結果

iは0:jは0 iは0:jは1 iは0:jは2 iは1:jは0 iは1:jは1 iは1:jは2 iは2:jは0 iは2:jは1 iは2:jは2 iは3:jは0 iは3:jは1 iは3:jは2 iは4:jは0 iは4:jは1 iは4:jは2

i

0

のとき,

j が

0, 1, 2

と 繰り返される

i

1

となったとき,

j

の値が

0

に 初期化された上で

1, 2

と繰り返される

i

2

となったとき,

j

の値が

0

に 初期化された上で

1, 2

と繰り返される

i

4

となったとき,

j

の値が

0

に 初期化された上で

1, 2

と繰り返される

内側ループによりprintf文が3回実行されることが,

外側のループにより5回繰り返される

(20)

if文との組み合わせ 1:

2:

3:

4:

5:

6:

7:

8:

9:

10:

11:

12:

13:

14 15:

16:

17:

18:

19 20:

#include <stdio.h>

int main(void) {

int i, j, ch = 0;

for(i = 0; i < 5; i++){

for(j = 0; j < 5; j++){

if(ch == 0){

printf("*");

ch = 1;

} else{

printf("-");

ch = 0;

} }

printf("¥n");

}

return 0;

}

文のネスト

i=0; i<5; i++

start

end

j=0; j<5; j++

終了

i

終了

j

ch==0

"*" "-"

ch=1 ch=0

if

改行

ch=0

if文との組み合わせ

実行結果

*-*-*

-*-*-

*-*-*

-*-*-

"*"の次は"-"を

出力するように

chを1にする

"-"の次は"*"を

出力するように

chを0にする

内側のループが

終了したら改行する

(21)

① i に

0

を代入

i

5

より小さいか?

5

より小さいので,内側の繰り返し実行

j

0

を代入

j( = 0

)は

5

より小さいか?

5

より小さいので,if文実行

ch

= 0

)は

0

か?

0

なので

* を表示

ch

1

を代入

j++

を実行(

j

1

が入る)

j( = 1

)は

5

より小さいか?

5

より小さいので,if文実行

ch

(⑨で

1

が入った)は

0

か?

0

ではないので

-

を表示

ch

0

を代入

j++

を実行(

j

2

が入る)

j( = 2

)は

5

より小さいか?

5

より小さいので,if文実行

ch

(⑮で

0

が入った)は

0

か?

0

なので

* を表示

ch

1

を代入

j++

を実行(

j

3

が入る)

if文との組み合わせ 1:

2:

3:

4:

5:

6:

7:

8:

9:

10:

11:

12:

13:

14 15:

16:

17:

18:

19 20:

#include <stdio.h>

int main(void) {

int i, j, ch = 0;

for(i = 0; i < 5; i++){

for(j = 0; j < 5; j++){

if(ch == 0){

printf("*");

ch = 1;

} else{

printf("-");

ch = 0;

} }

printf("¥n");

}

return 0;

}

文のネスト

if文との組み合わせ

実行結果

*-*-*

-*-*-

*-*-*

(22)

j( = 3

)は

5

より小さいか?

5

より小さいので,if文実行

ch

(㉑で

1

が入った)は

0

か?

0

ではないので

-

を表示

ch

0

を代入

j++

を実行(

j

4

が入る)

j( = 4

)は

5

より小さいか?

5

より小さいので,if文実行

ch

(㉗で

0

が入った)は

0

か?

0

なので

* を表示

ch

1

を代入

j++

を実行(

j

5

が入る)

j( = 5

)は

5

より小さいか?

5

より小さくないので内側繰り返し終了

㊲ 改行を表示

i++

を実行(

i

1

が入る)

i

5

より小さいか?

5

より小さいので,内側の繰り返し実行

j

0

を代入

※ ㉝で

ch

1

が入ったので 次は

-

から表示される

if文との組み合わせ

1:

2:

3:

4:

5:

6:

7:

8:

9:

10:

11:

12:

13:

14 15:

16:

17:

18:

19 20:

#include <stdio.h>

int main(void) {

int i, j, ch = 0;

for(i = 0; i < 5; i++){

for(j = 0; j < 5; j++){

if(ch == 0){

printf("*");

ch = 1;

} else{

printf("-");

ch = 0;

} }

printf("¥n");

}

return 0;

}

文のネスト

if文との組み合わせ

実行結果

*-*-*

-*-*-

*-*-*

-*-*-

(23)

講義のまとめ

 繰り返し処理

同じ処理を何度も繰り返す

プログラム制御のひとつ

 for文

前判定繰り返し処理

繰り返しの回数が分かっている場合に用いられること が多い

 文のネスト

箱の中に箱が入っているのと同じように,for文の中に for文が入っている(2重ループ)

他,if文の中にif文が入っている場合もネストという

参照

関連したドキュメント

添付資料4 地震による繰り返し荷重を考慮した燃料被覆管疲労評価(閉じ込め機能の維持)に

本事業では、繰り返し使える容器のシェアリングサービス「 Re&amp;Go cup 」をスターバックス の

 実施にあたっては、損傷したHIC排気フィルタと類似する環境 ( ミスト+エアブロー ) ※1 にある 排気フィルタ

前処理フィルタ2B 漏えい個所 漏えいあり 腐⾷あり スラッジ塊あり 異常なし. 

  他人か ら産業廃棄物 の処理 (収集運搬、処 分)の 委託を 受けて 、その

• De Glauwe,P などによると、 「仮に EU 残留派が勝 利したとしても、反 EU の動きを繰り返す」 → 「離脱 した方が EU

り分けることを通して,訴訟事件を計画的に処理し,訴訟の迅速化および低

 かつての広葉樹は薪炭林としての活用が主で、20〜40年の周期