前回の内容 条件分岐 (if 構文) アラカルト (what) 条件によって、複数(>1)の命令のうち、 一つだけを実行すること 状況に応じて適切な手段を選択できる (how) if 構文 (構文規則) if ( 条件式 ) { 条件が成立し時の命令 } else { 条件が不成立の時の命令 } (意味) 「条件式」が「真(成立する)」の場合 「条件が成立し時の命令」を実行する そうでない場合は、 「条件が不成立の時の命令」を実行する # 必ず、どちらか一方だけが実行される (例) if ( a != 0 ) { /* 分母が 0 でない場合.. */ c = 1/a; /* 割り算の実行 */ } else { printf ( "分母が 0 なので割り算ができません\n" ); } if 構文の色々なパターン (C 言語の「言語仕様」で if 構文 ) if ( 条件式 ) 文 [ else 文 ] !! 前期との違い !! 1. 「{、}」が不要 !! 2. else 節 ( else 以後 ) が省略可能 !! => 前期で学んだ形は、この仕様の特殊な場合 !! a. 他の人の書き方を見る時には、この一般的な形で理解 !! b. ぜひ、書く時には、前期の形式を踏襲する事をお勧め !! <= 「{、}」がないと、間違いが起きやすくなる !! 予防的なプログラミング ( 「失敗」を防ぐために、「失敗する可能性を、あらかじめ削除しておく」) 条件式と論理演算 if 構文や while (for) 構文で利用する「条件式」は、 => 「成立(True/真)」か「不成立(False/偽)」 # 真偽値 ( Boolean : { 真, 偽 } ) C 言語における、条件式 => 整数値を取る式(整数式) C 言語では、真偽値(条件式として現れる状況)が必要になった場合、 整数値に対して、 0 の時は、「偽」 0 以外の時は、「真」 として扱う。 # 整数値 => 真偽値として扱う場合 真偽値を返す場合、 「偽」の時は、0 「真」の時には、1 を返す約束になっている。 # 真偽値 => 整数値 として扱う場合 整数値 真偽値 0 <-------------> False (偽) 1 <-------------> True (真) 2 ------------------/ -1 -----------------/ ... ---------------/ 整数値にする理由 1. コンパイルした後の機械語がそうゆう性質をもっている # cf. ++ (インクリメント演算子) # => 機械語に、その命令があるので、 # その命令を積極的に使うために、言語仕様として C 言語に追加された 2. 整数値にする事により、 「計算の対象」になる # 論理的な演算を、整数の演算で表現可能 # => 論理のための演算を特に、設けておらず、整数演算で、代用している if 構文 (別の解釈) データを文に変更する構文 if ( 整数値 ) { 文1 } else { 文2 } 整数値 真偽値 実行文 0 <-------------> False (偽) 文2 1 <-------------> True (真) 文1 2 ------------------/ -1 -----------------/ ... ---------------/ # 条件式が、「計算可能」ということから、 # 「文が、『計算可能』になる」という事に繋がる # => ノイマン型計算機の設計思想 # 万能性の根拠に繋がる (整数値を)論理値とみなして、論理演算を行う演算子 && 論理積 || 論理和 ! 否定 論理積 論理和 否定 P | Q | P && Q | P || Q | ! P ----+-------+-----------+-----------+-------- T | T | T | T | F | F | F | T | ----+-------+-----------+-----------+-------- F | T | F | T | T | F | F | F | # 0 -> F -> 0 # 0 以外 -> T -> 1 休憩 10:50 開始 [2021/11/05] 講義: データ構造 (1) 構造体と配列 前回まで 三つの制御構造 順接: A B => 命令 A, B をこの順に実行する 条件分岐: if ( 条件 ) A else B => 条件によって、A と B の一方を実行 くり返し: while ( 条件 ) A => 条件が成立する限り A を繰り返す 任意の(プログラムが実現可能な..) 機能は、 この三つの構文の組み合わせで実現可能 ( 万能性がある ) ! プログラムを作成する ! 命令を組み合わせて、目的(とした機能)を実現する 今回以後 データ構造 データの組み合わせを実現したもの !!! if 構文は、データを文に対応させる !!! => データの組み合わせが、文の組み合わせ プログラム(コード) データ 命令の組み合わせ 対応 データの組み合わせ 順接 構造体 条件分岐 <=> 共用体 くり返し 配列 Code Code -> Data Data *------------------------------>* | | Code 組み合わせ | (可換図) | Data 組み合わせ v v *<------------------------------* Data -> Code !! Code の組み合わせを Data の組み合わせで表現可能(かもしれない) !! Data の組み合わせで Programming が可能になる !! !! プログラミング時(コンパイル時) 実行時 !! Code 表現 固定 !! Data 型と関係 変化 !! !! Code と Data の大きな違い !! 実行時に変化するかしないか !! もし、Data で Code が表現できる !! 実行時に変化する Code (のようなもの)が作れる !! # Computer Virus の動作原理 !! # Data が Code として(誤って)扱わられる事が原因 !! # # 「スタックオーバーフロー」 !! # # => scanf のうっかりとした利用法 コーディング 現実の世界の情報と計算機の世界のデータ(数値)の対応関係 例: ASCII Code 文字(現実の世界の情報) <=> 整数値(計算機の世界のデータ) コーディングによって、情報とデータの関係ができるので、 データ処理をつかって、情報処理が可能になり コンピュータを利用して、現実で役立つ機能が実現できる # コンピュータがさらに、装置(device)を利用すると、 # 自動化が可能 !! => 複雑な情報を表現するために、複雑なデータ(構造)が必要 データ構造 「プログラム」による「機能」の実現 プログラム : 「データ(数値)」の「処理(変更)」*しか* できない 機能 : 「情報」の「操作」によって実現される どこでか「データ」と「情報」の *対応* が必要 例: 文字 (ASCII Code): 文字コード(数値) と 文字(情報)の対応を行う[002] 「情報」を「データ」の形にする 「データ」による「情報」の「表現」を考える[003] 現実の世界での情報処理が、(コーディングを経由して..) 計算機の世界でのデータ処理(数値計算)になっている例 背景: 二次元平面上の点(現実の情報)を、 表現(コーディング)したい データ(数値)を利用して # 「表現方法」は、一通りではない # (x,y): 座標 # 直交座標 # 横が x , 縦が y 座標 # 右と上が正、左と下が負の方向 # # 他の例: # 軸の方向が逆のパターンがある # 例: excel は、行は上が負、下が正 # => 紙に印刷する時の方向 例 1: 平面上の点を「(x, y):直交座標系の座標」で表現 例 2: 平面上の点を「(r, a):極座標系の距離と角度」で表現 # (x,y)でも(r,a)でもともに、二つの数値の組 # => それをみただけでは、区別できない # <= 表現の「意味」を決めているのは、 # データの形(数値の組)だけでなく、 # そのデータの解釈仕方(扱いの仕方)で区別するしかない # <= データ解釈を扱い方(code)で表現する # # データの表現 # # データの組み合わせ + データを扱う基本的なコード # # => 「オブジェクト」 「表現」が異れば、同じ「機能(操作)」を実現する場合でも、「プログラム(処理)」が異なる 例 : 点 P と原点対象な位置にある点 Q を求める「機能」の実現 (例 1 と 例 2 で「処理」が異なる) 「点」を表現するには、「二つの実数値の『対』」が必要 「点」には、『対』という「構造をもっている」と考えられる #「構造を持つ」 # 1. 分解して、より小さなデータを取り出す事ができる # 2. その小さなデータの間には、特定な関係がある(関係をつかって元に戻せる) 「点」 -> X 座標 / Y 座標 => X, Y 座標から、「点」が作れる 注意 : ただ「『対』という『形』」だけでは意味がない、「操作」まで含めて考える必要がある sample-003.c 『点』P, Q は、ともに、Data としては、実数値(double) の「対」 として『データ表現』されているが、 それらが、直交座標なのか極座標なのかは、 それを扱う、扱い方 ( 出力する時に、 どちらの出力関数を使うか ? ) による !! データは、それだけをみても、何を表現しているかは、原理的にはわからない !! 例: !! 整数値 65 は、小さな整数なのか、それとも ASCII Code 'A' を表現をしているか ? !! それが(最終的に、現実の世界のどのような)情報に対応するかは、 !! その情報(データ)の扱われ方や、利用法から決まる データ構造とは 「構造を持つデータ」と「それを作る要素」の「関係」の事 「既存のデータ表現」から、「新しいデータ表現」を作る方法にもなっている