[PR]テレビ番組表
今夜の番組チェック
********************************
■■■■
■ ■ ■ ■
■ ■■■ ■■■
■ ■ ■ ■
■■■■
〜基礎から ★ C++Programing〜
********************************
【注意】 このマガジンは、最大化してお読みください。
また、等角フォントでお読みください。
(MS ゴシックなど)
********************************
発行者 むーくん
マガジンNO. 130(8-15)
発行日 01/05/09
講読人数 2500名ぐらい
マガジンID 0000050494
このマガジンは、まぐまぐから配信されています。
********************************
★あいさつ★
五月晴れや、五月雨とは、本当は6月の天気を指すのだそうです。
前者は梅雨の晴れ間、後者は梅雨を指します。
他にも誤解して使っている言葉がありそうですね。
********************************
********************************
★目次★
・列挙型
・文法
・詳細な文法
・プログラムのスタイル
・使い方
・サンプルプログラム
・今日のポイント
・予告
********************************
★列挙型★
今日は、列挙型を紹介します。
列挙型とは、定数を定義するものです。
構造体や共用体に似ていますが、違います。構造体や共用体は
型を定義するものでしたね。
定数とは、知ってのとおり、const宣言されたものか、「3」などの
数字、「"hello"」などの文字列などが挙げられます。
これをグループ化して分かりやすくしたのが列挙型です。
********************************
★文法★
┏━━━━━━━━━━━━━━━┓
┃ enum 新しい型名{ ┃
┃ 定数名 = 初期値 ┃
┃ ・ ┃
┃ ・ ┃
┃ }; ┃
┗━━━━━━━━━━━━━━━┛
キーワードは「enum」です。「イーナム」などと読みます。
また、これは、
enum 新しい型名{ 定数名 = 初期値, ・・・ };
の様に一行で書くことがほとんどです。
【新しい型名】
構造体や共用体と同じです。
省略もできますが、その場合、変数は作れません。
【定数名】
変数と同じ規則で名前を付けることができます。
【初期値】
これは、省略できます。
省略した場合の初期値は1となります。
********************************
★詳細な文法★
例えば、以下のように宣言したとします。
enmu day{sun=1, mon, the, wed, thu, fri, sat};
これは、
const int sun = 1;
const int mon = 2;
const int the = 3;
const int wed = 4;
const int thu = 5;
const int fri = 6;
const int sat = 7;
とほぼ等価です。
また、途中から初期値を変えることもできます。
enum choice{end,attack,defence,item,magic,escape=11,operate};
これは、
const int end = 0;
const int attack = 1;
const int defence = 2;
const int item = 3;
const int magic = 4;
const int escape = 11;
const int operate = 12;
とほぼ等価です。
初期値には整数しか使えません。浮動小数点はエラーになります。
また、サイズはint型と等しくなります。
********************************
★プログラミングのスタイル★
今まで、特に断っていませんがプログラム中に直接的な数値(直値)を
使うことはよいことではありません。
例えば、配列の章では
const int N = 100;
の様に要素数を定数定義していたはずです。
こうしておけば、もし、要素数を変更するようなことになっても
Nの値を一カ所変更するだけで済みます。
大きいプログラムではこうしていないと絶対に変更漏れが生じ
意味不明のバグの原因になります。
また、「3.14」などの有名な数値なら理解できるかもしれませんが
その他の勝手に決めた数値は、読む側が大変困ります。
その定数になった意図がよく分からないからです。
一カ所だけならコメントをつけて済ませるという手もありますが
仕様が変わり、コメントの変更を忘れたら悲劇です。(笑)
これからは、頻出する定数には定数定義するように心掛けましょう。
例)どっちが分かりやすいですか??
(coutの出力に、16進数で+符号付きで出力指示している)
cout.setf(ios::hex | ios::showpos);
cout.setf(8 | 2048);
こうやって「8」とか「2048」とかいわれても
何のことだかさっぱり分かりませんね。
********************************
★使い方★
enumで宣言した後は、その中で宣言された定数は、
普通の定数として振る舞います。
要するに、const宣言されたものと同じです。
また、enumで宣言された型の変数を作ることができます。
choice s;
の様に宣言します。
s = attack;
の様な形で列挙定義された値を代入できます。
また、基本的にこの型はintと互換性をもっています。
但し、代入などをすると警告されますが。
int型との比較はいつでも有効なので
if文で使う定数としての役割だけを考えてもOKです。
********************************
★サンプルプログラム★
RPGの戦闘を擬似的に作ります。
#include<iostream>
using namespace std;
enum choice{end,attack,defence,item,magic,escape=11,operate};
int main(){
int player;
do{
cout << "あなたの攻撃は?" << endl;
cout << "終わり0、攻撃1、防御2、道具3、魔法4" << endl;
cout << "逃げる11、作戦12" << endl;
cin >> player;
switch(player){
case end: /* endは列挙定数(0を意味する) */
break;
case attack:
cout << "ぎゃあーー!" << endl;
break;
case defence:
cout << "かかってこいよ!" << endl;
break;
case item:
cout << "HPが回復した!" << endl;
break;
case magic:
cout << "アチーーっ!!" << endl;
break;
case escape:
cout << "しかし逃げられない!" << endl;
break;
case operate:
cout << "いのちだいじに!!" << endl;
break;
default:;
}
cout << endl;
}while(player);
return 0;
}
【解説】
くだらないですが、列挙の使用例を示しています。
「攻撃」や「防御」などは通常、何らかの値を当てはめて表現
すると思いますが、直値を使ったのでは分かりづらくなります。
switch文を見てください。
場合分けが「attack」「defence」などのように意味のある名前が
つけられているので、ずいぶん分かりやすくなります。
case 0:
・
・
などと書いてみて比較してみてください。
違いが一目瞭然です。
********************************
★今日のポイント★
・プログラムにはなるべく直値を使わない
・複数の定数定義には列挙型(enum)を使う
********************************
★予告★
問題3を学習します(知識編)
********************************
********************************
講読解除はこちら
http://members.tripod.co.jp/mukun_mmg/mmg/cpp.html
バックナンバーはこちら
http://members.tripod.co.jp/mukun_mmg/mmg/cpp.html
内容について質問やご意見など
smukun@hotmail.com
筆者のWebサイト(むーくんの理学的なんでも講座)
http://members.tripod.co.jp/mukun_mmg/
************************************