目的
配列について理解し、使えるようになること。
配列とは
変数は箱であるという話を変数の時にしました。
それに対して、配列は変数が複数連なったものと考えることができます。
以下の図は、変数 (1つ1つの箱) が4つ連なった配列を表しています。
配列では、複数の変数を束ねて1つの名前をつけます。
上の例では、変数4つを束ねて、a という名前をつけています。
a という名前のついた配列には 4 つの箱 (= 変数 ) があります。
それぞれの変数は、a[0], a[1], a[2], a[3] のように表現します。
プログラミングでは、基本的に数を数えるときは 0 から数えます。
そのため、この場合、配列 a の 0番目, 1番目, 2番目, 3番目と呼びます。
配列の宣言
配列を使うためには、まず初めに宣言する必要があります。
配列は次のように宣言します。
int a[4];
上の例では、int 型の箱 (= 要素 ) が4つある配列を宣言しています。
画像で表すと、以下のようになります。
一般的に、配列は次のように宣言します。
型名 変数名[要素数];
要素数には、変数ではなく具体的な数値を指定します*1。
配列の利用
この配列を利用するには、次のようにします。
a[0] = 5;
これを画像で表すと以下のようになります。
上の例では、配列 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個の要素をもつ配列になります。
各要素は、上の図に書いてあるように、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人
挑戦課題
- AOJ 10011: Reversing Numbers 易
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10011
- AOJ 0028: Mode Value
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0028&lang=jp
- AOJ 0061: Rank Checker 難
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0061&lang=jp
補足
次のようなコンマ区切りのデータを読み込む際は、
3,4
scanf を次のように記述します。
scanf("%d,%d", &a, &b);