配列を使ってみる[二次元配列も](文法)(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:
}
では、検証しマイコンボードへ書き込みます。
同じ動きをするスケッチを配列を使用しないで
書いてみます。
// 変数宣言
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:
}
では、検証しマイコンボードへ書き込みます。
先ほどの、配列を使用したものと比べると、
変数名を変えた同じ動作のスケッチを
何度も記述することになっています。
ここまでの配列は、一次元配列と呼ばれているもので、
列だけが存在します。
これに対し、二次元配列と呼ばれるものもあり、
これは、行と列から構成されます。
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:
}
では、検証しマイコンボードへ書き込みます。
配列は、同じ動作で変数だけが変わるようなスケッチで
便利に利用できそうです。