講義メモ ・p.66「3.13 列挙型」から 提出フォロー:アレンジ演習:p.66 cast01.cs ・【注記】このプログラムは「Console.Write/WriteLine」がまったくないので実行しても何も表示されない ・bの値と、(byte)aの型を表示しよう ・型の大きさを超える値のキャストは可能かを確認しよう(例:(byte)5000) ・uint型とint型でのキャストは可能かを確認しよう ・ushort型とint型でのキャストは可能かを確認しよう ・実数リテラル3.9をint型にキャストするとどうなるか確認しよう ・整数3と4の平均値をdouble型へのキャストを用いることで小数点以下まで表示しよう 作成例+α //アレンジ演習:p.66 cast01.cs using System; class cast01 { public static void Main() { long a = 2; byte b; b = (byte)a; //aの値2をbyte型にキャスト(強制変換)してbyte型の変数に代入OK //【以下追加】 Console.Write("bの値は{0},", b); //2 Console.WriteLine("(byte)aの型は{0}", ((byte)a).GetType()); //System.Byte //var x = (byte)5000; //5000はbyte型の範囲を超えるので文法エラー int i = 5000; var x = (byte)i; //byte型の範囲を超える変数値ではエラーにならない Console.WriteLine("xの値は{0}", x); //136(不正な値になってしまうが異常終了はしない) //int c = (uint)3.14; //uint型へのキャスト結果の値はint型に代入できないのでエラー uint c = (int)3.14; //int型へのキャスト結果の値はuint型に代入できる Console.WriteLine("cの値は{0}", c); //3 int d = (ushort)3.14; //ushort型へのキャスト結果の値はint型に代入できる Console.WriteLine("dの値は{0}", d); //3 ushort e = (int)3.14; //int型へのキャスト結果の値はushort型に代入できる Console.WriteLine("eの値は{0}", e); //3 Console.WriteLine("実数リテラル3.9をint型にキャストすると{0}", (int)3.9); //3 Console.WriteLine("3と4の平均値は{0}", (double)(3 + 4) / 2); //3.5 //【以下追加】 Console.WriteLine("実数リテラル-3.9をint型にキャストすると{0}", (int)-3.9); //-3 Console.WriteLine("3と4の平均値は{0}", (3 + 4) / 2.0); //3.5(実数商になるので) } } p.66 3.13 列挙型 ・列挙型:整数値に名前を付けてグループ化し、型として扱えるようにしたもの ・例えば、じゃんけんのゲームで、0でグー、1でチョキ、2でパーを表すなら、  列挙型にすることで「次の手 = 0」を「次の手 = グー」と記述する方がわかりやすく、  誤って0/1/2以外が格納されてしまうことを防止できる。 ・なお、C#が提供するライブラリの中にも列挙型があり、例えば「どのキーか?」を表すKeys列挙体などがある。  https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.forms.keys ・列挙型の要素を列挙子という ・例えば、Keys列挙体の列挙子としては、Escape、Space、Aなどがある ・列挙型はenumキーワードをつけて定義する ・定義書式: enum 列挙型名 { 列挙子, … } ・列挙子には自動的に0から始まる番号が順に与えられるが、設定も可能 ・定義書式: enum 列挙型名 { 列挙子 = 整数値, … } アレンジ演習:p.68 enum01.cs ・列挙子をint型にキャストせずに表示するとどうなるか確認しよう ・列挙子の持つ整数をint型の変数する方法を考えて試そう 作成例 //アレンジ演習:p.68 enum01.cs using System; class enum01 { enum MyMonth //列挙型MyMonthの定義 { Jan = 1, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec //先頭の列挙子から1,2,3,4,…が与えられる }; public static void Main() { Console.WriteLine("Aprは{0}月", (int)MyMonth.Apr); //4月 Console.WriteLine("Mayは{0}月", (int)MyMonth.May); //5月 //【以下追加】 Console.WriteLine("Junは{0}月", MyMonth.Jun); //Jun int i = (int)MyMonth.Jul; //列挙子の持つ整数をint型の変数するにはintにキャスト Console.WriteLine("i = {0}", i); //7 } } ※ p.69 3.14 オブジェクト型とボックス化は割愛し、7章以降で必要部分をフォローします p.73 3.15 文字列型 ・文字列とは0文字以上の文字の並びであり、文字数は不確定 ・C#ではstring型(System.String型)で扱えるが、これはintなどの基本型とは扱いが異なる ・C#では文字列はオブジェクトとして扱い、このためのクラスを提供しており、それがSystem.String。 ・クラスの詳細は7章以降で説明するが、ここでは先行して、利用できる便利な「仕掛け」を知っておこう p.73 String01.csで用いている文字列に関する便利な「仕掛け」について  ① string型変数.Length:文字列の文字数を得る  ② string型変数[番号]:先頭文字の番号を0とした時の番号に当たる文字を得る  ③ string型変数1 = String.Copy(string型変数2):string型変数2の文字列を別の位置にコピーし、string型変数1で扱えるようにする  ※実質的に「string型変数1 = string型変数2」と同じだが、代入の場合、別の位置にコピーせずに同じ文字列を使いまわす可能性がある  ④ string型変数.IndexOf(文字):文字列に指定の文字があれば何文字目かを先頭を0として返す。なければ-1を返す。  ⑤ string型変数.IndexOf(文字列):文字列に指定の文字列が含まれていれば何文字目からかを先頭を0として返す。なければ-1を返す。 アレンジ演習:p.73 String01.cs ・コンソールに「文字列をどうぞ:」と表示し、コンソールから文字列を読み込み、何文字あるか表示しよう 作成例 //p.74 string01.cs using System; class string01 { public static void Main() { string str = "今日はよい天気です"; //文字列型変数1の初期化 string mystr; //文字列型変数2の宣言 char c; // Lengthプロパティで文字列の長さを調べる Console.WriteLine("strは長さ{0}です", str.Length); //9(2バイト文字も1文字) //文字型変数cに文字列strの5番目の文字を代入 c = str[4]; //先頭が0番で5番目なので[4] Console.WriteLine("文字列の5番目の文字は「{0}」です", c); //い //文字列strをmystrにコピー mystr = String.Copy(str); Console.WriteLine("mystr = {0}", mystr); //同一の文字列になる //文字列の検索 int n = str.IndexOf('は'); //3文字目なので2 Console.WriteLine("文字列に'は'が出てくるのは{0}番目の文字", n + 1); //3 n = str.IndexOf("よい"); //4文字目からなので3 Console.WriteLine("文字列に「よい」が出てくるのは{0}文字目から", n + 1); //4 //【以下追加】 Console.Write("文字列をどうぞ:"); string ans = Console.ReadLine(); Console.WriteLine("{0}文字です", ans.Length); } } p.78 練習問題1 ex0301.cpp 仕様 ・うるう年を考えないので、単純な積算で良い ・「1年は●秒」と表示しよう 作成例 //p.78 練習問題1 ex0301.cpp using System; class ex0301 { public static void Main() { Console.WriteLine("1年は{0:#,#}秒", 60 * 60 * 24 * 365); //1年は31,536,000秒 } } p.78 練習問題2 ex0302.cpp 仕様 ① 円の半径を格納するための変数をdouble型で宣言しておく ②「半径:」と改行無しで表示 ③ コンソールから入力し、double.parseメソッドで実数化して①に格納 ④「半径●の円の面積は■」と、①、Math.PI×①×①を表示 【追加課題】この円の円周も表示しよう 作成例 //p.78 練習問題2 ex0302.cpp using System; class ex0302 { public static void Main() { double r; //円の半径を格納するための変数を宣言 Console.Write("半径:"); //改行しない r = double.Parse(Console.ReadLine()); //コンソールから入力し実数化 Console.WriteLine("半径{0}の円の面積は{1}", r, Math.PI * r * r); Console.WriteLine("半径{0}の円の円周は{1}", r, 2 * Math.PI * r); //【追加課題】 } } 第4章 演算子 p.79 式と演算子 ・「+」や「-」に代表される計算や操作を表す記号を演算子という ・「typeof」「new」などのような単語の演算子もある ・演算子の対象をオペランド(項)といい、演算子の種類により数が異なる ・例:「a + b」はオペランドが2つなので、2項+演算子という ・0個以上の演算子とオペランドを合わせたものを式という(よって変数1個のみのものも式) ・式を計算して結果を得る事を「評価する」といい、結果の値を「評価」という ・例:式「a + b」の評価はaとbの和 ・なお、「=」は代入演算子ともいい、2項=演算子。 ・2項=演算子の評価は代入値となる。 ・例:式「c = 3 + 4」は2項+演算子の評価7が変数cに代入され、式全体の評価も7になる ・これで分かるように、通常の式は左から評価されるが、代入演算子は右から評価される アレンジ演習:p.80 expression01.cs ・式「(a = 3 + 4)」の評価も7になることを確認しよう 作成例 //p.80 expression01.cs using System; class expression01 { public static void Main() { int a = 0; Console.WriteLine("a = {0}", a); //「a = 0」 Console.WriteLine("(a = 7)の値は{0}", a = 7); //「(a = 7)の値は7」 //【以下追加】 Console.WriteLine("(a = 3 + 4)の値は{0}", a = 3 + 4); //「(a = 3 + 4)の値は7」 } } p.81 算術演算子 ・2項+,-,*,/,%演算子と、単項++,--演算子を合わせて算術演算子という ・2項+,-,*,/,%演算子のルール:(下記にあてはまらければエラーになる) 2項+演算子:2項が共に数値であれば加算結果を返す。どちらかまたは両方が文字列であれば連結結果の文字列を返す。 2項-演算子:2項が共に数値であれば左辺から右辺を引いた結果を返す。 2項*演算子:2項が共に数値であれば左辺と右辺の積を返す。 2項/演算子:2項が共に整数であれば左辺を右辺で割った結果の整数部を返す。実数であれば左辺を右辺で割った結果を返す。  ※「整数 / 0」は異常終了となる。  ※「正の実数 / 0」は「∞」(無限大)「負の実数 / 0」は「-∞」となる。  ※ なお、0.0は実数扱い アレンジ演習:p.81 add01.cs ・下記の組み合わせを2項+演算子に与えるとどうなるかも試そう。エラーにならない場合は結果の型を確認しよう  ①整数リテラルと文字リテラル  ②文字リテラルと文字リテラル  ③文字列リテラルと文字リテラル  ④整数リテラルと論理値リテラル 作成例 //p.81 add01.cs using System; class add01 { public static void Main() { Console.WriteLine(3 + 6); //加算で9 Console.WriteLine(3.0 + 6); //加算で9.0(表示は9) Console.WriteLine("3.5" + 6); //連結で"3.56" Console.WriteLine(3.5 + "6"); //連結で"3.56" Console.WriteLine(); //改行 Console.WriteLine("(3.0 + 6)の型は{0}", (3.0 + 6).GetType()); //Double Console.WriteLine("文字列3.5 + intの6の型は{0}", ("3.5" + 6).GetType()); //String Console.WriteLine("doubleの3.5 + 文字列6の型は{0}", (3.5 + "6").GetType()); //同 //【以下追加】 Console.WriteLine("整数3 + 文字'A' → {0}", 3 + 'A'); //加算で68(Aの文字コードは65) Console.WriteLine("型は{0}", (3 + 'A').GetType()); //Int32となる Console.WriteLine("文字'A' + 文字'B' → {0}", 'A' + 'B'); //加算で131(文字コードで計算) Console.WriteLine("型は{0}", ('A' + 'B').GetType()); //Int32となる Console.WriteLine("文字列\"AB\" + 文字'C' → {0}", "AB" + 'C'); //連結で"ABC" Console.WriteLine("型は{0}", ("AB" + 'C').GetType()); //Stringとなる //Console.WriteLine("整数10 + 論理値True → {0}", 10 + true); //(未定義)エラー } } アレンジ演習:p.81 add01.cs 続き ・下記の組み合わせを2項+演算子に与えるとどうなるかも試そう。エラーにならない場合は結果の型を確認しよう  ①実数リテラルと文字リテラル  ②論理値リテラルと論理値リテラル  ③論理値リテラルと文字リテラル  ④文字列リテラルと論理値リテラル 提出:アレンジ演習:p.81 add01.cs 続き 次回予告:p.82「算術演算子:型が異なる整数型と実数型による算術演算のルール」から