前回(2020/05/08)の内容 引数無し 命令列(固定)に名前つけたもの 名前を指定して、命令列実行できる 「『同じ名前』を指定すれば、『同じ命令』が実行される」事が保証される 引数付き関数 関数の内部の「変化する部分」を、「仮変数」で表す。 「変数」の「値(実際に実行する時に定まる値)」は、関数の実引数に指定する 引数付き関数は、関数の振舞いを「後」から決められる。 「後」; プログラムの実行時(関数の呼び出し)で定まる 「前(今)」:プログラムの作成(関数の定義だけ)時で定まる 引数付き関数の振る舞いは、実引数の値(関数呼び出し)で確定する 引数付き関数 汎用的になっている 同じような(にた)プログラム(関数)を複数つくらなくてもよい 再利用(効率化) 抽象的になっている 具体的なものに対して、「一部が決まっていない」 抽象化をすると、理解しやすくなる場合がある 「理解しやすい」というのは、「自分に取り入れやすい」 引数付き関数の引数の個数 複数指定できる それぞれ、別々の名前をつけて、別々に宣言 実引数も、仮引数と同じ個数指定する 実引数の値と仮引数の変数の対応は、順番で決まる == make と makefile make : 色々なコマンドを実行してくれる ファイルを「作る(make)」コマンド コマンド : cc もコマンド ( ./実行ファイル ), ls ubuntu に対して、「何をしろ」という命令 makefile make が参照するレシピ ファイルの作り方が書いてある make は makefile に従って「作る」 makefile の形式 makefile の中に、作成規則をたくさん書ける 作成規則(複数) 作りたいもの : 材料 作る命令列 make を実行すると.. 先頭の作成規則を適用しようとする ただし、その作成規則の命令の前に、 その規則の材料に対する作成規則も適用する 作りたいもの(ターゲット)と材料の作成時間を比較し、 ターゲットの方が古い場合だけ、作くる命令を実行する そうでなければ、実行しない ダミーターゲット 生成規則の中で、コマンドを実行してもターゲットが作られない物がある => ものを作るためには、使えない <= 命令列に名前をつけて、その名前で命令が実行できる make ターゲット名 と make を実行する場合に、「ターゲット名」を指定すると、 その「ターゲット名」に対応した生成規則を適用しようとする 演習 引数付き関数を作る [2020/05/15] C 言語における「文字列」 二つの「" (ダブルクォーテーション)」で挟んだ「『文字』の列」 例: 「"abc"」は、三つの文字 「a」, 「b」, 「c」から成る、長さ 3 の文字列 C 言語における「文字」 : 「(ASCII) 文字」 基本は、キーボードから「1 キー」で入力されて、画面に表示される「モノ」 aAb123 $% キーボードで「a」を入力すると、画面に「a」と入る (これが『文字』) ASCII Code 表 ( 1 byte で表現可能な「文字」表 ) 「"abc"」は、3 つの文字からなるので、3 byte のサイズ C 言語における「文字」は、 ASCII Code 表の 1 byte で表現できる「モノ」 「日本語文字」は、1 byte で表現できない ( ASCII Code 表にない ) 「日本語文字列」は扱えるが、今は説明しない (UTF-8 にする事だけ注意) キーボードに表記されていない文字の表現 キーボード上で表現されていない「文字」がある (キーボードは 256 もない) ASCII Code 表は、 1 byte = 8bit = 2^8 = 256 だけある # ASCII 7bit -> 128 通り C 言語で、表示できない文字表現する表現方法 => エスケープシーケンス エスケープシーケンスを利用して、色々な「文字」を表現する C 言語におけるエスケープ文字 「\ (バックスラッシュ)」が利用される (ubuntu : UTF-8 ) windows では「¥(エンマーク)」になる (Windows : JIS X 0201 ) TeX の時も、同じ話をした... # 日本の環境では、「\」マークがエスケープコードになる # 海外の環境は、バックスラッシュがエスケープコードになる # => 実は、コンピュータの内部では、円マークとバックスラッシュは同じもの # 表示するときに、円マークにするかバックスラッシュにするかが違う エスケープシーケンス エスケープ文字(「\」) + 「文字列」で、一つの「文字」を表現 複数の文字からなる文字列で、一つの文字を表現する その複数の文字からなる文字列の開始文字がエスケープ文字 n => 普通の文字「n」を表す表現 \n => 「\(エスケープ文字)」から始まっているので、 エスケープシーケンスになる => 「改行」の位置文字を表す エスケープシーケンスの例 \n 「改行コード」(改行を表す文字) \\ 「\(バックスラッシュ)」 そのもの \" 「" 」を表す => 文字列の中で「"」を表す場合。 「文字列」の計算 「文字列」に、正の整数値を加える事ができる +1 の結果は、「先頭の文字」が失われて、 1 文字短くなった「文字列」になる 例 : "abc" + 1 -> "bc" 空文字列 長さ 0 の文字列 (「""」で表現可能) !! 空文字列に +1 すると何がおきるか ? !! => なにがおきるかわからない !! => 最悪の場合は、コンピュータの振る舞いがおかしくなる 「文字列」の比較 (条件式) 表現 「!strcmp ( 文字列1, 文字列2 )」で、 「文字列比較」が可能 「文字列1」と「文字列2」が「同じ」ならば「真」になる そうでなければ、「偽」になる 空文字列「""」と比較する事で、 「!strcmp("",文字列)」と、「文字列」の長さが 0 の時、真になる 文字列の「長さが 0 かどうか」が解る 条件分岐 引数の内容によって振舞いを「大幅」に変更したい これまでの、引数付き関数の場合は、 引数の変化と、関数の振る舞いの変化は、「対応」している # 連続な振る舞いをしているようにみえる <= 引数が連続的に与えられても、 動作が、不連続な場合を考えたい。 例: 引数 : "a", "b", "c", "d", "e" 振る舞い : "c" の時だけ "C" で、そのほかは、そのまま if 文と strcmp 関数を利用して対応できる strcmp 関数 : 二つの文字列を比較する if ( !strcmp ( A, B ) ) { X } else { Y } A と B が同じなら X を、 そうでなければ Y を行う 「else if」を使うと更に複数の命令が選べる if ( C1 ) { P1 } else if ( C2 ) { P2 } .. else { Pn } C1 の時 P1、そうでなく C2 の時は P2 .. いずれでもないと Pn おまじない ( strcmp を利用する場合に使う ) #include strncmp ( A, B, N ); A と B の先頭の N 文字だけを比較する !strncmp ( "abc", "abz", 3 ); : 等しくない !strncmp ( "abc", "abz", 2 ); : 等しい