質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.84%

  • C

    3350questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • for

    196questions

    for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

構造体 成績 表を作ることに困ています

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 179

数学と英語の得点を入力し、最後に表を作りたいです。
表の部分だけできませんアドバイスください。
void print_student(STUDENT s)の部分に表に関するものをいれようとすると毎回繰り返され表と表じゃない出力が一緒に入り込んでしまいます。一度生徒の点数を表示させてから、表を表示させたいです。printf("%d %s", s.id, &s.name[0]);の位置に困っているのでどこに入れると良いのか教えてください。関数を増やすべきなのですか?

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

typedef struct student
{

    int id;
    char name[20];
    double Math;
    double English;

}STUDENT;

int main(void);
void print_student(STUDENT s);

int main(void)
{
    int i;
    STUDENT data[3] = {
        { 15991001, "キム" },
        { 15991003, "ヒョンジュン" },
        { 15991015, "イ" },
    };

    printf("学生の点数を入力して下さい:\n");

    for (i = 0; i < 3; i++) {
        print_student(data[i]);
    }
    return(0);
}

void print_student(STUDENT s)
{
    printf("学籍番号%d番\n", s.id);
    printf("数学: ");
    scanf("%lf", &s.Math);
    printf("英語: ");
    scanf("%lf", &s.English);

}

出力例
学生番号15991044番
数学: 48
英語: 52
学生番号15991089番
数学: 48
英語: 52

(and so on)

Student# Name       Math Eng  Fail
-------- ---------- ---- ---- ----
15991001 キム       36.5 78.0 M
15991003 ヒョンジュン49.0 69.0 M

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • archiver

    2018/05/20 14:20

    print_student()という名前なのに、やっていることは入力ですよね。ここで、出力例の最初にある個別の表示は、もしかして表示ではなくて、入力ですか?

    キャンセル

  • mMs7ScOiWNZzOie

    2018/05/20 14:43

    そうですね、、、はい入力です。表を作るのがprint_student()で、出力例の最初を入力する関数を造ればよいということですか?

    キャンセル

  • mMs7ScOiWNZzOie

    2018/05/20 14:44

    出力する関数を作る場合どのようにしたらよいのですか?

    キャンセル

回答 2

0

>関数を増やすべきなのですか?
増やしてもいいですが、そのまま表示してもいいと思います。

どうしたいのか良くわからなかったので、適当に作ってみました。

print_student (data[i]);
で入力を行っているようなので、
print_student (&data[i]);
の様に、元の構造体データを書き換えるように変更しました。

include <string.h>

typedef struct student
{
int id;
char name[20];
double Math;
double English;
}
STUDENT;
void
print_student (STUDENT *s)
{
printf ("学籍番号%d番\n", s->id);
printf ("数学: ");
scanf ("%lf", &s->Math);
printf ("英語: ");
scanf ("%lf", &s->English);
}

int
main (void)
{
int i;
STUDENT data[3] = {
{15991001, "キム"},
{15991003, "ヒョンジュン"},
{15991015, "イ"},
};
printf ("学生の点数を入力して下さい:\n");
for (i = 0; i < 3; i++)
{
print_student (&data[i]);
}
fputs("\n\n",stdout);
for (i = 0; i < 3; i++)
{
printf ("学生番号%i番\n" "数学: %.0f\n" "英語: %.0f\n",
data[i].id, data[i].Math, data[i].English);
}
fputs ("\n(and so on)\n"
"Student# Name____ Math_ Eng__ Fail\n"
"-------- ------------ ----- ----- ----\n", stdout);
for (i = 0; i < 3; i++)
{
printf ("%8i %-12s %5.1f %5.1f %c\n",
data[i].id, data[i].name, data[i].Math, data[i].English, 'M');
}
return (0);
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

関数を増やさなくてもできなくはないですが、質問者さんも機能毎に分ける方向で考えているようなので、入力用と出力用を分けるようにした方がいいと思います。
(まあ、現状のprint_student関数で入力と出力をやろうとするならば、ループ処理はprint_student関数内に持ってきた方がいいでしょうね)

入力用にinput_studentという関数を作るとすると、パラメータはPingHermitさんの回答にもあるようにinput_student側は(STUDENT *s)として、アドレスで受けるようにします。
(構造体に書き込むため)
それと人数分のループですが、main関数側で制御するのであれば、渡し方はPingHermitさんの回答通りで、(&data[i])とします。もし、input_student側に人数分のループも持ってくるならば、(data)にします。ただ、私的にはinput_student側にループも持ってくるならば、人数もパラメータでもらうようにします。つまり、input_student(<人数>, data)みたいな感じですね。そうなると、input_student関数の定義はinput_student(int cnt, STUDENT *s)ってかんじでしょうか(関数の戻り値の定義は省略しました。また、パラメータの並びは好き好きで)

出力用のprint_student関数も同様。main関数側で人数分のループをするならば(処理の中身は出力用に書き換えるとして)、今のままでいいですが、print_student関数側に人数分のループを持ってくるならば、人数もパラメータでもらうようにして、print_student(<人数>, data)で呼び出して、print_student関数側はprint_student(int cnt, STUDENT *s)で受けるようにするかなと。

ソースイメージとしては、
1.main関数で人数分のループ制御をする場合

int main(void)
{
    /* 中略 */

    for(i = 0; i < 3; i++) {
        input_student(&data[i]);
    }
    for(i = 0; i < 3; i++) {
        print_student(data[i]);
    }
    /* 中略 */
}

void input_student(STUDENT *s)
{
}

void print_student(STUDENT s)
{
}


2.各処理で人数分のループを制御する場合

int main(void)
{
    /* 中略 */
    input_student(3, data);
    print_student(3, data);
    /* 中略 */
}

void input_student(int cnt, STUDENT *s)
{
}

void print_student(int cnt, STUDENT *s)
{
}


って感じですかね(外っ面だけ書くと)。

設計次第で書き方はいくらでもあるので、とりあえずは考え方と大枠だけ回答します。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.84%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C

    3350questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • for

    196questions

    for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。