
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
#3です。
#4さんの言うとおり、配列の定義をヘッダに書くのはよろしくありません。
ただ、質問の中に、
「この「氏名」と「学籍番号」はあらかじめヘッダか何かに定義しておきたいのですが、」
とあったのでこうしただけです。
タグやvoidの件は私のサボりです。失礼しました。
前回の例は、きれいなプログラムを書いたわけではなく、あくまで、質問者さんの質問内容に従って書いただけです。
誤解させてしまったかもしれません。ごめんなさい
あと、やはりデータはプログラムと切り離した方が良いと思うのですが、プログラム内部にデータを持ちたい理由は何ですか? 速度にシビアなシステムなのでしょうか?
No.4
- 回答日時:
main が void を返すのもちょっとどうかと思うし, 配列の「定義」までヘッダに書いちゃうのはよろしくないですよ>#3. あと, 構造体にタグも張ってあげたいところ. 例えば
struct Meibo {
int id;
char [MAXLEN+1];
};
struct Meibo meibo[];
までをヘッダに書いて, 「配列 meibo に実際にデータを入れる」のは別のソースにする (で最後にリンクする) のが普通でしょう.
No.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;
}
}
}
No.2
- 回答日時:
2つの要素である氏名と学籍番号では、学籍番号は必ず一意になります(氏名は同姓同名もある)。
そこで、学籍番号をキーにしたHashTableやMapのようなものを使われてるデータ構造にしたら、いかがでしょうか?
言語がC++なら、STLが使えるので、MAPもそのまま使えると思います。
学籍番号から氏名を取ってこれるだけでなく、氏名から学籍番号もそうなめすることで可能です。
No.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 を使って抽象化していきます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数から配列を返すには?
-
c言語
-
C言語において、 配列要素をひ...
-
define で 配列
-
C#で配列が空かを判定するには?
-
C#で構造体の配列を持った構造...
-
MFCのCArrayを使った二次元配列
-
配列の要素数に変数を入れたい...
-
コンボボックスでデフォルト値...
-
構造体を引数とする関数について
-
構造体のextern方法
-
C言語の課題が出たのですが自力...
-
万年カレンダーについて。
-
const で宣言してるのに、値が...
-
callocで二次元配列を作成する...
-
c言語 構造体
-
C言語について質問です。
-
AfxBeginThread の引数について
-
[C++/CLI]マネージコードで配列...
-
C言語の2次元配列 容量が大き...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
C言語において、 配列要素をひ...
-
c言語
-
C言語 ファイルの指定された行...
-
define で 配列
-
C#で構造体の配列を持った構造...
-
C言語の課題が出たのですが自力...
-
char型配列をint型に代入するには
-
C#で配列が空かを判定するには?
-
MFCのCArrayを使った二次元配列
-
コンボボックスでデフォルト値...
-
MFC - ダイアログボックスのPic...
-
c言語 構造体
-
2番目の最大値を求める
-
C言語から質問です。
-
Cのエラー
-
プログラミングに関する問題が...
-
C言語の2次元配列 容量が大き...
-
Visual C++を 用いたテキストフ...
おすすめ情報