情報基礎演習II − 第5回


1.配列


変数の宣言の際、変数名の後に [ ] を付けて数を指定することで、 複数の記憶要素を持つ変数を用意することができます。 これを配列変数と呼びます。
int marks[3]; /* 3人分の点数データ */
上記の宣言によって、 3つ分の int 型のデータを格納する領域がコンピュータのメモリ上に 連続して確保され、その先頭に marks という配列変数名が付きます。

この配列変数の要素の一つを指定するときは、 [ ] に番号(整数)を書きます。 これを添字と呼びます。 添字は確保された領域の先頭の位置からのオフセット(変位)です。

この宣言により marks[0], marks[1], marks[2] という 3つの int 型変数が使用できるようになります。 なお、marks[3] は含まれないので注意してください。

marks[0] = 10;
marks[1] = 24;
marks[2] = 42;

printf("合計点 = %d\n", marks[0] + marks[1] + marks[2]);
添字には整数型の変数や式を使うこともできます。
i = 1;
printf("%d,%d,%d\n", marks[i], marks[i+1], marks[i-1]);

■課題17■


多次元配列

表形式のデータなどを処理するのに便利なように、 二次元の配列も使うことができます。 これは次のようにして宣言します。
int table[3][3]; /* 2次元配列 */
これは以下のように3×3=9個の要素を持つ配列を宣言します。
table[0][0]table[0][1]table[0][2]
table[1][0]table[1][1]table[1][2]
table[2][0]table[2][1]table[2][2]
コンピュータの記憶空間(メモリ)は、 実際には一次元配列の構造をしているので、 2次元以上の配列の領域は 右図のように一次元に展開して確保されます。

この図を見て分かるとおり、 この配列は3つの int 型の要素を持つ配列を、 3組用意したものになります。

同様にして、三次元の配列は次のようにして宣言します。

int volume[4][3][2]; /* 3次元配列 */
この配列は4×3×2=24個の要素を持つ配列を宣言します。 これは2個の要素を持つ int 型の配列3組をひとまとめにして、 それを更に4組用意します。 このようにして、さらに次元の高いの配列を宣言することもできます。


■課題18■


2.文字列


char 型データの配列変数において、 最後の要素の内容を '\0'(文字コード 0 の文字、すなわち数値の 0)としたものを、 特に文字列と呼びます。
char name[4];
name[0] = 'K';
name[1] = 'e';
name[2] = 'n';
name[3] = '\0';

printf で文字列を表示するには %s を使います。
printf("He is %s\n", name);
引数として(個々の要素ではなく)配列変数全体を用いるときは、 配列変数名(この場合 name)だけを指定します。 書式文字列中の変換指定子 %s が name の内容に置き換わります。

printf は書式文字列中に変換指定子 %s があると、 それに対応する変数を文字列とみなし、 その最初の要素から '\0' が見つかるまで1文字ずつ順番に出力していきます。 もし配列変数 name の最後の要素が '\0' でなければ、 printf は文字列の最後が見つけられないため、 暴走してしまいます。

"…" で挟まれたものは、文字列定数と呼びます。

printf("He is %s\n", "Ken");
"Ken" は前述の配列変数 name と同様、 'K', 'e', 'n', '\0' の4つの要素からなる配列です。 見てわかるとおり、 printf の書式文字列 "He is %s\n" も文字列です。 従って、次のようなこともできます。
char format[10];
format[0] = 'H';
format[1] = 'e';
format[2] = ' ';
format[3] = 'i';
format[4] = 's';
format[5] = ' ';
format[6] = '%';
format[7] = 's';
format[8] = '\n';
format[9] = '\0';
printf(format, "Ken");

■課題19■


文字列の操作

文字定数は文字型変数に代入することができますが、 文字列定数を文字型の配列変数に代入することはできません。 次の例はエラーになります。
char name[4];
name = "Ken"; /* × これはエラー */
文字列定数や配列変数に格納された文字列を全部配列変数にコピーするには、 strcpy などのライブラリ関数を使用します。

strcpy(s1, s2)

strcat(s1, s2) strlen(s) strcmp(s1, s2) これらのライブラリ関数を使用する場合には、 string.h というヘッダファイルを プログラムの最初の部分でインクルードしておく必要があります。
#include <string.h>

■課題20■