
No.3ベストアンサー
- 回答日時:
ソースを載せます
============ ソースはここから ========================
// Seiseki.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//
#include "stdafx.h"
// 人数を定義します
#define STUDENT_COUNT5
// 成績を格納する領域です
// 構造体配列でも作れますが、教科を通じての合計を取るのであれば
// 2次元配列のほうが適しています
#define SUBJECT_COUNT3// 強化の数
// 各教科のインデックス
#define MATHEMATICS0// 数学
#define ENGLISH1// 英語
#define JAPANEASE2// 国語
// データ格納域
// 2次元配列です
// 1次元目で生徒を識別します
// 2次元目で科目を識別します
static int SCORE[STUDENT_COUNT][SUBJECT_COUNT];
// 指定教科の最高点を求めます
// 成績は既にSCOREに格納済みとします
static int GetHighScore(int SubJect)
{
int i;// 生徒用
// 最初の生徒の成績を基準とし
// それを超えたら最高得点(仮)を更新します
// 全生徒分チェックし終わった時点の最高得点(仮)
// が真の最高得点です
int n = SCORE[0][SubJect];// 仮の最高得点
// 先頭の生徒の得点はチェックしたので
// 2番目以降をチェックします
for (i = 1; i < STUDENT_COUNT; ++i)
{
if (SCORE[i][SubJect] > n)
{
n = SCORE[i][SubJect];
}
}
return n;
}
// 指定教科の最低点を求めます
// 成績は既にSCOREに格納済みとします
static int GetLowScore(int SubJect)
{
int i;// 生徒用
// 最初の生徒の成績を基準とし
// それを超えたら最低得点(仮)を更新します
// 全生徒分チェックし終わった時点の最低得点(仮)
// が真の最高得点です
int n = SCORE[0][SubJect];// 仮の最低得点
// 先頭の生徒の得点はチェックしたので
// 2番目以降をチェックします
for (i = 1; i < STUDENT_COUNT; ++i)
{
if (SCORE[i][SubJect] < n)
{
n = SCORE[i][SubJect];
}
}
return n;
}
// 指定教科の平均点を求めます
// 成績は既にSCOREに格納済みとします
// 小数点以下も戻したいのでdoubleとします
static double GetAve(int SubJect)
{
int i;// 生徒用
int s = 0;// 合計用
// 合計を算出します
for (i = 0; i < STUDENT_COUNT; ++i)
{
s += SCORE[i][SubJect];
}
// 平均点を戻します
// 分母に1.0を掛けているのは、浮動小数点演算を行わせるためです
// s / STUDENT_COUNTだと小数点以下は切り捨てられます
// (例え戻り値がdoubleでもです)
return s / (STUDENT_COUNT * 1.0);
}
// 個人の合計得点を算出します
static int GetPersonalTotal(int Student)
{
int s = 0;// 合計用
int i;
// 合計を算出します
for (i = 0; i < SUBJECT_COUNT; ++i)
{
s += SCORE[Student][i];
}
return s;
}
int main(int argc, _TCHAR* argv[])
{
int i;
// 成績を入力させます
for (i = 0; i < STUDENT_COUNT; ++i)
{
printf("%d番目の生徒の数学の成績を入力してください : ", i + 1);
scanf("%d", &SCORE[i][MATHEMATICS]);
printf("%d番目の英語の成績を入力してください : ", i + 1);
scanf("%d", &SCORE[i][ENGLISH]);
printf("%d番目の国語の成績を入力してください : ", i + 1);
scanf("%d", &SCORE[i][JAPANEASE]);
}
// 結果を表示します
printf("数学成績(最高, 最低, 平均) = %d, %d, %.1f\n",
GetHighScore(MATHEMATICS), GetLowScore(MATHEMATICS),
GetAve(MATHEMATICS));
printf("英語成績(最高, 最低, 平均) = %d, %d, %.1f\n",
GetHighScore(ENGLISH), GetLowScore(ENGLISH),
GetAve(ENGLISH));
printf("国語成績(最高, 最低, 平均) = %d, %d, %.1f\n",
GetHighScore(JAPANEASE), GetLowScore(JAPANEASE),
GetAve(JAPANEASE));
for (i = 0; i < STUDENT_COUNT; ++i)
{
printf("%d番目の生徒の総得点 : %d\n", i + 1, GetPersonalTotal(i));
}
return 0;
}
======================= ソースはここまで ==========================
わかりやすさを重視して書きました。
その為、プログラムは処理速度的にも、行数的にも
非効率になっています。
ご了承ください。
詳細は、ソースのコメントを参照してください
生徒数を5人から変更したい場合は
#define STUDENT_COUNT5
を修正してください
(ex.
#define STUDENT_COUNT10
で10人)
以上です
No.4
- 回答日時:
No.3です。
お恥ずかしいことです。
コメントに誤記があります
#define SUBJECT_COUNT 3 // 強化の数
は
#define SUBJECT_COUNT 3 // 教科の数
の誤りです。
ごめんなさい
No.1
- 回答日時:
その問題を解くために、ご自分で書かれたソースコードを見せてください。
途中まででもかまいません。
この回答への補足
まだ途中で構造体についてすごい微妙なのであってるかどうかわからないのですがまだほとんど初めのほうだけしか書いていませんが
#include <stdio.h>
struct stdent {
char name[15];
int jpn;
int eng;
int math;
};
struct stdent getData(void);
struct stdent addData(struct stdent, struct stdent, struct stdent);
struct stdent aveData(struct stdent, struct stdent, struct stdent);
//void printData(struct stdent, struct stdent);
main()
{
struct stdent []Ver;
struct stdent answer1, answer2;
int i;
for(i = 0; i < 5; i++){
[i]Ver = getData();
}
answer1 = addData([i]Ver);
answer2 = aveData([i]Ver);
return 0;
}
struct stdent getData(void)
{
scanf("%d", &inputVer.num);
printf("Name? ");
scanf("%s" inputVer.name);
printf("Japanese? ");
scanf("%d", &inputVer.jpn);
printf("English? ");
scanf("%d", &inputVer.eng);
printf("Math? ");
scanf("%d", &inputVer.math);
return(inputVer);
}
ここまではとりあえずこうかなと思って書いてみました。
どうでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数桁10進数の*桁目だけを抽出...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語での引数の省略方法
-
「指定されたキャストは有効で...
-
【C++】関数ポインタの使い方
-
C言語 エラーの原因がわからな...
-
ラップ関数とはどんなものですか?
-
「{ } で囲むだけ」は正しい?
-
CStringの配列要素を関数で受け...
-
構造体の勉強中です 合計点の高...
-
足して100になるような乱数のア...
-
数字列を3桁ごとにカンマで区切...
-
C言語で分からないところがあり...
-
double型の値を、一桁ずつint型...
-
if と配列の組み合わせ
-
エンキューとデキューの操作関数
-
次のプログラムを教えてくださ...
-
線形補間 2次元テーブル C言語...
-
ファイルに含まれるアルファベ...
-
ファイルから Carray<int,int> ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
複数桁10進数の*桁目だけを抽出...
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 エラーの原因がわからな...
-
ラップ関数とはどんなものですか?
-
【C++】関数ポインタの使い方
-
if と配列の組み合わせ
-
(int *)の意味
-
ColorをRGBで指定する方法
-
未解決の外部シンボル _printf...
-
構造体の勉強中です 合計点の高...
-
商と剰余を同時に求める(C言語)
-
C言語で分からないところがあり...
-
式は定数値が必要です」という...
-
C言語での奇数の和
-
std::set<int> で、ある値が何...
-
課題でつまってます・・・
-
int16_t の _t は何?
-
比較回数と交換回数表示について
おすすめ情報