◆◆◆◆アマゾンで購入する◆◆◆

8.配列の考え方 
           内    容
(1)配列の考え方
(2)配列の宣言
(3)文字型の一次元配列=文字列
(4)配列を使ったプログラム例
(5)スタック領域と静的領域
(6)演習


(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.色々な便利な方法