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