前回の内容 命令 C 言語で、「何か(直接)する」記述 関数呼び出し ( printf ) return 命令 ( 関数を途中で終了し、値を返す ) 構文 : 命令を組み合わせて、新しい命令を作る表現 if 構文 条件によって、二つの命令の一方を実行する 代入 構文 : 「変数名」=「式」; 例 : i = 1+2; <= 変数 i に値 1+2 の結果である 3 を代入する命令 !! 「式」を書くと、「その式に従って値を計算する」 !! => 高級言語 ( Fortaran ; Formular Translator : 式を変換する ) !! 1 + 2 * 3 => 1 + 6 => 7 意味 : 「変数(変数名によって指定された)」に、 「式」を「計算した結果(式の値)」の「値」(求めて、それ)を「割り当てる命令」 代入の効果 : 変数の値が変化 ( 変化するものだから変数 ) 代入前と代入後では変数の値が異る ( 「前」と「後」という「時間」の変化 ) (代入された変数を含む)「同じ」命令が、 (その値が変化する事により)「異る」振舞いをする # 関数の効用 # 関数定義を行い、実引数を変更して関数呼び出しをすると # (同じ関数定義でも..) 異なる振る舞いができる # !! 実引数の指定 => 関数定義の仮引数変数への代入 # 変数(群)の値の変更を行いながら、 # (変数の値にした違った)命令の実行を与わせる # 手続き型言語の特徴 関数の仮引数変数 => 変数の一つ => 代入可能 居所変数 ( local variable, auto 変数 ) 1. 本体のブロックの先頭に変数宣言すると、関数内で使える 2. 最初はどんな値になっているかわからない => 必ず、値を代入してから使う必要がある !! 仮引数変数 <= 実引数の値で初期化されている !! => すぐに利用できる 「局所変数の値を定めずに、利用する(初期化忘れ)」 => 典型的なミス(気を付ける) 標準 I/O ライブラリの利用 標準 I/O ライブラリ I/O とは Input(入力) と Output(出力) の事 Input : プログラムが、プログラムの外から、 情報を読み込む(Read) Output : プログラムが、プログラムの外へ、 情報を書き出す(Write) [ポイント] 「外」はプログラムの置かれている環境で異る (i.e OS) !! 普段 : 「外」<=> 「人間」 (man machine interface) !! Program !! <= OS <= キーボード <= 人間 (Input) !! => OS => ディスプレイ => 人間 (Output) 「外」が違う 「同じ目的の事」が、「異なる手段」 例 : 「あいさつ」をするとき 日本とアメリカで異るの嫌 (だから全て英語で.. それも困るが..) +-A-> Windows Program +--+ +-B-> Ubuntu +-(Z=>A) -A-> Windows Program +--Z---+ +-(Z=>B) -B-> Ubuntu 標準ライブラリ 環境(外)の違いを吸収する役割 標準ライブラリを学び、利用する => 一つの表現を覚えれば、 色々な環境で、それが使える その違いを標準ライブラリが吸収してくれる 標準 I/O ライブラリの役割 異る環境でも、プログラムとしては、 同じ方法で I/O を行うための仕組 環境の違いはライブラリが吸収 (挨拶は手を振るで OK) 標準 I/O ライブラリの機能 I/O する物 : 文字、文字列、数値(基本データ) I/O の相手先 : キーボード(I), ディスプレイ(O),ファイル(I/O) printf の秘密 printf -- 引数で与えた文字列を画面に表示する printf : 超高機能出力関数 print with format (書式付き出力) 単なる文字列出力関数ではなかった ( cf. s_print_string : 単機能 ) 最初の引数に「『書式』を指定する文字列」を指定し、 書式に従って、二つ目以後のデータを(適切に整形して)出力する 書式 「書式('%' + 書式指示)」を指定する事により 何(基本型+文字列)が出力できる 例: %d 整数値を出力する %f 浮動小数点数値を出力する %s 文字列を出力する printf の利用の具体例 printf ( "整数値は (%d) です。\n", 123 ); => 「整数値は (123) です。」+「改行」 ^^^ 書式指定の %d の所が、その後の引数である「123」に置き換わる => 様々なデータ(型)が混在する出力を、簡単に書ける !! 引数の個数が変わる !! 引数の型も変わる !! => どうやって実現しているのか ? !! !! (現状で学んでいる)関数定義では、 !! !! 引数の個数も型も固定(定義時に決めたもの)になる printf ( "%f", 1.23 ); printf ( "%c", 'a' ); printf ( "%s", "abc" ); 文字列の中に出力を埋め込む事ができる int a=123; printf ( "int a=%d;\n", a ); => 複数のデータの出力が混在している場合でも、 簡単に実現できる ( cf. s_print.h と比較 ) 複数のデータを一度に出力する事ができる 書式は、書式指定文字列の中に、複数指定できる 書式指定文字列の後に、書式の個数だけ、値を指定して、 一挙に複数の値が出力できる int a=123; double b=1.23; printf ( "int a=%d, double b=%f\n", a, b ); ^^(1) ^^(2) ^ ^ | | | | +------------|-----+ | | | +--------+ 書式と、値の引数は、現れる順番で対応 printf の動作原理 後でちゃんと話すので、今回は我慢 !! scanf scanf : 超高機能入力関数 # printf と対応している scan with format (書式付き入力) 色々な型のデータを読み込む事ができる ( cf. s_input_int : 単機能 ) 「書式('%' + 書式指示)」を指定する事により何(基本型+文字列)が入力できる int a; scanf ( "%d", &a ); scanf は、入力した値を、(適切な型に変換して) 変数に代入する # int a; scanf ( "%d", &a ) <=> a = s_input_int() # char c; scanf ( "%c", &c ) <=> c = s_input_char() !! 変数(a) の前の 「&」は「お呪い」(後でちゃんと話す) !! 「&」を忘れると、『大問題』になる !! scanf に関しては、*あえて* 単機能的な使い方だけを紹介 !! 1. 一つの scanf では一つのデータの入力しか行わない !! 2. 書式指定文字列は、単一の書式しかかなない 書式や機能などについても printf と同様に考えてよい ## 超高機能 ## 文字列の中から値を取り出す事も ## できるのだが.. (結構難しいのでさけるのが無難 .. )