p.147 暗黙の型指定がなされた配列
・配列を初期化によって生成する場合、型を省略してvar型にできる
・書式: var 配列名 = new [] {値, …};
・こうすると、配列の型は指定されたすべての値を格納できる型に決まる
・例: var s = new []{"ABC", "DE"}; //string型になる
・例: var d = new []{1, 1.2f, 3.14}; //double型になる
・指定されたすべての値を格納できる型がない場合や、null指定の場合はエラーになる
・例: var e = new []{"1", 1.2f}; //エラー
p.147(int型を返すmainメソッド)
・mainメソッドは通常戻り値型はvoidだが、終了状態を示す整数値を返す「int main(){…}」とすることもできる
・こうした場合、正常終了であれば「return 0;」を、でなければ「return 負の数;」を記述できる
※ p.147 var03.csの場合「return 0;」しかしていないので、int型を返すmainメソッドにする必要性はない
p.147(配列とGetType)
・配列名.GetTypeは、文字列「.NET型名[]」を返す。例:"System.Int32[]" ・2次元配列名.GetTypeは、文字列「.NET型名[,]」を返す。例:"System.String[,]" ・2次元ジャグ配列名.GetTypeは、文字列「.NET型名[][]」を返す。例:"System.Double[][]"
アレンジ演習: p.147 var03.cs
・2次元配列もvar型にできることを確認しよう。また、GetTypeでの表示を確認しよう。 ・ジャグ配列もvar型にできることを確認しよう。また、GetTypeでの表示を確認しよう。
作成例
//アレンジ演習:p.147 var03.cs
using System;
class var03
{
public static void Main()
{
var name = new []{"太郎", "次郎", "三郎", "四郎"};
for (var i = 0; i < name.Length; i++) {
Console.WriteLine(name[i]);
}
Console.WriteLine("nameの型は{0}", name.GetType()); //System.String[]
var f = new[] { 0.5, 0.9, 1.5, 2.3 };
for (var i = 0; i < f.Length; i++) {
Console.WriteLine(f[i]);
}
Console.WriteLine("fの型は{0}", f.GetType()); //System.Double[]
//【以下追加】
var names = new [,]{{"太郎", "次郎" }, {"三郎", "四郎" } }; //2次元配列
Console.WriteLine("namesの型は{0}", names.GetType()); //System.String[,]
var namej = new []{new[]{"太郎", "次郎" }, new[]{"三郎"} }; //ジャグ配列
Console.WriteLine("namejの型は{0}", namej.GetType()); //System.String[][]
}
}
p.148 1次元配列のソート
・C#が提供するArrayクラスのSortメソッドに引数として配列名を渡すと、全要素を昇順(小⇒大)に整列してくれる ・また、このクラスのReverseメソッドに引数として配列名を渡すと、全要素を逆順にしてくれる ・よって、全要素を降順(大⇒小)に整列するには、Sortメソッド、Reverseメソッドの順に用いると良い
アレンジ演習:p.148 sort01.cs
・nameをvar型にしても動作することを確認しよう ・2次元配列やジャグ配列を渡すとどうなるか確認しよう
作成例
//アレンジ演習:p.148 sort01.cs
using System;
class sort01
{
public static void Main()
{
var name = new []{"Eric", "Peter", "Frank", "Kate", "Thomas"}; //【変更】
for (int i = 0; i < name.Length; i++) {
Console.WriteLine(name[i]);
}
Console.WriteLine();
Array.Sort(name); //昇順にソートする
for (int i = 0; i < name.Length; i++) {
Console.WriteLine(name[i]);
}
Console.WriteLine();
Array.Reverse(name); //逆順にする(降順にソートしたことになる)
for (int i = 0; i < name.Length; i++) {
Console.WriteLine(name[i]);
}
//【以下追加】
var names = new [,]{{200, 300 }, {100, 500 } }; //2次元配列
//Array.Sort(names); //昇順にソートする ⇒ 実行時エラー
var namej = new []{new[]{"太郎", "次郎" }, new[]{"三郎"} }; //ジャグ配列
//Array.Sort(namej); //昇順にソートする ⇒ 実行時エラー
}
}
アレンジ演習:p.150 foreach01.cs
・配列と作業変数を全てvar型にできることを確認しよう ・2次元配列を渡すとどうなるか確認しよう ⇒1次元配列と同様に全要素が順に用いられる ・ジャグ配列を渡すとどうなるか確認しよう ⇒foreachを2重ループにすることで、要素配列から全要素が順に用いられる
作成例
//アレンジ演習:p.150 foreach01.cs
using System;
class foreach01
{
public static void Main()
{
var Animal = new string[]{"犬", "猫", "雉", "猿"}; //string[]型になる
var Num = new int[]{10, 20, 30, 40}; //int[]型になる
foreach (var str in Animal) { //string型になる
Console.WriteLine(str);
}
Console.WriteLine();
foreach (var i in Num) { //int型になる
Console.WriteLine(i);
//i = 0; //文法エラーになる
}
//【以下追加】
Console.WriteLine();
var names = new [,]{{200, 300 }, {100, 500 } }; //2次元配列
foreach (var i in names) { //int型になる
Console.WriteLine(i);
}
Console.WriteLine();
var namej = new []{new[]{"太郎", "次郎" }, new[]{"三郎"} }; //ジャグ配列
foreach (var i in namej) { //String[]型になる
//Console.WriteLine(i); //System.String[]になってしまう
foreach (var j in i) { //string型になる
Console.WriteLine(j); //値が表示される
}
}
}
}
p.152 練習問題 ex0601.cs ヒント
① intまたはvar型の変数として、受験者数、合計点を0で初期化 ② コンソールから受験者数を入力し整数化 ※0以下が入力されたらやりなおし ③ 受験者数を要素数とする点数の配列を生成 ④ 受験者数の分、下記を繰返す ・コンソールから点数を入力し整数化してて点数[添字]に代入 ・点数を合計点に足しこむ ⑤ 合計点を実数化してから受験者数で割って平均点を得て表示 ⑥ 点数の配列をソートし、逆順にする ⑦ 点数の配列の全要素を表示
作成例
//p.152 練習問題 ex0601.cs
using System;
class ex0601
{
public static void Main()
{
var num = 0; //受験者数
var sum = 0; //合計点
do {
Console.Write("受験者数:"); num = int.Parse(Console.ReadLine());
} while (num <= 0); //正の数が入力されるまで繰返す
var point = new int[num]; //受験者数分の配列を生成
for (int i = 0; i < num; i++) { //受験者数分だけ繰返す
Console.Write("{0}番の点数:", i + 1); point[i] = int.Parse(Console.ReadLine());
sum += point[i]; //合計に足し込む
}
Console.WriteLine("平均点={0}", (double)sum / num); //合計を実数化して受験者数で割る
Array.Sort(point); //昇順にソート
Array.Reverse(point); //逆順にすると降順になる
Console.WriteLine("*** 点数(降順)***");
foreach (var i in point) { //全点数について繰返す
Console.WriteLine(i);
}
}
}