講義メモ 第3章 変数とデータ型

p.37 変数の初期化

・p.23で説明したとおり、変数の宣言と同時に値を代入できる。これを初期化という。
・初期化に用いる値を初期値という
・intは整数用のデータ型、stringは文字列用のデータ型で、変数の大きさや特性を決める。
・なお、データ型はint、stringのようにC#が提供する「組み込み型」と、プログラマが自由に定義できる「ユーザ定義型」がある
・Main()メソッドの「{」から「}」の中で宣言した変数をローカル変数といい、この中でのみ有効。
 ※ プログラマが自由にメソッドの定義を行い、その中で宣言した変数もローカル変数
・ローカル変数は宣言した段階では値は不定であり、これを使おうとすると(通常)エラーになる

p.39 定数

・変数の初期化において、先頭に「const」と付けることで、その変数の値の変更を禁止できる
・プログラマや、プログラムを引き継いだ技術者が誤って書き換えてしまうことを防ぐのが目的
・このような変数を定数といい、値に名前をつけて扱う場合にも用いる
 例: const int tax = 110; //税率は110%
・定数への代入はエラーになる。また、初期化しない宣言のみもエラーになる

ミニ演習 mini039.cs

・p.35 readline01.csをアレンジしよう
・文字列"あなたのお名前は何ですか--- "を、string型の定数に格納して用いるようにしよう

作成例

//ミニ演習 mini039.cs
using System;
class ReadLine01 {
    public static void Main() {
        string name; //文字列型の変数nameの宣言(コンソール入力用)
        const string q = "あなたのお名前は何ですか--- "; //【追加】入力ガイドを定数にする
        Console.Write(q); //入力ガイドなので改行しない(定数の表示)
        name = Console.ReadLine(); //コンソールから入力し変数nameに格納
        Console.WriteLine("あなたのお名前は{0}さんですか",  name); //変数nameの値を表示
    }
}

p.40 値型と参照型

・変数はデータ型によって実際の大きさが決まる。例えば、int型変数や定数は1個32ビットになる。
・このような型を値型という。
・対して、決まらない型もある。例えば、string型は大きさが不定(何文字でもOK)
・このような型を参照型といい、ユーザ定義型は基本的に参照型。
・参照型は変数が指す位置とは別の場所にデータを格納し、場所の情報を変数に格納することが多い

p.41 データ型

・組み込み型には、数値型・文字型(文字列ではない)・論理型がある
・通常、C言語/C++などから引き継いだint、stringなどの型名を用いるが、C#が含まれる.NETフレームワークで定めた
 .NET型名を使うことも多い。特に、コンソールから得られるメッセージには.NET型名が用いられる。
・例: 通常型「int」は、.NET型では「System.Int32」
※ C言語では「実装は処理系依存」とすることが多く、int型の大きさなども処理で異なる

p.43 整数型

・C#などでは整数型の基本はintだが、int型で扱える値の範囲はプラスマイナス21億程度で32ビット
・これより大きな値を扱いたい場合や、小さい値をより狭い領域で扱いたい場合、また、負の数が不用の場合などに合わせて、
 intに加えて7種類の整数型がある
・intより小さい値をより狭い領域で扱いたいための型が、sbyte(8ビット)、short(16ビット)。
・intの範囲を超える整数を扱うための型が、long(64ビット)
 ※ 同じVisual Studioで動作するVC/VC++では、int型とlong型は同じ扱いになっているので注意
・負の数を用いない場合、int⇒uint、short⇒usort、long⇒ulong、sbyte⇒byte とすると、負の数が代入できない変数になり、
 正の数の有効範囲が倍になる
 例: intは約-21億から約+21億。uintは0から約42億の範囲
・各整数型の最大値、最小値は「型名.MaxValue」「型名.MinValue」で得られる。

p.44 Type01.cs

//p.44 Type01.cs
using System;
class Type01 {
    public static void Main() {
        Console.WriteLine("sbyte :{0}~{1}", sbyte.MinValue, sbyte.MaxValue);
        Console.WriteLine("short :{0}~{1}", short.MinValue, short.MaxValue);
        Console.WriteLine("int   :{0}~{1}",   int.MinValue,   int.MaxValue);
        Console.WriteLine("long  :{0}~{1}",  long.MinValue,  long.MaxValue);
        Console.WriteLine(); //改行(行明け)
        Console.WriteLine("byte  :{0}~{1}",  byte.MinValue,  byte.MaxValue);
        Console.WriteLine("ushort:{0}~{1}",ushort.MinValue,ushort.MaxValue);
        Console.WriteLine("uint  :{0}~{1}",  uint.MinValue,  uint.MaxValue);
        Console.WriteLine("ulong :{0}~{1}", ulong.MinValue, ulong.MaxValue);
    }
}

p.45(Parseメソッドについて)

・文字列型変数などの値がそのまま整数に変換できる場合「int.Parse(文字列)」で変換結果が得られる。
 例: string s = "123"; int i = int.Parse(s); //数値123が得られる
 例: string s = Console.ReadLine(); int i = int.Parse(s); //入力を数値化できる(出来ない場合エラー)
・int以外の整数方も指定可能で、例えば「ushort.Parse(文字列)」なども可能
・ただし、変換できないと実行時エラーになるので注意。

p.46 Type02.cs

//p.46 Type02.cs
using System;
class Type02 {
    public static void Main() {
        Console.Write("整数を入力してください--- "); //入力ガイドなので改行しない
        int x = int.Parse(Console.ReadLine()); //コンソールから入力し整数変換し変数xに格納
        Console.WriteLine("今の数字を2倍すると{0}ですね。",  x * 2); //変数xの2倍の値を表示
        Console.Write("あなた年齢を入力してください--- "); //入力ガイドなので改行しない
        ushort age = ushort.Parse(Console.ReadLine()); //コンソールから入力し符号なし短整数に変換し変数ageに格納
        Console.WriteLine("あと{0}年で100歳ですね。",  100 - age); //変数xの2倍の値を表示
    }
}

p.47(メソッドの引数にメソッドを指定する)

・Type02.csの「int x = int.Parse(Console.ReadLine())」を分解すると:
 ① int x; //整数型変数の宣言
 ② string work; //文字列型変数の宣言
 ③ work = Console.ReadLine(); //コンソールから文字列を入力
 ④ x = int.Parse(work); //文字列を整数に変換して代入
・本来であれば一旦、文字列型変数に置く必要があるが、コンソールから文字列を入力するメソッドそのものを、
 整数に変換するメソッドの引数にすることで省略できる
・一般的に、途中で使う作業用の変数(上の例のwork)を用いずにシンプルにすることが望ましいが、分かりづらければ、
 このように分解して考えると良い
・なお、int.Parseメソッドの引数には、文字列や文字列を返す式やメソッドであれば、どんなものも記述できる

p.47(Convertクラスのメソッド)

・C#が提供するConvertクラス(クラスの説明は後述)には、文字列型から.NET型への変換を担うメソッドが型ごとに提供されている
 例: Convert.ToInt32(文字列) //文字列型からint型への変換
 例: Convert.ToUInt16(文字列) //文字列型からushort型への変換

p.47 Type03.cs

//p.47 Type03.cs
using System;
class Type03 {
    public static void Main() {
        Console.Write("整数を入力してください--- "); //入力ガイドなので改行しない
        int x = Convert.ToInt32(Console.ReadLine()); //コンソールから入力し整数変換し変数xに格納
        Console.WriteLine("今の数字を2倍すると{0}ですね。",  x * 2); //変数xの2倍の値を表示
        Console.Write("あなた年齢を入力してください--- "); //入力ガイドなので改行しない
        ushort age = Convert.ToUInt16(Console.ReadLine()); //コンソールから入力し符号なし短整数に変換し変数ageに格納
        Console.WriteLine("あと{0}年で100歳ですね。",  100 - age); //変数xの2倍の値を表示
    }
}

p.48 浮動小数点数型

・実数(小数点がある値)の表現方法として、C#では浮動小数点数型を採用している
・浮動小数点数型には単精度のfloatと、倍制度のdoubleがあり、基本的はdoubleが優先される
・単精度のfloatは1個32ビットである代わりに、有効桁数が少なく誤差が出やすい
 ※ Unityでは扱う実数値の数が多くなりやすいので、精度より容量を考えてfloat型を用いることが多い
・倍精度のdoubleは1個64ビットである代わりに、有効桁数が多く誤差が(floatより)少ない
・それぞれの最大値、最小値は、.MaxValue、.MinValueで得られる
・これをConsole.WriteLineなどで表示すると、指数表記が用いられる
・指数表記は実数を「●×10の■乗」で表す方式で、表記は「●E■」となる。0が長く並ぶ値をシンプルに表現出来る
 例: 123456000000 ⇒ 1.23456×10の12乗 ⇒ 1.23456E13
 例: 0.0000123456 ⇒ 1.23456×10の-5乗 ⇒ 1.23456E-5

p.49 Type04.cs

//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 :-3.402823E+38~3.402823E+38
double:-1.79769313486232E+308~1.79769313486232E+308

p.49 Math.Powメソッド

・C#が提供するMathクラスには、べき乗を返すPowメソッドがあるが、このメソッドの2引数と結果(戻り値)の型はdouble型になっている
・このことを「double Math.Pow(double, double)」というように表記する
・例:Math.Pow(2.0, 3.0) ⇒ 8.0が得られる

p.50 type05.cs 解説

・肥満度の指標であるBMI=体重(kg)÷(身長(m)の2乗)を求めるプログラム
・身長がcm単位ではなくm単位なことに注意

p.50 Type05.cs

//p.50 Type05.cs
using System;
class Type05 {
    public static void Main() {
        Console.Write("身長(m)--- "); //入力ガイドなので改行しない
        double bl = double.Parse(Console.ReadLine()); //コンソールから入力し実数変換し変数blに格納
        Console.Write("体重(kg)--- "); //入力ガイドなので改行しない
        double bw = double.Parse(Console.ReadLine()); //コンソールから入力し実数変換し変数bwに格納
        //体重÷身長の2乗を、小数点以下1桁まで表示
        Console.WriteLine("BMI = {0:##.#}",  bw / Math.Pow(bl, 2.0));
    }
}

アレンジ演習:p.50 Type05.cs

・メートルではなくセンチメートルで身長を入力するように改良しよう
・ヒント: BMI=体重(kg)÷((身長(cm)÷100.0)の2乗)

作成例

//アレンジ演習:p.50 Type05.cs
using System;
class Type05 {
    public static void Main() {
        Console.Write("身長(cm)--- "); //入力ガイドなので改行しない
        double bl = double.Parse(Console.ReadLine()); //コンソールから入力し実数変換し変数blに格納
        Console.Write("体重(kg)--- "); //入力ガイドなので改行しない
        double bw = double.Parse(Console.ReadLine()); //コンソールから入力し実数変換し変数bwに格納
        //体重÷m単位にした身長の2乗を、小数点以下1桁まで表示
        Console.WriteLine("BMI = {0:##.#}",  bw / Math.Pow(bl / 100.0, 2.0));
    }
}

p.50 decimal型

・decimalは10進数のことで、実数を内部的2進数で扱うfloat/double型に比べて、誤差が出づらい
・ただし、1個に128ビット用いるのでメモリの消費量に注意
・初期化に用いる実数値も同じ扱いをする必要があるので、末尾にMまたはmを付けて示す必要がある
 例: decimal d = 3.14M; //decimal型扱いの値で、decimal型の変数を初期化
・扱える値の範囲はdecimal.MinValueからdecimal.MaxValueで、float型より狭いが、long型より広い
・符号なしdecimal型は無い

p.51 Type06.cs

//p.51 Type06.cs
using System;
class Type06 {
    public static void Main() {
        Console.WriteLine("decimal:{0}~{1}",decimal.MinValue,decimal.MaxValue);
        //【以下参考】
        float   f = 3.141592653589793238264643F;
        double  d = 3.141592653589793238264643;
        decimal m = 3.141592653589793238264643M;
        Console.WriteLine("f :{0}", f); //f :3.141593
        Console.WriteLine("d :{0}", d); //d :3.14159265358979
        Console.WriteLine("m :{0}", m); //m :3.141592653589793238264643
    }
}

提出:アレンジ演習:p.50 Type05.cs「メートルではなくセンチメートルで身長を入力」

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です