第1章 「やさしい入門」
1.6 配列(2)

2021年9月4日

前回に引き続き配列です。
今回はK&R本のサンプルコードをベースに少々改造を加えたソースコードでご説明します。
プログラム自体は少々長くなりますが、中身は前回のレベルとほぼ同じですので理解出来ると思います。

配列とは関係ありませんが、長いソースコードではブロック単位でコメントを入れるとわかりやすくなります。
こちらも参考にして下さい。

プログラムの目的

キー入力を受け付け、以下のキーが押された数をカウントする
・0~9のキーそれぞれ
・空白(タブ、改行含む)合計
・上記以外のキー

ソースコード

 

解説

①int ndigit[ARRAY_SIZE];
各数字に対応したカウント数を格納する配列です。
サンプルソースコードでは以下のようにコメントを記入しています。
int配列であることはわかりますがコメントを入れないと役目がわかりません。
サンプルのようにコメントを入れることで他人が見たり、自分で後ほど確認する場合でも意味がわかります。
プログラム作成中に頭の中を整理するためにも是非記入しましょう。

//数字キーのカウントを格納
//配列番号が数字キーに対応
//例
// ndigit[0] 0キー
// ndigit[1] 1キー
// ndigit[2] 2キー
// 以降同様

②for (int i = 0; i < ARRAY_SIZE; i++) {
ndigit[i] = 0;
}

先ほどの配列の内容を0に初期化しています。
変数は定義しただけでは値は不定です。
必ず初期値を入れる習慣を付けましょう。

② int nwhite = 0; //空白、改行、タブの数(どれかがきたらカウントアップ)
int nother = 0; //数字や空白、改行、タブ以外の数

それぞれがカウンターの役割を持っています。
こちらもコメントを入れています。

③if (c >= '0’ && c <= '9’) { //数字キーか?
入力されたキーが0以上、9以下であることを確認しています。
文字コードはASCIIコードと呼ばれる16進のコードが割り当てられています。
都合の良いことに数字キーは下記のように連番となっています。
従ってサンプルコードのように確認することで0~9の数字を判定することが出来るのです。
ちなみに’0’は内部では0x30に変換されます。

16進は先頭に0xを付けて表現します。
C言語では16進表現はよく利用しますので覚えておいてください。
16進法については後で説明します。

ASCIIコード(16進表記)
0 = 0x30
1 = 0x31
2 = 0x32
3 = 0x33
4 = 0x34
5 = 0x35
6 = 0x36
7 = 0x35
8 = 0x38
9 = 0x39

 

④++ndigit[c-'0’];
ndigit配列について①でご説明したように0~9のそれぞれのキーを押した数を各配列に格納しています。
c-'0’は押したキーの番号に対応する配列を示します。
例えば0キーを押された場合を考えてみましょう。
cの中身は上のASCIIコード表より0x30となります。’0’はもちろん0x30、従って0x30-0x30=0となり配列0を指します。
同様に9キーを押された時はcの中身は0x39で0x39-0x30=9で配列9を指しています。

⑤16進について
16進が初めての方に解説を致します。
通常我々が利用するのは10進で各桁は0~9までとなっています。
例えば1の位が9まで進むと0に戻り桁上がりが発生し10の位が1になります。
16進は同様に各桁が0~15まで進める進法です。
各桁には1文字しか書けませんので10以上はアルファベッドで以下のように表記します。
9→A→B→C→D→E→F
(大文字でも小文字でも構いません)
Fまで来ると桁上がりし10になります。
この時10進法の10と区別するため先頭に0xを付けて0x10と表現します。

⑥if (式)
○○
} else if (式) {
○○
} else {
○○
}

以前、ご説明したif文は下記のようにif文の式が一つで真と偽の判定を行っていました。

if (式)
○○
} else {
○○
}

今回は複数の式が判定できる文をご説明します。
最初のif文は今までと同じです。
判定を追加する場合は} else if (式) {のように記述します

サンプルでは最初のif文でキー入力が0~9であることを判定しています。
偽の場合、次のif文で空白、改行、タブのどれかであることを判定しています。
その文でも偽になると最終的にnotherをインクリメントしています。

⑦ for (int i = 0; i < ARRAY_SIZE; i++) {
printf(“%d: %d個\n", i, ndigit[i]);
}
配列の中身を順に取り出し表示しています

 

動作の確認

112233449とキーを押して、スペース、abc、スペース、Enterと押して最後にctrl+z、Enterで終了して下さい。
以下のようになれば正解です。
空白数の3はabcの前後のスペースとEnterキーの合計です。
その他の3はabcキーですね。

 

今回はここまで

 

※本プログラム教室はK&Rの「プログラミング言語C」をベースに進めています。