第5章 配列

第5章1 整数配列

 変数に添え字をつけることにより、配列として宣言できる。

1-1 配列の宣言

[書式(一次元配列)]

変数の型 変数名[要素の数];

[例]

int ten[10];
ten[0] = 20;
ten[1] = 30;

[イメージ]

ten[0]ten[1]ten[2]ten[3]ten[4]ten[5]ten[6]ten[7]ten[8]ten[9]
2030







※要素数に10と指定した場合、0から9までの10個の変数が宣言される。

練習問題

教科書69ページ問5

1-2 配列の初期化

配列の宣言時に初期化を行うには、次のように指定する。

初期化の例

int ten[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

間違った初期化の例

int ten[10];
ten = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

※配列宣言後にまとめてデータを入れることは出来ない!!

練習問題

教科書70ページ問6

1-3 配列を使うと便利なプログラムの例

1クラス分の5段階評価(1〜5)を入力し、評価別の人数を求める。

[配列を使用しないプログラム]

#include <stdio.h>
main()
{
    int     cnt1 = 0, cnt2 = 0, cnt3 = 0, cnt4 = 0, cnt5 = 0;
    int     hyoka;

    while (printf("評価を入力 -> "), scanf("%d", &hyoka) != EOF)
    {
        if (hyoka == 1)
            cnt1++;
        if (hyoka == 2)
            cnt2++;
        if (hyoka == 3)
            cnt3++;
        if (hyoka == 4)
            cnt4++;
        if (hyoka == 5)
            cnt5++;
    }

    printf("評価が 1 の人数 : %d\n", cnt1);
    printf("評価が 2 の人数 : %d\n", cnt2);
    printf("評価が 3 の人数 : %d\n", cnt3);
    printf("評価が 4 の人数 : %d\n", cnt4);
    printf("評価が 5 の人数 : %d\n", cnt5);

}

[配列を使用したプログラム]

#include <stdio.h>
main()
{
    int     cnt[6] = {0, 0, 0, 0, 0, 0};
    int     hyoka;

    while (printf("評価を入力 -> "), scanf("%d", &hyoka) != EOF)
    {
        cnt[hyoka]++;
    }

    for (hyoka=1 ; hyoka<=5 ; hyoka++)
    {
        printf("評価が %d の人数 : %d\n", hyoka, cnt[hyoka]);
    }

}

1-4 応用

配列を宣言すると同時に初期化を行う場合、要素数を省略することができる。省略した場合、初期化した数分の要素が宣言されたことになる。

int ten[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

int ten[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

は同じ意味

練習問題

  1. 教科書71ページ練習問題12
  2. 教科書73ページ練習問題13

1-5 多次元配列

配列は一次元だけでなく、二次元以上の配列を使うことができる。

[二次元配列の例]

1クラス40人の5科目分の得点を入れる配列

int ten[40][5];

※ten[0][1]は1人目の2科目目の得点、ten[1][4]は2人目の5科目目の得点という意味になる。

[二次元配列の初期化方法]

int ten[40][5] = {
    {80, 75, 60, 70, 55},
    {80, 75, 60, 70, 55},
        ・
        ・
    {80, 75, 60, 70, 55}
};

5個の塊が40個あると考え、1つの塊ごとに{ }で囲む。

練習問題

  1. 教科書75ページ例題14のプログラムを次のように改造する。
    • 横の合計のとなりに平均点を表示する
    • 科目別の合計点、平均点を表示する
  2. 教科書76ページ練習問題14

2 文字配列

 C言語では、文字列を””を用いて表す。例えば"Hello"という文字列は、メモリ上の任意の位置に次のように格納される。

番地80008004800880128016802080248028803280368040


'H''e''l''l''o''\0'


'\0'は文字列の終わりを表す制御文字で、文字列をメモリに格納する際、自動的に付けられる。

しかし文字列をプログラムで扱う場合、C言語では1つの変数に1つの文字しか格納できないため、文字変数を配列にして文字列を格納するという技を使う。

2-1 文字配列の宣言

[書式(一次元配列)]

char 変数名[格納する文字列の最大長+1];

[例]

char name[10] = "Kogakuin";

[イメージ]

name[0]name[1]name[2]name[3]name[4]name[5]name[6]name[7]name[8]name[9]
'K''o''g''a''k''u''i''n''\0'

※文字列の先頭から順番に格納され、文字列の最後にはヌル文字「\0」が格納される。

2-2 文字配列の初期化

文字配列の1つ1つに1文字ずつ代入することはできるが、 文字列をまとめて格納することは(そのままでは)できない。

[初期化の例]

char name[10] = "Kogakuin";

または

char name[10];
name[0] = 'K';
name[1] = 'o';
name[2] = 'g';
name[3] = 'a';
name[4] = 'k';
name[5] = 'u';
name[6] = 'i';
name[7] = 'n';
name[8] = '\0';

※文字列の最後にはヌル文字「'\0'」が必要!!

[間違った初期化の例]

char name[10];
name = "Kogakuin";

※配列宣言後にまとめてデータを入れることは出来ない!!
(特殊な関数を使えば可能)

2-3 文字列の入出力

char name[10];
scanf("%s", name);
printf("INPUT NAME : %s\n", name);

※文字列をscanfで入力する場合、変数名の前に&をつける必要は無い!!

[サンプル]入力した文字列を1文字ずつ縦に表示する

/* 入力した文字列を1文字ずつ縦に表示する */
#include <stdio.h>
main()
{
    char name[80];
    int  i;

    printf("文字列を入力 : ");
    scanf("%s", name);

    for (i=0 ; name[i] != '\0' ; i++)
        printf("%c\n", name[i]);

}

※入力される文字列は必ず同じ長さとは限らないため、 文字列の最後('\0')になるまで処理を繰り返すようにした。

練習問題

  1. 入力された文字列の長さを求めるプログラムを作成せよ。 ただしヌル文字は含まないものとする。

2-4 scanfの罠?

scanfは書式付標準入力関数であるため、入力データに空白やカンマなどの区切り文字があると、区切り文字の手前までしか入力されず、残りを切り捨ててしまう。

[例]

char name[80];
scanf("%s", name);
printf("InputData = %s\n", name);

このプログラムを実行して「Kogakuin」と入力した場合、「InputData = Kogakuin」と表示されるが、「Nagoya Kogakuin」と入力した場合、「InputData = Nagoya」と表示されてしまう。

区切り文字を無視し、リターンキーを押したところまでのデータをすべて格納させるには標準文字列入力関数getsを使う。

[getsの書式]

gets(文字配列名);

[使用例]

char name[80];
gets(name);
printf("InputData = %s\n", name);

※scanfの%sは「区切り文字まで入力」という意味だが、printfの%sは「文字列の終わりまで出力」という意味である。

確認問題

問題1

整数配列内の数値を調べ、データ件数、最大値、最小値を求めるプログラムを作成せよ。

#include <stdio.h>
main()
{
  int data[] = {20, 30, 50, 20, 55, 68, -1};
ここから先を考える。
(ただし、-1はデータの終わりとする)

問題2

区切り記号を含む文字列を入力し、小文字はすべて大文字に置き換えて表示するプログラムを作成せよ。


[ TOP ]