ここから本文です

c言語に関して、

アバター

ID非公開さん

2020/7/423:17:30

c言語に関して、

構造体を引数として構造体の中の一つのメンバの最大、最小を求める関数を作りたいのですがどうすれば良いか分かりません。

具体的には、3人の学生の各教科の点数を比較して最高点と最低点を求めるようなものにしたいです。

理想としては、最大を求める関数、最低を求める関数の2つを作り、使い回しが効くようなものにしたいと思ってます。

回答お願いします。

閲覧数:
64
回答数:
1

違反報告

回答

1〜1件/1件中

nuo********さん

2020/7/507:11:08

指定された科目の最大値を返す get_max_score() と、
指定された科目の最小値を返す get_min_score() です。

どちらの関数も、1つ目の引数には、
学生情報の構造体の配列のアドレス、
2つ目の引数には科目コードを指定します。

========

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_STUDENT_NUM 3
#define MAX_NAME_LEN 32
#define CODE_MATH 0
#define CODE_ENGLISH 1
#define CODE_JAPANESE 2
#define CODE_SCIENCE 3
#define CODE_SOCIAL_STUDIES 4

struct student_info {
int id;
char name[MAX_NAME_LEN];
int score[5];
};

typedef struct student_info STUDENT_INFO;

int get_max_score(STUDENT_INFO student[], int subject) {
int ct, ret = 0;

for (ct = 0; ct < MAX_STUDENT_NUM; ct++) {
if (student[ct].score[subject] > ret) {
ret = student[ct].score[subject];
}
}

return ret;
}

int get_min_score(STUDENT_INFO student[], int subject) {
int ct, ret = 100;

for (ct = 0; ct < MAX_STUDENT_NUM; ct++) {
if (student[ct].score[subject] < ret) {
ret = student[ct].score[subject];
}
}

return ret;
}

int main(void)
{
STUDENT_INFO student[MAX_STUDENT_NUM];
int ct, i;

srand(0);

for (ct = 0; ct < MAX_STUDENT_NUM; ct++) {
student[ct].id = ct + 1001;

for (i = 0; i < 5; i++) {
student[ct].score[i] = rand() % 101;
}
}

strcpy(student[0].name, "樫野有香");
strcpy(student[1].name, "西脇綾香");
strcpy(student[2].name, "大本彩乃");

printf("ID 氏名 数学 英語 国語 理科 社会\n");
printf("--------------------------------------\n");

for (ct = 0; ct < MAX_STUDENT_NUM; ct++) {
printf("%4d %8s: %3d, %3d, %3d, %3d, %3d\n", student[ct].id, student[ct].name,
student[ct].score[0], student[ct].score[1], student[ct].score[2],
student[ct].score[3], student[ct].score[4]);
}

printf("\n");

printf("数学の最高点は%3d点、最低点は%3d点です。\n",
get_max_score(student, CODE_MATH),
get_min_score(student, CODE_MATH));

printf("英語の最高点は%3d点、最低点は%3d点です。\n",
get_max_score(student, CODE_ENGLISH),
get_min_score(student, CODE_ENGLISH));

printf("国語の最高点は%3d点、最低点は%3d点です。\n",
get_max_score(student, CODE_JAPANESE),
get_min_score(student, CODE_JAPANESE));

printf("理科の最高点は%3d点、最低点は%3d点です。\n",
get_max_score(student, CODE_SCIENCE),
get_min_score(student, CODE_SCIENCE));

printf("社会の最高点は%3d点、最低点は%3d点です。\n",
get_max_score(student, CODE_SOCIAL_STUDIES),
get_min_score(student, CODE_SOCIAL_STUDIES));

return 0;
}

========

【実行結果】

ID 氏名 数学 英語 国語 理科 社会
--------------------------------------
1001 樫野有香: 32, 32, 54, 12, 52
1002 西脇綾香: 56, 8, 30, 44, 94
1003 大本彩乃: 44, 39, 65, 19, 51

数学の最高点は 56点、最低点は 32点です。
英語の最高点は 39点、最低点は 8点です。
国語の最高点は 65点、最低点は 30点です。
理科の最高点は 44点、最低点は 12点です。
社会の最高点は 94点、最低点は 51点です。

  • アバター

    質問者

    ID非公開さん

    2020/7/510:15:41

    回答ありがとうございます。
    構造体の中に配列をメンバとして入れる以外に方法はありますか?
    構造体は
    typedef struct{
    char name;
    int jpn;
    int math;
    int eng;
    }student;
    としてしまったのですが、、、

  • その他の返信(2件)を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる