配列を使ってみる[二次元配列も](文法)(Arduino)

整数型変数をaという名前(変数名)で宣言すると、
 int a;
となります。この宣言は a という名前の整数格納用の入れ物を
1個準備することになります。

では、
 ind b[3];
と宣言すると、整数型変数を b という名前で3個の入れ物を
準備することになり、これを配列宣言といい、
この配列に付けた名前を配列名(参照変数)といいます。

この場合、用意される入れ物、配列の名前は、すべて b であり、
この各入れ物を区別するため、配列名に添え字 [ ] が付けられます。
この添え字は、1つめの入れ物から順番に、
 b[0]、 b[1]、 b[2] ・・・・
と 0 から付けられます。

一般変数と配列
一般変数と配列

配列宣言の方法は、
 配列の型 配列名〔要素数〕
で、整数型配列を x という名前で 3個用意する場合、
 int x[3];
と宣言します。

初期化については、
一般変数では、
 int a = 10;
などと記述します。
配列では、
 配列の型 配列名〔要素数〕 = { 初期化式 }
で、
 int x[3] = { 10, 20, 30 };
と記述します。
 int x[3] = { 10, 20 };
と記述した場合は、
 int x[3] = { 10, 20, 0 };
と記述したとことになります。
また、
 int x[] = { 10, 20, 30 };
のように、配列宣言時に要素数を省略した場合は、
初期化式の数分の要素数が用意される。
この場合、 int x[ 3 ] = { 10, 20, 30 };
と記述したことになります。
・初期化式が記述されていない場合は、 
 要素数[ ]内は省略できません。

配列への値の代入は、
配列宣言時に初期化式で代入する以外では、
 int x[3];
 x[0] = 10;
 x[1] = 20;
 x[2] = 30;
のように、配列名に添え字を指定して代入します。
同じ数値(例えば40)の代入であれば、
 for ( int i = 0; i < 3; i++ ){
  x[ i ] = 40;
 }
と書くことができます。

配列からの値の読み出しは、代入と同じく、
 int x[3] = { 10, 20, 30 };
 Serial.println( x[0] );
のように、配列名に添え字を指定して読み出します。
また、すべての入れるからの読み出しは、
 int x[3] = { 10, 20, 30 };
 for ( int i = 0; i < 3; i++ ){
  Serial.println( x[ i ] );
 }
と書くことがでます。

シリアルモニタに10個のデータを1秒毎に送信します。
スケッチです。

// 配列宣言と初期化
int data[] = {
   1,5,8,10,15,16,27,28,39,40
};
void setup() {
  // put your setup code here, to run once:
   Serial.begin( 9600 ); // シリアルポートを初期化(9600bps)
   // data配列をシリアルポートへ出力
   for ( int i = 0; i < 10; i++ ) {
     Serial.println( data[i] );  // 指定添え字のdataを出力
     delay( 1000 );              // 1000ms停止
   }
}
void loop() {
   // put your main code here, to run repeatedly:
}

では、検証しマイコンボードへ書き込みます。

実行結果1
実行結果1

同じ動きをするスケッチを配列を使用しないで
書いてみます。

// 変数宣言
int a = 1,  b = 5,  c = 8;
int d = 10, e = 15, f = 16;
int g = 27, h = 28, i = 39;
int j = 40;
void setup() {
   // put your setup code here, to run once:
   Serial.begin( 9600 ); // シリアルポートを初期化(9600bps)
   Serial.println( a );  // 変数aを出力
   delay( 1000 );        // 1000ms停止
   Serial.println( b );  // 変数bを出力
   delay( 1000 );        // 1000ms停止
   Serial.println( c );  // 変数cを出力
   delay( 1000 );        // 1000ms停止
   Serial.println( d );  // 変数dを出力
   delay( 1000 );        // 1000ms停止
   Serial.println( e );  // 変数eを出力
   delay( 1000 );        // 1000ms停止
   Serial.println( f );  // 変数fを出力
   delay( 1000 );        // 1000ms停止
   Serial.println( g );  // 変数gを出力
   delay( 1000 );        // 1000ms停止
   Serial.println( h );  // 変数hを出力
   delay( 1000 );        // 1000ms停止
   Serial.println( i );  // 変数iを出力
   delay( 1000 );        // 1000ms停止
   Serial.println( j );  // 変数jを出力
   delay( 1000 );        // 1000ms停止}
}
void loop() {
   // put your main code here, to run repeatedly:
}

では、検証しマイコンボードへ書き込みます。

実行結果2
実行結果2

先ほどの、配列を使用したものと比べると、
変数名を変えた同じ動作のスケッチを
何度も記述することになっています。

ここまでの配列は、一次元配列と呼ばれているもので、
列だけが存在します。
これに対し、二次元配列と呼ばれるものもあり、
これは、行と列から構成されます。
Microsoft Excelの表のような感じのものです。

配列宣言は、
 配列の型 配列名〔行の要素数〕〔列の要素数〕
で、整数型配列を x という名前で、3行2列の6個の入れ物を用意する場合、
 int x[3][2];
と宣言します。

配列では、
 配列の型 配列名〔行の要素数〕〔列の要素数〕 = { 初期化式 }
で、
 int x[3][2] = { {10, 20 }, { 30, 40 }, { 50, 60 } };
と記述します。
・初期化式内の各行の区切りかっこは、
 必ずしも必要としません。

二次元配列
二次元配列

では、
3行4列の二次元配列で構成された表の
それぞれの行列の計を求めてみます。

それぞれの行列の計を求め、指定配列位置へ格納してみます。
スケッチです。

// 配列宣言(3行4列)
int data[3][4] = {
   { 10, 20, 30, 0 },
   { 40, 50, 60, 0 },
   { 0, 0, 0, 0 }
};
void setup() {
   // put your setup code here, to run once:
   Serial.begin( 9600 ); // シリアルポートを初期化(9600bps)
   // 配列dataの行と列の合計を求める
   for( int i = 0; i < 2; i++ ){
     for( int j = 0; j < 3; j++ ){
       data[i][3] += data[i][j];   // 行計(各行4列目へ)
       data[2][j] += data[i][j];   // 列計(各列3行目へ)
       data[2][3] += data[i][j];   // 総計(2行4列目へ)
       Serial.print( data[i][j] ); // 値を出力
       Serial.print( "\t" );       // TAB出力で間隔開け
     }
     Serial.println( data[i][3] );   // 行計の出力と改行
  }
  // 列計の出力
  for( int j = 0; j < 4; j++ ){
       Serial.print( data[2][j] ); // 値を出力
       Serial.print( "\t" );       // TAB出力で間隔開け
  }
  Serial.println( );              // 改行の出力
}
void loop() {
   // put your main code here, to run repeatedly:
}

では、検証しマイコンボードへ書き込みます。

実行結果3
実行結果3

配列は、同じ動作で変数だけが変わるようなスケッチで
便利に利用できそうです。