200 likes | 374 Views
プログラミング演習 Ⅱ 第 3 回 配列(1). 情報・知能工学系 山本一公 kyama@tut.jp. 前回の課題の解説・ポイント. 課題1-1 入力は scanf 関数 fprintf 関数で出力 cat コマンドで確認 課題1-2 入力は fscanf 関数 “ バイナリ形式で ” と指定されているので、 fwrite 関数で出力 List 13-10 をそのまま正しく打ち込んで実行. 今日の内容. 教科書 p.87 ~ 配列 1 次元配列 配列の初期化 配列のコピー オブジェクト形式マクロ 代入式 式の評価と値、評価の順序.
E N D
プログラミング演習Ⅱ第3回配列(1) 情報・知能工学系 山本一公 kyama@tut.jp
前回の課題の解説・ポイント • 課題1-1 • 入力は scanf関数 • fprintf関数で出力 • cat コマンドで確認 • 課題1-2 • 入力は fscanf関数 • “バイナリ形式で”と指定されているので、fwrite関数で出力 • List 13-10をそのまま正しく打ち込んで実行
今日の内容 • 教科書 p.87~ • 配列 • 1次元配列 • 配列の初期化 • 配列のコピー • オブジェクト形式マクロ • 代入式 • 式の評価と値、評価の順序
配列とは(1) • 同じ型のオブジェクトの集まりを、番号により管理できるようにしたデータ型 • どういうときに使うのか? • 例えば • テストの成績を出したい • 合計点や平均点を出したい • 学生は何人?
配列とは(2) • 学生が5人だけだったら • 変数は5個 • プログラムで書いても、苦ではない • 学生が300人いたら • 変数が300個! • 300個の変数名を考えないといけない! • ある変数名を別の変数名と間違えてはいけない! • プログラムで書くのは大変 ⇒ 配列の出番! • 他には • 「ベクトル」を表すために使う
配列の宣言(1) • 普通の変数の宣言は「型名 変数名」 • 配列は「型名 変数名[要素数]」 • 注意:使える要素は0~要素数-1まで • 言語によって違います /* int型で、変数名が vxだったら */ intvx; vc[0] /* int型で、配列名が vcで、要素数が 5 だったら */ intvc[5]; vc[1] vc[2] vc[3] vc[4]
配列の宣言(2) • 要素数は定数でなければいけない! • こういう宣言はできない!……ことになっている • 最近のコンパイラ(gcc等)だとOKな場合も • 処理系(コンパイラ)に依存するので、なるべく書かないように int n = 5; int a[n]; /* エラー:要素数は定数でなければならない */
配列とfor文(1) • 配列の各要素に、順番に数値を代入することを考える • 配列の要素数が少ないときは、力技でプログラムが書ける • p.90, List 5-2 • for文を使えば、効率良く書ける • p.90, List 5-3 • 要素数が300になっても、同じように書ける
配列とfor文(2) • List 5-3から抜粋 • iが0のとき、vc[0] = 0 + 1 = 1 • iが1のとき、vc[1] = 1 + 1 = 2 • iが2のとき、vc[2] = 2 + 1 = 3 • iが3のとき、vc[3] = 3 + 1 = 4 • iが4のとき、vc[4] = 4 + 1 = 5 • 順番に数値が代入されている • for文は、こういう人工データ作成用途に最適! for (i = 0; i < 5; i++) vc[i] = i + 1;
配列の初期化(1) • 配列に最初から数値を入れておきたい • 順番に要素を並べる! • 全体を“{“, “}”で囲む! • 要素数は書かなくても良い! • 要素数は自動的に初期化のデータ数になる! /* List 5-3で代入したものを最初から入れておきたい*/ intvc[5] = {1, 2, 3, 4, 5}; /* List 5-3で代入したものを最初から入れておきたい*/ intvc[] = {1, 2, 3, 4, 5};
配列の初期化(2) • 初期化のデータ数は少なくても良い • vc[3]とvc[4]は自動的に0に初期化される(そういう決まりになっている) • 多いのはダメ!エラーになる /* List 5-3で代入したものを最初から入れておきたい*/ intvc[5] = {1, 2, 3};/* {1, 2, 3, 0, 0}と同じ */ /* List 5-3で代入したものを最初から入れておきたい*/ intvc[5] = {1, 2, 3, 4, 5, 6, 7}; /* これはエラー */
配列の初期化(3) • 要素数が多い配列で、要素を全部0.0に初期化したい!というような場合 • p.91, List 5-4のようにすべき • for文を使って全ての要素に同じ数値を入れる inti; double vd[300]; for (i = 0; i < 300; i++) vd[i] = 0.0;
配列のコピー • 配列 vaを配列 vbにコピーしたい • というようなことは、できない! • for文で要素ごとにコピーしましょう • p.93, List 5-6を参照のこと intva[5], vb[5]; vb = va; intva[5], vb[5], i; for (i = 0; i < 5; i++) vb[i] = va[i];
オブジェクト形式マクロ(1) • p.96, List 5-9のようなプログラムを作った • 作ったときの学生の数は5人 • 学生の人数が増えた!8人になった! • 「5」を「8」に変更したい! • でも、printf文の中の”5”は”8”に変えてはいけないから、エディタの一括置換は使えない • 全部目で見てチェックしなきゃいけない! • プログラムが何千行もあったら、すごく大変だ!
オブジェクト形式マクロ(2) • こんなときにマクロを使おう! • “#define”で定義する • ”#”で始まるものは全部コンパイラへの命令(”#include”も) • 大文字で定義する(慣習) • プログラムの中で使える変数みたいなもの • 利点 • 何の数値か分かりやすくなる! • 変更が容易になる! • プログラムの間違いが減る! #define STUDENTNUMBER 5 inttensu[STUDENTNUMBER];
式の評価、式の値 • 式はその値を評価することができる • 代入式でも評価できる • 代入式の値は左辺の変数の型と値 int x = 2; xは? ⇒ 2 int x = 2, y; y = x; ⇒ 式の値は? ⇒ y の型と値 ⇒ 2
評価の順序 • それぞれの変数の値はいくらになる? • 式の評価は右から • 最初eに10が代入される • ”e=10”という式の値は10 • その式の値がdに代入されて、d=10になる • 以下繰り返しで、全ての変数の値は10になる! int a = 1, b = 2, c = 3, d = 4, e = 5; a = b = c = d = e = 10; int a = 1, b = 2, c = 3, d = 4, e = 5; a = (b = (c = (d = (e = 10))));
今週の課題 • 教科書 p.93, 演習5-4のプログラムを作成せよ。 • 2つの n 次元ベクトル x, y をキーボードから入力し、それらの内積を求めて表示するプログラムを作成せよ。次元数 n は”#define”を使って適当な値をプログラム内で定義すること。なお、内積の定義は以下の通り。
レポートについて • 電子メールで提出 • 提出先は prog2@slp.cs.tut.ac.jp • Subjectを「プログラミング演習2 課題2提出 学籍番号・氏名 」とすること • C言語ソースファイルを添付する • メールの本文には何も書かなくて良いです • ソースファイルの頭にコメントで以下の情報を入れる • 学籍番号・氏名 • プログラムの説明(どのように動くのか、工夫した点等) • 実行結果(長い場合は一部)を貼る • 提出締切は、10月24日(水) 12:00 (1週間後)
授業用Webサイト • URL: http://www.slp.cs.tut.ac.jp/~kyama/programming2/ • 課題のpdfファイルが置いてあります。 • 授業で使ったpptファイルを置いていきます。 • 質問メールは、以下のどちらかのアドレスまで • kyama@tut.jp • prog2@slp.cs.tut.ac.jp • C-515へ直接質問しに来ても構いません