- 締切済み
2つの要素をペアで管理する方法
「氏名」と「学籍番号」のペアで管理しておき、氏名を入力で受けた後、対応する学籍番号を出力するプログラムを作成したいです。 この「氏名」と「学籍番号」はあらかじめヘッダか何かに定義しておきたいのですが、このような方法はありますでしょうか? ファイルを読み込まず、また数が膨大になっても対応できるようにしたいのですが。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- cyacya2000
- ベストアンサー率54% (39/71)
#3です。 #4さんの言うとおり、配列の定義をヘッダに書くのはよろしくありません。 ただ、質問の中に、 「この「氏名」と「学籍番号」はあらかじめヘッダか何かに定義しておきたいのですが、」 とあったのでこうしただけです。 タグやvoidの件は私のサボりです。失礼しました。 前回の例は、きれいなプログラムを書いたわけではなく、あくまで、質問者さんの質問内容に従って書いただけです。 誤解させてしまったかもしれません。ごめんなさい あと、やはりデータはプログラムと切り離した方が良いと思うのですが、プログラム内部にデータを持ちたい理由は何ですか? 速度にシビアなシステムなのでしょうか?
- Tacosan
- ベストアンサー率23% (3656/15482)
main が void を返すのもちょっとどうかと思うし, 配列の「定義」までヘッダに書いちゃうのはよろしくないですよ>#3. あと, 構造体にタグも張ってあげたいところ. 例えば struct Meibo { int id; char [MAXLEN+1]; }; struct Meibo meibo[]; までをヘッダに書いて, 「配列 meibo に実際にデータを入れる」のは別のソースにする (で最後にリンクする) のが普通でしょう.
- cyacya2000
- ベストアンサー率54% (39/71)
C言語なら構造体配列を使用すればよいのでは? >数が膨大になっても対応できるようにしたい 膨大がどの程度かにもよりますが、配列の大きさを明記せず、初期値リストを指定すれば、初期値リストが入る数分の大きさにしてくれます。 大きさがわからないので、終端を示す学籍番号(例では-1)をいれました。 また、一般論ですが、データが膨大になるのであればプログラムと分離(データファイルを読み込む)した方がよいと思います。プログラム中にデータを持つと、データを書き換えるたびにコンパイルしないといけないので面倒ですし、人間は必ずミスを犯しますから、ソースファイルはなるべく触りたくありません。 (例) #include <stdio.h> #include <string.h> //以下の部分をヘッダに定義 #define MAXLEN 20 struct { int no; char name[MAXLEN+1]; } meibo[]={ 1,"a", 2,"b", 3,"c", -1,"" //学生番号ー1が最後 }; //ここまでヘッダに定義 void main(){ char name[MAXLEN+1]; scanf("%s",name); for(int i=0;meibo[i].no!=-1;i++){ if(strcmp(meibo[i].name,name)==0){ printf("name:%s,no:%d\n",meibo[i].name,meibo[i].no); break; } } }
- iphone-goo
- ベストアンサー率36% (4/11)
2つの要素である氏名と学籍番号では、学籍番号は必ず一意になります(氏名は同姓同名もある)。 そこで、学籍番号をキーにしたHashTableやMapのようなものを使われてるデータ構造にしたら、いかがでしょうか? 言語がC++なら、STLが使えるので、MAPもそのまま使えると思います。 学籍番号から氏名を取ってこれるだけでなく、氏名から学籍番号もそうなめすることで可能です。
- graycat000
- ベストアンサー率51% (53/102)
状況がよくわかりませんが、C言語でしたら、例えば次のようにするのはどうでしょう。 氏名を name 配列に入れ、学籍番号を number 配列に入れます。 学生の総数は LIST_MAX として定義しておきます。 -- hoge.h -- #define LIST_MAX 256 char* name[LIST_MAX] = { "A", "B", "C", ... "LAST" }; int number[LIST_MAX] = { 1, 2, 3, ... 256 } -- hoge.c -- #include "hoge.h" int main(void) { : printf("学籍番号 %s, 氏名 %s\n", number[10], name[10]); : } プログラム動作中に配列サイズを変更するならば、動的メモリ割り当て malloc などを使うことになるでしょう。もっと高度にするならば構造体や、C++なら new や class を使って抽象化していきます。