2017年09月17日
《その30》 列挙体(p.163演習4-12,p.165演習4-13)
新版明解C++入門編 p.162 List 4-17 のプログラムで、重要かなと個人的に思った箇所は つぎの2つです。
@ while (type < Dog || type > Invalid);
A animal_selected = static_cast<animal>(type);
@ のポイントは、列挙体である animal型の Dog や Invalid を、そのままキャスト無しで 整数型である type と比較することができるということ。
A のポイントは、列挙体 animal_selected = type; と書くことはできない点です。つまり、整数を列挙型へ代入するときにはキャストが必要だということです。
◆ 列挙型から整数への変換ではキャストが不要
◆ 整数から列挙型への変換ではキャストが必要
新版明解C++入門編 p.163 演習4-12
トランプの記号(ダイヤ、ハート、クラブ、スペード)の四つの列挙子をもつ列挙体を定義せよ。各列挙子の値は、先頭から順に 0, 1, 2, 3 とし、List 4-17と同様にキーボードから値を読み込んで表示すること。
// p163_演習4-12
#include <iostream>
using namespace std;
int main()
{
enum suit { Diamond, Heart, Club, Spade };
int type;
do {
cout << "0…ダイヤ 1…ハート 2…クラブ 3…スペード : "; cin >> type;
} while (type < Diamond || type > Spade); // キャストが不要
suit selected = static_cast<suit>(type); // キャストが必要
switch (selected) {
case Diamond: cout << "ダイヤが好きです!\n" ; break;
case Heart: cout << "ハートが好きです!\n" ; break;
case Club: cout << "クラブが好きです!\n" ; break;
case Spade: cout << "スペードが好きです!\n"; break;
}
}
新版明解C++入門編 p.165 演習4-13
性別、季節、曜日などを表す列挙体を自由に定義し、それを用いたプログラムを作成せよ。
「自由に」ということなので、何月かを数字で入力すると その月の呼び名を 旧暦で表示するプログラムにしました。
最初に、名前のある普通の列挙体を使うプログラムを作って、次に、それを名前のない列挙体を使うプログラムに変更してみました。
// p165_演習4-13_1
#include <iostream>
using namespace std;
int main()
{
enum months { January = 1, February, March, April, May, June,
July, August, September, October, November, December};
int num;
do {
cout << "何月?:"; cin >> num;
} while (num < January || num > December);
months selected = static_cast<months>(num);
switch (selected) {
case January : cout << "睦月\n" ; break;
case February : cout << "如月\n" ; break;
case March : cout << "弥生\n" ; break;
case April : cout << "卯月\n" ; break;
case May : cout << "皐月\n" ; break;
case June : cout << "水無月\n" ; break;
case July : cout << "文月\n" ; break;
case August : cout << "葉月\n" ; break;
case September : cout << "長月\n" ; break;
case October : cout << "神無月\n" ; break;
case November : cout << "霜月\n" ; break;
case December : cout << "師走\n" ; break;
}
}
次に、上のプログラムを 名前のない列挙体を使う形に変更してみました。
// p165_演習4-13_2
#include <iostream>
using namespace std;
int main()
{
enum /*months*/ { January = 1, February, March, April, May, June,
July, August, September, October, November, December};
int num;
do {
cout << "何月?:"; cin >> num;
} while (num < January || num > December);
// months selected = static_cast<months>(num);
// switch (selected) {
switch (num) {
case January : cout << "睦月\n" ; break;
case February : cout << "如月\n" ; break;
case March : cout << "弥生\n" ; break;
case April : cout << "卯月\n" ; break;
case May : cout << "皐月\n" ; break;
case June : cout << "水無月\n" ; break;
case July : cout << "文月\n" ; break;
case August : cout << "葉月\n" ; break;
case September : cout << "長月\n" ; break;
case October : cout << "神無月\n" ; break;
case November : cout << "霜月\n" ; break;
case December : cout << "師走\n" ; break;
}
}
--
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/6711412
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック