配列

Last-modified: 2017-05-08 (月) 21:19:42
 

目的

配列について理解し、使えるようになること。

配列とは

変数は箱であるという話を変数の時にしました。
それに対して、配列は変数が複数連なったものと考えることができます。

以下の図は、変数 (1つ1つの箱) が4つ連なった配列を表しています。

 
array.png

配列では、複数の変数を束ねて1つの名前をつけます。
上の例では、変数4つを束ねて、a という名前をつけています。

a という名前のついた配列には 4 つの箱 (= 変数 ) があります。
それぞれの変数は、a[0], a[1], a[2], a[3] のように表現します。

プログラミングでは、基本的に数を数えるときは 0 から数えます
そのため、この場合、配列 a の 0番目, 1番目, 2番目, 3番目と呼びます。

配列の宣言

配列を使うためには、まず初めに宣言する必要があります。
配列は次のように宣言します。

int a[4];

上の例では、int 型の箱 (= 要素 ) が4つある配列を宣言しています。
画像で表すと、以下のようになります。

 
array.png

一般的に、配列は次のように宣言します。

型名 変数名[要素数];

要素数には、変数ではなく具体的な数値を指定します*1

配列の利用

この配列を利用するには、次のようにします。

a[0] = 5;

これを画像で表すと以下のようになります。

array2.png

上の例では、配列 a の 0 番目に 5 を代入しています。
配列の各要素を利用するときは、配列名[数字]のように書き、今までの変数と同じように利用します。

数字の部分は、添字と言ったり、インデックスと言ったりします。

配列を宣言し、標準入力から読み込む。

int a[3];

scanf("%d %d %d", &a[0], &a[1], &a[2]);

配列へ変数を利用してアクセスする

配列の要素を利用する時に、配列名[数字]と書くことは既に説明しました。
実は、この数字の部分には変数も利用できます。

例1

以下は、int 型の配列を用意し、3 番目の要素に 10 を代入しています。

int a[10];
int i;

i = 3;
a[i] = 10;

例2

以下は、int 型の配列を用意し、すべての要素に 0 を代入しています。

int a[10], i;

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

例3

以下は、int 型の配列を用意し、標準入力から 3 個の整数を読み込んでいます。

int a[3], i;

for(i = 0; i < 3; ++i){
    scanf("%d", &a[i]);
}

2次元配列

次のように宣言すると、2×4個の2次元配列を利用できます。

int a[2][4];

そうすると、以下の図のように、計8個の要素をもつ配列になります。

array3.png

各要素は、上の図に書いてあるように、a[0][2] のように利用します。

上の例では、以下の 8 個が用意され、利用できます。

  • a[0][0]
  • a[0][1]
  • a[0][2]
  • a[0][3]
  • a[1][0]
  • a[1][1]
  • a[1][2]
  • a[1][3]

a[0][4] や、a[2][0] などは使えません。
宣言時に指定してあるのはあくまでも個数であり、その数値まで使えることを表すものではありません

以下の例では、4×4の大きさの配列を確保し、a[2][3] には 2×3 の答えが入るように代入しています。

int a[4][4];
int i, j;

for(i = 0; i < 4; ++i){
    for(j = 0; j < 4; ++j){
        a[i][j] = i * j;
    }
}

課題

課題1

整数を n 個入力します。
n 個入力し終わった後に、入力した数値を表示しなさい。

入力された値は、一度すべて配列に格納すること。
n は 10 以下とします。

入力例

以下は 4 つの整数を入力しています。
1行目は、数の個数です。

4
3
1
6
7

出力例

入力された数値をそのまま出力します。

3
1
6
7

実行例

1行目は数の個数 n です。
2行目から n 個の個数を入力してください。
入力が終わったら、入力した数値を順番に出力してください。

./a.out
1
8
8
./a.out
3
7
6
4
7
6
4
./a.out
10
1
3
5
7
9
2
4
6
8
10
1
3
5
7
9
2
4
6
8
10

課題2

整数が n 個入力されます。
それぞれ何個ずつ入力されたかを求めなさい。

入力される整数は 0 以上 10 未満とします。

入力例

1行目には整数の個数 n が与えられます。
2行目以降には n 個の整数が続きます。

5
3
2
7
2
7

上の例では、5個の整数が入力されています。

出力例

入力された整数がそれぞれ何個ずつか、整数とその個数を空白区切りで表示します。

2 2
3 1
7 2

上の例では、2が2個、3が1個、7が2個入力されたことを表しています。

実行例

./a.out
1
3
3 1
./a.out
3
5
2
5
2 1
5 2
./a.out
5
8
8
8
8
8
8 5

ヒント

a[n]にはnの個数が入る。

課題3

学籍番号と成績 (GPA) が与えられます。
入力された順に順位をつけて出力しなさい。

入力形式

1行目に学生の人数 n が与えられます。
2 ~ (n + 1) 行目に、学生の情報が学籍番号と成績 (GPA) を空白で区切って与えられます。

n は 10 以下です。

出力形式

学籍番号と成績 (GPA) と順位を、入力された順に出力しなさい。
学生ごとに改行し、各数値はスペースで区切って出力すること。

GPA は小数点以下1桁まで表示すること。

入力例

3
100 3.7
101 3.0
102 3.1

出力例

学籍番号、成績、順位の順です。

100 3.7 1
101 3.0 3
102 3.1 2

実行例

./a.out
1
1000 4.0
1000 4.0 1
./a.out
3
10 2.6
13 2.0
12 2.2
10 2.6 1
13 2.0 3
12 2.2 2
./a.out
4
1001 3.1
1003 3.4
1009 3.7
1010 3.4
1001 3.1 4
1003 3.4 2
1009 3.7 1
1010 3.4 2

ヒント

自分がn位→自分より上にn-1人

挑戦課題

補足

次のようなコンマ区切りのデータを読み込む際は、

3,4

scanf を次のように記述します。

scanf("%d,%d", &a, &b);
 


*1 C99 の可変長配列についての説明は省きます。