講義メモ ・p.48「浮動小数点数型」から再開します 提出フォロー:ミニ演習 mini046.cs ・p.46 type02.cs を元にして、下記の仕様のプログラムを作成しよう  ①コンソールから整数A、Bを入力  ②AとBの和、差、積、商、平均値を表示する  ※商と平均値は小数点以下切り捨てでOK 作成例 //ミニ演習 mini046.cs using System; class mini046 { public static void Main() { Console.Write("整数Aを入力してください---"); //改行しない int a = int.Parse(Console.ReadLine()); //文字列として入力し整数化した値で初期化 Console.Write("整数Bを入力してください---"); //改行しない int b = int.Parse(Console.ReadLine()); //文字列として入力し整数化した値で初期化 Console.WriteLine("A + B = {0}", a + b); //整数化したので計算可 Console.WriteLine("A - B = {0}", a - b); //〃 Console.WriteLine("A * B = {0}", a * b); //〃 Console.WriteLine("A / B = {0}", a / b); //〃(整数商になる) Console.WriteLine("平均は{0}", (a + b) / 2); //〃(〃) } } p.48 浮動小数点数型 ・小数点を持つ値を実数といい、小数点の扱い方に固定小数点方式と浮動小数点方式がある。 ・C#では格納効率が良い浮動小数点方式を採用している ・浮動小数点方式による実数を浮動小数点数という ・実数には誤差がつきものであり、特にコンピュータでは全ての値を2進数で扱うため、10進数で無限小数になる値(1÷7、円周率など)は2進数でも無限小数であり、10進数の0.1なども2進数では無限小数になってしまう。 ・よって、例えば、実数の1.0は1.00000000001かもしれないし0.9999999999かもしれないとみなされる ・この理由により、C#などでは整数と実数の扱いがまったく異なり、例えば2と2.0は違う扱いになる  (ただし、Console.WriteLineなどでの表示では「.0」が省略されることが多い ・C#では浮動小数点数に2種類の精度がある  ①単精度:精度が低い代わりに占有するメモリが小さい。floatまたはSingleといい1つ32ビット。  ②倍精度:占有するメモリが大きい代わりに精度が高い。doubleまたはDoubleといい1つ64ビット。 ・通常、処理効率は②の方が良いが、Unityなどの大量の座標を扱うツールでは①の利用が多い。  ※テキストp.48下から3行目の記述は、Unityなどには当てはまらない。使い分けがポイント。 ・なお、C#では桁数が多い実数は「3.402823E+38」のような指数表記で示される。 ・指数表記は実数を「0以上10未満の数値×10の●乗」で表すもので例えば「1.2E+3」は「1200」のこと。 ・よって、float型の最大値は3.402823×10の38乗=340282300000000000000000000000000000000 ・なお、「1.2E-3」は1.2×(1/10の3乗)=0.0012 アレンジ演習:p.49 type04.cs ・float型の変数fpiと、double型の変数dpiを、円周率3.14159265358979323846 で初期化する  ※文法エラーになるのでfpiの初期値の末尾にはFをつけること(理由はp.59で後述) ・この2つの値を表示して、有効桁数を確認しよう //アレンジ演習: p.49 type04.cs using System; class type04 { public static void Main() { Console.WriteLine("float: {0}~{1}", float.MinValue, float.MaxValue); Console.WriteLine("double:{0}~{1}", double.MinValue, double.MaxValue); //【以下追加】 float fpi = 3.14159265358979323846F; //円周率をfloat型扱いにして初期値に double dpi = 3.14159265358979323846; Console.WriteLine("fpi : {0}", fpi); Console.WriteLine("dpi : {0}", dpi); } } p.49 浮動小数点数型:浮動小数点数型の値を返すメソッドの例(Math.Pow) ・実数値で元の値と乗数を渡すと、べき乗の結果をdouble型で返すMath.Powメソッドが提供されている ・Math.Powは静的メソッド(後述)なので、特に準備なく「Math.Pow(実数, 実数)」で呼び出してOK ・Console.WriteLineやConsole.Writeの中で↑を呼び出せば、結果として得られた実数値を表示できる ・あるいは、式の中で↑を呼び出せば、結果として得られた実数値を計算に用いることができる  例: type05.csの「bw / Math.Pow(bl , 2.0)」は「blの値の2乗で変数bwの値を割った結果」 アレンジ演習:p.50 type05.cs ・BMI(肥満係数)を得るプログラムだが、身長の単位がメートルなので誤解しやすい ・身長をセンチメートル単位で入力できるようにしよう ・BMIの計算式を変更しても、その前にメートル単位に換算しても良い 作成例 //アレンジ演習:p.50 type05.cs using System; class type05 { public static void Main() { Console.Write("身長(cm)--- "); //【変更】 double bl = double.Parse(Console.ReadLine()) / 100; //【変更】 Console.Write("体重(kg)--- "); double bw = double.Parse(Console.ReadLine()); Console.WriteLine("BMI = {0:##.#}", bw / Math.Pow(bl, 2.0)); } } p.50 decimal型 ・実数には誤差がつきものなので、1つあたりの記憶域の量を倍にすることで、誤差を最小化するものがdecimal型。 ・decimal型は1つ128ビット(floatの4倍、doubleの2倍)で、精度は小数点以下28桁。 ・なお、decimal型の変数の初期値や代入値をリテラルで示す場合、decimal型にする必要がある。 ・この仕掛けをサフィックス(p.59)といい、decimal型のサフィックスは「M」または「m」。 アレンジ演習:p.51 type06.cs ・decimal型の変数mpiを、円周率3.14159265358979323846 で初期化する  ※文法エラーになるのでmpiの初期値の末尾にはMまたはmをつけること(理由はp.59で後述) ・この値を表示して、有効桁数を確認しよう 作成例 //アレンジ演習:p.51 type06.cs using System; class type06 { public static void Main() { Console.WriteLine("decimal:{0}~{1}", decimal.MinValue, decimal.MaxValue); decimal mpi = 3.14159265358979323846M; //decimal型扱い Console.WriteLine("mpi = {0}", mpi); //この場合、誤差無し } } p.52 type07.cs 補足 ・ソースの中でサフィックスが「100M」だったり「1m」だったりと大文字小文字が混じっているが、通常、どちらかに統一するのがコーディングルール(チームや会社における書式ルール)。 p.52 type07.cs //p.52 type07.cs using System; class type07 { public static void Main() { decimal total; //元利合計 Console.Write("借入金額---"); decimal a = decimal.Parse(Console.ReadLine()); //入力しdecimalに変換 Console.Write("利息(%)---"); decimal p = decimal.Parse(Console.ReadLine()); //入力しdecimalに変換 decimal r = p / 100M; //利息をパーセンテージから小数にする total = a * (1M + r); //decimal型の1に利息を加算し借入金額に掛ける Console.WriteLine("1期間後の元利合計は{0:c}です", total); //通貨形式(p.31) 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); } } p.53 文字型 ・1文字を格納するための型で、C#ではUnicodeによる文字コード(文字を表す番号)が用いられる ・charは「キャラ」または「チャー」と読む(どちらでも良いがチームルールで決める場合もある) ・Unicodeは1文字を2バイト以上で表すが、C#では2バイトと規定しているので、char型は16ビット。 ・char型の変数の初期化は文字リテラルで行うことができる ・書式: char 変数名 = '文字'; ・Console.Write/WriteLineは文字型の変数も扱うことが可能 ・文字リテラルでは'\u文字コード'形式で、16進数による文字コードによる文字の指定が可能 ・例えば、'猫'は16進数による文字コードが「732B」なので「char a = '\u732B';」と初期化できる  ※文字コードはWindowsに付属の「文字コード表」で確認できる ・なお、'\u文字コード'は、'\x文字コード'にしても良い(\xは16進数を示す) ・文字コードを10進数で指定するには、char型へのキャスト(強制変換:後述)を「(char)」で行え良い  例: char d = (char)12431; //12431は16進数308Fで「わ」の文字コード アレンジ演習:type09.cs ・行数を増やさずに「猫でもわかるC#」と表示するようにしよう ※「C#」は文字コードで指定しなくてOK 作成例 //アレンジ演習:p.55 type09.cs using System; class type09 { public static void Main() { char a = '\u732B'; //猫 char b = '\x3067'; //で char c = 'も'; char d = (char)12431; //わ char e = '\u304B'; //か char f = '\x308B'; //る Console.WriteLine("{0}{1}{2}{3}{4}{5}C#", a, b, c, d, e, f); //【変更】 } } p.55 エスケープ文字 ・制御用のコードを文字として扱う仕組みと、特別な意味をもつ文字を通常文字として扱える仕組みを合わせたものがエスケープ文字 ・エスケープシーケンスともいう ・前に\マークをつけた2文字で1文字分の変数になる ・制御用のコードを文字として扱う仕組みの代表が「\n」(改行)で、これ以外の「\r」「\t」「\b」「\v」「\f」の動作は処理系などに依存するので、何も動作しないことがある。 ・なお「\0」はヌル(ナル、null)のことで「無」を意味する。 ・特別な意味をもつ文字を通常文字として扱える仕組みには「\\」「\'」「\"」があり「\」「'」「"」を文字として扱える ・エスケープ文字は文字列リテラルの中にいくつでも指定可能。例:"A\nB\nC\n"(1文字ごとに改行) アレンジ演習:p.56 escape01.cs ・エスケープ文字を用いて「Let's go to "SIDE7" by \1234」と画面に表示しよう 作成例 //アレンジ演習:p.56 escape01.cs using System; class escape01 { public static void Main() { char n = '\n'; //改行を文字として文字型変数に格納 string str1 = "今日は"; //文字列リテラルで文字列型変数うぃ初期化 string str2 = "よい天気です"; //同上 Console.WriteLine(str1 + n + str2); //中央に改行を文字とする変数 string str3 = "今日は\nよい天気です"; //エスケープシーケンスを含む文字列 Console.WriteLine(str3); //表示時に中にある改行コードが動作する //【以下追加】 Console.WriteLine("Let\'s go to \"SIDE7\" by \\1234"); } } p.57 論理型 ・真理値(真偽値)を扱える型で、1ビット分の記憶容量。 ・真理値(真偽値)は真を意味するtrue、偽を意味するfalseの2値のどちらかになる ・真偽には「正しい、ホント」「間違い、ウソ」という意味はなく「あてはまる」「あてはまらない」が近い。 ・論理型はbool型のみで、trueとfalseは論理リテラル。  ※ C/C++では「整数0で偽、0以外で真を表す」ことが可能だが、C#では禁止なので注意 ・論理型変数はフラグ用に用いられることがある。例: bool tested = false; //テスト済フラグをオフ ・論理型変数はtrueとfalseの2値以外を保持できないので、フラグなどの用途に向く ・なお、Console.Write/WriteLineでbool型変数の値を表示すると先頭が大文字のTrue/Falseとなる ・bool型は.NET型ではSystem.Boolean型になる アレンジ演習:p.57 bool01.cs ・bool型変数どうしの加算をするとどうなるか確認しよう ・文法エラーになったらコメントアウトすること 提出:アレンジ演習:p.57 bool01.cs 次回予告:p.57 論理型(つづき)