前回(2019/10/25)の内容 浮動小数点数 (double 型) の応用 ソフトウェア概論的 : C 言語でプログラムを書く int, char に加えて double が使える 従来(double 型導入前..) でも、「万能」である double を利用しなくても、「小数点数」を扱う事は可能 # 普通の整数に対して、小数点が、一番右の位の右にある (「123」=>「123.0」)と解釈可能 # (勝手に、「実は、小数点が、右から3番目にある『123456 => 123.456』と思う」ことも可能 => double を使うと自然に、実数(もどき)が利用できる => double という「新しい型」を導入すると(できる事は増えてないが..) 表現が簡単で、間違いもへる => 扱えるデータ型が増えると、いろいろな表現が「楽に」なる 「型」:それを操作するときに、自動的に働く機能が付随する事によって、 それの性質が「自動的」に保たれる仕組み # 「型」=> (数学) 「空間 : 集合とその集合上で利用な可能な演算の対」 数値積分 : 解析学の結果を応用 (解析的に解けない問題でも、近似解が得れる) switch 構文 整数型(文字型を含む)の式を与え、その式の値によって複数の選択肢の一つを選択 break 文によって、switch 構文の実行を終了(中断)できる リダイレクション コマンド実行時に、画面への出力を、 コマンドの後ろに "> ファイル名" とする事によって、 ファイルに切り換える(リダイレクション)する機能 => プログラムの出力を、ファイルに保存する事により、 出力の内容を再利用できる # 出力の内容が、ファイルに入っているので、エディタで変更したり、 # 次の処理の入力したりできる !! リダイレクションを使わなくても、プログラムの出力をファイルに行う方法は、講義でやる予定.. !! リダイレクションをしっていると多くの場合、上の機能は知らなくても済む !! 上の機能は、プログラムを変更しないといけないが、リダイレクションは、どのプログラムに対しても使える [まとめ] 講義の目的は、(C 言語で..) プログラムを書けるようにする プログラム : 命令の組み合わせ 命令の組み合わせ方法 : 順接と条件分岐と、繰り返しの三種類で十分 順接 命令をならべる 関数を作る ( 並べた命令を一つの名前で呼べる ) 条件分岐 if 構文 switch - case 繰り返し 再帰呼び出し while for # do 〜 while => 命令を組み合わせる事ができれば、プログラムが書けるので、 命令の組み合わせの仕組みがわかれば、問題 型の導入 できることは、増えないが、「表現」がしやすくなる 「文字列」, char, int, double ... [今日の話] データ構造 => データを組み合わせ作る(構造をもった..)データの「組み合わせ方?」の事 !!! 単にデータを組み合わせるだけでなく、 !!! その組み合わせたデータの操作を含めて、「データ構造」と呼ぶので、 !!! 「組み合わせ方」だけでは、説明として不十分 cf. char, int, double 型の値は、単純型(組み合わせていないデータ型) プログラムが「役立つ」のは、 プログラムが処理しているデータ(数値)と、現実の情報が対応しているから => 現実の情報を、データで表現する # 現実の情報が「整数、実数、文字」であれば、 # C 言語でも、「int, double, char」で表現できる # => より、複雑な「情報」は、どうやって、C 言語で表現するか ? 例 : 平面上の点(の位置)という情報を、数値で表現したい => 素直に考えると、「一つの数値」では表現できなさそう.. (実際はできるが...) => 二つの「数の『組』」で一つの「点」を表現する # 表現の方法は、いろいろある # 点の全体の集合と、数値(の組み合わせ)の集合との間に「全単射な関数」があれば、 # それは、「表現」になる # 平面上の点を、一つの数値で表現する事も可能 # cf. # P:(x,y) where x, y は 1 未満の正実数 # x = 0.x1x2x3... (無限小数) # y = 0.y1y2y3... (無限小数) # z = 0.x1y1x2y2.. # (x,y) <-> z : 全単射 二つの数の組で、平面上の点(の位置)を表現 直交座標系 極座標系 # いずれも、「表現」になっている # 「点」全体の集合と、二つの実数値の対の間に全単射な写像がある !!! いろいろな手段がある場合 !!! そのうちの一つを選択するならば、それは、「選択」によって、メリットがほしい もし、与えられた点に対して、 「原点対称な点を求める」という「情報処理」をする場合 直交座標系 : (x,y) => (-x,-y) 極座標系 : (r,a) => (r,a+π) 表現方法が変われば、 「同じ『機能』」を実現するのに 「異なる『計算(操作)』」 が必要になる => 「表現方法の違い」によって、「プログラミング上の違い」が生じる => (結果として..) 得失が生まれる cf. sample-004.c : 直交座標の場合の原点対称の変換になっている 20191108-01-9999.c : 極座標の場合の原点対称の変換になっている # 比較して欲いの処理の違い !! [注意したい事] !! 事実 : 表現方法が異れば処理が異る !! => !! 表現方法と、操作方法は、対にしないと意味がない !! => 数学の「空間」と関係 !! => 「表現方法」と「操作方法」の対 => データ構造 !! => !! 「じゃあどちらを選べばよいか ?」という疑問をもって欲い !! <= その時の都合が良い方を選択すると良い 例題 : 平面上の点の表現として、「直交座標系」と「極座標系」のどちらが ? もし、操作が、平行移動のような場合は、直交座標系、 もし、操作が、(原点中心の...)回転のような場合は、極座標系 になる。 現実の世界の「情報」を表現するために、コンピュータ上のデータ表現と、その操作操作が必要になる => まずは、「データ表現」の話から始める。 [構造体] 構造体 : 複数の有限固定な、要素を並べたものを表現する仕組み。 構文 構造体 : struct { 構成要素 } 構成要素 : タグ名とその型をならべたもの 例: struct { int x; int y; } typedef と組合せる事によって、既存型と同じよう利用する事ができる # typedef 構造 型名; # => 「型名」の型がつくられ、既存型と同じ振舞をする # => その型の「変数」が作れる 構造体は、複数の要素からなるので、個々の要素をタグ名で個々に独立に参照可能 !! 関数の引数や、返値にも指定できるので、 !! 関数から、複数の値を返すためにも利用可能 命令を組合せる事により、プログラムが作れる 三つの組み合せ (順接、条件分岐、繰り返し) データを組合せる事により、データ構造が作れる 三つの組み合せ (構造体、共用体、配列) # データ構造と、それを操作する演算の組 => オブジェクト # C 言語では、オブジェクトを「間接的」にしか表現できない # 最近のオブジェクト型言語 (C++, C#, Java, Go, Phyton, etc.. ) では、この「オブジェクト」が直接表現できる