• ベストアンサー

C言語の enum の使い方

インターネットのサイトなどを利用してC言語を勉強しています。 いま一通り基本的な勉強が済んだところですが、enum というユーザー定義変数をどんな風に使えばよいのか、今ひとつわかりません。サンプルコードなどを見ても、 enum でなくても配列を使えば出来そうなものが多いのですが、この型の変数はどう使えば効果的なのでしょうか。 詳しい方、どうかよろしく教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

>enum というユーザー定義変数を 変数ではないでしょう。 むしろ定数かと。 >enum でなくても配列を使えば出来そうなものが多いのですが 具体的になにがあります? ちなみに配列ではありませんので誤解なきよう。 http://homepage2.nifty.com/well/enum.html とか、いい感じに説明されていますかね。 defineだとただの置き換えなので何でも設定できてしまう。とか型チェックができない。とかの問題があります。 私自身、最近使ったやり方では…テーブルのインデックス用に使いましたね。

papashiroSooke
質問者

お礼

早速お返事いただきまして、ありがとうございます。 今までは説明を読んだだけでそう感じていたのですが、実際に enum を使って書かれたプログラムを配列で出来るかどうかやってみたところ、これがまったく難しいことであるということがわかりました。 下にそのプログラム例を挙げてみます。 #include <stdio.h> /* To shorten example, not using argp */ int main () { enum planets { Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto }; enum planets planet1, planet2; planet1 = Mars; planet2 = Earth; if (planet1 > planet2) puts ("Mars is farther from the Sun than Earth is."); else puts ("Earth is farther from the Sun than Mars is."); return 0; } このプログラムと同じ結果を、配列を使って出そうとしましたが、配列の要素である惑星の名前(文字列)からそのインデックスを求める必要があり、enum のように簡単ではないとわかりました。 正直に言いまして、enum は本当にざっと読みすごしただけでしたが、今回その効果の一端がわかったような気がします。 文字の並び(普通に言う文字列ではなくて)が決まった値を持っているというところがポイントなのでしょうね。 ご紹介頂いたサイトなどにも行って、また勉強したいと思います。

その他の回答 (1)

  • wormhole
  • ベストアンサー率28% (1619/5654)
回答No.1

>サンプルコードなどを見ても、 enum でなくても配列を使えば出来そうなものが多いのですが、この型の変数はどう使えば効果的なのでしょうか。 配列にenumの変わりをさせるというのが全く想像できないんですが。 enumそのものを勘違いされていませんか? enumは、限定的な値を持つ型を定義するものなんですが。 enum POWER_STATUS { ON, OFF, }; とか。

papashiroSooke
質問者

お礼

早速お返事いただきまして、ありがとうございます。 回答者さんのおっしゃるとおり、enum をまったく勘違いしていたようです。 enum を使ったプログラムを配列で書けるというのは、今までそのようなものを自分で書いてそう感じていたということではなく、サンプルなどを見てそう感じていただけです。実際にやってみたところ、これがまったく難しいことであるということがわかりました。 下にそのプログラム例を挙げてみます。 #include <stdio.h> /* To shorten example, not using argp */ int main () { enum planets { Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto }; enum planets planet1, planet2; planet1 = Mars; planet2 = Earth; if (planet1 > planet2) puts ("Mars is farther from the Sun than Earth is."); else puts ("Earth is farther from the Sun than Mars is."); return 0; } このプログラムと同じ結果を、配列を使って出そうとしましたが、配列の要素である惑星の名前(文字列)からそのインデックスを求める必要があり、enum のように簡単ではないとわかりました。 正直に言いまして、enum は本当にざっと読みすごしただけでしたが、今回その効果の一端がわかったような気がします。 文字の並び(普通に言う文字列ではなくて)が決まった値を持っているというところがポイントなのでしょうね。

関連するQ&A

  • C言語に関することについて教えてください

    学校の問題集にでてきた問題がわかりません、どうか教えてください 1 プログラムの役割、必要性について説明せよ 2 プログラムにおける変数と定数の役割を説明せよ。また、ローカル変数の有効な範囲について説明せよ。 3 C言語で使う変数が他について、宣言子と、printf関数、scanf関数それぞれにおいて対応する書式指定子を対応表にせよ。また、変数名を決める際に守るべき文法上の規則と、プログラマとして配慮すべき事項を説明せよ。 4 配列について、その役割と定義方法を説明せよ。 5 コンピュータにおける文字処理に必須なアスキーコードについて説明せよ。 6 C言語における文字列について、文字列定数、文字列変数を説明せよ。 7 C言語における繰り返し処理の文法(for,while,do~while)を、プログラムコード列を示して説明せよ。 8 C言語における条件判断の文法(if,else,else if)を、プログラム列を示して説明せよ。 9 繰り返し、条件判断において利用する論理式(等値演算子、関係演算子、論理演算子等で記迷する式)について、その記迷の方法を論理和、論理積も含めて説明せよ。 10 変数のアドレスについて説明せよ。また、ポインタについて、アドレスとの関連性を踏まえて、その役割と定義方法を説明し、具体的な使い方のプログラムコード例を示せ。 11 ポインタと配列の関係について、ポインタによる配列操作を列に説明せよ。 12 関数について、その役割と定義方法について説明せよ(戻りがた、関数名、引数リスト)。また、自作関数をそれらを利用するmain関数のプログラムコード例を示せ。 13 scanf関数の戻り値について、その内容を説明して、どのような際に利用すると便利か、プログラムコード例を示して説明せよ。 14 引数にポインタを利用する関数のプログラムコード例を示して、ポインタの必要性、重要性を説明せよ。 15 構造体について、その役割と定義方法を説明し、具体的な使い方のプログラムコード例を示せ。 16 ファイルポインタについて説明し、ファイル入出力の方法についてプログラムコード例を示して説明せよ。

  • C言語の上級者を目指したい。

     就職活動でソフト会社へ面接に行きました。 金融関係のプログラムをつくっている会社です。 そのとき社長さんから聞いた話です。 「学校を出たばかりの人にプログラムを書かせると100万口座の処理に3日もかかってしまうが、プロが書いたものは10分で処理できる。」 ポインタをしっかり勉強しておいて欲しいとの話でした。  結局、その会社は断りましたが自信をなくしてしまいました。 残りの1年はCをどのように勉強していけば良いでしょうか。 アドバイスをお願いします。  いまの私のレベルは基本情報処理技術者試験をC言語で合格しています。 勉強した本は下記の通りです。 (1) やさしいC ソフトバンク (2) 明解C言語入門 ソフトバンク (3) らくらく突破C言語 技術評論社 (4) 合格サポートC言語 一橋出版 (5) ポインタの極意 ソフトバンク (6) C言語によるアルゴリズムとデータ構造 ソフトバンク   ただし、(1)~(4)はサンプルコードを入力し演習問題も自力で解いてますが  (5)、(6)は一通り読んだだけです。

  • C言語の勉強方法

    こんにちは。 今C言語の勉強方法で悩んでいます。 私のC言語暦は、大学の授業の時に、文法一通りを覚えました。(当時はオセロゲームの次の一手を考えるようなアプリを作りました。) ポインタに関しては、柴田望洋さんの「C言語ポインタの極意」という本を少し読みました。ぼんやりと理解しているような状態です。K&Rの本は概ね理解できます。(演習問題はやっていません。) 仕事としてしているわけではなく、本はいろいろ読んでいるのですが、あまり自分でサンプルコードを打ってみたりはしていません。演習問題も解いていません。 APIに関する知識は乏しいです。アルゴリズムとデータ構造は、ヒントがないと、自力では書く自信がありません。基本情報処理技術者の資格も持っていません。 こういったレベルですが、これからどういった勉強をすればいいでしょうか?アドバイスを頂けるとありがたいです。

  • C言語の配列をPush(追加)するには

    C言語の配列をPush(追加)するには タイトル通りなのですが、OPENCVにあるcvSeqPushのように 配列の末尾に新たな数値を追加する関数はあるのでしょうか?? できれば、簡単なサンプルコードもしくはそれが掲載されているページを紹介していただくと とても助かります。よろしくお願いします。

  • C言語の勉強方

    基本情報の試験の言語がCで受験しなくてはいけないんですが、独学で0からのスタートなので難しくて参ってます。2週間かけて、基礎の部分を一通り勉強して、前半部分は理解できたんですが、後半の 構造体、ポインタ:なんとなく理解 ユーザ関数:理解不能 といった感じなので、応用問題とかになると全然分からなくて参ってます。 C言語の勉強の仕方や初心者でも分かりやすく理解できる参考書などは無いでしょうか??教えて下さい。 1週間シリーズがいいと聞いたんですが、あれはどうなんでしょうか??

  • 関数と変数と定数と式をまとめて [C言語]

    はじめまして。私はC言語初心者です。 C言語では、関数の引数や変数への代入や配列の添え字などに、変数や定数や、式や関数の値を利用できるじゃないですか。私は今C言語について勉強したことをファイルにまとめていっているのですが、上記のようなことを説明するたびに「関数と変数と定数と式」と書くと長ったらしくなってしまいます。そこで、これらをまとめていう言葉があったら教えて欲しいのです。 回答よろしくお願いします。

  • コンパイルせずにマクロの置き換えだけ実行(c言語)

     こんにちは。私はwin32APIを勉強しているc言語初心者なのですが、win32APIにはマクロで定義されたたくさんの新しい型があって、何がなんだか分からなくなります。なのでマクロの置き換えだけを実行してその新しい型がなんの型で出来ているのかを調べたいのですが、それをするにはどうすればいいでしょうか?使っているコンパイラはVC++2008です。回答よろしくお願いします。

  • C言語

    以下のC言語のプログラムを教えてください。 お願いします。 (1)標準入力から文字列(2 文字以上)を入力し,文字数を計上すると共に,入力された文字列の逆順に入れ替える処理を実現してください.なお,以下の要件を満たしたプログラムを作成してください. ・ 入力された文字列は,char 型の配列(要素数50)で受け取ること ・ 文字数を計上するcount 関数(引数:配列のアドレス,戻り値:文字数)を定義 し,main 関数より呼び出すこと ・ 文字列を逆順に入れ替えるreverse 関数(引数:配列のアドレス,戻り値:無し) を定義し,main 関数より呼び出すこと ・ 標準出力の処理は,main 関数で記述すること 【プロトタイプ宣言】 int count(char *str); void reverse(char *str); 【実行結果】 文字列を入力してください(2 文字以上) apple 文字数 = 5 入れ換え前 apple 入れ換え後 elppa (2)char 型の配列(要素数50)を2 つ宣言し,標準入力から2 つの文字列を入力してください.そして,格納した字列を入れ替える関数(swapstr 関数)を作成し,入れ替え前と入れ替え後の配列内の値(文字列)を配列名とともに標準出力するプログラムを作成してください. 【プロトタイプ宣言】 void swapstr(char *str1, char *str2); 【実行結果】 2 つの文字列を入力してください apple strawberry 入れ換え前 配列str1 = apple 配列str2 = strawberry 入れ換え後 配列str1 = strawberry 配列str2 = apple

  • C言語のこれを日本語にすると

    お世話になっております。 いまC言語のプログラムを勉強しているのですが こちらの意味が分かりません。 //使用変数の定義 int port; char s_port[7]; これを訳すとどういう意味になるのでしょうか? またかっこの7はどういう意味でしょうか? あわせてご回答宜しく御願いいたします。

  • C言語について

    C言語の問題なのですか、作成したのですが内容がわからないです。テキストを読んでも解説が書いていないので、出来ればどなたか簡単な解説でも教えて頂けるとありがたい。 〈コード〉 #include <stdio.h> int main(void) { short point[] = {234, 819, 18, -6492, 795, 20302, 2431, 9029, 0, -28009}; // 定義と逆順に値を表示する for (int i = sizeof(point) / sizeof(point[0]) - 1; i >= 0; i--) { //sizeofで配列要素数を算出 printf("%d\n", point[i]); } return 0; }

専門家に質問してみよう