計算機実習 I

第三回 (2012 年 4 月 26 日)

制御文:条件、枝分かれ、繰り返し

http://www.sw.it.aoyama.ac.jp/2012/CP1/lecture3.html

Martin J. Dürst

AGU

© 2005-12 Martin J. Dürst 青山学院大学

今日の予定

ミニテスト

情テクのソフトボール大会

C 言語の位置づけ

個人ノートパソコンでの cygwin のホームディレクトリ

先週の演習について

プログラム開発のコツ

(advice for program development)

識別子の選び方

(identifier, 名前)

繰り返しの普遍条件

(loop invariant)

繰り返しの普遍条件の例

(Russian peasant multiplication)

a0, b0: 最初の (被) 乗数 (入力)

sf: 最後の合計 (出力)

目的: sf = a0 · b0

普遍条件: ai · bi + si = a0 · b0

数学的帰納法の基底:
i = 0 の場合、
初期化により s0 = 0 ので、
a0 · b0 + s0 = a0 · b0 + 0 = a0 · b0

 

繰り返しの普遍条件の例: 帰納

証明するもの: 普遍条件が 0 ≦ if の時に成立

数学的帰納法の帰納のステップ:

普遍条件が k 回目の最初に成り立てば、 k 回目の最後、すなわち k+1 回目の最初にも成り立つ

ak · bk + sk = a0 · b0

ak が偶数の場合: ak · bk + sk = ak/2 · bk·2 + sk = a0 · b0 (/ は整数の割算)

ak が奇数の場合: ak · bk + sk = ak/2 · bk·2 + ak + sk = a0 · b0

よって、sk+1 = sk + ( ak が基数の場合のみ) bk

ak+1 = ak / 2; bk+1 = bk · 2

 

繰り返しの普遍条件: 修了の証明

終了条件: ai = 0

ai+1 = ai / 2 によって、 ai が毎回半減、いずれ 0 になる

結果の確認:

ai = 0 の場合、ai · bi + si = 0 · bi + si = 0 + si = si = a0 · b0

よって ai = 0 の場合, si が出力として正しい

if 文の構文 (文法)

(syntax of the if statement; grammar)

if ( 条件式 )
    

文法には固定部分 (上記で if()) と置き換えられる部分がある。

文法は形だけ、意味 (動作) は別

文の種類

括弧は積極的に使用

誤解を招く書き方:

if (score >= 60)
    printf("60 点以上です。\n");
    printf("あなたは合格です。\n");

誤解のない書き方:

if (score >= 60) {
    printf("60 点以上です。\n");
    printf("あなたは合格です。\n");
}

 

ifelse の組み合わせ

if (score >= 60) {
    printf("60 点以上です。\n");
} else {
    printf("来年また会いましょう。\n");
}

if - else if - else の書き方

if (...) {
    ...
}
else if (...) {
    ...
}
else {
    ...
}

if 文の代わり: 三項演算子

(ternary operator; 条件演算子, conditional operator)

よくある一句:

if (x > y)
    max = x;
else
    max = y;

次が同等:

max = (x > y) ? x : y;

if 文の代わり: 条件式

&&|| で if 文のようなものが作れる:

if (score >= 60) {
    grade = calculate(score);
}

の代わりに

score>=60 && (grade=calculate(score));

Cygwin で使える条件式

例: gcc 03B1.c && ./a

例: gcc -o 03B1 03B1.c && ./03B1

効果:

二つの実行も上記の様につなげる

main から 0return すると真、それ以外で偽 (C 内部と逆)

switch

switch (  ) {
  case 定数1 :
    処理1 ;
    break;
  case 定数2:
  case定数3:
    処理2 ;
    ...
    break;
  default :
    処理3 ;
    break;
}

 

switch 文の注意点

break がない場合、プログラムはそのまま続く

int a = 5, b;
switch (a) {
  case 4:
    b = 3;
    break;
  case 5:
    b = 7;
  case 6:
    b = 22;
    break;
}

実行後、b の値は ...

break を意図的に使わないとき、コメントで明記

 

ifswitch の使い分け

主な目安:

for 文の文法

for ( 初期化; 継続条件; 次の一歩 ) {
    繰り返す処理;  
}

while 文の文法

while ( 継続条件 ) {
    繰り返す処理;  
}

forwhile の使い分け

主な目安:

do ... while

文法:

do {
    繰り返す処理;  
} while ( 継続条件 );

今週の演習問題

部分点の評価

表示の例:

...
Your program only passed 17 out of 20 tests.
You received 72.0 out of 100 points.

宿題に使える教室

次回の準備