配列
同じ型の複数のデータをひとまとまりにして扱うデータ構造として、配列というものがあります。
配列には、型、配列名、要素数を与えます。配列の型によって、保存するデータの種類が決まり、配列の要素数によって、その配列に保存できるデータの数が決まります。
配列の実体を作成すると、指定した型に応じた要素数分のメモリ領域が確保され、各領域には、ゼロから(要素数-1)まで順番に番号が割り振られます。配列名と割り振られた番号を使ってデータをメモリ領域に書き込んだり、読み出したりします。
配列は、要素番号を増減することで各データにアクセスできるので、繰り返し処理を使って配列内のデータの読み書きを容易に行うことができます。特に、C#では、繰り返し処理のforeach文を使うと、配列内のすべてのデータへの読み書きが簡単にできます。
foreach文については、繰り返し文の記事にまとめています。
配列の書き方
配列は、型と配列名、要素数で宣言します。
この宣言により、型と要素数に応じたメモリ領域が自動的に確保されます。
「new」は、new演算子と呼ばれるもので、実体を生成するときに使います。
例のようにchar型で配列名aを要素数4で宣言すると4バイト分の領域が確保され、a[0]、a[1]、a[2]、a[3]をchar型の変数として扱うことができます。
配列の宣言と同時に初期値を入れたい場合は、中括弧「{ }」内に要素数分の初期値をカンマ区切りで記述します。初期化方法は、その他に、配列領域のみ確保して、以降のプログラムで、初期値を代入する方法もあります。
ここでみてきた配列は、要素が一列に並んだ配列になります。このような配列を一次元配列といいます。配列は、複数行に拡張することができます。拡張した配列を多次元配列といいます。
次に、配列を二行に拡張した二次元配列の書き方についてみていきます。
二次元配列の書き方
二次元配列は、各行の要素数をカンマで区切って記述します。
例では、2行3列の要素を持つbyte型の配列aを宣言しています。
初期化をする場合としない場合で、上段の形か下段の形かに分かれます。
初期値は、行ごとに中括弧「{ }」をカンマ区切りで記述します。
この例の場合、配列a の要素(0,0)に「0」、要素(0,1)に「1」、要素(0,2)に「2」、要素(1,0)に「3」、要素(1,1)に「4」、要素(1,2)に「5」が初期値として与えられます。
同じような考え方で、配列の「[ , ]」のカンマを増やしていくことで、三次元、四次元と配列の次元を拡張できます。
一次元配列の使用例
一元配列のプログラム例を記載します。
初期化方法が異なりますが、どちらも同じ結果となります。
using System;
namespace ArrayTest
{
class ArrayTest
{
static void Main(string[] args)
{
char[] a = new char[4];
a[0] = 'a';
a[1] = 'b';
a[2] = 'c';
a[3] = 'd';
foreach (char c in a)
{
Console.WriteLine(c);
}
Console.WriteLine("end\n");
}
}
}
using System;
namespace ArrayTest
{
class ArrayTest
{
static void Main(string[] args)
{
char[] a = new char[4] {'a','b','c','d'};
foreach (char c in a)
{
Console.WriteLine(c);
}
Console.WriteLine("end\n");
}
}
}
c:\prog\cs>cs_array
a
b
c
d
end
二次元配列の使用例
二次元配列のプログラム例を記述します。
using System;
namespace ArrayTest
{
class ArrayTest
{
static void Main(string[] args)
{
byte[,] a = new byte[10,11] {
{ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0xFF}, //1行目
{ 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0xFF}, //2行目
{ 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0xFF}, //3行目
{ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0xFF}, //4行目
{ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0xFF}, //5行目
{ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0xFF}, //6行目
{ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0xFF}, //7行目
{ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0xFF}, //8行目
{ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0xFF}, //9行目
{ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0xFF} //10行目
};
foreach (byte b in a)
{
if( b == 0xFF)
{
Console.WriteLine();
}
else if( b == 0)
{
Console.Write("■");
}
else
{
Console.Write("□");
}
}
Console.WriteLine("end\n");
}
}
}
c:\prog\cs>cs_array
■■■■□■■■■■
■■■□□■■■■■
■■□■□■■■■■
■■■■□■■■■■
■■■■□■■■■■
■■■■□■■■■■
■■■■□■■■■■
■■■■□■■■■■
■■■■□■■■■■
■■■■□■■■■■
end
構造体
配列は、同一型のデータの集まりを扱うデータ型でしたが、異なる型のデータの集まりを作りたい場合、構造体という型を使います。
構造体は、char型やbyte型など、はじめから決められたデータサイズを扱う型とは異なり、プログラム設計者によって作られる独自の構成となります。
ですので、構造体は、同一の型も含め、異なる型、配列など、作りたいデータの集まりを自由に組み合わせることができます。
構造体の書き方
構造体は、下の図のように記述します。
定義した構造体の実体の宣言は、
構造体タグ名 構造体名;
のように記述し、構造体の各メンバーへのアクセスは、
構造体名.メンバー名;
というように、構造体名とメンバー名をドット演算子(ピリオド)でつなぎます。
具体的にサンプルプログラムでみていきたいと思います。
構造体の使用例
この例では、int型の変数x,y,zをもつ構造体position型を作成しています。
「 position pst; 」でposition型の実体であるpstを作成して、
「 pst.x = 1 」「 pst.y = 2 」「 pst.z = 3 」でposition型の各メンバーx,y,zにアクセスしています。
using System;
namespace StructTest
{
class StructTest
{
public struct position
{
public int x;
public int y;
public int z;
}
static void Main(string[] args)
{
position pst;
pst.x = 1;
pst.y = 2;
pst.z = 3;
Console.WriteLine("X:{0} Y:{1} Z:{2}",pst.x,pst.y,pst.z);
Console.WriteLine("end\n");
}
}
}
c:\prog\cs>cs_struct
X:1 Y:2 Z:3
end
コメント