[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/

************************************

前のページ   後のページ   目次へ