今週の話題

ゲームソフト販売本数ランキング:今週1位は「ドラゴンクエストIII そして伝説へ…(Switch)」 GO!
ディー・エヌ・エー上半期は減損計上で増益も増収ならず、『ポケポケ』による巻き返しに期待【ゲーム企業の決算を読む】GO!
MSストアで購入した手持ちのXbox作品がクラウドストリーミングで遊べるように―まずはHD-2D版『ドラクエ3』や『Farming Simulator 25』など最新作含む50作品からスタート GO!
バンダイナムコオンライン、バンダイナムコエンターテインメントに吸収合併・消滅へ…昨今は『ブルプロ』や『ガンダムエボリューション』などを開発 GO!
ソニーがKADOKAWAを買収協議中との報道―『エルデンリング』のフロム・ソフトウェアなど傘下企業にも注目、KADOKAWAは「当社として決定した事実はありません」とコメント GO!

Steamは“過激なヘイト”の温床?Valveが米ユダヤ系団体・名誉毀損防止連盟に名指しで非難される GO!
児童搾取の問題削減につながるか?『Roblox』最新アップデートでペアレンタルコントロール機能強化へ―プレイ時間の制限やリモートでのアカウント制御など GO!

前回のコメント

 まず、前回の講義においてZOOMの立ち上げにトラブルがありましたことをお詫びします。
 申し訳ありませんでした。

・本日もありがとうございます。
 自分で変数の値を1へらすだけでも、練習になりますね。
 プログラミングなど、専門学校の講師の方が説明してくれている時に、特にメモしたほうが後ほど訳に立つという事柄って例えば何かあるか
 あれば教えてください。(あいまいな質問ですみません)

 後になって、何が役に立つかはわかりませんので、抽象的な回答になりますが、
 説明の中で「テキストや講義メモに書かれていないことのうち、心にひっかかったもの」だと思います。
 「後で役に立つかもしれないし、役に立たないかもしれないけど、ちょっと気になること」を、
 テキストの余白などに書き込んでおくと、良さそうです。

・今回来る前にまとめた中に抜けてた部分があったのが練習問題やる際にわかったので
 修正点が見つかってよかったと思いました。
 次回も頑張ろうと思います。

 何よりです。応援します。

・球の体積のほうが自信ありません

 体積は【自由参加課題】なので、気楽に挑戦してみてください。

講義メモ 後半

p.66 列挙型

・整数値に名前を付けてグループにて型にしたもの。
・例: グーは0番、チョキは1番、パーは3番とするとき「次の手 = 0」とするより「次の手 = グー」とした方が分かりやすく、
 可読性が上がる
・このグループ名を列挙名、要素を列挙子という
・C#が提供するライブラリの中にも列挙型があり、広く用いられている
 例: https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.forms.keys Keys列挙型
・書式: enum 列挙名 { 列挙子, … }
・列挙子には自動的に0から整数があてはめられるが、代入も可能
・書式: enum 列挙名 { 列挙子 = 整数値, … }
・「 = 整数値」を指定しない場合、先頭は0、それ以降は1っ前の列挙子の値+1になる。

アレンジ演習: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,5,…,12になる
    };
    public static void Main()
    {
        //列挙子の持つ整数をint型として扱うにはキャストする
        Console.WriteLine("Aprは{0}月", (int)MyMonth.Apr); //Aprは4月
        Console.WriteLine("Mayは{0}月", (int)MyMonth.May); //Mayは5月
        Console.WriteLine("Aprは{0}", MyMonth.Apr); //【追加】AprはApr
        int x = (int)MyMonth.Apr; //【追加】int型変数への列挙子の代入にも型キャストが必要
    }
}

p.69 3.14 オブジェクト型とボックス型:割愛し「第7章 クラス」「第6章 配列」で説明します

p.73 3.15 文字列型

・文字列は0文字以上の文字がならんだもので、文字数は確定しない
・文字列はstring型(.NETではSystem.String型)で扱える
・C#では文字列を(後述する)クラスで扱うので、文字数を得たり、比較したり、コピーしたりするための仕掛(プロパティ、文字配列、
 メソッド)が用意されている
・ここではクラス、プロパティ、配列、メソッドの詳細は後回しにして、便利な仕掛を理解しておこう

アレンジ演習:string01.cs

・コンソールに「文字列:」と表示し、文字列を入力したら、何文字あるか表示する処理を追加しよう

作成例

//アレンジ演習:p.73 string01.cs
using System;
class string01
{
    public static void Main()
    {
        string str = "今日はよい天気です";
        string mystr;
        char c;
        // Lengthプロパティ(後述)で文字列の長さを調べる
        Console.WriteLine("strは長さ{0}です", str.Length);
        //文字型変数cに文字列strの5番目の文字を代入
        c = str[4]; //文字列を文字の配列(後述)として扱える
        Console.WriteLine("文字列の5番目の文字は「{0}」です", c);
        //文字列strをmystrにコピー
        mystr = String.Copy(str); //静的メソッド(後述)を用いる
        Console.WriteLine("mystr = {0}", mystr);
        //文字列の検索
        int n = str.IndexOf('は'); //メソッドに文字を与えて用いる
        Console.WriteLine("文字列に'は'が出てくるのは{0}番目の文字", n + 1);
        n = str.IndexOf("よい"); //メソッドに文字列を与えて用いるオーバーロード(後述)
        Console.WriteLine("文字列に「よい」が出てくるのは{0}文字目から", n + 1);
        //【以下追加】
        Console.Write("文字列:");
        string name = Console.ReadLine();
        Console.WriteLine("{0}は{1}文字です。", name, name.Length);
    }
}

p.75「is演算子とas演算子」は割愛します

p.78 練習問題1 ヒント ex0301.cs

・うるう年を考えないので、1年の秒数は60秒×60分×24時間×365日で算出できる

作成例

//p.78 練習問題1 ex0301.cs
using System;
class ex0301
{
    public static void Main()
    {
        Console.WriteLine("1年は{0}秒", 60 * 60 * 24 * 365);
    }
}

提出:p.78 練習問題2 ex0302.cs

p.78 練習問題2 ヒント ex0302.cs

① 円の半径を格納するためのdouble型の変数rを宣言
②「半径:」と改行なしで表示
③ コンソールから入力を受け取り、double.parseメソッド(p.46参照)で実数化して変数rに格納
④ 円周率Math.PIと変数rの2乗を掛けた結果を面積として表示
【自由参加課題】この半径の球の体積も表示しよう

講義メモ

・p.59「Object.GetTypeメソッド」から

p.58(サフィックス:接尾語)【再掲載】

・整数リテラルと実数リテラルはサフィックスをつけることで、扱われる型を変更できる
・整数型サフィックスは「L」でlong型、「U」でuint型、「UL」でulong型で扱える
 ※ 小文字でも良いが「L」を「l」で示すことは推奨されない
・例: ulong work = 4900000000UL; //49億をulong型で扱う(このULは略しても文法エラーにはならない)
・実数型サフィックスは「F」でfloat型、「M」でdeciml型で扱える
 ※ 小文字でも良い。また「d」でdouble型にできるが、指定不要
・例: float work = 3.141592F; //円周率をfloat型で扱う(このFは略すと文法エラー)

提出フォロー:ミニ演習 mini059.cs

・上記のサフィックスの2つの例を試すプログラムを作ろう
・略すと文法エラーになる場合はメッセージを確認してからコメントアウトすると良い

作成例

//ミニ演習 mini059.cs
using System;
class mini059
{
    public static void Main()
    {
        ulong work1 = 4900000000UL; //49億をulong型で扱う
        ulong work2 = 4900000000;  //(このUは略しても文法エラーにはならない)
        float work3 = 3.141592F; //円周率をfloat型で扱う
        //float work4 = 3.141592; //(このFは略すと文法エラー)
        Console.WriteLine("{0} {1} {2}", work1, work2, work3);
    }
}

p.59 Object.GetTypeメソッド

・C#にはあらゆるプログラム(クラス)の基本的存在としてObject/objectというクラスが用意されている。
・この中に、汎用的なメソッドがあり、その1つがGetTypeメソッド
・GetTypeメソッドは型情報を返すもので、これをConsole.Write/WriteLineなどに与えると.NET型(p.42)を表す文字列がで表示される
・書式: 値または式.GetType() ⇒ 戻り値型はType型だが、Console.Write/WriteLineなどに与えると文字列になる
・例:Console.WriteLine(100.GetType()); ⇒ System.Int32 //100はint型扱いであり、.NET型にするとInt32

アレンジ演習:p.60 literal01.cs

・文字リテラル、文字列リテラル、論理型リテラルも試してみよう

作成例

//アレンジ演習:p.60 literal01.cs
using System;
class literal01
{
    public static void Main()
    {
        string format = "{0}の型は.NET型で{1}です"; //これ以降のWriteLineで用いる書式を事前定義
        Console.WriteLine(format, "100", 100.GetType());
        Console.WriteLine(format, "100U", 100U.GetType());
        Console.WriteLine(format, "100L", 100L.GetType());
        Console.WriteLine(format, "100UL", 100UL.GetType());
        Console.WriteLine(format, "1.25", 1.25.GetType());
        Console.WriteLine(format, "1.25F", 1.25F.GetType());
        Console.WriteLine(format, "1.25M", 1.25M.GetType());
        Console.WriteLine();
        Console.WriteLine(format, "10F", 10F.GetType());
        Console.WriteLine(format, "10D", 10D.GetType());
        Console.WriteLine(format, "10M", 10M.GetType());
        Console.WriteLine();
        Console.WriteLine(format, "-10D", (-10D).GetType());
        Console.WriteLine(); //【以下追加】
        Console.WriteLine(format, "文字", 'A'.GetType());     //System.Char
        Console.WriteLine(format, "文字列", "ABC".GetType()); //System.String
        Console.WriteLine(format, "論理型", true.GetType());  //System.Boolean
    }
}

p.61 暗黙の型指定

・初期化を行う時、初期値によって型が決まる場合は、変数の型指定は不要で代わりに「var」を記述できる。
・例: var i = 100; //100はint型なので「int i = 100;」とみなされる
・なお「var i;」のような宣言のみはエラーになる。
・型の無いリテラル「null」があるが、これは暗黙の型指定には利用できない

アレンジ演習:p.62 var01.cs

・変数noはint型(System.Int32型)になっていることがわかるが、この表示後に文字列などの異なる型の値を代入するとどうなるか
 確認しよう。
・なお、テキストでは「int Main()」となり「return 0;」があるが、このプログラムでは不必要なので、
 今まで通り「void Main()」として良い。「return 0;」は不要。

作成例

//アレンジ演習:p.62 var01.cs
using System;
class var01
{
    public static void Main()
    {
        var mytext = "猫でもわかるC#プログラミング 第"; //string型になる
        var no = 3; //int型になる
        var myc = '版'; //char型になる
        Console.WriteLine(mytext + no + myc); //上記を連結して表示
        Console.WriteLine("mytextの型は{0}で、noの型は{1}で、mycの型は{2}です",
            mytext.GetType(), no.GetType(), myc.GetType()); //型情報を.NET形式で表示
        // no = "ABC"; //noはint型になっているので文字列は代入できない
        // no = 3.14; //実数も代入できない
    }
}

p.62 dynamic型

・var型の進化系で、初期化ではなく宣言で指定できる暗黙の型
・最初の値の代入によって、型が決まる
・よって、実行するまで変数型が確定できない場合に便利
・例: dynamic d; d = 100; //dはint型(Int32)と見なされる
・もちろん、var型と同様に初期化で用いることも可能
・利用には、VS(VC++)のプロジェクトの参照設定に追加が必要
 ①プロジェクトエクスプローラの「参照」を右クリックし「参照の追加」
 ②参照マネージャで「Microsoft.CSharp」のチェックをオンにして「OK」

アレンジ演習:p.62 var01.cs

・変数zはdouble型(System.Double型)になっていることがわかるが、この表示後に文字列などの異なる型の値を代入するとどうなるか
 確認しよう。
 ⇒varとは異なりエラーにはならず、型が変化する
・なお、テキストでは「int Main()」となり「return 0;」があるが、このプログラムでは不必要なので、
 今まで通り「void Main()」として良い。「return 0;」は不要。

作成例

//p.63 dynamic01.cs
using System;
class Dynamic01
{
    public static void Main()
    {
        dynamic x = 10, y = "abc", z; //xはint、yはstring型になるが、zは未定
        z = 1.25; //zはdouble型になる
        Console.WriteLine("x ---- {0}", x.GetType());
        Console.WriteLine("y ---- {0}", y.GetType());
        Console.WriteLine("z ---- {0}", z.GetType()); //System.Doubleなのだが
        z = "ABC"; //【以下追加】文字列を代入可能
        Console.WriteLine("z ---- {0}", z.GetType()); //System.Stringになっている
    }
}

p.64 3.11 スコープ

・変数はこれを宣言したブロックおよびその内側のブロックから利用可能で、この範囲のことをスコープという
・スコープは基の意味は「視野」だがこの場合「有効範囲」のこと
・なお、{}にブロックはプログラマが自由に指定できるので、変数のスコープを制限できる
・しかし、C#ではスコープが異なっても同じ変数名は使えないので(C/C++では使えるが)、任意のブロックによる変数のスコープの
 制限はあまり意味がない。

アレンジ演習:p.64 scope01.cs

・スコープの外で変数を用いるとどういうエラーになるか確認しよう
・確認したらコメントアウトすること

作成例

//p.64 scope01.cs
using System;
class scope01
{
    public static void Main()
    {
        int a = 10;
        Console.WriteLine("a = {0}", a);
        {
            int b = 5;
            Console.WriteLine("a = {0}, b = {1}", a, b);
            {
                int c = 1;
                Console.WriteLine("a = {0}, b = {1}, c = {2}", a, b, c);
            }
            //ここではcは見えません
            Console.WriteLine("a = {0}, b = {1}", a, b);
            //c = 5; //「ここには存在しない」エラーになる
        }
        //ここでは、b,cは見えません
        Console.WriteLine("a = {0}", a);
        //b = 100; //「ここには存在しない」エラーになる
    }
}

p.65 3.12 型変換

・型の値の範囲が狭いものを「型が小さい」広いものを「型が大きい」という
・型が小さいものから、型が大きいものへの代入では「暗黙の型変換」が行われ、大きい方の型に変換してから代入される
・型が大きいものから、型が小さいものへの代入はエラーになる
・しかし、プログラマの責任において行いたい場合は「型キャスト」によって可能になる
・書式: (型名)式または値
・例: long a = 2; byte b; b = (byte)a; //aはlong型だがbyte型に強制変換して代入せよ

アレンジ演習:p.66 cast01.cs

・整数型からdouble型への型キャストが可能かを確認しよう
・整数型からdecimal型への型キャストが可能かを確認しよう
・整数型からchar型への型キャストが可能かを確認しよう
・整数型からstring型への型キャストが可能かを確認しよう
・整数型からbool型への型キャストが可能かを確認しよう

作成例

//p.66 cast01.cs
using System;
class cast01
{
    public static void Main()
    {
        long a = 33;
        byte b;
        b = (byte)a; //long型からbyte型にキャストすればbyte型変数に代入可能
        double w1 = (double)b;    //byte⇒doubleの型キャストはOK
        decimal w2 = (decimal)b;  //byte⇒decimalの型キャストはOK
        char w3 = (char)b;        //byte⇒charの型キャストはOK(文字コードが33の文字!になる)
        //string w4 = (string)b; //byte⇒stringの型キャストは文法エラーになる
        //bool w5 = (bool)b;     //byte⇒boolの型キャストは文法エラーになる
        Console.WriteLine("w1 = {0} w2 = {1} w3 = {2}", w1, w2, w3); //2 2 !
    }
}

今週の話題

ゲームソフト販売本数ランキング:今週1位は「マリオ&ルイージRPG ブラザーシップ!(Switch)」 GO!
“対話なくして前進なし”ゲーム向けオーディオミドルウェア「Wwise」が日本ユーザーに寄り添う理由とは…フィードバックをもとにレイアウトの大幅変更も【CEDEC2024 セッションレポート&インタビュー】GO!
サイバーエージェントが大幅営業増益で着地、映画「ウマ娘」も成功で新たな局面へ【ゲーム企業の決算を読む】GO!
PS Storeの2024年10月ダウンロードランキングが公開―PS5の第1位は『パルワールド』 GO!

ユービーアイソフトは消費者を騙した―サービス終了でプレイ不能の『The Crew』ユーザーが救済と賠償を求め集団訴訟へ GO!

前回のコメント

・わかりやすかったです
・理解できた

 何よりです。

・型やサフィックスなど、今回もいろいろ言葉が出てきているので、頑張って覚えていきたいです。
・今回は少し追いつくのが大変でしたし最初のおさらいで突っかかったので
 復習してこようと思います。
・使い分ける種類が増えてきて難しくなってきたので、頑張ります。

 応援します。解説が必要でしたら、いつでもリクエストしてください。

・復習をしているのですが、30ページのtext05.csがどうしても理解できなかったので、もう一度解説してほしいです。
 頭の中で正解像がイメージできないのです。

 text05.csのテーマである「桁数の指定」は「表示をいじくる」というよりは
 「データから文字列を作る時に編集し、それを表示する」という手順になっています。
 よって、「”{0, 5}”, 123」とすれば
 「5桁分の空白文字列を用意して、0番目のデータ(123)を右から詰めよう」
 ⇒「□□□□□」⇒「□□123」となり、これを表示するわけです。
 ただし、桁数が足りなければ、自動的に増やしますので、桁数の指定が無視されることになります。
 また、この時に、他の文字や式(変数)を含むこともできますので、x = 10, y = 123456789 で、
 「”x = {0, 5}, y = {1, 3}”, x, y」とすれば
 「文字列 “x = ” と5桁分の空白文字列を用意して、0番目のデータ(10)を右から詰めよう」そして、
 「文字列 “, y = ” と3桁分の空白文字列を用意して、1番目のデータ(123456789)を右から詰めよう」
 ⇒「x = □□□□□, y = □□□」⇒「x = □□□10, y = 123456789」となり、これを表示するわけです。
 つまり「”x = {0, 5}, y = {1, 3}”, x, y」の1個目のカンマは文字列の一部であり、
 2個目と3個目のカンマは式(変数)の区切りになっています。

講義メモ 後半

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 = 4900000000UL; //49億をulong型で扱う(このULは略しても文法エラーにはならない)
・実数型サフィックスは「F」でfloat型、「M」でdeciml型で扱える
 ※ 小文字でも良い。また「d」でdouble型にできるが、指定不要
・例: float work = 3.141592F; //円周率をfloat型で扱う(このFは略すと文法エラー)

提出:ミニ演習 mini059.cs

・上記のサフィックスの2つの例を試すプログラムを作ろう
・略すと文法エラーになる場合はメッセージを確認してからコメントアウトすると良い

講義メモ

・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型の変数に代入して表示し誤差を確認しよう
・表示できる桁数を工夫すること
・また、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); //【変更】
    }
}