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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

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

for

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

Q&A

2回答

4503閲覧

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

mMs7ScOiWNZzOie

総合スコア14

C

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

for

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

0グッド

0クリップ

投稿2018/05/20 04:51

数学と英語の得点を入力し、最後に表を作りたいです。
表の部分だけできませんアドバイスください。
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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

archiver

2018/05/20 05:20

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

2018/05/20 05:43

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

2018/05/20 05:44

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

回答2

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関数で人数分のループ制御をする場合

C

1int main(void) 2{ 3 /* 中略 */ 4 5 for(i = 0; i < 3; i++) { 6 input_student(&data[i]); 7 } 8 for(i = 0; i < 3; i++) { 9 print_student(data[i]); 10 } 11 /* 中略 */ 12} 13 14void input_student(STUDENT *s) 15{ 16} 17 18void print_student(STUDENT s) 19{ 20}

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

C

1int main(void) 2{ 3 /* 中略 */ 4 input_student(3, data); 5 print_student(3, data); 6 /* 中略 */ 7} 8 9void input_student(int cnt, STUDENT *s) 10{ 11} 12 13void print_student(int cnt, STUDENT *s) 14{ 15}

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

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

投稿2018/05/20 08:10

archiver

総合スコア1557

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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);
}

投稿2018/05/20 05:45

PingHermit

総合スコア478

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問