プロが教えるわが家の防犯対策術!

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

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

A 回答 (3件)

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



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

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

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

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

お礼日時:2003/04/25 16:19

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



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

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

"%d位"に入れたいのは struct dataのint rankなんでしょう?
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/04/25 16:18

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

でしょうね。

この回答への補足

ちゃんと実行できました。ありがとうございます。
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
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!