2021/10/01 09:00- ソフトウェア概論 B 代入 局所変数の宣言 変数への値の代入 (代入文) 標準 Iinput/Ouput printf : 書式つき出力 == printf : 書式つき出力 print with format ^^^^^ ^ printf 出力するとき : print (write) をつかう C 言語だけ printf printf ( 書式, それに埋め込まれるデータ列.. ) 書式 : 基本文字列 文字列内に出力形式を指定する文字列(書式指定)が含まれている 書式指定 : % から始まる 例 printf ( "変数 x の値は %d です\n", 10 ) 書式指定: % + 一文字 : 色々なデータの出力が可能 d (digit) : 10 進数整数 f (float) : 浮動小数点数 c (char) : 文字 s (string) : 文字列 !! printf が高機能になっている仕組み !! 書式指定の部分を解釈して、適切に出力を行う仕組み !! 「解釈する」 !! 指定されたデータに対し、 !! その表現にたいする適切なふるまいをするようになっている !! !! 通常の関数は、引数は、それ単体で意味があるとあつかう !! !! add( 1, 2 ) !! !! 1 + 2 <= 1, 2 単体のデータ ( 内部構造はかんがえない ) !! !! printf ( ".. %d .. %c .. ", .. ) !! !! ^^^^^^^^^^^^^^^^^ 文字列の中、さらに部分的な情報があって、それを分解して、処理している !! !! printf の原理 ( 色々な知識が必要 ) は、最後の方 !! !! => 文字列を「解釈」して色々な事をする !! !! => 高機能化につながっている 代入 構文 : 変数名 = 式; 変数名で指定される変数に対し、式の値を割り当てる 変数の値が、代入を行った後は、 その割り当てられた値になる 局所変数(auto 変数/自動変数)とその宣言 局所変数 : それが宣言されているブロック内だけで有効な変数 ブロック : プログラム中の 「{」から「}」の間 !! すべてのブロックの外でも有効な変数 !! => 大域変数(グローバル変数) 仮引数変数は、関数の本体(となるブロック)内で有効な局所変数となる 局所変数宣言 => ブロックの先頭で、変数宣言をする事ができる 変数の型名 変数名(, 変数名.. ) => そのブロック内だけで有効な局所変数を宣言できる cf. 仮引数変数も、局所変数の一種 1. 宣言する場所が違う 2. 仮引数変数は、実引数の値を最初(有効になった[ブロックに入った]時点)から持っている => 局所変数宣言で宣言された変数は、(値をはじめからもっているが、)その値は不定(ゴミが入っている) 普通の局所変数の場合は、利用するまえに、 最初の代入(変数の初期化)を済ませてから、利用する 「変数の初期化忘れ問題」 代入をつかいたい 変数が必要 局所変数宣言をする 初期化を忘れると、トラブル !! 関数の引数は、安全な変数の宣言と代入 == scanf 書式つき入力関数 cf. printf : 書式付出力関数 入力 : データをプログラムの外 ( キーボードだとか.. ファイル.. ) から プログラム内に取り込む cf. getchar() : キーボードから一文字入力する => 入力されたデータ(文字コード)は、 関数値として参照可能 scanf では、入力されたデータ(文字列)が、 適切なデータ型に変換され、変数に代入される 入力されたデータ(値)を収める変数は、 scanf の書式の後に、指定するが、 その時に、変数名の前に「&」を付ける必要がある => この「&」の意味と、付ける理由は、今日は話さない !! 「ポインター」という概念と関係 scanf の書式指定がされると、 入力をする時に、その書式に合わせて、入力しないと、 大変(期待したことと異なる結果になる事が多い) => scanf を使うなら書式指定は、 最小限度(一つの変数の型指定だけする)のがおすすめ プログラムの基本パターン input-process-output scanf で変数に入力した値を代入し 代入文を利用して、変数の値を使った計算を行い、 計算結果を別の変数代入 printf で、変数に保存されている計算結果を出力 == 標準入出力の話 => 次回に回す == while 構文 命令を繰り返すための構文 形式 while ( 「条件」 ) { 「繰り返す命令」 } => 「条件」が成立している限り、「繰り返す命令」を繰り返す <> | +-----> | | | | 条件のチェック -----+ | | 成立 | 不成立 | v | | 繰り返す命令を実行 | | | | +-------+ | | +<--------------+ | v 終わり while 構文の「条件式」は、同じもの もし、「条件式」の中に「変数が含まれていない」か あるいは、「含まれていても変化しない」場合 => 無限に繰り返す事になる while 構文の命令を有限回で止めるには、 条件式の中に、変数を含め、 繰り返す命令の中で、 (いつかは..) その変数の値を変更する必要がある => 「代入文」が必須 == コマンドライン引数(what) 「実行ファイル (*.exe)」を実行する時に、後ろに引数(コマンドライン引数)をつける事ができる 例 : ./p-001.exe foo bar argc -> 3 このコマンドライン引数は、「文字列」として 「main 関数」に渡される # コマンドライン引数は、間に空白文字が含まれている場合は、 # その空白文字を削って、引数をそこで、分割して、複数の文字列として扱う いままで main(void) => 引数は「void」(引数がない関数) main 関数の引数 ( int argc, char *argv[] ) main の最初の二つの引数 一つ目 : コマンドライン引数の個数 + 1 二つ目 : コマンドライン引数自身の文字列のリスト(配列)になっていて、 i 番目の引数の文字列は argv[i] を指定する事により、取り出せる コマンドライン引数が参照できる argc : コマンドライン引数の個数 + 1 argv[n] : n 番目のコマンドライン引数の文字列 ( argv[0] は、実行ファイル名が入っている ) コマンドライン引数の効用 入力以外に、プログラムに情報を渡す仕組みの一つ 実行前に値を指定する必要がある ( 指定できる ) 入力先となるファイル名を示す ( メタ的 / パラメータ的利用 ) 文字列から数値への変換を行う関数 atoi ( ASCII to int : 文字列から整数値 ) / atof ( ASCII to float : 文字列から実数値 )