21
第4第 第第第第第 第第第第第第第第第 2014 第第第第第第第第第第第

第 4 週 ループ処理

  • Upload
    race

  • View
    54

  • Download
    0

Embed Size (px)

DESCRIPTION

第 4 週 ループ処理. プログラミング言語  2014 立命館大学情報理工学部. List 4-1 (PP.60--P.61) do-while 文  (必須知識) {} の 内部を繰り返す.条件が成立する限り. /* 入力整した数が偶数か奇数かを判断することを繰り返す */ #include < stdio.h > int main(void) { int cont ; int no; do { printf (“ 整数を入力してください ); scanf (“%d”, &no); if(no % 2) - PowerPoint PPT Presentation

Citation preview

Page 1: 第 4 週 ループ処理

第 4 週ループ処理

プログラミング言語  2014立命館大学情報理工学部

Page 2: 第 4 週 ループ処理

List 4-1 (PP.60--P.61)   do-while 文  (必須知識)    {}の内部を繰り返す.条件が成立する限り/* 入力整した数が偶数か奇数かを判断することを繰り返す */#include <stdio.h>

int main(void){ int cont; int no;

do { printf(“整数を入力してください); scanf(“%d”, &no); if(no % 2) puts(“その数は奇数です.”); else puts(“その数は偶数です.”); printf(“もう一度? [Yesは0, Noは9] : “); scanf(“%d”, &count); } while( count == 0 );

return 0;}

{ }で囲まれた部分を繰り返す

( ) 内の条件が成立する限り

Page 3: 第 4 週 ループ処理

実行してみよう (PP.60--61)

整数を入力してください : 4その数は偶数です.もう一度? [Yes は 0, No は 9] : 0整数を入力してください : 3その数は奇数です.もう一度? [Yes は 0, No は 9] :

最初に整数として 4 を入力

これは 2 で割るとあまりが0だから「偶数」と表示

「もう一度実行するか」と聞かれる

0を入力0だから,もう一度実行

整数として 3 を入力

これは 2 で割るとあまりが1だから「奇数」と表示

Page 4: 第 4 週 ループ処理

実行例を コードをたどりながら (PP.60--61)

整数を入力してください : 4その数は偶数です.もう一度? [Yes は 0, No は 9] : 0整数を入力してください : 3その数は奇数です.もう一度? [Yes は 0, No は 9] :

#include <stdio.h>

int main(void){ int cont; int no;

do { printf(“整数を入力してください); scanf(“%d”, &no); if(no % 2) puts(“その数は奇数です.”); else puts(“その数は偶数です.”); printf(“もう一度? [Yesは0, Noは9] : “); scanf(“%d”, &cont); } while( count == 0 );

return 0;}

条件成立だから

繰り返し

Page 5: 第 4 週 ループ処理

List 4-6 (P.67) 初期化子,複合代入演算子,後置演算子(必須知識) ループに関連した演算

/* 1から5までの和 */#include <stdio.h>

int main(void){ int no = 1; int sum = 0;

do { sum += no; no++; } while ( no <= 5);

printf("1から5までを足した値は%dです.\n", sum);

return 0;}

初期化子: 変数の定義時に初期値を代入

複合演算子: sum = sum + no; と同意

後置演算子: no の値を 1 増やす

sum の初期値は 0 , no の初期値は 1do-while により,   no の値を sum に加え   no を 1 増やすこれらを no が 5 以下なら繰り返す

Page 6: 第 4 週 ループ処理

複合代入演算子 ( PP.64--66  必須知識) 

+, -, *, /, % などの演算子に対して変数 演算子= 式;

は変数 = 変数 演算子 式;

の意味となる.評価結果は代入された値

[ 例 ]  int main(void){ int number = 10;

number += 2; /* number の値は 10 + 2 で 12 */ number *= 2; /* number の値は 12 * 2 で 24 */ return 0;} 複合代入演算子の評価結果は

上が 12 で下が 24

Page 7: 第 4 週 ループ処理

後置演算子 ( P.67  必須知識)

変数 ++ 変数の値をひとつ増やす変数 -- 変数の値をひとつ減らす

後置演算子では,評価してから,1だけ増やす(減らす)

[ 例 ]  int main(void){ int number = 10;

number ++;    /* number の値は 10 + 1 で 11 */ number --;    /* number の値は 11 - 1 で 10 に戻る */ return 0;}

上の評価結果は 10 で,  下の評価結果は 11

Page 8: 第 4 週 ループ処理

List 4-7 (P.68)   while 文    (必須知識)

 条件が成立する限り内部を繰り返し/* 0までカウント・ダウン */#include <stdio.h>

int main(void){ int no; printf("整数を入力: "); scanf("%d",&no); while( no >= 0 ) { printf("%d ", no); no--; /* デクリメント(1だけ減らす) */ } putchar('\n'); /* 改行 */

return 0;}

{ }内を繰り返す

( ) 内の条件が成立する限り

do-while() 文は,実行してから条件判定   ( 1 度は,必ず,内部が実行される)while() 文は,条件判定してから内部を実行   ( 1 度も,内部が実行されないことがある)

% ./ex4-7整数を入力 : 33 2 1 0 %

ループ変数: 繰返しを制御する変数

この変数の値を操作して制御

Page 9: 第 4 週 ループ処理

文字定数と putchar() (P.69)

文字定数:  1 文字を一重引用符で囲ったもの[ 例 ]  ‘ a’, ‘X’, ‘7’, ‘*’

   改行やタブなど,見えない 1 文字の表現   ‘ \n’ 改行,     ‘ \t’ タ

putchar() :  1 文字を印字  [ 例 ] putchar(‘a’) ・・・  1 文字 a を印字      putchar(‘\n’) ・・・ 改行

Page 10: 第 4 週 ループ処理

List 4-10 (P.72) 後置演算子を用いた簡潔表現/* 指定された数だけ * を連続表示 */#include <stdio.h>

int main(void){ int no; printf("整数を入力: "); scanf("%d",&no); while( no-- > 0 ) putchar('*'); putchar('\n'); /* 改行 */

return 0;}

% ./ex4-10整数を入力 : 3***%

整数として 3 が入力されるno の値は 3

条件式で no-- > 0 が成立( 3 > 0 だから) no の値は 2* を1つ印字条件式で no-- > 0 が成立( 2 > 0 だから) no の値は 1* を1つ印字条件式で no-- > 0 が成立( 1 > 0 だから) no の値は 0* を1つ印字条件式で no-- > 0 が不成立( 0 > 0 だから) no の値は -1ループを終了して改行を1つ印字return 0;

[ 注 ]  最初は以下がおすすめ while( no > 0 ) {   putchar(‘*’);   no--; }

Page 11: 第 4 週 ループ処理

List 4-11 (P.73) 前置演算子変数の値を先に1つ増やしてから評価

/* 指定された数だけ整数を入力し,合計と平均を計算 */#include <stdio.h>

int main(void){ int i = 0; int sum = 0; /* 合計値 */ int num, tmp; printf(" 整数は何個 ?: "); scanf("%d",&num); while( i < num ) { printf("No.%d: ", ++i); scanf("%d", &tmp); sum += tmp; } printf(" 合計値 : %d\n", sum); printf(" 平均値 : %d\n", (double )sum / num);

return 0;}

num の値として 3 が入力される

条件式で i < num が成立( 0 < 3 だから) このとき i の値は 0No.1 と印字 ( 先に値が増やされるので i の値は 1 だから )

条件式で i < num が成立( 1 < 3 だから) このとき i の値は 1No.2 と印字 ( 先に値が増やされるので i の値は 2 だから )

% ./ex4-11整数は何個 ?: 3No.1: 55No.2: 23

i の初期値は 0 なのに,No.1 が最初に印字され

るのはなぜ?

プログラミングでは変数の値が次々と変化するその時点でのすべての変数の値の組をプログラムの状態という

Page 12: 第 4 週 ループ処理

無限ループ (P.134, P.136)

ループの継続条件が常に成立するループ[ 例 ] do-while 文や while 文での条件を1にしたとき

int main(void){ while(1)

printf(“ だれか止めてよう~ \n”); return 0;}

もし,間違って無限ループをもつプログラムを実行してしまったら, ctrl-C( コントロール・キーを押しながら C) で止めることができる.

Page 13: 第 4 週 ループ処理

% ./ex4-12整数は ?: 90 1 2 3 4 5 6 7 8 9%

List 4-12 (P.74--75)     for 文  (必須知識)

ループ変数を初期化し,条件成立の限り,ループ変数を更新しながら/* 指定された整数までカウントアップ */

#include <stdio.h>

int main(void){ int i, no; printf(" 整数は ?: "); scanf(“%d”,   &no);

for( i = 0;   i <= no;   i++ ) { printf("%d ", i); } putchar('\n');

return 0;}

ループ変数の初期化(これは 1 度だけ)

繰り返しを続ける条件

ループ変数の更新

成立なら for の内部を実行

繰り返しを続ける条件

成立なら for の内部を実行

ループ変数の更新条件判定→実行→更新を繰り返す

Page 14: 第 4 週 ループ処理

実行例を コードをたどりながら (PP.74--75)/* 指定された整数までカウントアップ */#include <stdio.h>

int main(void){ int i, no; printf(" 整数は ?: "); scanf(“%d”,   &no); for( i = 0;   i <= no;   i++ ) { printf("%d ", i); } putchar('\n');

return 0;}

% ./ex4-12整数は ?: 2

%0 1 2

今度は2とする

ループ変数を更新し,条件が充たされる限り繰り返す

Page 15: 第 4 週 ループ処理

for 文での注意事項 (P.75)

for( 初期化 ; 繰り返し継続条件 ; 更新 )ループ本体

• 初期化: 繰り返しが始まる前に 1 度だけ実行– 初期化は,実施することがなければ,省略してもよい

• 繰り返し継続条件 :  評価した結果が非 0 なら継続– 繰り返し継続条件を省略すると非 0 となり,無限ループ

• 更新: 繰り返し処理の 1 回が終了し,次回の前に実行– 更新は,実施することがなければ,省略してもよい

Page 16: 第 4 週 ループ処理

List 4-15 (P.78) 多重ループ (必須知識)ループの中にループ

/* 九九の表 */#include <stdio.h>

int main(void){ int i, j;

for(i = 1; i <= 9; i++) { for(j = 1; j <= 9; j++) printf("%3d", i * j); putchar('\n'); } return 0;}

% ./ex4-15   1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81

ループが入れ子になっている

Page 17: 第 4 週 ループ処理

実行例を コードをたどりながら (P.78)

/* 九九の表 */#include <stdio.h>

int main(void){ int i, j;

for(i = 1; i <= 9; i++) { for(j = 1; j <= 9; j++) printf("%3d", i * j); putchar('\n'); } return 0;}

% ./ex4-15

i を 1 にして,

   1 2 3 4 5 6 7 8   9

i を 2 にして,

   2 4 6 8 10 12 14 16 18

j でループを回すと 1 の段

j でループを回すと 2 の段

内側の for 文が,一気に実行されると考えるとわかりやすい

Page 18: 第 4 週 ループ処理

List 4-18 (P.81) 多重ループで図形/* 直角三角形を表示 */#include <stdio.h>

int main(void){ int i, j, ln;

printf(" 何段ですか ? :"); scanf("%d", &ln);

for(i = 1; i <= ln; i++) { for(j = 1; j <= i; j++) putchar('*'); putchar('\n'); } return 0;}

% ./ex4-18何段ですか ? :7****************************%

i が 1 のとき,星 1 つi が 2 のとき,星 2 つi が 3 のとき,星 3 つi が 4 のとき,星 4 つi が 5 のとき,星 5 つi が 6 のとき,星 6 つi が 7 のとき,星 7 つ

j が i 以下であるかぎり,内側のループが回るため

星の数が行番号と一致

今回押さえるべきプログラム

Page 19: 第 4 週 ループ処理

continue  と  break(P.104) ( 必須知識 )ループの途中で実行順序を変える

/* 負でない整数を入力し,その数から その 2 倍の数までの 1 桁の偶数の和を求める */int main(void){ int min, max, sum; printf(" 負でない整数 : "); scanf("%d",&min); max = 2 * min; for(sum = 0; min <= max; min++) { if(min % 2 == 1) continue; if(min >= 10) break; printf("%d ", min); sum += min; } printf(" の合計は %d\n", sum); return 0;}

% ./sumOfEven負でない整数 : 66 8 の合計は 18

continue は次のループ処理へ

2 で割った余りが 1 (奇数)なら,

ループ内の以下の処理をせず,次の繰り返し処理を開

始break はループを抜ける(p.105   List 5-15参照 )

10 以上ならループを抜ける.多重ループなら, break を含むもっとも内側のループを

抜ける

Page 20: 第 4 週 ループ処理

クイズ次のプログラムの実行結果を示せ

#include <stdio.h>

int main(void){ int ln = 5, i,j;

for(i = 1; i <= ln; i++) { for(j = 1; j <= ln - i; j++) putchar(' '); for(j = 1; j <= i; j++) putchar('*'); putchar('\n'); } return 0;}

Page 21: 第 4 週 ループ処理

正解

    *   **  *** *********

第 1 行は 4 つ空白, 1 つ星印第 2 行は 3 つ空白, 2 つ星印第 3 行は 2 つ空白, 3 つ星印第 4 行は 1 つ空白, 4 つ星印第 5 行は空白なし, 5 つ星印