前置き:
- 既存の回答群が「ランク」という言葉を用いているのでこの回答もそれに倣う.
- 質問文に「実数」という気になる語があるが,話の内容としてはどうでもいい所と思うので,この回答内のコードでは得点を
int
としている.
どこ/何 に困っている(というか混乱している?)のか? という原因がイマイチ判断付かないところですが……
おそらく,「ある得点がどのランクか?」というのを求める部分だけを関数にでもすると見通しが良くなるのでは無いでしょうか.
すなわち,こういうやつ:
C
1//ランクの個数
2#define N_RANK (6) //6段階
3
4//得点がどのランクに属するのかを求めて返す関数.
5//戻り値は 0-based な値.すなわち,値の範囲は [ 0, N_RANK ) である.
6int RankIndex( int Score )
7{
8 //どんな実装方法でも良い.
9 //とにかく引数の得点に対応した {0,1,2,..., N_RANK-1 } のいずれかの値を返す.
10}
があるとして,socre[2][20]
に 2教科×20人 分のスコアが入っているのだとしたら,集計の部分は
C
1int score[2][20]; //←コレにスコアが入力されているのだとして
2
3//得点の分布を求める
4int RankHistogram[2][N_RANK] = {0}; //2教科分の度数分布
5for( int iSubject=0; iSubject<2; ++iSubject ) //2教科分のループ
6{
7 for( int iStudent=0; iStudent<20; ++iStudent ) //20人分のループ
8 {
9 int iRank = RankIndex( score[iSubject][iStudent] );
10 ++RankHistogram[iSubject][ iRank ];
11 }
12}
とか混乱なく書けるのではなかろうか? と.
上記の話を関数 RankIndex
の実装を適当に補って纏めると,以下のような感じ.
C
1//ランクの個数
2#define N_RANK (6)
3
4//各ランクの最低得点.
5//関数 RankIndex の実装で使用している.
6//(あと,質問文で指定されている形の出力を行う際にも何かしらこういうのが必要になると思われ)
7const int MinScoreOfRank[ N_RANK ] = { 0, 20, 40, 60, 80, 100 };
8
9//得点がどのランクに属するのかを返す.
10//戻り値は 0-based な値.すなわち,値の範囲は [ 0, N_RANK ) である.
11int RankIndex( int Score )
12{
13 int iRank = 0;
14 for( /*NOP*/; iRank<N_RANK-1; ++iRank )
15 {
16 if( Score < MinScoreOfRank[iRank+1] )break;
17 }
18 return iRank;
19}
20
21//
22int main()
23{
24 //score[2][20] に 2教科×20人分 の得点情報を入力する処理については困っていないと思うので省略
25 int score[2][20];
26 {//※ここではテスト用に katoy 氏の回答内のコードを借用して値を入れている
27 for( int iStudent=0; iStudent<20; ++iStudent )
28 {
29 int p = (iStudent * 10) % 100;
30 score[0][iStudent] = p;
31 score[1][iStudent] = 100 - p;
32 }
33 }
34
35 //得点の分布を求める
36 int RankHistogram[2][N_RANK] = {0}; //全要素の初期値を0にする
37 for( int iSubject=0; iSubject<2; ++iSubject )
38 {
39 for( int iStudent=0; iStudent<20; ++iStudent )
40 {
41 int iRank = RankIndex( score[iSubject][iStudent] );
42 ++RankHistogram[iSubject][ iRank ];
43 }
44 }
45
46 //結果確認
47 //※これは質問文記載のフォーマットでの出力ではなく,
48 // RankHistogram[][] の値がどうなったか(: katoy 氏が示している結果と同じ値が得られているか否か)を確認するためのコード.
49 for( int iRank=0; iRank<N_RANK; ++iRank )
50 {
51 printf( "%d %d\n", RankHistogram[0][iRank], RankHistogram[1][iRank] );
52 }
53
54 return 0;
55}