前回の内容 while 構文 繰り返しを行う構文 構文: while ( 繰り返し条件 ) { 繰り返す命令 } 意味: 「繰り返し条件」が成立している限り、 「繰り返し命令」を繰り返す ( 同じ命令を何度も行う ) 実行の流れ: 0) 「繰り返し条件」をチェック => 偽(成立しない場合): 何もせず、次の命令に 真(成立した場合): 1) へ 1) 「繰り返す命令」を実行する 2) へ 2) 0) に戻る 0) -> 1) -> 2) -> 0) .. -> 0) -> 終了 真 実行 真 . 偽 プログラムを書く時の表現 「繰り返し条件」: 同じ表現のものを毎回チェックする 同じ「表現」なので、同じ意味(真/偽)になりそう その中に「変化するもの(変数)」が含まれていれば、 少なくても、条件をチェックする場合に、 値が変化する可能性がでてくる !! 変化するものが含まれていなければ、 !! 常に偽 ( 一切なにもしない.. ) !! 常に真 ( 無限に繰り返し、終了 ) => while 構文の「繰り返し条件」のところには、 変化するもの(変数)を含めるとよい !! 変数以外の「変化するもの」 !! 例 : 入力を(関数値として)、式に含めればよい さらに、 実際に、その変化を保証する必要がある !! 入力の場合は、入力するひとが、考える => 繰り返し命令の中で、「変数の値」を「更新」する 「更新」によって、変数の値が色々と変化し、 いつかは、「繰り返し条件」が不成立になるようにする必要がある 「繰り返し命令」を繰り返す事により、 最終的に、「繰り返し条件」が何時かは、「不成立(偽)になる」 ように「while 構文の条件式と命令を組み合わせる」必要がある => 数学的に示す while 構文の応用 収束値を計算するプログラム while 構文と相性がよい 二分法を利用して、方程式の解を求める 二分法 : 答え(方程式の解)が入る区間の範囲を 半分ずつにしてゆく 区間の範囲が、もとめる誤差内に入るまで、 繰り返す # 数学的には、 # a_n = (1/2)^n (n -> 無限 ) 0 に収束 # 任意 ε > 0 に対して # 十分に大きな n_0 において # |a_{n_0} - 0| < ε 数値計算 (解析的発想:答の近似値の精度を高めて行く) while 構文の数値計算の上での考え方 while ( 答えの精度が不十分 ) { 答えの精度を高める } <= while 構文の終了時には、 十分に精度の高い答え(の候補)が得られている needs: 厳密に答えがえられない場合がある 解析的な手法が存在しない ( 例: 5 次元以上代数方程式 ) => そうゆう場合でも、「答え」が欲しい seeds: ある程度の誤差が許される応用がある => 現実の世界では、「誤差の精度はいろいろあるが..」誤差が許される事がほとんど [2021/10/15] for 構文 for 構文とは 繰返しを記述する構文規則 ( cf. while ) 構文: for ( <初期化式>; <継続条件式>; <再初期化式> ) { <繰返し文> } 初期化式 : 最初に一度だけ、必ず行われる文 継続条件式 : 毎回、繰返し文の実行「前」に評価されこれが偽の場合は終了になる 繰返し文 : for 文によって繰り返される命令 再初期化式 : 繰返し文の実行の後に毎回実行される 流れ: <*> 0) 「初期化式」が実行される(必ず、一度だけ実行される) 1) 「継続条件式」をチェック 偽: for 構文は終了 真: 2) へゆく 2) 「繰り返し文」を実行して 3) へ <*> 3) 「再初期化式」を実行して 4) へ 4) 1) に戻る while 構文と for 構文は、互いに、 変換できる(事が多い..) <簡易版の変換規則> for 構文 for ( A; B; C ) { D; } => while (構文) A; while ( B ) { D; C; } # 実は、 # for 構文の括弧(パーレン「(,)」)の中身は # 省略(表現を空っぽにできる)可能 # 「初期化式」の省略 => 空文(なにもしない) # 「再初期化式」の省略 => 空文(なにもしない) # 「継続条件式」の省略 => 常に「真」となる ( 1==1 となると考えてもよい ) # while (構文) while ( A ) { B; } => for 構文 for ( ; A; ) { B; } for 構文の良いところ (while 構文と比較して..) 制御変数があり、 その制御変数への操作が、ひとまとまりにできるならば、 for 構文の括弧になかに一度に記述する事により、 「解かりやすく」なる 特に 固定回数繰り返しパターンは、一目でわかるので、 その場合は for 構文の利用を推奨 !! 明示的なループ制御変数がなかったり、 !! あるいは、それをまとめて記述できない場合 !! => 無理に for 構文にするより、 !! 直に、while 構文で表現した方が !! (思い込みを避ける事ができるので)望ましい for 構文は、ループ制御変数がある場合に用いるが、 そのループ制御変数への操作を工夫する ( 例: 例題 20211015-01 の場合は、 効率版で、「偶数」だけ生成するように工夫している ) ことにより、色々な機能が、すきっりとできる場合がある # 実直版をつくり、それから、効率版を作る(リファクタリング)が、 # 良い( 正しく動き、かつ、効率よい )プログラムの基本 インクリメント/デクリメント演算子 変数の値を 1 だけ増やしたり減らしたりする演算子 「++」: 変数を 1 だけ増やす => 「i++」 は、「i = i + 1 」と同じと思って良い 「--」: 変数を 1 だけ減らす => 「i--」 は、「i = i - 1 」と同じと思って良い # 10:40 〜 11:20 までの講義録画に失敗して、抜けがある 先週の課題 = おまけ: Excel との連携 C 言語で、数学的関数が扱える ( 例: sin 関数 ) 関数の値の値の計算ができるように => 図示化したい ! C 言語から、直接グラフを書く事も可能 ! <=> Excel を利用する事を考える 具体例: sin 関数をグラフ化したい