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

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

解決済みの質問

C言語で、引数が構造体の場合

生徒の名前、点数、順位を表示するプログラムをつくりたいのですが、(下のような関数を用いることを前提として)

void rank1(struct data *x,int n)
{
int i,j;
for(i=0;i<n;i++)
x[i].rank=1;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(x[i].score<x[j].score)
x[i].rank++;
}


このような場合、関数の引数として、構造体が用いられているわけですよね?
引数が構造体の場合、どのように引数の部分を書けばいいのか分かりません。
私が考えたプログラムは下記の通りです。
もちろんうまくいきませんでした。
たぶん最後のprintfの所のrank1の引数が間違っているだけだと思うんですが、どうでしょうか?


include<stdio.h>

struct data {
char name;
int score;
int rank;
};

void rank1(struct data *x,int n)
{
int i,j;
for(i=0;i<n;i++)
x[i].rank=1;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(x[i].score<x[j].score)
x[i].rank++;
}

void main(void)
{
int m;
static struct data x[] = {{'A',56,1},
{'B',79,1},
{'C',34,1},
{'D',91,1},
{'E',69,1}};
for(m=0;m<5;m++)
printf("%c君 %d点 %d位\n",x[m].name,x[m].score,rank1(x,m));
}

投稿日時 - 2003-04-25 15:01:35

QNo.531807

困ってます

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

>としたにもかかわらず、下のようにプリントするときはrankに1がつかないのでしょうか?

まず、rank1は関数名、rankはstruct data構造体のメンバ変数名です。
全然別のものです。

rank1関数は、struct data構造体の配列を調べてメンバ変数rankに順位を入れます。

printfで表示するのは、このメンバ変数を表示しなければなりません。
つまり、printfの引数は x[m].rank です。

投稿日時 - 2003-04-25 15:43:13

お礼

なるほど、そういうことですか。
分かりやすい説明、本当にありがとうございました。

投稿日時 - 2003-04-25 16:19:40

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

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

回答(3)

ANo.2

まずrank1()関数を実行して値をセットアップし、printf()関数では値を取り出すだけにするということです。

printf("%c君 %d点 %d位\n",x[m].name,x[m].score,rank1(x,m));

この文がおかしいんです。なぜprintf()関数の中でrank1()関数を実行しているんですか?値が返る関数ならまだしもこれはvoid関数になっていますよ。

"%d位"に入れたいのは struct dataのint rankなんでしょう?

投稿日時 - 2003-04-25 15:40:44

お礼

すいません。勉強不足であまりよく分かっていなかったもので・・・回答ありがとうございました。

投稿日時 - 2003-04-25 16:18:23

ANo.1

for(m=0;m<5;m++)
printf("%c君 %d点 %d位\n",x[m].name,x[m].score,rank1(x,m));

ではなくて、

rank1(x,5);
for(m=0;m<5;m++)
printf("%c君 %d点 %d位\n",x[m].name,x[m].score,x[m].rank);

でしょうね。

投稿日時 - 2003-04-25 15:09:31

補足

ちゃんと実行できました。ありがとうございます。
1つ質問があるんですが、

>rank1(x,5);

というrankを定義することをしていなかったのと、x[m].rankというように、rankもメンバの1つのように書けばいいということは分かったんですが、どうして

void rank1(struct data *x,int n)

としたにもかかわらず、下のようにプリントするときはrankに1がつかないのでしょうか?

>for(m=0;m<5;m++)
>printf("%c君 %d点 %d位\n",x[m].name,x[m].score,x[m].rank);

投稿日時 - 2003-04-25 15:24:17

あなたにオススメの質問