(1)配列の考え方
ビールケースみたいな入れ物を考えてみましょう。
20本のビール瓶に入った液状のものを
一括して運ぶことができます。
ただし,各仕切りには,ビール瓶を入れることができますが,
1升ビンは入れることができません。
すなわち,たとえて言うと,
ビールケース = 配列
ビールケースにはビール瓶だけを入れる
= 配列の要素には,同じ型の要素を入れる。
すなわち,配列とは「同じ型のデータの集まり」だと
いえます。
各仕切りを識別するためには,番号を付けます。
すなわち,番号を付けて
各仕切りの位置を指定するわけです。
この番号を添え字といいます。
番号の付けかたには,
以下の左のように,各仕切りに一連番号を付ける方法,
右のように縦方向と横方向の番号を付ける方法があります。
左のような配列を1次元配列,
右のような配列を2次元配列と呼びます。
2次元以上の配列を多次元配列として総称します。
(2)配列の宣言
配列宣言は,
型名 配列変数名[配列の大きさ];
のように宣言します。たとえば,整数10個の配列は,
int A[10];
として宣言します。
添え字は 0 から始まりますので, 配列要素は,
A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7]
A[8] A[9]
として指定します。
たとえば,5番目の要素に値20を入れるには,
A[4] = 20;
とします。 先頭が 0 ですので,
5番目は添え字 = 4 であることに 注意しましょう。
2次元配列では,次のように縦,横の大きさを指定します。
char A[4][5];
このように記述するのはCの特徴です。
物理的な順序では,後の方の添え字が早く回ると考えましょう。
すなわち,コンパイラが生成したAの領域の先頭番地が
1000番地だと すると,次のように配置されます。
すなわち, A[Isice][Jsize]のときA[I][J]は,
I * Jsize + J 番目
の要素となります。
(3)文字型の一次元配列=文字列
文字型の1次元配列を文字列(String)と呼びます。
最大20文字のストリング領域を確保するには,
char s[21];
と宣言します。
(注)最後に Nul コード(0x00)が入りますので,
文字数 + 1 の領域を確保する必要があります。
[追加]
C++ではこの点が拡張されています。
文字列の宣言は,
String^ S;
と宣言することができます。
なお「String」の後のハット(^)を忘れがちなので
気をつけましょう。 |
配列宣言は,
型名 配列変数名[配列の大きさ];
のように宣言します。たとえば,整数10個の配列は,
(4)配列を使ったプログラム例
配列に最初データを設定しておき,
そのデータを加算するプログラム例を示します。
このように,最初,配列にデータを読み込んでおき,
そのデータを加工したり,計算するのが
通常のプログラムです。
|
[例] |
|
#include "stdafx.h"
int main(int argc, char* argv[])
{ int A[10],i,total; i=0;
/* 最初にデータを読み込んでおく */
while(i<10)
{ printf("i=%d :",i);
scanf("%d", &A[i]);
i=i+1;
}
total=0; i=0;
/* 配列のデータを加算 */
while(i<10)
{
total=total+A[i];
printf("A = %d ( %d ) \n",A[i],
total);
i=i+1;
}
}
|
(5)スタック領域と静的な領域
これまでは,main関数内で変数宣言していました。
この場合,main関数が起動されてから,
それぞれの変数領域はスタックに割り当てられます。
関数内で変数宣言した領域もスタックに割り当てられます。
すなわち,関数が実行されるときだけ存在する領域と
なり,関数の処理が終わるとなくなってしまいます。
これに対して,
●固定的なテーブルデータ
●前回の状態を保持するためのデータ
の場合は,関数の処理が終わっても
領域として存在していなければなりません。
このようなデータを格納する変数を,
「静的変数」と呼びます。
静的変数を宣言するには,以下のように書きます。
static int dt1; (初期値設定がない場合)
static int dt2=10; (初期値設定がある場合)
配列の場合
static int dt3[5]={3, 10, 5, 7, 1};
文字列の場合,文字列表記のままで記述できます。
static char dt4[6]=“abcde”;
多次元の場合
static int dt5[2][5]={{1,2,3,4,5},{6,7,8,9,10}};
文字列多次元の場合,
static char ctab[3][7] ={“alpha”,
“beta”,”gamma”}
通常,静的変数は,main関数の前に書いて,
どの関数からも参照できるようにします。
|
[例] |
|
#include "stdafx.h"
#include "string.h"
static char qsttab[4][80]
={"おはよう","こんにちは","こんばんは",""};
static char anstab[4][80]
={"いい朝ですねー","どちらまで",
"おやすみなさーい","そんな挨拶知らないよ"};
int main(int argc, char* argv[])
{
int i;
while(strlen(gets(qsttab[3]))>0)
{
i=0;
while(strcmp(qsttab[i],qsttab[3])!=0)
i=i+1;
printf("%s\n",anstab[i]);
}
} |
新しい関数が出てきましたので,
その機能について以下に示します。
関数呼出 |
意味 |
gets(文字列) |
1行読み込んで文字列に格納する。 |
strlen(文字列) |
文字列の長さを求める。 |
strcmp(文字列1, 文字列2) |
|
文字列1と文字列2を比較。
文字列1が辞書式順序で
文字列より前のとき −1
文字列1が辞書式順序で
文字列より後のとき +1
同じとき0
|
なお,例題で示している探索法は,
「番人付き探索法」と呼ばれる探索方法です。
(6)演習
(6−1)10個の浮動小数点データを読み込んで,
平均値を計算して表示するプログラムを作りなさい。
(6−2)20個の正の整数値を読み込んで,
最大値を求め,表示するプログラムを作りなさい。
[ヒント]
最初最大値を負にしておく。
ループしている途中で,それまでの最大値と,
その時点の添え字で示される配列要素と比較して,
それまでの最大値が小さければ,最大値を置き換える。
(6−3)「朝」と入力すると「おはよう」,
「昼」と入力すると「こんにちは」,
「夜」と入力すると「こんばんは」
と答えるプログラムを作成しなさい。
|
1.C言語の誕生
2.C言語の仲間たち
3.新しい言語をすばやく覚えるには
4.Cでプログラミング
5.データの入れ物 変数の考え方
6.注釈・定数
7.プログラムの実行順序
8.配列
9.C言語特有の代入文・制御構造
10.関数の話
11.構造体と共用体
12.ビット演算
13.プログラムの場所をポインタで
14.ファイルの入出力
15.色々な便利な方法
|