前回の内容 条件分岐 (if 構文) アラカルト [基本] if ( 条件式 ) { 条件が成立した時の文 } else { 条件が不成立の時の文 } [本当の if 構文] (ぶら下がり構文) if ( 条件式 ) 条件が成立した時の文 else 条件が不成立の時の文 => これを組み合わる事により、色々な事ができる 例: else if => else 節の所に if 構文を入れる if ( 条件1 ) 条件 1 が成立した時の文 else if ( 条件2 ) 条件 2 が成立した時の文 else 条件 2 も不成立の時の文 => if ( 条件1 ) 条件 1 が成立した時の文 else if ( 条件2 ) 条件 2 が成立した時の文 else 条件 2 も不成立の時の文 ぶら下がり構文の問題点 if ( 条件1 ) if ( 条件2 ) 命令1 else 命令 2 # 見かけ上 : 命令 2 は、条件 1 が不成立の時に実行 # 実際は、そうならない # => 直観に合わない表現ができてしまう.. # かっこをわすれて、計算順番が変わる # 「3 に 2 を加えて 4 を掛ける」 # 3 + 2 * 4 => 11 # ( 3 * 2 ) * 4 => 20 # # 「3 に 2 を掛けて 4 を加える」 # 3 * 2 + 4 => 10 # ( 3 * 2 ) + 4 => 10 # 「安全」を図るために、(不要でも..) カッコを付ける # => ミス減らす [ポイント] 2 分岐(条件の成立/不成立)を組み合わせる事により 多様な条件判定や、多数の分岐が実現できる <=> switch 構文 ( 一つの式に対する多分岐 ) 条件式と論理演算 条件式 : 整数値を取る式 値(整数値)が 0 の時は「偽(条件が不成立)」 それ以外は「真(条件が成立)」 ! 計算の結果、「真」の値を与える場合は、(代表値として..) 1 が採用される 「式」=>「計算結果」が利用される 「条件」を「計算」で求める事ができる 数学 C 言語 二つの条件式が どちらか一方が 論理積 ともに真の時に 0 の時は 0 真になる それ以外は 1 P and Q P && Q 論理積 | P Q | P and Q --------+-------------------+------------ | 真 真 | 真 | 真 偽 | 偽 | 偽 真 | 偽 | 偽 偽 | 偽 論理積 | Q | +-------+-------+ (P and Q) | 真 | 偽 | --------+---+-------+-------+ |真 | 真 | 偽 | P +---+-------+-------+ |偽 | 偽 | 偽 | --------+---+-------+-------+ ふたつの条件式の ともに 論理和 一方が真の時に 0 の時は 0 真になる それ以外は 1 P or Q P || Q 論理和 | P Q | P or Q --------+-------------------+------------ | 真 真 | 真 | 真 偽 | 真 | 偽 真 | 真 | 偽 偽 | 偽 論理和 | Q | +-------+-------+ (P or Q) | 真 | 偽 | --------+---+-------+-------+ |真 | 真 | 真 | P +---+-------+-------+ |偽 | 真 | 偽 | --------+---+-------+-------+ 真偽値が反転 0 は 1 否定 真 => 偽 0 以外は 0 偽 => 真 not P !P 否定 | P | !P --------+-------+-------- | 真 | 偽 | 偽 | 真 <> 論理積 | P Q | P and Q --------+-------------------+------------ | 0以外 0以外 | 1 | 0以外 0 | 0 | 0 0以外 | 0 | 0 0 | 0 論理積 | Q | +-------+-------+ (P and Q) |0以外 | 0 | ----+-------+-------+-------+ |0以外 | 1 | 0 | P +-------+-------+-------+ | 0 | 0 | 0 | ----+-------+-------+-------+ == 条件が「値」なので、 変数に代入したり、 関数の実引数に渡したり、 関数の返り値にすることができる 「計算」ができる 処理対象としてのデータ プログラムの制御には、間接的にしか、影響を与えない 論理値としてのデータ プログラムの制御に対し、直接に影響を与える プログラムの構造 ( if 構文の組み合わせ ) => 計算(データ)の組み合わせに代わっている 人間 => コードを書く => データを処理 ^ | | | +-----------+ 論理値としてのデータ => コードに影響を与える !! コードは、プログラム作成時に決まる !! => 実行時点では「固定」 !! データは、プログラム実行時に決まる !! => 実行時点ででも「可変」 !! => データの方が柔軟性が高い(変化させる事ができるから..) これまで... プログラム <= コードを記述する コードを記述することが、プログラムを書く コードの組み合わせ方法 順接 : コード(命令)並べる 条件分岐 : if 構文 / switch 構文 繰り返し : 再帰 / while, for => コードの組み合わせによりデータを処理して 機能を実現するために、 コードだけでなく、データに焦点を置いた考え方が重要 => データ構造 == データ構造\ データの構造の話 構造を持つデータの話 => データにある構造をみつけだし、それを明示的に記述する事により 構造をもったデータを直接扱えるようにする 例: 一つの整数 <= 構造をもっていない 一つの整数型変数に、代入する事が 「モノ」を表すときに「単純な一つ整数だけ」であらわすのは不適切な事がある 気象:一つの地点で、三つの整数値 <気象> <-> <気温,湿度,気圧> <気象> からその部分である<気温>(だけ)を抜き出す事ができる 一つのものが複数のものから構成されている 構造を持つ C 言語 単純なものとそれ処理ができる | データ構造 | 複雑なものと、その処理が要求される 現実の世界 あるものを操作する時(A の世界)に、 それが直接操作できない場合でも、 それと同型なもの(B の世界)を操作すれば、 間接的に、操作が可能なる 同型なもの同士(A,B)の関係をコーディング !!! 数学では、たくさんの同型なもの扱う !!! 一つのやりかたで、複数のものが扱える データ構造 単純なデータから、組み合わせて複雑なデータを作る ただし、表現が異なれば、それを処理する手段が異なる データ構造を考える場合は、その処理仕方と一緒に考える必要がある # データの構造と処理の仕方をまとめたものをオブジェクト !! 数学における「空間」=<集合、操作> 構造体 データ型を作るための仕組み 数学: 直積空間を作る A, B => C = A x B = { | a \in A, b \in B } A, B, C => A x B x C = { | a \in A, .. } = { <,c> | a \in A, .. } = (A x B) x C C 言語での複数の型 ( 空間 ) から、その直積を作るしくみ 例: double : x 座標 double : y 座標 double x double : 点 (直交座標) struct point { /* 点 */ double x; /* x 座標 */ double y; /* y 座標 */ } sample-005.c データ構造を使わない 二つの変数の対で、一つの点という対象を表現する 変数の対と点の対応(コーディング)は、 プログラマの頭の中にしかない