
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が関数宣言と一致しません。」と出ます。
どこがおかしいのでしょうか、どなたか教えてください。
No.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]といったものと同じだということがおわかりいただけるのではないでしょうか。
No.1
- 回答日時:
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」 です。
ご回答ありがとうございます。
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に対して正しくありません」と出てしまいます…。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数から配列を返すには?
-
int i, int i[1];
-
配列の要素数に変数を入れたい...
-
c言語
-
配列の配列をmemcpyやmemcmpし...
-
構造体のextern方法
-
c言語プログラミング 等差数列...
-
define で 配列
-
AfxBeginThread の引数について
-
C#でのフィボナッチ数列
-
C言語の配列のコピーについて
-
CStringからchar*への型変換に...
-
リッチテキストボックスの中身...
-
VBAのプログラムで、DIAG = 1# ...
-
NULLポインタが0でない処理系と...
-
C言語のintとcharの違いってな...
-
C言語 配列の長さの上限
-
C# Listを使わずに2次元配列の...
-
C言語のポインタに直接アドレス...
-
メモリのアドレスからの値の取...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
C言語において、 配列要素をひ...
-
配列の要素数に変数を入れたい...
-
c言語
-
define で 配列
-
C#で構造体の配列を持った構造...
-
C#で配列が空かを判定するには?
-
コンボボックスでデフォルト値...
-
C言語 ファイルの指定された行...
-
C言語の2次元配列 容量が大き...
-
2番目の最大値を求める
-
MFCのCArrayを使った二次元配列
-
MFC - ダイアログボックスのPic...
-
構造体のextern方法
-
要素数・要素の値が未定の配列...
-
C言語についてです 5人のテスト...
-
配列のアドレス部
-
構造体を引数とする関数について
-
fclose()でセグメンテーション違反
-
C言語 数値の連続入力について
おすすめ情報