講義メモ

・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); //【追加課題】
    }
}

コメントを残す

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