講義メモ ・double型とfloat型の誤差についての補足後、p.50「decimal型」へ 提出フォロー:アレンジ演習:p.50 type05.cs ・身長をメートルではなく、センチメートルで入力するように改良しよう 作成例 //アレンジ演習:p.50 type05.cs using System; class type05 { public static void Main() { Console.Write("身長(cm)--- "); //【変更】 double bl = double.Parse(Console.ReadLine()) / 100; //【変更】実数を入力しdouble型のメートルに変換 Console.Write("体重(kg)--- "); double bw = double.Parse(Console.ReadLine()); //実数を入力しdouble型に変換 Console.WriteLine("BMI = {0:##.#}", //小数点以下1桁まで表示(この改行はしてもしなくても良い) bw / Math.Pow(bl, 2.0)); //BMI=「体重÷身長の2乗」を } } double型とfloat型の誤差についての補足 ・浮動小数点数型は単精度のfloatと、倍精度のdoubleの2種類で、doubleがデフォルト扱い  ※ Unityでは精度が求められない限り、容量が小さいfloatを用いることが多い(大量データが扱いやすい) ・float型は1個32ビットで誤差が大きくなりやすく、表現できる範囲が狭い ・double型は1個64ビットで(float型よりは)誤差が小さくなり、表現できる範囲が広い ・なお、実数リテラル(小数点数を表す数字列(小数点を含むことが可能))は、double型とみなされる。 ミニ演習 mini049.cs double型とfloat型の誤差を試そう ・Mathクラスには円周率を提供する Math.PIがある ・これを、double型の変数と、float型の変数に代入して表示し誤差を確認しよう ・float型の変数に代入するときは前に「(float)」をつけてキャスト(後述)するとエラーを回避できる ・表示できる桁数を工夫すること ・また、1/7でも試してみよう 作成例 //ミニ演習 mini049.cs double型とfloat型の誤差を試そう using System; class mini049 { public static void Main() { double d = Math.PI; //double型の変数を円周率で初期化 float f = (float)Math.PI; //float型の変数を円周率をfloat型にキャストした値で初期化 //以下は小数点以下30桁で表示 Console.WriteLine("PI double:{0:F30}", d); Console.WriteLine("PI float :{0:F30}", f); d = 1 / 7.0; //double型の変数に1÷7を代入 f = (float)(1 / 7.0); //float型の変数に1÷7をfloat型にキャストして代入 Console.WriteLine("1/7.0 double:{0:F30}", d); Console.WriteLine("1/7.0 float :{0:F30}", f); Console.WriteLine("1/7.0*7.0 double:{0:F30}", d * 7.0); Console.WriteLine("1/7.0*7.0 float :{0:F30}", f * 7.0); } } 実行結果: PI double:3.141592653589790000000000000000 PI float :3.141593000000000000000000000000 1/7.0 double:0.142857142857143000000000000000 1/7.0 float :0.142857100000000000000000000000 1/7.0*7.0 double:1.000000000000000000000000000000 1/7.0*7.0 float :1.000000044703480000000000000000 p.50 decimal型 ・C#独自の実数データ型で1個のデータ長が128ビットもある代わりに、小数点以下28桁程度までの正確な演算が可能 ・よって誤差を最小化したい場合に用いる ・利用には留意点と制限がある ・初期化や代入には実数リテラルの末尾に「M」または「m」を付けてdecimal型扱いにすること  ※「メートル」や「メガ」と誤解されすいので、コメントなどで補足すると良い ・例: decimal d = 3.141592653589793238264643383279M; //decimal型の実数で初期化 ・なお、p.51 type06.csの実行結果でわかるとおり、decimal型の範囲はfloat型よりも狭い アレンジ演習:p.52 type07.cs ・「5週間後の元利合計」も表示するようにしよう 作成例 //p.52 type07.cs using System; class type07 { public static void Main() { decimal total; //合計用のdecimal型変数 Console.Write("借入金額---"); decimal a = decimal.Parse(Console.ReadLine()); //入力文字列をdecimal型に変換 Console.Write("利息(%)---"); decimal p = decimal.Parse(Console.ReadLine()); //同上(パーセンテージで入力) decimal r = p / 100M; //decimal型の100で割って利率を得る total = a * (1m + r); //decimal型の1に上記を加えて借入金額に掛けると元利合計になる Console.WriteLine("1期間後の元利合計は{0:c}です", total); a = total; //元利合計なので、利息を借入金額に加える total = a * (1m + r); Console.WriteLine("2期間後の元利合計は{0:c}です", total); a = total; total = a * (1m + r); Console.WriteLine("3期間後の元利合計は{0:c}です", total); a = total; total = a * (1m + r); Console.WriteLine("4期間後の元利合計は{0:c}です", total); a = total; //【以下追加】 total = a * (1m + r); Console.WriteLine("5期間後の元利合計は{0:c}です", total); } } p.53 3.7 文字型 ・stringは文字列型で、charは文字型。文字型は1文字分の固定した長さになる ・内部的には文字を表す番号である文字コードが格納される。 ・文字コードには複数の種類があるが、C#ではUnicodeという文字コード体系を用いる ・Unicodeでは全角や半角の区別がなく(基本的に)1文字2バイト(16ビット) ・よって、char型の容量も16ビット ・文字列は「"」で、文字は「'」で挟んで用いる。  ※ 文字リテラルという ・Console.Write/WriteLineメソッドはchar型にも対応しているので、文字リテラルやchar型変数を指定できる アレンジ演習:p.54 type08.cs ・「猫でもわかるかも」と表示するようにしよう。なお、変数を増やさないこと。 作成例 //p.55 type08.cs using System; class type08 { public static void Main() { char a = '猫', b = 'で', c = 'も', d = 'わ', e = 'か', f = 'る'; //文字型変数を初期化 Console.Write(a); //文字をコンソールに表示(改行しない) Console.Write(b); Console.Write(c); Console.Write(d); Console.Write(e); Console.Write(f); Console.Write(e); //【追加】か Console.Write(c); //【追加】も Console.WriteLine(); //改行のみを行う } } アレンジ演習:p.54 type08.cs その2 ・6回ある「Console.Write」を削除して、その下の「Console.WriteLine();」で6文字を表示するようにしよう ・「猫でもわかるかも」の「かも」は消してOK ・変数は変更しないこと 作成例 //p.55 type08.cs using System; class type08 { public static void Main() { char a = '猫', b = 'で', c = 'も', d = 'わ', e = 'か', f = 'る'; //文字型変数を初期化 //Console.Write(a); //文字をコンソールに表示(改行しない) //Console.Write(b); //Console.Write(c); //Console.Write(d); //Console.Write(e); //Console.Write(f); Console.WriteLine("{0}{1}{2}{3}{4}{5}", a, b, c, d, e, f); //【変更】文字を順に表示 } } p.54(文字コードによる文字の表現) ・Unicodeによる文字コードは通常、0000からFFFFまでの16進数で表される ・なお、Windows10では「スタート」「Windowsアクセサリ」「文字コード表」でUnicodeを確認できる。  ※ Windows11では「スタート」「すべてのアプリ」「Windowsツール」「文字コード表」 ・「U+」に続く4桁が文字コードで例えば「A」は0041、「Z」は005A。 ・「詳細表示」をチェックすると、Unicodeで指定が可能になるので、4桁の16進数で指定するとその文字が得られる  ※漢字やひらがなの場合は、フォントを漢字を含むもの(例:HGPゴシックE)に変えてから実行すること  例:「732B」は「猫」 ・文字コードを文字リテラルで用いることができる。「'\u」または「'\x」の後にコードを入力し「'」で閉じると良い  例: char neko = '\u732B'; ・なお、文字コードを10進数で指定したい場合は、「(char)」を前置してキャストすると良い  例: char neko = (char)29483; アレンジ演習:p.55 type09.cs ・「猫でもわかるかも」と表示するようにしよう。なお、変数g、hを増やし、gには「か」を10進数表示で、hには「も」を16進数表示で与えること。 ・「も」の文字コードは文字コード表で調べること 作成例 //p.55 type09.cs using System; class type09 { public static void Main() { char a = '\u732B'; //16進数で「猫」 char b = '\x3067'; //16進数で「で」 char c = 'も'; char d = (char)12431; //10進数12431⇒16進数308Fで「わ」 char e = '\u304B'; //16進数で「か」 char f = '\x308B'; //16進数で「る」 char g = (char)12363; //【追加】16進数304B⇒10進数12363で「か」 char h = '\u3082'; //【追加】16進数で「も」 Console.WriteLine("{0}{1}{2}{3}{4}{5}{6}{7}", a, b, c, d, e, f, g, h); //【変更】 } } p.55 エスケープ文字 ・エスケープシーケンスともいい、制御情報や特殊な意味のある文字を「\文字」で表す仕組み ・改行のなどの制御情報を文字「\n」で表したり、実行させることが可能 ・また、文字列中にダブルクォーテーションを入れたい場合は「\"」で、シングルコーテーションを文字として扱うには「\'」、円マークを文字として扱うには「\\」とすることができる アレンジ演習:p.56 escape01.cs ・2回目の「よい天気です」を「よい"天気"です」と表示するようにしよう 作成例 //アレンジ演習:p.56 escape01.cs using System; class escape01 { public static void Main() { char n = '\n'; //改行コードのエスケープ文字で文字型変数nを初期化 string str1 = "今日は"; //文字列① string str2 = "よい天気です"; //文字列② Console.WriteLine(str1 + n + str2); //文字列①と文字型変数nと文字列②を連結して表示(nで改行) string str3 = "今日は\nよい\"天気\"です"; //【変更】文字列リテラルの中に「\n」「\"」を入れる Console.WriteLine(str3); //表示すると途中で改行する } } p.57 3.8 論理型 ・2値しかない値型で、真偽値を表す。真をtrue、偽をfalseと表すが「良い・悪い」ではなく「あてはまる・あてはまらない」の意味 ・Cでは、falseを0で、trueを非0で示し、C++もこの表現が可能だが、C#では禁止。 ・論理型はbool型であり、bool型の変数にはtrueまたはfalseのみを格納できる。 ・例: bool flag = true; ・Console.Write/WriteLineでbool型変数を表示すると、自動的にTrue/Falseで表示される ・変数の型情報を得る汎用的なメソッドがGetType()で(詳細は後述)、bool型変数に用いると.NET表記で"System.Boolean"が得られる ・オブジェクトの文字列表記を得る汎用的なメソッドがToString()で(詳細は後述)、bool型変数に用いると、文字列"True"または"False"が得られる アレンジ演習:p.57 bool01.cs ・bool型の変数どうしの四則演算や、単項-演算子による符号反転ができるかどうか確認しよう ・また、bool型の変数と実数型の変数との代入ができるかどうか確認しよう  ⇒どちらも不可 作成例 //p.57 bool01.cs using System; class bool01 { public static void Main() { bool a = true; //論理型の変数を真偽値で初期化 bool b = false; //同上 Console.WriteLine("a = {0}, b = {1}", a, b); //"True","False"で表示 Console.WriteLine("aは{0}", a.GetType()); //System.Boolean Console.WriteLine("aは文字列にすると「{0}」", a.ToString()); //"True"で表示 Console.WriteLine("bは文字列にすると「{0}」", b.ToString()); //"False"で表示 // bool c = a + b, d = a - b, e = a * b, f = a / b; //bool型の変数どうしの四則演算は文法エラーになる // double w = a; //実数型の変数への代入は文法エラーになる // double w = 3.14; a = w; //実数型の変数からの代入も文法エラーになる } } p.58 3.9 リテラル ・リテラル:プログラムの中にデータを記述したもので、定数ともいう。 ・整数リテラル、実数リテラル、文字列リテラル、文字リテラル、論理リテラルがある ・整数リテラル:123、-456、0xABなど。int型扱いになる ・実数リテラル:3.14、.5、0.12E-5など。double型扱いになる ・文字列リテラル:"あ","あいう",""など。string型扱いになる ・文字リテラル:'A','あ'など。char型扱いになる ・論理リテラル:true、falseのみ。bool型扱いになる p.58(サフィックス:接尾語) ・整数リテラルと実数リテラルはサフィックスをつけることで、扱われる型を変更できる ・整数型サフィックスは「L」でlong型、「U」でuint型、「UL」でulong型で扱える  ※ 小文字でも良いが「L」を「l」で示すことは推奨されない ・例: ulong work = 4900000000U; //49億をulong型で扱う(このUは略しても文法エラーにはならない) ・実数型サフィックスは「F」でfloat型、「M」でdeciml型で扱える  ※ 小文字でも良い。また「d」でdouble型にできるが、指定不要 ・例: float work = 3.141592F; //円周率をfloat型で扱う(このFは略すと文法エラー) 提出:ミニ演習 mini059.cs ・上記のサフィックスの2つの例を試すプログラムを作ろう ・略すと文法エラーになる場合はメッセージを確認してからコメントアウトすると良い 次回予告:p.59「Object.GetTypeメソッド」から