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

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

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

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

Emacs

GNU Emacsと拡張性の高い、高性能なテキストエディタです。豊富なライブラリの導入により、統合開発環境やWebブラウザとしても機能させる事が可能です。

Q&A

解決済

1回答

2842閲覧

分布の表示について

bjbjeknr

総合スコア26

C

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

Emacs

GNU Emacsと拡張性の高い、高性能なテキストエディタです。豊富なライブラリの導入により、統合開発環境やWebブラウザとしても機能させる事が可能です。

0グッド

1クリップ

投稿2017/01/11 08:05

テストの平均点とともに平均点の分布を集計するプログラムをつくりたいのですが、分布の集計をする関数をどのように書けばいいいのか分かりません。

実行のイメージ

./a.out

各学生の点数を入力してください。
入力: 数学, 英語, 国語(カンマで区切る)
(いずれかに -1 を入力すると終了)
1人目:60,75,90
2人目:85,90,87
3人目:34,56,45
4人目:50,70,35
5人目:80,78,68
6人目:-1,-1,-1
人目 | 数学 英語 国語 | 平均1 | 60 75 90 | 75.0
2 | 85 90 87 | 87.3
3 | 34 56 45 | 45.0
4 | 50 70 35 | 51.7
5 | 80 78 68 | 75.3
範囲 | 人数
0以上- 10未満 | 0 人
10以上- 20未満 | 0 人
20以上- 30未満 | 0 人
30以上- 40未満 | 0 人
40以上- 50未満 | 1 人
50以上- 60未満 | 1 人
60以上- 70未満 | 0 人
70以上- 80未満 | 2 人
80以上- 90未満 | 1 人
90以上-100未満 | 0 人
100 | 0 人

私のプログラムです。

C

1#include <stdio.h> 2#define DISTIBUTION 3 3 4void Show_average(int *j,int *e,int *m,double *ave); 5 6void Show_distribution(); 7 8double main(void) 9{ 10 int J_test[100]={0}; 11 int E_test[100]={0}; 12 int M_test[100]={0}; 13 int cnt=0; 14 double ave[100]=0; 15 16 printf("各学生の点数を入力してください。\n"); 17 printf("入力: 数学, 英語, 国語(カンマで区切る)\n"); 18 printf("いずれかに -1 を入力すると終了)\n "); 19 printf("%d人目: ", cnt+1); 20 21 scanf("%d,%d,%d", &J_test[cnt], &E_test[cnt],&M_test[cnt]); 22 while(0 <= J_test[cnt] && 0 <= E_test[cnt] && 0<= M_test[cnt] ){ 23 cnt++; 24 printf("%d人目: ", cnt+1); 25 scanf("%d,%d,%d",&J_test[cnt], &E_test[cnt],&M_test[cnt]); 26} 27 J_test[cnt] = E_test[cnt] = M_test[cnt] = -1; 28 29 Show_average(int J_test,int E_test,int M_test,double ave); 30 Show_distribution(void); 31 32 return{0}; 33} 34 35void Show_average(int *j,int *e,int *m,double *ave) 36{ 37 int i=1; 38 printf("\n"); 39 printf("\n"); 40 printf("人目 | 数学 英語 国語 | 平均"); 41 printf("-----+----------------+--------"); 42 while( 0 <= *j && 0 <= *e && 0 <= *m ) { 43 printf("%d | %d %d | %.1f¥n",i++, *j++, *e++, *ave++); 44 } 45} 46 47void Show_distribution() 48{ 49 int distribution[DISTIBUTION]={0}; 50 int j; 51 distribution[weight[i] /50]++ ; 52 53 printf("\n"); 54 printf("範囲| 人数"); 55 printf("----------------+--------"); 56 57 for(j=0; j<DISTIBUTION; j++){ 58 printf("%d以上-%d未満 | %d人¥n", j*10 ,(j+1)*10-1,distrib[j]); 59 } 60 return 0; 61}

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

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

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

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

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

coco_bauer

2017/01/11 09:19

分布(平均点階層別件数)を格納する int distribution[11] をmain関数の中で定義して、各人の平均値が算出されるたびに該当する階層の件数を増やしてゆくようにします。そして、最後に分布の表示をしてください。
guest

回答1

0

ベストアンサー

分布の表示を行う前に、学生の平均点が、どの範囲に入るか求め、1人ずつ分布配列に加算して行きます。

C

1#include <stdio.h> 2 3 4#define MAX_STUDENTS 100 5 6 7void Show_scores(int *M_test, int *E_test, int *J_test, double *average, int students); 8void Show_distribution(double *average, int students); 9 10 11int main(void) 12{ 13 int M_test[MAX_STUDENTS]; 14 int E_test[MAX_STUDENTS]; 15 int J_test[MAX_STUDENTS]; 16 int students; 17 double average[MAX_STUDENTS]; 18 19 printf("各学生の点数を入力してください。\n"); 20 printf("入力: 数学, 英語, 国語(カンマで区切る)\n"); 21 printf("いずれかに -1 を入力すると終了)\n"); 22 23 for (students = 0; students < MAX_STUDENTS; students++) { 24 printf("%3d人目: ", students + 1); 25 scanf("%d,%d,%d", &M_test[students], &E_test[students], &J_test[students]); 26 27 if (0 > M_test[students] || 0 > E_test[students] || 0 > J_test[students]) { 28 break; 29 } 30 31 average[students] = (M_test[students] + E_test[students] + J_test[students]) / 3.0; 32 } 33 34 35 Show_scores(M_test, E_test, J_test, average, students); 36 Show_distribution(average, students); 37 38 return 0; 39} 40 41 42void Show_scores(int *M_test, int *E_test, int *J_test, double *average, int students) 43{ 44 int index; 45 46 printf("\n"); 47 printf("\n"); 48 printf("人目 | 数学 英語 国語 | 平均\n"); 49 printf("-----+----------------+--------\n"); 50 51 for (index = 0; index < students; index++) { 52 printf(" %3d | %3d %3d %3d | %5.1f\n", 53 index + 1, M_test[index], E_test[index], J_test[index], average[index]); 54 } 55} 56 57 58void Show_distribution(double *average, int students) 59{ 60 int distribution[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 61 int index; 62 int range; 63 64 for (index = 0; index < students; index++) { 65 if (average[index] >= 100) { 66 range = 10; 67 } 68 else { 69 range = (int)(average[index] / 10); 70 } 71 72 distribution[range]++; 73 } 74 75 printf("\n"); 76 printf("範囲 | 人数\n"); 77 printf("----------------+--------\n"); 78 79 for (range = 0; range < sizeof(distribution) / sizeof(int) - 1; range++) { 80 printf("%3d以上-%3d未満 | %d人\n", range * 10, (range + 1) * 10, distribution[range]); 81 } 82 printf("%3d | %d人\n", range * 10, distribution[range]); 83}

投稿2017/02/08 14:12

naomi3

総合スコア1105

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問