同じ型の値を連続して管理する「配列」を学ぶ。
ループと組み合わせると大量のデータを効率よく扱える。
配列とは、同じデータ型の変数が複数、連続したメモリ領域に並んだもの。
個別の変数を何個も用意する代わりに、1つの名前でまとめて管理できる。
#include <stdio.h>
int main(void)
{
int a, b, c, d, e;
int sum;
printf("5人の点数を入力してください: ");
scanf("%d %d %d %d %d", &a, &b, &c, &d, &e);
sum = a + b + c + d + e;
printf("合計: %d\n", sum);
return 0;
}
#include <stdio.h>
int main(void)
{
int score[5];
int i, sum = 0;
printf("5人の点数を入力してください:\n");
for (i = 0; i < 5; i++) {
scanf("%d", &score[i]);
sum += score[i];
}
printf("合計: %d\n", sum);
return 0;
}
score[100] と数字を変えるだけで対応できる。データ型 配列名[要素数];
int score[5]; /* 要素数のみ(中身は不定) */
int score[5] = {100, 80, 90, 75, 60}; /* 要素数と初期値を同時に指定 */
int score[] = {100, 80, 90}; /* 要素数は初期値の個数から自動決定 */
int score[5] = {10, 20}; /* 残りの要素は 0 で初期化される */
int score[5];(未初期化)
| score[0] | score[1] | score[2] | score[3] | score[4] |
|---|---|---|---|---|
| ??? | ??? | ??? | ??? | ??? |
int score[5] = {10, 20, 30};
| score[0] | score[1] | score[2] | score[3] | score[4] |
|---|---|---|---|---|
| 10 | 20 | 30 | 0 | 0 |
score[5] にアクセスすると範囲外で未定義動作になる。
配列名[添字]
添字(インデックス)に変数を使えるのが配列の強み。ループと組み合わせる。
int score[5] = {80, 70, 90, 60, 85};
score[2] = 95; /* score[2] を上書き */
printf("%d\n", score[2]); /* 95 と表示 */
#include <stdio.h>
int main(void)
{
int data[5] = {10, 20, 30, 40, 50};
int i, sum = 0;
/* 全要素に +1 する */
for (i = 0; i < 5; i++) {
data[i] += 1;
}
/* 合計を計算しながら表示 */
for (i = 0; i < 5; i++) {
printf("data[%d] = %d\n", i, data[i]);
sum += data[i];
}
printf("合計: %d\n", sum);
return 0;
}
data[0] = 11 data[1] = 21 data[2] = 31 data[3] = 41 data[4] = 51 合計: 155
for (i = 0; i < 要素数; i++) が基本形。
#include <stdio.h>
int main(void)
{
int score[5];
int i, sum = 0;
double avg;
printf("5人の点数を入力してください(1つずつ Enter):\n");
for (i = 0; i < 5; i++) {
printf("score[%d]: ", i);
scanf("%d", &score[i]);
sum += score[i];
}
avg = sum / 5.0;
printf("合計: %d\n", sum);
printf("平均: %.1f\n", avg);
return 0;
}
5人の点数を入力してください(1つずつ Enter): score[0]: 80 score[1]: 70 score[2]: 90 score[3]: 60 score[4]: 85 合計: 385 平均: 77.0
5つの整数を配列に格納し、最大値を表示するプログラムを作れ。
#include <stdio.h>
int main(void)
{
int data[5] = {34, 12, 78, 45, 23};
int i, max;
/* ここに最大値を求める処理を書く */
printf("最大値: %d\n", max);
return 0;
}
max = data[0]; で最初の要素を仮の最大値にしてから、残りと比較する。
max = data[0];
for (i = 1; i < 5; i++) {
if (data[i] > max) {
max = data[i];
}
}
5つの整数を配列に格納し、逆順に表示するプログラムを作れ。
#include <stdio.h>
int main(void)
{
int data[5] = {1, 2, 3, 4, 5};
int i;
/* ここに逆順表示の処理を書く */
return 0;
}
for (i = 4; i >= 0; i--) {
printf("%d ", data[i]);
}
printf("\n");
Q1. int a[5]; の添字として有効な範囲はどれか。
正解:イ
要素数 5 の配列の添字は 0〜4。a[5] は範囲外で未定義動作になる。
Q2. int a[5] = {1, 2}; のとき a[4] の値はどれか。
正解:ウ
初期化リストで指定されなかった残りの要素は 0 で初期化される。
Q3. 次のコードの出力として正しいものはどれか。
int a[4] = {10, 20, 30, 40};
printf("%d\n", a[1] + a[3]);
正解:ウ
a[1] = 20、a[3] = 40。20 + 40 = 60。
Q4. 配列と for 文を使う利点として最も正しいものはどれか。
正解:イ
添字に i などの変数を使うことで、ループと組み合わせて大量の要素を効率よく処理できる。