
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を探す
今、見られている記事はコレ!
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列の要素数に変数を入れたい...
-
define で 配列
-
c言語
-
C#で構造体の配列を持った構造...
-
2番目の最大値を求める
-
VB.NETにおける構造体の初期化
-
ポインタを使って構造体の配列...
-
IPアドレスを配列に代入する方法。
-
AfxBeginThread の引数について
-
関数から配列を返すには?
-
C言語のポインタによる関数の引...
-
構造体の配列 char *' 型は 'ch...
-
C言語の課題が出たのですが自力...
-
C言語において、 配列要素をひ...
-
C++:構造体:newで入れ子:del...
-
C言語 ファイルの指定された行...
-
c言語プログラミング 等差数列...
-
CStringからchar*への型変換に...
-
C言語にて構造体のメンバがNULL...
-
Integer変数をカラにしたいので...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
C言語において、 配列要素をひ...
-
配列の要素数に変数を入れたい...
-
c言語
-
define で 配列
-
C#で構造体の配列を持った構造...
-
C#で配列が空かを判定するには?
-
コンボボックスでデフォルト値...
-
C言語 ファイルの指定された行...
-
C言語の2次元配列 容量が大き...
-
2番目の最大値を求める
-
MFCのCArrayを使った二次元配列
-
MFC - ダイアログボックスのPic...
-
構造体のextern方法
-
要素数・要素の値が未定の配列...
-
C言語についてです 5人のテスト...
-
配列のアドレス部
-
構造体を引数とする関数について
-
fclose()でセグメンテーション違反
-
C言語 数値の連続入力について
おすすめ情報