前回(2021/06/11)の内容 先々週から、二周目(最初から、詳しくもう一度) Hello, World 色々なおまじない(例:#include)の解説 制御構造 先週(二周目) 「関数」という考え方 「プログラムの一部(命令)」に「名前」を付ける事 !!! 命令列は、「順接」を複数の命令に適用したもの !!! なので、結局、一つの「命令」になっている !!! => 関数呼び出しは、一つの「命令」 関数の定義方法 命令列に名前を付ける事 書き方 0. 名前をきめて、それを書く 1. 名前の前に void、後ろに (void) 2. その続きに {, } 3. { と } の間に名前を付けたい命令(列)を書く 関数の呼出し方法 名前を付けた、命令を、その名前(関数名)を利用して、 呼び出す表現 書き方 0. 関数名書き 1. 名前の後ろに (); を付ける 引数付き関数 名前をつける命令の中に、変数を含める事により、 後から、変数の値を指定する事により、 同じ命令なのに、異なる振る舞いさせる事ができる 記述方法 定義 仮引数変数の宣言を行う 呼び出し 実引数を指定する 仮引数変数の宣言の時 変数の名前と同時、(その前に..) その変数に入る値の型を指定する必要がある 具体例: 文字列の時 char * 文字 char 文字を引数に持つ関数と型宣言 文字を引数に持つ関数 : char * から char 仮引数変数の「型宣言」 (実引数として与えられる)値の型がわからないと、 その値を利用する(演算する)方法がわからない => 型を指定する事によって、 値の処理の方法を指示する必要がある 「文字」というデータ型 「文字」の比較 / 「文字」の計算 出力には putchar を使う / getchar で入力ができる C 言語の関数にも「値」を持つ(返す)ものがある => 最初の例と紹介したのが getchar() 入力-処理-出力 ( Input - Process - Output ) 例: p-014.c input -> getchar() process -> +1 <= 目的 output -> putchar() getchar() キーボードから文字を入力して、それを値とする関数 値を返す関数 (1) 今までの関数と違い 1. 関数前にある void -> 関数が返す値の型 2. 本体に 「return 式」命令を書く事により、 関数の値を return の後ろの「式」で指定できる 「return 式」命令には二つ機能がある a) この命令を実行すると、即座に関数を終了する => 制御構造 ( 命令の実行順序に影響を与える .. ) b) 関数の終了に際して、return の後ろにある式の値を関数の返り値にする 2021/06/18 順接 命令を並べると、その命令が、並べた順に実行される cf. プログラム : 命令を並べたもの 命令(C 言語における命令の典型的な形:関数呼び出し) 関数呼び出し ( printf 関数を呼び出す ) => 関数に機能が働いて、「何か」がおきる 具体例 : printf ( 文字列 ) => 文字列が画面に表示される putchar ( 文字 ) => 文字が画面に表示される 個々の関数が何をするかは、すこしずつ学ぶ必要がある 「命令と命令を組み合わせて、新しい命令を作る」 『命令』を対象する記述(一種のメタ命令) => 制御構造 条件分岐 if 構文 ( <= 「if 『文』」とは呼ばない ) !!! if 構文 : 命令とは次元が異なる if ( 条件 ) { 条件が成立した時の命令A /* then 節 */ } else { 条件が不成立の時の命令B /* else 節 */ } if 構文によって、命令A と命令 B から、 新しい命令が作られる 「文」<= 命令に対して使う言葉 条件 文字列の比較の場合 !strcmp ( A, B ) 文字列 A と B が等しい 文字の比較の場合 A == B 等しい文字 A != B 等しく文字 A < B 文字 A が ASCII コード表順で B より小さい A > B 〃 大きい A <= B 文字 A が ASCII コード表順で B より以下 A >= B 〃 以上 !! 「=>」という比較演算子はない if 構文(条件分岐)を利用すると、 条件によって、二つの命令のどちらか一方を実行するような (新しい)命令が作られる => if 構文を「入れ子」にする事により、 二つより多くの命令のいずれか一つを実行するようにできる else if 構文 else 節全体が一つの if 構文の時、 else 節を囲む { と } を省略する表現 繰り返し 再帰呼び出しを利用する事により、 与えられた命令を、繰り返すよう新しい命令が作れる 再帰呼び出しの書き方 => 関数を定義する時に、関数の本体に、自分自身を呼び出す !! 注意 !! 無条件に再帰呼び出しをすると、無限ループになる !! 「与えられた命令を繰り返す(新しい)命令」を作る !! <= 上手に、適当なところで、繰り返しをやめるようにする !! if 構文を利用して、 !! 再帰呼び出しをする命令とそうでない命令を組み合わせる !! if 構文の条件のところに変数がないとこまる !! その変数は、関数の引数に基づくものである必要があり !! その引数は、再帰呼び出しの時に変更されないといけない !! その変更の結果、いつかは、再帰呼び出しをしない命令が if 構文により実行される必要がある 三つの制御構造 ( 順接、条件分岐、繰り返し ) があれば、 実は、任意の命令が、この制御構造の繰り返し適用で、実現可能な事が(数学的に..)わかっている == s_print.h s_input.h の使い方 1. プログラムの先頭 ( stdio.h の下位.. ) #include "s_print.h" #include "s_input.h" 書く 2. コンパイルする時に 「-I ~/c/include」を -c の前に挿入する cc -I ~/c/include -c p-016.c ^^^^^^^^^^^^^^^ 追加部分 3. 次の関数が使える s_print.h s_print_string 文字列の出力 ( printf と同じ ) s_print_char 文字の出力 ( putchar と同じ ) s_print_int 整数値の出力 s_input.h s_input_string 文字列の入力 s_input_char 文字の入力 ( getchar と同じ ) s_input_int 整数値の入力 s_input/s_print