2021/10/22 09:00- ソフトウェア概論 B 前回の内容 for 構文 もう一つの「繰返し」構文 すでに、動作が解っている命令を「繰り返す」ための構文 # 構文: 命令から命令をつくる記述 ( 命令そのものではない ) # for 構文 / while 構文 / if 構文 # 文: 命令を直接記述したもの # 関数呼び出し / 代入文 / i++ cf. 他の繰り返し構文 : while 構文 基本 while 構文と for 構文は、簡単に相互変換 for 構文は ( while 構文に比較して ) 制御変数の扱いが楽 => for 構文の最初の括弧の中に、まとめてかける 構文: for ( 初期化; 条件; 継続 ) { 命令 } 初期化 : 最初に一度だけ、必ず、実行される 条件 : 命令を繰り返すかどうかの判定 初回は、初期化の後に行われ、以下、 条件が成立している間、 次の繰り返しの前にチェックされる 命令 : 条件が成立している間、実行される 継続 : 命令の後に実行される | v 初期化 | +------>| | | | v | 条件 =(不成立)=> for 構文の実行は終了(次の命令へ) | | | (成立) | | | v | 命令 | | | v | 継続 | | +-------+ 意味: 最初に初期化をおこない、以下 条件が成立しているあいだ、 命令と継続を繰り返す while 構文との関係 : 相互に変換できる for => while 0) for を while に変更 1) 初期化を while の前に移動 2) 継続を命令の後ろに移動 while => for 0) while を for に変更 1) for の後ろの括弧の中の条件の両側に「;」をつける => 初期化と継続を「空(式)」(なにもしない)にしている for 構文と while 構文の使い訳 ! 一方があれば、他方はいらない(再帰があれば両方いらない) ! 両方使うなら、「使い分け」をすべき 制御変数が明確なら for 構文の方がよい 特に、くり返し回数が、for 構文の一行でわかる場合、効果的 くり返し回数が、明確でない場合は while 構文の方がおすすめ # 制御の変数の変化が解っても、回数がすぐにわからない場合 while で、「条件が成立するまで」という表現の方が自然 => 無理に、for 構文を使うと「誤解」する可能性がある 数値計算 リーマン積分 積分の数学的な定義(極限[無限の概念]を含む)から、 それを有限化(離散化)することにより、 近似値を求める 例: 「n -> 無限」=>「n -> 有限の値」 「ε -> 0」=> 「ε -> 0 に近い小さな値」 数学:正確な値 => 計算機:近似値 適用範囲が狭い => 数学で求められない場合でも答えが得られる おまけ MS-Excel との連携 (csv ファイルの利用) : グラフの描画 [2021/10/22] 条件分岐 (if 構文) 条件分岐 (条件によって二つの命令の一方を実行) # 三つ制御構造の一つ # 順接: 命令を並べて、順に実行する # # f(g(x)) => y=g(x), z=f(y) # # 1+2*3 => 2*3 -> 6, 1 + 6 -> 7 # 条件分岐: 条件によって、二つの命令のうちの一つを実行 # くり返し: 条件が成立している間、命令を繰り返す if 構文 の構文 (前期) if (「条件」) { 「条件成立時の命令」 } else { 「条件不成立時の命令」 } if 文 の意味 まず「条件」をチェック ( 0 なら偽、それ以外なら真 ) 「条件」が真なら「条件成立時の命令」を実行 そうでなければ「条件不成立時の命令」を実行 if 構文 ( 後期 ) if (「条件式」) 「条件成立時の命令」 [ else 「条件不成立時の命令」 ] # [ 〜 ] は、「省略可能」の意味 if 文 の意味 ( 後期 ) まず「条件」をチェック ( 0 なら偽、それ以外なら真 ) 「条件」が真なら「条件成立時の命令」を実行 そうでなければ else 節があれば、「条件不成立時の命令」を実行 else 節がなければなにもしない !! 前期の if 構文 !! {} が必要 => 不要 !! {} は、n 個 ( n >= 0 ) の命令を一つの命令にする仕組み(ブロック) !! 命令が一つの場合、無駄になるだけで、悪さはしない !! 「条件成立時の命令」が 1 命令の場合は、{} がなくてもよい !! else が必要 => 省略可能 !! 「条件不成立時の命令」がなければ、無駄になるだけ悪さをしない !! 「条件不成立時の命令」がない場合は、省略する !! !! 後期の形をしっていても、前期の形を推奨(間違いが少なくなる) if 文の色々なパターン else 節の省略 : 「条件不成立時の命令」がない時 「 if (「条件」) { 「条件成立時の命令」 } 」 だけで 「else 以下」は省略 「命令が一つ」の時 : 「 if (「条件」) 「条件成立時の命令」 」 だけで 「{」、「}」は不要 注意 : 「{」、「}」の省略はお勧めできない !! 「ぶら下がり構文」の悲劇 「{」、「}」で、明示的に範囲指定しないと、 「自分が思っていた事」と違う結果になってしまう... if 構文の応用 if 構文の入れ子 (ネスト) 動機: if 構文では、二つの命令の一つしか選べない => 2 分岐 <= 応用としては、n 分岐 (n>1) なので 単体の if 構文では、これが実現できない => if 構文を組み合わせる事により、 多分岐を実現する事ができる 条件式 機能 条件分岐 ( if ) や、繰返し ( while, for ) で条件の判定に利用される式 これまで : 大小比較 / 一致・不一致を利用してきた 整数値 : ==, !=, >, <. >=, <= 文字列 : !strcmp で一致しているかどうか => 成立(真)/不成立(偽) => 整数値をとる式 => 条件式として、利用される場合は、 0 の場合は「偽」(不成立) 0 以外の場合は「真」(成立) として扱われる。 特に、真偽値を返す場合は、 偽の時は 0 を、真の時は 1 を返す約束 後期(真実)  整数値 => 計算ができる (追加の情報処理が可能) 色々なものが入れられる | v 「条件式」--+--> 成立(真) ---> 1 ---> if 構文(真) | | | | +------------------------+ | +--> 不成立(偽) --> 0 ---> if 構文(偽) 構文 整数値(真偽値ではない..)を取る式 意味 結果が 0 ならば「偽」、 そうでなければ(どんな値でも 0 でない限り)「真」 論理(真偽)値 : 0(偽) か 1(真) を取る値 (条件式は論理値になる) 条件式で利用される演算子 論理演算子 : 以下の説明では「真(1)」にならない時は「偽(0)」になる 等号 (==) : 両辺の値が等しい時のみ 真(1) 等号否定 (!=) : 両辺の値が異る時のみ 真(1) 不等号 (>, <, >=, <=) : 両辺の値を比較し、不等式が成立した時のみ 真(1) 論理演算子 論理積 (&&) : 両辺が共に真(0 でない)の時のみ真(1) 論理和 (||) : 両辺の共に偽(0)の時のみ偽(0) 否定(!) : 条件式の前に前置し、それが偽(0)の時のみ真(1)