来週の試験 各自微妙に異なる問題 20 題 問題によって次の二つのパターンがある 1. 一問一ファイル形式 => C のプログラムファイルを答えとして提出 => 未提出の場合は、1 問分が未回答扱い 2. QQQQ-a.txt にメッセージの形で答え書き込む => 5問分は、メッセージを直接書く 提出されている場合は、記述されている分だけ採点 => 未提出の場合は、5 問分が未回答扱い ファイル数 : 20 - 5 + 1 = 16 = 4 x 4 ( CST Portal II の 4 箇所に、4 つずつ提出 ) 前回(2021/07/02)の内容 講義内容 switch 構文 多分岐型の条件分岐 ( n 個のうちの一つ ) cf. if 構文 : 二分岐 ( 二つのうちの一つ ) !! switch => n !! if => 2 !! -> n = 2 とすれば、switch で if の代わりができる !! -> if は不要 ? !! <= if の条件は、自由に指定できる !! switch の条件は、等号しか使えない !! => 不等号の場合は、if が必要 !! => 整数型(と文字型[小さな整数])しか使えない !! 文字列ではできない !! if 構文は条件が自由なので、汎用 !! else if をつかえば、結果的に、 !! 多分岐も実現できる !! 機能としては、 if 構文だけで十分 !! why switch 構文 !! 他の人が使う可能性があるので学ぶ必要がある !! 一つの式に対し、複数の値の可能性があり、 !! 個々の値に対して、別々の処理をしたい場合、 !! else if より switch の方が読みやすい !! !! if 構文より switch の方が高速 !! !! if 構文 vs switch 構文 !! !! 汎用性 vs 速度 整数型 int で宣言する ( char *, char, int の三つ目の型 ) !! int という整数型そのものも大事だが、 !! データを扱う時に、型を意識する必要がある int で扱える、整数の値の範囲は (32 bit の場合 : -2^{32-1} ~ 2^{32-1}-1 の範囲 ) => 「有限」である(無限ではない) => 有限に伴う(数学にはない..)色々な制約がある 再帰呼出し 関数を定義する時に、その本体 ( { ~ } の間 / 名前つけたい命令の列 ) の中に、 自分自身を呼び出す !! 考え方 !! 同じ事を繰り返す !! X=AAAA...A.. (無限に続く..) !! XA=X !! X <= XA (再帰/帰納法の考え方) !! !! 例: !! x = 0.999999... = 1 !! x/10 = 0.0999999... !! x/10 + 0.9 = 0.99999... !! x/10 + 0.9 = x !! 0.9 = x - 0.1x = 0.9x !! 1 = x 再帰呼び出しは、安易に行うと、無限のものを表す事になる => 条件分岐を利用して、制御する 具体的には、 if 構文(swtich 構文)を利用して、 再帰呼び出しをする場合としない場合を作る 再帰呼び出しをする場合に、引数の値を変更する事により、 「いつかは『再帰呼び出しをしない場合になる』ようにする」必要がある テンプレートとしておすすめ 引数を n (自然数 : int) として、 0 の時に何もしない n>0 の時、 繰り返す命令を実行し、 再帰呼び出しの時に n を一つ減らす (-1) ! 文字列の場合は、 ! 空文字列の時になにもしない ! そうでない時には ! 繰り返す命令を実行し、 ! 再帰呼び出しの時に n の長さを一つ減らす(+1) 色々と複雑な再帰もかける 例: フィボナッチ数列 ( n [>2] 項の漸化式で定義される数列 ) 再帰呼び出し利用する事により、 繰り返しが実現できる 数学の「関数」は、純粋関数 => 数学的な操作に都合がよい 例: x + x = 2x 例: x + y = y + x C 言語の「関数」は、純粋関数とは限らない(副作用を持つ可能性がある) -> 副作用の操作を積極的に行う => 制御構造 ( 順接/条件分岐[if 構文]/繰り返し[再帰]) に意味がある