[前回の内容] 「代入」: 変数に対して、値を指定する 1. 値を指定する「命令」なので、「実行する時期」を指定できる cf. 関数の「仮引数変数」の値は、関数が呼び出され時点(自動[安全]/制御できない) # 代入のし忘れ(初期値の未設定問題)がおきる可能性がある 2. 値の再設定が可能 cf. 「仮引数変数」の値(変更は可能だったが..)そうしてなかった => 特定な変数を含む命令は(その命令が同じなのに..)変数の値の変更(代入)によって、異なる振る舞いをする 変数の値の「更新」 : 右辺に左辺と同じ変数を含む代入 例: i=1; ... i = i + 1; <= もとの i の値に 1 を加えて、新しい i の値とする => i の値を 1 増やす 代入文を利用したプログラミング(手続き型言語によるプログラミング) => 現状(問題が解けていない状態)から解答(となる値を持つ変数がある状態)へ、 変数の値を更新して、近づけてゆく行為 # 人間が問題を解く、手順をたどる形で、プログラムが実行される # => 「時間」の概念 ( 代入前と後 ) がある # => 「自分の手できない事」は、「プログラムでも作れない」 ## 数学の考え方は、代入文を不要としている(時間概念が不要) ## 例 : 再帰的関数定義 (関係を記述するだけで、手順を記述していない) ## => 普段の問題解決とアプローチが異なる(ので難しい) ## <= 数学の便利が出てくる [while 構文] 「繰返し」を実現するもう一つの手段 ( cf. 再帰呼出し ) 構文 : while ( <条件> ) { <繰返し命令> } 意味 : <条件> が成立する限り、<繰り返し命令>を繰り返す while 構文の実行の流れは <条件> <繰り返し命令> <条件> <繰り返し命令> .. <条件> という流れ 制御変数(while の条件部分で参照され、本体で更新される変数)の更新が必須 cf. 再帰呼び出しの時も、引数の値が更新される事ポイント => 再帰呼び出しの場合は、関数の呼び出しの時に、制御変数の更新が(裏側で..)行わるので、 意図的に変更する必要はなかった <= while 構文の場合は、制御変数を意識する必要がある # 制御は一つとは限らないので注意 [scanf] データをキーボードから入力し、変数に代入する関数 => printf と対にして説明される # printf は print with format # format の部分にいろいろ指定ができる # <= scanf も format を利用するので、大概、対で説明される # !! 入力と出力なので、対称性を考えて、対にするのは理解できるが.. # !! => printf/scanf は、理解するのに必要な知識に差がありすぎる.. [注意] scanf の 書式指定は、本当に入力する値の書式だけを指定する(ことが望ましい) 一つの scanf では、一つの変数への入力にする(ことが望ましい) scanf で、値を入力し、代入する変数の前に「&」を忘れないように注意 [本日の内容] [浮動小数点数(double 型)] => 「小数」で表現(小数点を含む数値)される数値を扱う 例: 123.456 => 123456 x 10^{-3} 0.00123456 => 123456 x 10^[-9] 123456000 => 123456 x 10^{3} 有効桁数 大きさ !! 浮動小数点数の構造に関しては、重要だが、ソフトウェア概論では扱わない <= 整数型は、小数点の位置が、いつも一の位に右に「固定」されている(ので「固定小数点数」と言えないこともない) !! 「1」は整数値だが「1.」は浮動小数点数 浮動小数点数の出力に %f だと、小数点以下は、6 桁しかでず、7 桁以降は、表示されない => もし、7 桁以後も必要ならば、書式指定で、精度(桁数)を指定して、それが、きちんと、出力されるようにする 浮動小数点数では、「==」を使わない !! 二つの(異なる形で計算された..)浮動小数点数が一致するのは稀なので、めったにおきない a == b と同様な事をしたければ、 ε (小さな正の浮動小数点数.. 例えば 10^{-6} など ) を用意し fabs( a - b ) < ε の形チェックする ( a と b の差が、十分に小さい場合に、「等しい」とみなす ) <応用> ある値に収束する数列を作り、その収束値を計算するプログラム 具体的な例として、与えらた数の平方根を計算するプログラム(ニュートン法) => p-007.c [for 構文] while 構文(や再帰)と同様、繰り返しを実現する構文 文法 : for ( <初期化式>; <条件式>; <再初期化式> ) { <繰り返し命令> } 意味 : ほぼ、次の while 構文と同じ <初期化式>; while ( <条件式> ) { <繰り返し命令> <再初期化式>; } for 構文は、繰り返しにかかわる制御変数への操作を、一か所に、まとめて、 記述することが可能なので、わかりやすい。 特に 「for ( 変数 = a; 変数 =< b; 変数の更新 ) { .. }」は、 「変数の値が a 〜 b まで 値を更新しながら繰り返す」という「成句(イデオム)」として利用できる 例: for ( i = 0; i < n; i++ ) { /* i++ 〜 i = i + 1 */ } i を 0 〜 n-1 まで 1 ずつ増やしながら、繰り返す => 繰り返す回数は n になる。 !! for 構文の三つ要素 ( <初期化式>; <条件式>; <再初期化式> ) は省略可 !! => <条件式> が空 (常に「真」として扱われる)