こんにちは。なんか、似たような質問の回答をしたばかりなような気もしますが、C言語の入門書レベルで書けるコードはこんな感じになると思います。このコードの少し面倒くさいところは、関数への配列のアドレスを渡すところです。この部分が少し捻ってある部分ですね。また、最後の名前を表示する部分については、名前+成績を表示するように変えてあるので、"%d"と、成績の変数を取り除けば、課題どおりになります。なお、このコードはわざとデバッグ用の部分も残してありますので、いろいろいじって実行してみてください。その結果(コードが)壊れたら、またコピペすればよいだけの話です。
#include <stdio.h>
#include <string.h>
#define NUM 4 //4人分の配列を用意するので、マクロで置き換える
//デバッグ用のマクロ(コメントアウトすると#ifdef~#endifの内容が無効になる)
#define DEBUG
struct seiseki{
char name[30];
int score;
};
typedef struct seiseki seiseki;
/* 各人の名前と点数を表示する関数の宣言 */
void showPeople(seiseki *list);
/* 一番点数の高い者を調べ,その名前を表示する関数の宣言 */
void showMax(seiseki *list);
int main(void)
{
seiseki list[NUM];
// 佐藤 80 鈴木 75 田中 95 高橋 90
strcpy(list[0].name, "佐藤"); list[0].score=80;
strcpy(list[1].name, "鈴木"); list[1].score=75;
strcpy(list[2].name, "田中"); list[2].score=95;
strcpy(list[3].name, "高橋"); list[3].score=90;
// 配列名は、配列の先頭要素のアドレスを格納しているポインタと同じ働きを持つ。
// よって、配列名listを引数として関数に渡すだけで、
// 関数に構造体配列「list」のアドレスを渡したことになる。
#ifdef DEBUG
showPeople(list);
#endif
showMax(list);
return 0;
}
/* 各人の名前と点数を表示する関数の定義 */
void showPeople(seiseki *list){
int i;
printf("%s\t%s\n", "name", "score");
for(i=0;i<NUM;i++){
printf("%s\t%d\n", list[i].name, list[i].score);
}
}
/* 一番点数の高い者を調べ,その名前を表示する関数の定義 */
void showMax(seiseki *list){
int i; //ループ用
// パターン1用の変数(最大値を持つ配列番号の格納用)
int maxArrayNum = 0;
// パターン2用の変数
int max = 0; char name[30];
// パターン1は、最高点の人の配列のデータを直接使うやり方
// パターン2は、最高点が見つかるたびに別に用意した変数に
// 名前と点数を上書きしていくやり方。お好きな方をお使いください。
for(i=0;i<NUM; i++){
if(max < list[i].score){
/* パターン1 */
maxArrayNum = i;
#ifdef DEBUG
printf("現段階の最高点は%sさん☆:\t%d\n", list[maxArrayNum].name, list[maxArrayNum].score);
#endif
/* パターン2 */
max = list[i].score;
strcpy(name, list[i].name);
#ifdef DEBUG
printf("現段階の最高点は%sさん!:\t%d\n", name, max);
#endif
}
}
// パターン1を使った表示法。
printf("最高点は%sさん:\t%d点\n", list[maxArrayNum].name, list[maxArrayNum].score);
// パターン2を使った表示法。
printf("最高点は%sさん:\t%d\n", name, max);
}
お礼
親切なかたがいて非常にたすかりました。 解説をしっかり勉強して学びたいとおもいます。 ありがとうございます。