[前回] レーシングゲームを作ってみた C 言語で作成されているので、C 言語の知識が必要 => 前期(ソフトウェア概論 A)の知識で十分 アプリケーション固有(ゲーム)の知識が必要 リアルタイムなキー入力が必要 画面操作(画面表示の一部だけを書き換える機能) 乱数 アイディア 手順を作る(アルゴリズム) [ガイダンス] 前期(ソフトウェア概論 A)やコンピュータ概論と方針は同じ ソフトウェア概論 Aの知識は仮定 うるさくするな 課題と試験で成績を付ける [復習(ソフトウェア概論 A)] ソフトウェア概論 A/B の目的 C 言語でプログラムが作成できるようにしよう 自分の目的に沿ったプログラムができるとうれしい => 自分の環境を良くしたい ソフトウェア概論 A/B の内容 C 言語そのものの知識(C 言語で、どのように、目的の機能を表現するか) 表現方法なので、語学 プログラムのコンパイルの仕方と実行の仕方 コンピュータの操作方法 プログラミング: どのように考えて、プログラムを作成するか => アルゴリズム概論でやる この講義でも少しずつふれる 「分割統治法」 C 言語そのもの 「Hello, World」 printf, getchar, putchar : 入出力関数 プログラムと人間の間でデータの交換ができる 構文 : 複数の命令を組み合わせて新しい命令を作る仕組み 順接 : 二つの命令 A, B があったときに, 「A を実行してから B を実行する」という命令を作る 条件判定 (if 構文) : 一つの条件 P と、二つの命令 A, B があったときに, 「条件 P の成立、不成立によって A, B のどちらか一方を実行する」 if ( P ) { A } else { B } !! この表現では A と B のどちらか一方しか実行されない 繰り返し : 条件 P と命令が A にあったときに 条件 P が成立するかぎり、A を繰り返す !! A の記述は一度だが、実行は N 回(複数回)になる(かもしれない) 「再帰呼び出しを使う」 [まとめ] 任意のプログラム(上記の三つの構文以外の構文を利用したプログラム)に対して、それと同じ機能で、上記の三つの構文だけで作られたプログラムを作る事ができる。 => 他の(かっこよさげな..)構文を知らなくても、任意のプログラムが書ける。 [関数] プログラム(の一部)に名前をつけて、 その名前だけで、そのプログラムを実行する仕組み そのためのつくられたもの 例 : main, printf, ... (自分でも作れる) 関数の作り方(関数宣言) 関数の利用の仕方(printf で、最初にやっている..) 最初は引数無し => 引数を付けた場合 引数付き 引数と条件分岐を利用して、再帰呼び出し [型] 「型」は「値の集合」+「その値の操作方法」 int : 整数値( 0. 1. 2, .., -1, -2, .. ) + 四則(+.-,*,/, .. ) char : 文字集合('A','b', '1'..)と、文字操作 (入出力、+1, -1 文字がずれる..) 引数変数の「型」 ある型の変数は、その型の値を記録している 関数呼び出しをするときの引数の型と、関数定義をするときの仮引数変数の型は一致している必要がある。 ソフトウェア概論 A では、たくさんの「おまじない」があった cf. #include , char * (文字列..), etc.. ソフトウェア概論 B では謎解きを行う予定 == [ソフトウェア概論 B] 条件分岐 二つの命令のどちらか N の命令のいずれかの場合にも if 構文を組み合わせて(入れ子にして..)実現できる why : N => 1 + (N-1) の二つ分ければよい 二つなので、 N は if 構文で処理可能 N-1 の部分は、改めて考えればよい ( 再帰呼び出し / 数学的帰納法の考え方 ) 再帰呼び出し 関数の本体で自分自身を呼び出すこと 再帰的関数定義 : 再帰呼び出しを含む関数の定義 再帰呼び出しを「限定的」に利用する事で、「繰り返し」が実現できる 入出力は、副作用(関数の値を決める事以外の目的で働く機能)を持つ 副作用を持つ関数を呼び出すと、 呼び出した回数だけ、副作用が生じるので、 呼び出す回数に意味がある 一方、副作用をもたない関数(純粋関数)は、そのような事はない。 p-018.c では、getchar() が何か所も現れるが、呼び出し回数が 複数になるので、それぞれの関数の値は違うものになる => 同じものとみなすと失敗する