このスライドの使い方

  • 画面下の「▶」で再生開始、「⏸」で一時停止

  • 画面右下の「>」で次頁へ、「<」で前頁へ

  • 青字下線の部分は、まとめプリントの穴埋め

  • 作業」のところでは、ファイルをダウンロードしてコンパイル・実行

第 5 章
「配列」

教科書 pp.115–139

§ 5-1「配列」

(教 pp.116–131)

配列

(教 p.116)

  • 同一の型のデータを集めて、 番号(添字、そえじ)でアクセスできるようにしたもの
  • C 言語の配列の添字は 0から
  • 角括弧 [] で各要素にアクセス — a[i]

/* 初期化しないとき */ int va[5];

配列(つづき)

(教 p.120, p.130)

/* 配列の初期化は、式をコンマで区切って { } で囲む */ /*(残りの要素は 0 で初期化される) */ int vb[5] = { 15, 20, 30 }; /* 初期化子を代入することはできない — 教 p.121 */ vb = { 15, 20, 30, 0, 0 }; /* 配列同士の代入はできない — 教 p.130 */ vb = va;

作業: まとめのプリント Q 5.1.1 をやってみる

配列の走査

(教 p.118)

  • 配列は for 文と相性が良い
  • 5 個の要素を持つ配列の各要素に対して同じ操作を行なうときには…

for (i = 0; i < 5; i++) { a[i] = …; }

作業: List 5-3, List 5-4 を実行する

配列の初期化

(教 p.120)

作業: List 5-5, List 5-6 を実行する

配列の要素に値を読み込む

(教 p.122)

作業: List 5-7 を実行する

配列の全要素の並びを反転する

(教 p.123)

2 つの変数 x, y の中身を入れ替えるのに、

x = y; y = x; 

と書いてもダメ、
別の変数(例えば temp)を一つ用意して、

temp = y; y = x; x = temp;

と書く必要がある

作業: List 5-8 を実行する

なお、List 5-8 は

真ん中のループは、↓ のコンマ演算子を使うかたちも可 (comma2.c)


for (i = 0, j = 6; i < j; i++, j--) {
    int t = x[i];
    x[i]  = x[j];
    x[j]  = t;
}

オブジェクト形式マクロ
(定数マクロ)

(教 p.124)

プログラム中で繰り返し使う定数は名前をつける


#define NUMBER 5
  • この指令は NUMBER というオブジェクト形式マクロを定義す る
  • マクロは他のコンパイル処理に先だって、一括して置換される

作業: List 5-10 を実行する

マクロを定義する利点

  • 値の変更が容易になる
  • 定数の意味がわかり易い
    秘密の数値(マジックナンバー)を直接プログラムに埋め込まない!

マクロが使われる箇所

  • 配列の要素数など、文法上、定数が要求されるところ

  • 円周率などの数学定数・物理定数など絶対不変の定数

(これら以外では、通常の変数を使うのが普通)

C99 規格では

(教 p.136)

配列の要素数に変数を使った書き方も一応可能


int n = 3;
int a[n];  /* C99 では許容だが */

for (i = 0; i < n; i++) {
    a[i] = 0;
}

しかし、処理系がこれをサポートしなくても良い
(演習の解答では、使ってはいけない

マクロ名

(教 p.124)

すべての文字を大文字とする慣習がある

  • 小文字を使ってもコンパイルエラーになるわけではないが、強く非推奨とする
    (演習の解答で、小文字を使ったマクロ名は間違いとする)
  • 逆に、変数名は必ず小文字を混ぜること
    (演習の解答で、大文字だけの変数名は間違いとする)

代入式の評価

(教 p.126)

代入「変数 = 」も式であり、値(代入された値と同じ)を持つ

  • 代入演算子は右結合である(右側から行われる)
  • つまり、x = y = 0x = (y = 0) と解釈される

作業: List 5-11 を実行する

作業: まとめのプリント Q 5.1.2 をやってみる

配列の要素数〜配列のコピー

(教 pp.128–131)

教科書を読んでおく

Warning

(教 p.131)

  • 発音は /'wɔːnɪŋ/
  • カタカナではウォーニングが近い
  • 警告という意味で、エラーではないが間違っている可能性が高いことを示す
    (コンパイルができないということではない)

break 文の例

(まとめのプリント)

作業: breakTest.c を実行する(break を continue に変えたものも試す)

作業: まとめのプリント Q 5.1.3 をやってみる

§ 5-2「多次元配列」

(教 pp.132–137)

多次元配列

(教 p.132)

各要素が配列であるような配列、言い替えれば 2 つ以上の添字を持つ配列のこと
ただし、物理的には一次元に配置される(Fig.5-10 参照)

作業: まとめのプリント Q 5.2.1 をやってみる


int x[2][3] = {{ 1, 2, 3 }, { 4, 5, 6 }};

作業: List 5-15 を実行する

作業: まとめのプリント Q 5.2.2 をやってみる

文法のまとめ

宣言 (declaration)

分類 一般形
配列宣言 変数 [ 定数 ] = { ,, };

=」以降の 灰色の部分は省略可能

式 (expression)

分類 一般形 補足説明
配列アクセス [] a[1], b[2][3] など

第 5 章・終