[先週の内容] 文字型 (char) が、小さな整数に対応している 文字と、整数値の対応が ASCII Code 表で定義されている # なぜ、計算(数値)しか扱えないコンピュータが # 他の数値以外の情報が扱えるか ? # => それらの情報を、数値と相互変換しているから (cf. 数学の「可換」と概念) # コンピュータの外では「情報」=>コンピュータの中に取り入れるときには「数値」に # コンピュータの中では、数値の処理をする # コンピュータの外に出すときには、「数値」を、「情報」に変換する # => コンピュータの中では、単に数値の変換(計算)だが、外では、「情報」の変換に見える # <= コンピュータの外と内で相互変換を行う「変換表」が必要で、これが「コード表」 # 例: # 文字の扱い # 外で文字だが、キーボードが文字を数値変換 # コンピュータで処理 # 外に出すときは、ディスプレイに表示するときに、数値から、文字変換される 分割コンパイル 一つのプログラムが、複数の関数からできているとき、 関数を、別のファイルに記述し、あとからまとめて、一つの実行ファイルにできる 例 : p-002.c (二つ関数からなる) => p-003.c p-003-01.c に分割 => 1. それぞれ別にコンパイルが可能 1a. しかし、どちらも、完全プログラムではない(プログラムの断片) => 単独でリンクしても実行ファイルを作る事はできない 2. 実行ファイルを作る場合は、それぞれ別々に作ったオブジェクトファイル(.o)を まとめて指定する必要がある => 結果的には、分割前と同じものが作れる <= 「手間が増えている」だけのように感じるが.. (デメリット) <= ファイルを分割する事によって、再利用が可能(メリット) main 関数以外の関数は、他のプログラムからも利用できる 例: p-004.c で、say_hello を利用する事を考える => p-004.c だけを作る リンクする時に、p-003-01.o を指定すれば、 p-003-01.c で定義されている say_hello という関数が「再利用」される !! printf / hanoi なども、(自分で作らなくても..) この原理ですでにつくられている関数が !! 再利用できるので、「巨人の肩に乗る」事が可能なる !! 「ライブラリ(コンパイル済の関数の集合)の利用」 !!! 他にもいろいろと分割コンパイルという考え方のメリットがある !!! => ファイルが分割されているので、別の人が作成できる !!! => 今のソフトウェア開発が大規模化しているので、 !!! グループでプログラムを作成するために必須 make と makefile ( make tool の最初のもの.. ) 分割コンパイルによって、生じたデメリットは、(本来は..)メリットで十分補える(トレードオフできる) => さらに、「分割に関する(よって必要になった)情報」を makefile にまとめ make にその情報を利用して、デメリットをなくす事ができる !!! 配られたファイルの中に Makefile があったら !!! make コマンドで、プログラムを作成する !!! => 細かい違いの事は考えなくてもよくなる Hanoi パズル 三本の棒(1,2,3)とその棒にさせる大きさの異なる円盤 一つの棒(1)に、円盤を大きい順(下が大、上が小)に乗せる 次のルールしたがって、その円盤を (1) から (2)の棒に移動させる 1. 一度に移動できるのは、個々の棒の一番上の円盤だけ 2. 小さい円盤の上に大きな円盤を重ねる事はできない | | | [1|1] | | [22|22] | | [333|333] | | ----+-----------+-----------+------ (1) (2) (3) 最初にできるのは、(1) になる [1] を (2) か (3) のどちらか 答えは [1] : (1) => (2) | | | | | | [22|22] | | [333|333] [1|1] | ----+-----------+-----------+------ (1) (2) (3) できること [1] => (1), (3) [2] => (3) 答えは [2] : (1) => (3) | | | | | | | | | [333|333] [1|1] [22|22] ----+-----------+-----------+------ (1) (2) (3) できること [1] => (1), (3) [2] => (1) 答えは [1] : (2) => (3) | | | | | | | | [1|1] [333|333] | [22|22] ----+-----------+-----------+------ (1) (2) (3) 答えは [3] : (1) => (2) | | | | | | | | [1|1] | [333|333] [22|22] ----+-----------+-----------+------ (1) (2) (3) hanoi の API によると 円盤の移動は、 s_hanoi_move ( "1", "2" ); と、移動元の棒の番号と、移動先の棒の番号を指定するだけ why ? HANOI のルールにより、棒が指定されれれば、 棒の一番上の円盤が自動的に指定されるので、 特に、引数で指定する必要はない # ライブラリが勝手に判断する [注意] 課題 20190531-01 を行うには 20190531-01-QQQQ.c を c/20190531/hanoi の所に保存 実行 make BASE=20190531-01-QQQQ test もし、hanoi の中に libSK.a があったら、削除する windows でやってもよいし、ubuntu で「rm libSK.a」としてもよい [今日の内容] プログラム 命令の組み合わせ 組み合わせの方法は、順接、条件分岐、繰り返し(再帰呼び出し)の三種類で、十分 !! 命令は、何かの対象に対して、操作を行う !! 命令は、同一の対象に対して、複数の操作を行う !! <=> 異なる対象に対して、同一な作業をする事も、異なる結果になる !! 例: !! 文字列 "abc" に +1 という操作を行うと => "bc" !! 文字 'A' +1 という操作をする => 'B' !! 数値 1 +1 という操作 => 2 !! => 対象の(種類と)組み合わせも考える必要がある !! !! コーディングの考え方をつかうと究極的には、数値だけでよいのだが.. !! !! => 対象が、直接的に操作できた方が、「分かり」易い 対象(Data 型) 文字列 文字 整数 整数の扱い 2019/06/07 のプレゼン資料 p.7 2019/06/07 のプログラム sample-003-01.c sample-014-01.c sample-015-01.c sample-015.c を今日のフォルダ (c/20190614)に保存 個別に、上記の四つのファイルをコンパイル cc -c sample-003-01.c cc -c sample-014-01.c cc -c sample-015-01.c cc -c sample-015.c sample-015.exe を作るには、上記のコンパイル結果をすべて利用する cc -o sample-015.exe sample-015.o sample-015-01.o sample-014-01.o sample-003-01.o 関数の引数に整数を利用したい場合は、 関数宣言の所の仮引数の宣言には、 (これまでのように無条件に「char *」をつけるのではなく..) 「int」を指定する # 仮引数の宣言の所には、引数として与える値の種類(型)に対応して # 指定するキーワードが異なり、すくなくても # 文字列を指定する場合 char * (これまでと同じ) # 整数値を指定する場合 int (今回新しく学んだ..) # を指定する ## => 将来、この指定する表現(型宣言..)は、随時増えてゆくことになる 課題 20190607-02 => 文字列の長さで、回数を示していたが、整数値が利用できるので、 整数値で繰り返しを指定するようにした。 課題 20190607-03 => 分割コンパイルの経験 すでに sample-015-01.o, sample-014-01.o, sample-003-01.o から printpositiveint (非負の整数値を表示する関数) が提供されている 課題を解くには、これ(printpositiveint)を利用すると簡単 cc -c 20190607-03-9999.c cc -o 20190607-03-9999.exe 20190607-03-9999.o sample-015-01.o, sample-014-01.o, sample-003-01.o ./20190607-03-9999.exe