みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

2つの要素をペアで管理する方法

「氏名」と「学籍番号」のペアで管理しておき、氏名を入力で受けた後、対応する学籍番号を出力するプログラムを作成したいです。
この「氏名」と「学籍番号」はあらかじめヘッダか何かに定義しておきたいのですが、このような方法はありますでしょうか?
ファイルを読み込まず、また数が膨大になっても対応できるようにしたいのですが。

投稿日時 - 2009-12-22 00:45:33

QNo.5539186

暇なときに回答ください

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

#3です。

#4さんの言うとおり、配列の定義をヘッダに書くのはよろしくありません。
ただ、質問の中に、
「この「氏名」と「学籍番号」はあらかじめヘッダか何かに定義しておきたいのですが、」
とあったのでこうしただけです。
タグやvoidの件は私のサボりです。失礼しました。
前回の例は、きれいなプログラムを書いたわけではなく、あくまで、質問者さんの質問内容に従って書いただけです。
誤解させてしまったかもしれません。ごめんなさい

あと、やはりデータはプログラムと切り離した方が良いと思うのですが、プログラム内部にデータを持ちたい理由は何ですか? 速度にシビアなシステムなのでしょうか? 

投稿日時 - 2009-12-22 20:23:05

ANo.4

main が void を返すのもちょっとどうかと思うし, 配列の「定義」までヘッダに書いちゃうのはよろしくないですよ>#3. あと, 構造体にタグも張ってあげたいところ. 例えば
struct Meibo {
int id;
char [MAXLEN+1];
};
struct Meibo meibo[];
までをヘッダに書いて, 「配列 meibo に実際にデータを入れる」のは別のソースにする (で最後にリンクする) のが普通でしょう.

投稿日時 - 2009-12-22 11:48:48

ANo.3

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;
}
}
}

投稿日時 - 2009-12-22 11:08:06

ANo.2

2つの要素である氏名と学籍番号では、学籍番号は必ず一意になります(氏名は同姓同名もある)。

そこで、学籍番号をキーにしたHashTableやMapのようなものを使われてるデータ構造にしたら、いかがでしょうか?

言語がC++なら、STLが使えるので、MAPもそのまま使えると思います。
学籍番号から氏名を取ってこれるだけでなく、氏名から学籍番号もそうなめすることで可能です。

投稿日時 - 2009-12-22 01:49:54

ANo.1

状況がよくわかりませんが、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 を使って抽象化していきます。

投稿日時 - 2009-12-22 01:04:18

あなたにオススメの質問