・p.117「要素を入れずに配列を作成する」から
p.117 要素を入れずに配列を作成する
・配列の要素を要素数を指定して確保(生成)しておき、後で要素値を代入することも多い ・配列の宣言の書式: 型[] 配列名; ・配列の生成の書式: 配列名 = new 型[要素数]; //要素数の分の領域を確保(生成)する ・宣言と生成は同時に行ってよい: 型[] 配列名 = new 型[要素数]; ←p.117の書式 例: string[] slimes = new string[3]; //要素数3の文字列型配列slimesの生成 ・生成により中身の入っていない要素になるので、その要素への代入は可能だが、利用するとNull(無)が返されるので注意
アレンジ演習:p.117 Chap3_6_3.cs
・中身の入っていない要素である dirs[2]をDebug.Logするとどうなるか確認しよう ⇒ nullになる ・また、添字には変数や式が利用できるので、int w = 2; としておいて dirs[w]をDebug.Logするとどうなるか確認しよう ⇒ nullになる
作成例
//アレンジ演習:p.117 Chap3_6_3.cs
using UnityEngine;
public class chap3_6_3 : MonoBehaviour {
void Start() {
string[] dirs = new string[4];
dirs[0] = "東";
dirs[1] = "西";
Debug.Log(dirs[0]);
Debug.Log(dirs[1]);
//【以下追加】
Debug.Log(dirs[2]); //null
int w = 2;
Debug.Log(dirs[w]); //null
}
}
提出フォロー:アレンジ演習:p.116 chap3_6_2
・書き換えたい要素の添字と、書き換える文字列をパブリック変数で与えるようにしよう ・ついでに、string.Joinの区切り文字もパブリック変数で与えるようにしよう
作成例
//アレンジ演習:p.116 chap3_6_2
using UnityEditor.Callbacks;
using UnityEngine;
public class chap3_6_2 : MonoBehaviour{
public int n; //【追加】
public string s; //【追加】
public string kugiri; //【追加】
void Start() {
string[] dirs = {"東","西","南","北"};
dirs[n] = s; //【変更】
Debug.Log(string.Join(kugiri, dirs)); //【変更】
}
}
p.118 foreach文
・第4の繰り返し構文で、配列などの複数の要素を持つデータ構造に対して「全要素について繰返す」場合に便利
・書式: foreach (型 作業変数 in 配列名など) { 作業変数を用いる処理 }
・この書式により、配列などの要素が先頭から1個ずつ作業変数に渡されて(コピーされて)繰り返し内容が
実行される
・よって、配列をforeach文で扱うと、添字を意識する必要がなくなる
※ なお、作業変数はforeachのブロック内でのみ有効なので、ブロックを抜けた後では利用できないが、
複数のforeachのブロックで同名の作業変数を用いても問題ない
※ ただし、作業変数を用いる処理で作業変数の値を変更することはできないので、配列の要素値を設定・変更する
処理はできない
※ なお、作業変数の方は配列の型と一致するのが基本なので「var」キーワードを用いて省略しても良い
(varは型を自動決定してくれる匿名型)
※チームルールによってはforeachではvar型と決めている場合がある
アレンジ演習:p.118 chap3_7_1
・作業変数dをforeachのブロックの外で用いると文法エラーになることを確認しよう(確認後コメントアウト) ・作業変数dにforeachのブロックの中で値を代入すると用いると文法エラーになることを確認しよう (確認後コメントアウト) ・作業変数dをvar型にしてみよう
作成例
//アレンジ演習:p.118 chap3_7_1
using UnityEditor.Callbacks;
using UnityEngine;
public class chap3_7_1 : MonoBehaviour{
void Start() {
string[] dirs = {"東","西","南","北"};
foreach (var d in dirs) { //【変更】var型で良い
// d = "南東"; //【追加・削除】代入できない
Debug.Log(d + "方向");
}
//Debug.Log(d + "方向"); //【追加・削除】ブロック外では無効
}
}
p.119 for文を使ってインデックスを指定する
・foreach文を用いる場合に比べて冗長になるが、foreach文の制限に該当する場合は、for文で同じ処理を記述できる
・書式例:
for(int 繰返し用の変数 = 0; 繰返し用の変数 < 要素数; 繰返し用の変数++) {…}
アレンジ演習:p.119 chap3_7_2
・繰返し用の変数cntをforのブロックの前で宣言しておけば、ブロック外で用いることができることを確認しよ ・forのブロックの中で配列の要素に値を代入できることを確認しよう
作成例
//アレンジ演習:p.119 chap3_7_2
using UnityEditor.Callbacks;
using UnityEngine;
public class chap3_7_2 : MonoBehaviour{
void Start() {
string[] dirs = {"東","西","南","北"};
int cnt; //【追加】
for (cnt = 0; cnt < 4; cnt++) { //【変更】
dirs[cnt] = "南東"; //【追加】代入できる
Debug.Log(dirs[cnt] + "方向");
}
Debug.Log("添字は" + cnt); //【追加】ブロック外で有効(4になるので注意)
}
}
補足:配列の要素数
・配列の要素数は「配列名.Length」で得られるので、要素数が必要な場合に、これを用いておけば、
要素数を変更した場合に、自動的に追従してくれるので、保守性が向上する
※チームルールによっては「配列名.Length」の利用を義務と決めている場合がある
・なお「.Length」はクラスや構造体におけるプロパティと呼ばれる仕掛けの一つで、C#は配列を内部的にオブジェクトとして扱うので、
C#が提供するプロパティがいつでも利用可能
・書式例:
for(int 繰返し用の変数 = 0; 繰返し用の変数 < 配列名.Length; 繰返し用の変数++) {…}
アレンジ演習:p.119 chap3_7_2 つづき
・配列の要素数で「配列名.Length」を用いるように変更しよう ・すると、配列dirsに要素"北東"を加えても、処理の変更が不要なことを確認しよう
作成例
//アレンジ演習:p.119 chap3_7_2
using UnityEditor.Callbacks;
using UnityEngine;
public class chap3_7_2 : MonoBehaviour{
void Start() {
string[] dirs = {"東","西","南","北","北東"}; //【変更】
int cnt;
for (cnt = 0; cnt < dirs.Length; cnt++) { //【変更】
//dirs[cnt] = "南東";
Debug.Log(dirs[cnt] + "方向");
}
Debug.Log("添字は" + cnt); //ブロック外で有効(自動的に5になる)
}
}
p.120 単純に全ての組み合わせを並べる = 2重ループ
・foreach文による繰り返しの中でもさらに繰り返しが可能 ・ただし、作業変数名は外側と内側で異なるものにすること ・内側のforeach文では、外側の作業変数が利用可能 ・なお、3重以上の多重ループも可能
アレンジ演習:p.120 chap3_8_1
・作業変数の型を両方ともvarに変更しよう
作成例
//アレンジ演習:p.120 chap3_8_1
using UnityEngine;
public class chap3_8_1 : MonoBehaviour{
void Start() {
string[] team = {"A","B","C","D" };
foreach(var t1 in team){ //【変更】
foreach(var t2 in team){ //【変更】
Debug.Log(t1 + "vs" + t2);
}
}
}
}
p.122 単純に全ての組み合わせを並べる = つづき
・foreach文による2重ループの中で、2つの作業変数を比較する処理を記述できる
アレンジ演習:p.122 chap3_8_2
・何パターンあるか最後に表示しよう
作成例
//アレンジ演習:p.122 chap3_8_2
using UnityEngine;
public class chap3_8_2 : MonoBehaviour{
void Start() {
string[] team = {"A","B","C","D" };
int num = 0; //【追加】パターン数
foreach(var t1 in team){
foreach(var t2 in team){
if (t1 != t2){
Debug.Log(t1 + "vs" + t2);
num++; //【追加】
}
}
}
Debug.Log(num + "パターンある"); //【追加】
}
}
p.123 同じ繰り返しを省くには
・foreachによる繰り返しとforによる繰り返しを組み合わせることで、細かい制御が可能になる
アレンジ演習:p.123 chap3_8_3
・外側のforeach文もfor文にすることで、記述をよりシンプルにしよう
作成例①
//アレンジ演習:p.122 chap3_8_3
using UnityEngine;
public class chap3_8_3 : MonoBehaviour{
void Start() {
string[] team = {"A","B","C","D" };
for(int i = 0; i < 4; i++){
for(int j = 0; j < i; j++){ //内側の繰返しを外側のカウンタで制限する
Debug.Log(team[i] + "vs" + team[j]);
}
}
}
}
作成例②
//アレンジ演習:p.122 chap3_8_3
using UnityEngine;
public class chap3_8_3 : MonoBehaviour{
void Start() {
string[] team = {"A","B","C","D" };
for(int i = 0; i < 4; i++){
for(int j = i + 1; j < 4; j++){ //内側の繰返しの開始を外側のカウンタの次からにする
Debug.Log(team[i] + "vs" + team[j]);
}
}
}
}