前回の内容 前回の内容 ガイダンス : 基本は、前期と同じ / ただし、前期の知識を仮定する 目的 : 「C 言語でプログラムが書けるようになる」事 三つの内容 : プログラミング / 操作方法 / C 言語 方針 : 同じ内容を 3 度、繰返しながら、少しずつ内容を深く進める 復習 1 周回 : hello world, 関数, 制御構造(順接,条件分岐,再帰) 原理的に可能なプログラムは一通りかける 2 周目 : 様々なデータ構造 ( char, int ) まだ、途中 : 早めに終らせて、3 周回のアプリ開発に行きたい 代入 代入とは 概念 : 「変数」に「値」を「割り当て」る「操作」 「変数」 関数の引数変数として導入 色々値を持ちうるもの プログラム作成時は、値がきまってなくてもよいが 実行時には、値が決まっている必要がある => 「値を決める」という作業 => 「値」を「割り当てる」 例: 仮引数変数の場合は、 実引数(これが割り当てる変数の値)が相当する => 実引数を指定(して、関数を呼び出しを)する事は、 仮引数変数への代入 「=」を利用した代入の話 代入「後」は、その変数の値は、代入さ(割り当てら)れた値に「変化」する 1 限の内容 a. 「代入」という言葉 b. 「代入」の仕組み => 関数引数と同じ働き c. 「代入」を C 言語で(関数呼び出しを使わず、直接)実行する方法 代入文 ( 「=」を利用した、代入の表現 ) (代入文の左辺に現れる変数を利用するための..) 変数宣言 => 関数の仮引数変数と同じ 表 : 代入文と関数呼び出しの比較 代入の対象 代入元 タイミング 回数 影響範囲 代入文 局所変数 代入文の右辺の式 いつでも 何度でも 次の代入まで 関数呼び出し 仮引数変数 実引数 関数呼び出し時 一回 関数(呼び出し)内 代入を行うと (その変数が保持していた..) 代入「前」の値は、「失われ」る 代入の「前」と「後」という「時間」の概念の把握が必要となる !! 数学には「時間の概念がない」 表現 : 代入の構文 「変数名」=「式」 [例] a=1+2; (変数 a に 3 ( = 1+2 ) を代入) => 代入文は、「式の『計算』要求」にもなっている => 代入文を並べる事により、 「計算を進める」事にもなっている 手続き型言語 ( 代入文を中心にプログラムを書く事を想定した言語 ) 「=」は、「代入」を表現する(等号[等しい]ではない!! / 等号は「==」) 局所変数宣言 概念 : 局所変数を宣言する cf. 関数の仮引数変数は、関数の定義時に、仮引数部でおこなっている 関数の本体 ( { 〜 } : ブロック ) の先頭でやる # C 言語の制約のひとつ / C++ などは、先頭に限定しない.. => プログラミング時は、変数の型を指定し、 変数に代入可能な値の制限を行う 実行時は、変数の値を収める領域を準備する命令になる 関数(ブロック)内のみ(局所的)で有効(利用可能)な変数を宣言する 「仮引数変数(実は局所変数の一種)」以外にも、変数が増やせる !! 仮引数変数も代入文をつかって、値が変更できる 表現 : 局所変数の宣言 「変数の型名」「変数名」 [例] int a; (整数型の変数 a を宣言) cf. 仮引数変数は、実引数の値で、「代入済」の変数 -> 局所変数は宣言をした段階では、「ゴミ」が入っている 未代入の変数の値は「未定(プログラムミスの代表例 !!)」 変数は宣言と同時に「初期化(最初の代入)」できる(すべき) [例] int a=1; !! 最初に何をいれるべきかがわからない場合がある !! 変数を使いたい場所と、宣言をする場所が離れているから !! その場合は、「固定」な値を無条件に設定する !! 例 : int 0/char '\0'/char * "" 課題 : 20210917-02 => 後回し 標準 I/O ライブラリの利用 標準 I/O ライブラリ ( stdio ) I/O とは Input(入力) と Output(出力) の事 Input : プログラムが、プログラムの外から、情報を読み込む(Read) Output : プログラムが、プログラムの外へ、情報を書き出す(Write) [ポイント] 「外」はプログラムの置かれている環境で異る (i.e OS) 例 : 「あいさつ」をするとき日本とアメリカで異るの嫌(だから全て英語で.. それも困るが..) 環境の違いを吸収して、 プログラムは同じだが、実行結果は、 その環境において、適切に変化するようにする仕組みが欲しい その「仕組み」が標準ライブラリ => 標準ライブラリを利用すれば、 環境の違いを意識せずに、同じプログラムで(同じ機能を実現)できる 標準 I/O ライブラリの役割 異る環境でも、プログラムとしては、同じ方法で I/O を行うための仕組 環境の違いはライブラリが吸収 (挨拶は手を振るで OK) 標準 I/O ライブラリの機能 I/O する物 : 文字、文字列、数値(基本データ) I/O の相手先 : キーボード(I), ディスプレイ(O),ファイル(I/O) printf printf : 超高機能出力関数 print with format (書式付き出力) 単なる文字列出力関数ではなかった cf. printf ( "Hello, World\n" ); => 引数で指定された「文字列」を出力する 「書式('%' + 書式指示)」を指定する事により何(基本型+文字列)が出力できる printf ( 書式指定(の文字列) + 色々な型の値 ); => 基本型であれば、どんな型の値でも出力可能 !! printf の関数の引数には、 !! 色々な型の値を指定する事ができる !! !! 関数の実引数は、仮引数変数の型と同じ型の値と指定する !! !! => 関数の引数の型は、いつも同じ !! なぜ、このような(変な)事ができるかは.. !! この講義の最後あたりで、説明したい.. !! いまはしない.. printf ( "%d", 123 ); / printf ( "%f", 1.23 ); / printf ( "%c", 'a' ); / printf ( "%s", "abc" ); 文字列の中に出力(色々な値)を「埋め込む」事ができる int a=123; printf ( "int a=%d\n", a ); 複数のデータを一度に出力する事ができる int a=123; double b=1.23; printf ( "int a=%d, double b=%f\n", a, b ); 非常に高機能 printf の動作原理 後でちゃんと話すので、今回は我慢 !!