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
第 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) puts(“その数は奇数です.”); else puts(“その数は偶数です.”); printf(“もう一度? [Yesは0, Noは9] : “); scanf(“%d”, &count); } while( count == 0 );
return 0;}
{ }で囲まれた部分を繰り返す
( ) 内の条件が成立する限り
実行してみよう (PP.60--61)
整数を入力してください : 4その数は偶数です.もう一度? [Yes は 0, No は 9] : 0整数を入力してください : 3その数は奇数です.もう一度? [Yes は 0, No は 9] :
最初に整数として 4 を入力
これは 2 で割るとあまりが0だから「偶数」と表示
「もう一度実行するか」と聞かれる
0を入力0だから,もう一度実行
整数として 3 を入力
これは 2 で割るとあまりが1だから「奇数」と表示
実行例を コードをたどりながら (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;}
条件成立だから
繰り返し
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 以下なら繰り返す
複合代入演算子 ( 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
後置演算子 ( P.67 必須知識)
変数 ++ 変数の値をひとつ増やす変数 -- 変数の値をひとつ減らす
後置演算子では,評価してから,1だけ増やす(減らす)
[ 例 ] int main(void){ int number = 10;
number ++; /* number の値は 10 + 1 で 11 */ number --; /* number の値は 11 - 1 で 10 に戻る */ return 0;}
上の評価結果は 10 で, 下の評価結果は 11
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 %
ループ変数: 繰返しを制御する変数
この変数の値を操作して制御
文字定数と putchar() (P.69)
文字定数: 1 文字を一重引用符で囲ったもの[ 例 ] ‘ a’, ‘X’, ‘7’, ‘*’
改行やタブなど,見えない 1 文字の表現 ‘ \n’ 改行, ‘ \t’ タ
ブ
putchar() : 1 文字を印字 [ 例 ] putchar(‘a’) ・・・ 1 文字 a を印字 putchar(‘\n’) ・・・ 改行
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--; }
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 が最初に印字され
るのはなぜ?
プログラミングでは変数の値が次々と変化するその時点でのすべての変数の値の組をプログラムの状態という
無限ループ (P.134, P.136)
ループの継続条件が常に成立するループ[ 例 ] do-while 文や while 文での条件を1にしたとき
int main(void){ while(1)
printf(“ だれか止めてよう~ \n”); return 0;}
もし,間違って無限ループをもつプログラムを実行してしまったら, ctrl-C( コントロール・キーを押しながら C) で止めることができる.
% ./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 の内部を実行
ループ変数の更新条件判定→実行→更新を繰り返す
実行例を コードをたどりながら (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とする
ループ変数を更新し,条件が充たされる限り繰り返す
for 文での注意事項 (P.75)
for( 初期化 ; 繰り返し継続条件 ; 更新 )ループ本体
• 初期化: 繰り返しが始まる前に 1 度だけ実行– 初期化は,実施することがなければ,省略してもよい
• 繰り返し継続条件 : 評価した結果が非 0 なら継続– 繰り返し継続条件を省略すると非 0 となり,無限ループ
• 更新: 繰り返し処理の 1 回が終了し,次回の前に実行– 更新は,実施することがなければ,省略してもよい
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
ループが入れ子になっている
実行例を コードをたどりながら (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 文が,一気に実行されると考えるとわかりやすい
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 以下であるかぎり,内側のループが回るため
星の数が行番号と一致
今回押さえるべきプログラム
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 を含むもっとも内側のループを
抜ける
クイズ次のプログラムの実行結果を示せ
#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;}
正解
* ** *** *********
第 1 行は 4 つ空白, 1 つ星印第 2 行は 3 つ空白, 2 つ星印第 3 行は 2 つ空白, 3 つ星印第 4 行は 1 つ空白, 4 つ星印第 5 行は空白なし, 5 つ星印