[前回の復習] while 構文 一つの文を繰り返す場合に、その文を while 構文の中で利用する 例: int count = 1; while ( count < 10 ) { printf ( "%d\n", count ); /* count を出力 */ count = count + 1; } while によって、 { printf ( "%d\n", count ); /* count を出力 */ count = count + 1; } が繰り返し実行されている # while 構文の対象は、「一つの」文 # => 複数の文を対象にしたい場合は、ブロックにする # => 繰り返しの命令、状態の変更命令の二つがペアなら.. # => 結局、いつでも、ブロックにした方がよい # cf. if 構文の時も、ブロックを使わずに、「ぶら下がり構文」を # 利用してもよいが、「この講義」では、「禁止」 # => 「構文の時には、必ず、ブロックにする」という 「マナー」を適用する(ルールではない) printf : 書式付き出力関数 ( PRINT wiht Format ) printf ( 書式文字列, 追加の引数... ) 書式文字列 : 基本は文字列だが、中に、書式指定が含まれる 書式指定 : %+英文字 printf は、書式文字列の書式以外の部分の文字はそのまま、 書式のある部分は、追加で指定された値を、その場所に埋め込む 例: printf ( "%d+%d=%d\n", 123, 456, 123+456 ); => %d %d %d 123+456=578 画面に情報を(文字列の形で表現して)出力するときに、大変便利 ! これまでは、「書式指定の無い書式文字列」の例のみやった ! => 書式指定がないので、書式文字列がそのまま出力される ! => 文字列の出力関数 ! [注意] printf は、非常に変な関数 ! 変 : 引数の個数も型も固定されていない ! 普通の関数とは毛色が異なる(まだ、説明しない) !!! 便利なので、積極的に使おう scanf ( 書式指定, &付の変数名を並べる ); 例: int n; /* 入力した値を保持する変数 */ scanf ( "%d", &n ); /* キーボードから「123」と入力すると.. */ /* 変数 n に 整数値 123 が代入される */ [注意] 書式には、複数の書式指定ができる(追加引数にも複数の&+変数がかける) => 「マナー」 一つの scanf では、一つの変数への入力だけにする 書式文字列には、書式指定のみを記述する [疑問] printf と同じように、変な引数 書式文字列に書式指定以外のものを指定すると、どうなる ? 変数の前につける & はなに ? => 後回し ! scanf の利用は、必要最小限度(単独の変数に入力をおこないたい場合の簡便法)で使う ! printf と scanf は、書式指定の記述形式が同じなので、一緒に覚える ! 当分必要なのは % の後ろの英文字の意味 ! 詳しくは google ! ! 書式指定 扱う値 型 ! d 整数値 int ! f (lf) 浮動小数点数 double ! c 文字 char ! s (出力) 文字列 char * [今日の話] while 構文の続き while 構文の働きを、これまで学んだ内容で解釈する (その 1) if 構文が無限にあると思う while ( 条件 ) { 文 } => if ( 条件 ) { 文 } if ( 条件 ) { 文 } ... (無限にならんでいる) (その 2) 再帰呼び出しだと思う 変数=初期値 while ( 条件 ) { 文 変数=変数の新しい値(変数更新) } => 関数呼び出し 関数(初期値) 関数定義(再帰呼び出しを利用して定義) void 関数名(変数宣言){ if ( 条件 ) { 文 関数(変数の新しい値) } else {} } ! while 構文は、if 構文の並びあるいは、再帰呼び出しの関数の別表現として、解釈可能 !! while 構文は常に再帰関数に変換可能(逆も可能だが面倒) [for 構文] 形式 : for ( 変数の初期化; 条件; 変数の更新 ) { 文 } 意味 : 変数の初期化 while ( 条件 ) { 文 変数の初期化 } while 構文と同様な機能をもつ(ほぼ同じ) => for 構文だと、パラメータ変数の記述が一か所にまとまる # 繰り返し記述においては、 # 繰り返したい命令 # と # 繰り返しを実現するための命令(パラメータの処理) # の二つの要素からなる C 言語では、「i++」(後置インクリメント演算)という形で、変数名の後ろに ++ を付ける事ができる これの意味は、 ほぼ「i=i+1」と同じ for 構文では、「i=i+1」とかく代わりに「i++」と書く事が多い switch 構文 形式 : switch ( 式 ) { 「ラベル : 命令列」の繰り返し } ラベル : case 式 | default 命令列 : 命令の繰り返し 命令 : ふつうの文と break 意味: まず、式が計算され、その値がもとめられる。 もし、その阿知と、ラベル式の値のなかで一致するものが あれば、そのラベルの後ろから命令が実行される そうでなければ、default の後ろ ちなみに、default がない場合は、命令は一切実行されない 命令は、ラベルの所から、上から下へ、実行されるが、途中で、 break 命令に会うと、switch 構文を終了する(抜ける) switch 構文は、「効率が良いが制限された」if 構文の塊と解釈できる switch ( 式 ) { case 式1: 命令1 ; break; case 式2: 命令2 ; break; .. case 式n: 命令n ; break; default: 命令n+1l break; } if ( 式 == 式1 ) { 命令1 } else if ( 式 == 式2 ) { 命令2 } ... } else if ( 式 == 式n ) { 命令n } else { 命令n+1 } 一つの評価(式)に対して、複数の場合分けが必要な場合(多重分岐)は、 if 構文を組み合わせるより、switch 構文の方が、わかりやすい 「プログラムは思った通りに動かない、書いた通りに動く」 [まとめ] 新しい構文 for 構文 switch 構文 基本は、これまでの機能の別表現 1. 知らなくても、できる事は減らない(使わなくてもよい) 2. ほかの人がつかうかもしれないので、知っている必要 3. 「表現」の違いなので、「他の人間(三日後の自分を含む)」に、わかりやすくするために、利用する事ができる [squash] 反射神経ゲーム 時間が刻々と進んでにつれて、様相が変化してゆく それに対して、ゲームのプレイヤーが干渉する形になっている MVC Model 状況を表す情報(変数の値の組) View 状況を(変数の値の組を利用して)表現機能 Control 状況表す兵法を入力によって変換させる機能