dポイントプレゼントキャンペーン実施中!

n人の教科ごとの最高点、最低点を求めるプログラム

C言語で、タイトルのようなプログラムを作成しています。(n≦100)
教科は国語、数学、英語の3教科です。
作る際の条件として、最高点と最低点を同時に求める関数minmaxを一つだけしか作れません。

入力例)
% ./a.out
number of persons: 3
Japanese Math English
No.1: 90 80 70
No.2: 71 91 81
No.3: 82 72 92

min score: 71 72 70
max score: 90 91 92


現在、構造まで習いました。その知識をもとに以下のようにプログラムしました。(ただ、教科ごとの最高、最低点を求める部分は代表して国語の点の最低点を求める部分だけ載せました)


#include <stdio.h>
#define MAX 100

struct score{
    int jpn;
    int math;
    int eng;
};

void minmax(struct score, int, struct score *, struct score *);

main(){
    struct score s[MAX], min, max;
    int n, i;

    printf("number of persons: ");
    scanf("%d", &n);
    printf("Japanese, Math, English\n");

    for (i = 0; i < n; i++) {
        printf("No.%d: ", i+1);
        scanf("%d %d %d", &(s[i].jpn), &(s[i].math), &(s[i].eng));
    }

    minmax(s[MAX], n, &min, &max); <------------(☆)

    printf("min score: %3d%3d%3d\n", min.jpn, min.math, min.eng);
    printf("max score: %3d%3d%3d\n", max.jpn, max.math, max.eng);
}

void
minmax(struct score s[], int n, struct score *minscore, struct score *maxscore)
{
    int i, max, min;

    for (i = 1, min = s[0].jpn; i < n; i++) {
        if (min > s[i].jpn) {
            min = s[i].jpn;
        }
    }
    minscore->jpn = min;

(以下略)
}

しかし、これをコンパイルすると、
「(☆):パラメータの型1が関数宣言と一致しません。」と出ます。
どこがおかしいのでしょうか、どなたか教えてください。

A 回答 (2件)

よくみたら、プロトタイプと実際の定義が不一致です


> void minmax(struct score, int, struct score *, struct score *);
→void minmax(struct score [], int, struct score *, struct score *);

> minmax(struct score s, int n, struct score *minscore, struct score *maxscore)
> ということですか?

違います。対処法が逆です。

関数minmaxで受け取りたいのは、struct scoreの配列全体ですから、

> minmax(s[MAX], n, &min, &max); <------------(☆)
→ minmax(s, n, &min, &max);
です。

宣言で 「struct score s[MAX]」となっていますが、これは、「『s』という名前のstruct score がMAX個の配列」であって、「『s[MAX]』という名前のstcruct scroreの配列」ではないです。
配列全体を示す変数は s であって s[MAX]ではありません。

#defineで定義したマクロはコンパイル前の置き換わります。s[MAX]は実際にはs[100]としてコンパイルされます。そう考えれば、s[0],s[1]といったものと同じだということがおわかりいただけるのではないでしょうか。
    • good
    • 0
この回答へのお礼

よく理解できました!
丁寧に教えてくださってありがとうございました。

お礼日時:2010/06/24 15:12

s[MAX] は struct scoreの配列s の要素の一つであり、 struct score 型になります。


s[0],s[1]といったものと同じです。
(より正確に言えば、struct score s[MAX]と宣言しているので、s[MAX]は範囲外となり、どんな動作をするかはわかりません)

> minmax(struct score s[], int n, struct score *minscore, struct score *maxscore)
とstruct scoreの配列を要求しているのですから、型が一致していません。

この場合、struct scoreの配列は 「s」 です。
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます。
minmax(struct score s[], int n, struct score *minscore, struct score *maxscore)

minmax(struct score s, int n, struct score *minscore, struct score *maxscore)
ということですか?
しかしこれでコンパイルすると、minmax関数内のs[0]やs[i]の'['に対して、「structに対して正しくありません」と出てしまいます…。

お礼日時:2010/06/23 21:45

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