・アレンジ演習:p.140 array03.cs」の続きから
p.140 array03.cs 補足【再掲載+α】
・023行目などで用いている「Char.IsNumber(文字列s, 位置n)」は、文字列sの先頭を0文字目とした時のn文字目が、 数字かどうかを返すメソッド ・よって、位置nが0であれば、文字列の先頭文字が数字であればtrue、でなければfalseを返す ・これで事前にチェックすることで、int.Parseメソッドなどで数値化できる文字列かどうかがわかるので、 異常終了を防ぐことができる ・このプログラムでは、事前に1桁であることもチェックしているので、先頭文字のチェックだけで、 int.Parseメソッドで数値化できるかを判断できる
アレンジ演習:p.140 array03.cs【再掲載+α】
・if文の中で「Char.IsNumber(strClass, 0) != true」などとしているが、!Char.IsNumber(strClass, 0)」と シンプルにできることを確認しよう ・単項!演算子については、p.89参照
作成例
//アレンジ演習:p.140 array03.cs
using System;
class array03
{
public static void Main()
{
string[,] Name = new string[2, 5] {
{"田中六郎", "吉田一郎", "太田太郎", "粂井康孝", "岡田三郎"},
{"横田芳子", "池田和子", "目黒貴和子", "武田信子", "園田淳子"}
};
int MyClass, No;
string strClass, strNo;
while (true) {
Console.Write("クラスは---");
strClass = Console.ReadLine();
if (strClass.Length >= 2) {
Console.WriteLine("入力は1桁のみです");
continue;
}
if (!Char.IsNumber(strClass, 0)) { //【変更】
Console.WriteLine("数字を入力してください");
continue;
}
MyClass = Int32.Parse(strClass);
if (MyClass <= 0 || MyClass >= 3) {
Console.WriteLine("クラスは1組か2組です");
continue;
}
break;
}
while (true) {
Console.Write("出席番号は---");
strNo = Console.ReadLine();
if (strNo.Length >= 2) {
Console.WriteLine("入力は1桁のみです");
continue;
}
if (!Char.IsNumber(strNo, 0)) { //【変更】
Console.WriteLine("数字を入力してください");
continue;
}
No = Int32.Parse(strNo);
if (No <= 0 || No >= 6) {
Console.WriteLine("出席番号は1番から5番までです");
continue;
}
break;
}
Console.WriteLine("{0}クラスの出席番号{1}番は{2}さんです",
strClass, strNo, Name[MyClass - 1, No - 1]);
}
}
アレンジ演習:p.140 array03.cs つづき
・全体に冗長で問題点もあるので、下記を改良しよう ①クラス数(2)と学生数(5)を定数にして、配列の初期化や入力チェックに用いるようにしよう ②何も入力せずにEnterを押すと異常終了するので「入力長が2以上」を「入力長が1ではない」にする ③このチェックとIsNumberによるチェックはまとめて実行できる(短絡評価(p.90)にすれば良い) そしてエラー時は「入力は数字1桁のみです」と表示すれば良い
作成例
//アレンジ演習:p.140 array03.cs
using System;
class array03
{
public static void Main()
{
const int CLASS = 2, STUDENT = 5; //【追加】クラス数、生徒数
string[,] Name = new string[CLASS, STUDENT] { //【変更】
{"田中六郎", "吉田一郎", "太田太郎", "粂井康孝", "岡田三郎"},
{"横田芳子", "池田和子", "目黒貴和子", "武田信子", "園田淳子"}
};
int MyClass, No;
string strClass, strNo;
while (true) {
Console.Write("クラスは---");
strClass = Console.ReadLine();
if (strClass.Length != 1 || !Char.IsNumber(strClass, 0)) { //【変更】
Console.WriteLine("入力は数字1桁のみです");//【変更】
continue;
}
MyClass = int.Parse(strClass);
if (MyClass < 1 || MyClass > CLASS) { //【変更】
Console.WriteLine("クラスは1組から{0}組です", CLASS); //【変更】
continue;
}
break;
}
while (true) {
Console.Write("出席番号は---");
strNo = Console.ReadLine();
if (strNo.Length != 1 || !Char.IsNumber(strNo, 0)) { //【変更】
Console.WriteLine("入力は数字1桁のみです");//【変更】
continue;
}
No = int.Parse(strNo);
if (No < 1 || No > STUDENT) { //【変更】
Console.WriteLine("出席番号は1番から{0}番までです", STUDENT); //【変更】
continue;
}
break;
}
Console.WriteLine("{0}クラスの出席番号{1}番は{2}さんです",
strClass, strNo, Name[MyClass - 1, No - 1]);
}
}
p.142 3次元以上の配列
・C#の多次元配列には次元数の上限はない
・しかし、次元数が増えると要素数が増大するのでメモリの消費量に注意が必要
・3次元配列の宣言と生成の書式: データ型[,,] 配列名 = new データ型[要素数①,要素数②,要素数③];
・3次元配列の初期化の例(2階建ての横3縦4の迷宮)
int[,,] map = { { {1,2,3,4}, {5,6,7,8}, {9,10,11,12} }, { {1,2,3,4}, {5,6,7,8}, {9,10,11,12} } };
・3次元配列の全要素を扱う場合、forの3重ループにして、添字①、②、③の順に扱うと良い
書式例:
for (int i = 0; i < 要素数①; i++) {
for (int j = 0; j < 要素数②; j++) {
for (int k = 0; k < 要素数③; k++) {
配列名[i, j, k]を操作
}
}
}
p.143(多次元配列の次元数と要素数)
・多次元配列の次元数は、配列名.Rank で得られる ・多次元配列の全要素数は、配列名.Length で得られる ・なお、要素数は各次元の要素数の積になるが、各次元の要素数を得る方法はない 例: 2階建ての横3縦4の迷宮を表すmap[2,3,4]の要素数は2×3×4=24
アレンジ演習:p.143 array04.cs
・次元ごとの要素数を定数で与えるようにして、繰返しの回数としても用いよう
作成例
//アレンジ演習:p.143 array04.cs
using System;
class array04
{
public static void Main()
{
const int X = 2, Y = 2, Z = 3; //【追記】
int[,,] ar = new int[X, Y, Z] {
{ {0, 1, 2}, //順に[0,0,0][0,0,1][0,0,2]
{3, 4, 5} }, //順に[0,1,0][0,1,1][0,1,2]
{ {6, 7, 8}, //順に[1,0,0][1,0,1][1,0,2]
{9,10,11} } //順に[1,1,0][1,1,1][1,1,2]
};
Console.WriteLine("配列の次元 = {0}", ar.Rank); //次元数を表示
Console.WriteLine("arの個数 = {0}", ar.Length); //要素数を表示
for (int i = 0; i < X; i++) { //1番目の添字
for (int j = 0; j < Y; j++) { //2番目の添字
for (int k = 0; k < Z; k++) { //3番目の添字
Console.Write("{0}, ", ar[i, j, k]); //順に表示
}
}
}
Console.WriteLine(); //改行
}
}
アレンジ演習:p.144 jagged01.cs
・各要素数を定数で与えるようにして、繰返しの回数としても用いよう
作成例
//アレンジ演習:p.144 jagged01.cs
using System;
class jagged01
{
public static void Main()
{
const int X = 2, Y = 3; //【追加】ジャグ配列を構成する配列数,要素配列の要素数
int[][] ar; //ジャグ配列の宣言
ar = new int[X][]; //【変更】ジャグ配列(の外側)を生成
ar[0] = new int[Y]; //【変更】ジャグ配列[0]になる配列を生成
ar[1] = new int[Y]; //【変更】ジャグ配列[1]になる配列を生成
for (int i = 0; i < X; i++) { //【変更】ジャグ配列を構成する全配列について繰返す
for (int j = 0; j < Y; j++) { //【変更】要素配列の全要素について繰返す
ar[i][j] = (i + 1) * (j + 1); //(添字+1)の積によって要素値を決める
}
}
for (int i = 0; i < X; i++) { //【変更】ジャグ配列を構成する全配列について繰返す
for (int j = 0; j < Y; j++) { //【変更】要素配列の全要素について繰返す
Console.WriteLine("ar[{0}][{1}] = {2}", i, j, ar[i][j]); //表示
}
}
}
}
アレンジ演習:p.146 jagged02.cs
・要素配列数を定数で与えるようにして、繰返しの回数としても用いよう ・要素配列の初期化で要素数を記述しないようにしよう ・2つのfor文を2重ループにしよう
作成例
//アレンジ演習:p.146 jagged02.cs
using System;
class jagged02
{
public static void Main()
{
const int X = 2; //【追加】ジャグ配列を構成する配列数
string[][] name = new string[X][]; //【変更】
name[0] = new string[2]{"田中", "工藤"};
name[1] = new string[3]{"吉田", "佐藤", "池田"};
for (int i = 0; i < X; i++) { //【変更】
for (int j = 0; j < name[i].Length; j++) { //【変更】
Console.WriteLine(name[i][j]); //【変更】
}
}
}
}