前回(2020/06/26)の内容 「関数」という考え方 「プログラムの一部」に「名前」を付ける事 関数の定義方法 引数付き関数 関数の定義する命令の一部を仮引数変数にする => 後から、実引数を指定することにより、 仮引数変数の値を決める事ができる => 一つの関数定義で、様々な働き(命令の一部が変数で、それが変化する)をする関数が定義可能 関数の呼出し方法 関数名の後ろに実引数を指定して命令を呼び出す 実引数は、カンマ「,」で区切って、必要な個数だけ指定する 実引数の値は、仮引数変数に、順に割り当てられる !!! (基本) 実引数の個数とその型は、仮引数変数の個数と型に一致する必要がある !!! 仮引数変数の宣言型が char * => 文字列 !!! 仮引数変数の宣言型が char => 文字 関数の利用によって、 様々な機能を実現する事が可能になる 関数利用の重要性 機能に(適切な名前をつけて)抽象化を行い、分かりやすくする 文字を引数に持つ関数と型宣言 仮引数変数の「型宣言」 仮引数変数の宣言に「char」を付ける 文字を引数に持つ関数 : 「char *」から 「char」 関数の中で、仮引数変数を利用して、命令の振る舞いを変更できる 仮引数に割り当てられている『値』の『型』が異なれば、 それを対象した操作が異なる 例(出力) 値の型が char => 『文字』なので => putchar を使う 値の型が char * => 『文字列』なので => printf を使う 『値の型』によって、できる事や、振る舞いが異なるので、 仮引数変数にどのような型の値が入っているかが重要で、 関数の仮引数宣言では、『型』の指定(変数型宣言)が重要 『文字』の処理のしかた 『文字』そのものの表現 (「'」で挟む) => 『文字』の操作が可能 その処理の対象を関数の引数に与え、関数内で操作可能 2020/07/02 講義の目的 C 言語を利用して、プログラムが書けるようになりたい * C 言語の「プログラミング言語」としての言語教育 * C 言語のプログラムを実際に利用する ( コンパイルとか実行方法 ..) * 「プログラム」の書き方そのもの 「入力-処理-出力」 プログラムの基本構造 「プログラム」を 「何かを入力」 し、 「それを処理」 し、 「その結果を出力する」 ものとして考える。 <<プログラム>> 人間 => データ => [入力] -> [処理] -> [出力] => データ => 人間 キーボード ディスプレイ 情報を入手し、それを処理した後、出力する 入力-処理-出力 の基本パターン [入力部] main で入力を行い、処理関数を呼ぶ [処理部] 処理関数で処理を行い、出力関数を呼ぶ [出力部] 出力関数で出力を行う s_print.h/s_input.h の使い方 2020/07/03 のページの ダウンロードから、二つのファイル s_print.h s_input.h をダウンロード ダウンロード先は c:\usr\c\include を作り、その中に二つとも入れる 利用法 1. C プログラムファイル ( .c ソースファイル ) で、 #include "s_print.h" #include "s_input.h" とする。 2. 命令(関数)として、 s_print_AAAA ( AAAA -> char, string, int ) で、『文字』、『文字列』、『整数』が出力できる s_input_AAAA ( AAAA -> char, string, int ) で、『文字』、『文字列』、『整数』が入力できる 3. コンパイルする時 cc -I ~/c/include *.c でコンパイルする s_input.h/s_print.h の効用 『文字』、『文字列』、『整数』の入出力が可能 [注意] 「s_..」 は、この講義独自で、一般的でない これと同じ事をする「一般的な方法」もやります => 後期の B # 意図 : # 「一般的な方法」を理解するには、まだ知識が足りない # => 今の段階で導入するのはちょっと、よくない # 自分作成した独自の .h (ヘッダー) や関数の利用法を学びたい printf, getchar, putchar => 標準ライブラリ関数 # すでに、どこかで、定義されていて、 # リンク時に自動的に指定されるライブラリ内にあるので # 自分で定義しなくても使える (ライブラリ) # 標準関数なので、どこでも使える # 例: ubuntu, でも windows でも使える s_print_AAAA / s_input_AAAA は標準でない関数 整数型 C 言語でも整数(の一部)が扱える !!! コンピュータでは、無限が扱えない !!! 「実質的に」「無限なものを処理する」には、「無限に時間がかかる」 !!! 例 : すべての自然数を出力する !!! 実質「止まらないプログラム」になる !!! => 基本、コンピュータでは扱わない !!! コンピュータでは「有限もの」しか扱わない !!! cf. 「数学」では「無限」が(直接)扱える !!! 帰納法 : 任意の自然数 n に対する命題 P(n) が証明できる !!! P(0), P(1), P(2), ..., P(n), ... !!! => 無限個の命題を証明できる 整数型 : -2^31 〜 2^31 - 1 (-21,4748,3648 〜 21,4748,3647) まで範囲の整数 (cf. limits.h) 32 bit で表現できる値 ( 2^32 通りの整数値 ) !!! 有限な数値した扱えない 整数の計算 四則 ( 和: +, 差: -, 積: *, 商: /, 余り: % ) の計算ができる 整数同士の比較 ( if 構文の条件式で利用する ) 等価 ( 等しい: ==, 等しくない: != ) 大小比較 ( 大なり: >, 小さいなり: <, 以下: <=, 以上: >= ) 整数の入出力 s_print_int()/s_input_int() を利用する 整数型の宣言 ( 引数/返り値 ) 「int」を利用する ( 以前は char * [文字列] / char [文字] だった ) 返値(かえりち)のある関数 数学の関数 ( 例 : f(x) = x^2 ) 引数に数値を与えると、結果として数値が返る 例 : f(3) = 3^2 = 9, f(10) = 10^2 = 100 !!! 今日まで、「作成できる関数」 !!! (関数の前におまじないとして void を付ける ) !!! は、何か(出力)を行う機能(function)をもったものだけだった !!! 実は、値を返す関数(function)にもできる !!! 返り値のある関数 (値を返す関数) 返値(かえりち)のある関数(値を返す関数) C 言語でも、「値を返す」関数が定義できる => 「式」の中で利用できる 例 : 「getchar()」 : 入力した結果である『文字』を返す関数 標準ライブラリ関数 関数を呼ぶと、結果(の値)として、「入力した『文字』」が返る => putchar の実引数 ( 式の中で利用できる ) 例 2 : s_input.h の中の s_input_AAAA は、それぞれ、 AAAA 型の入力した値が返る関数 返り値をもつ関数の定義の仕方、呼び出し方 返値(かえりち)のある関数の宣言 関数宣言の頭部での関数名の前に「返す値の型」を書く 『文字』を返す関数は「char」と書く 『整数』を返す関数は「int」と書く 『文字列』を返す関数は「char *」と書く 実は、「void」は、「値を返さない関数」の意味だった !!! という事は、 !!! main 関数は「int」に対応する『値』を返す !!! わけで.. 「値を返す関数」の「値の返し方」 return 命令を利用する return 命令の機能 構文 : 「return 式;」 意味 : 式の値を求め、その式の値を関数の値として、 即時、関数を終了する 注意 : return は 「値を返す」という機能 と同時に 「関数の終了」も意味する => return 命令のある行で、関数の実行終了する => それより後は実行しない cf. 通常は、関数の本体 (「{」〜 「}」の終りで、終了