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

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

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

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

Q&A

解決済

5回答

1183閲覧

配列を用いた平均点の出し方

tanakaemi

総合スコア2

C

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

0グッド

0クリップ

投稿2021/12/30 19:39

前提・実現したいこと

5人の生徒の以下の点数が知りたいです。平均点は全て四捨五入した値を求めたいです。

・科目1から3の得点
・生徒1人の3科目の平均点
・科目ごとの平均点
・3科目の平均点の平均点

以下は合計点を出すそれっぽいプログラミングで、
今、合計点が表示されている箇所を全て平均点にしたいのです。

該当のソースコード

#include<stdio.h> main() { int i,j,a; int ten[6][4]; for(i=0;i<=4;i++){ for(j=0;j<=2;j++){ printf("ten[%d][%d]=",i,j); scanf("%d",&a); ten[i][j]=a; } } for(i=0;i<=4;i++){ ten[i][3]=0; for(j=0;j<=2;j++){ ten[i][3]=ten[i][3]+ten[i][j]; } printf("ten[%d][3]=%d\n",i,ten[i][3]); } for(j=0;j<=3;j++){ ten[5][j]=0; for(i=0;i<=4;i++){ ten[5][j]=ten[5][j]+ten[i][j]; } } printf("\n"); printf("----------------------------------------------\n"); printf("科目1\t科目2\t科目3\t3科目の平均点\n"); for (i = 0; i <= 5; i++) { if (i == 5) { printf("----------------------------------------------\n"); } for (j = 0; j <= 3; j++) { printf("%d\t", ten[i][j]); } printf("\n"); } printf("----------------------------------------------\n"); }

試したこと

元々int型なのでfloat型にして+0.5足せばいいことはわかるのですが、それをどこに書けばいいかわかりません。

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

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

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

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

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

thkana

2021/12/30 21:44

「平均点」ってなんでしたっけ? どうやって算出するものでしたか? 「0.5」がどのように関係するのでしょう? 算数か数学の最初の頃に習っていると思いますので思い出してください。それはプログラミング以前の問題です。
majiponi

2021/12/30 23:22

「合計を出してから」割る、ということは、二重ループの最も内側に割り算を書くと、マズそうですよね… 四捨五入は、0.5って考え方でもできますが、round関数っていうものを使うのがお手頃です。使い方を調べてみましょう。
guest

回答5

0

c

1#include <stdio.h> 2#include <math.h> 3#include <memory.h> 4 5#define NUMBER_OF_COLUMNS 3 6#define NUMBER_OF_ROWS 5 7 8#define ALL -1 9 10void input(int table[][NUMBER_OF_COLUMNS]) { 11 for(int i=0; i<NUMBER_OF_ROWS; i++) { 12 for(int j=0; j<NUMBER_OF_COLUMNS; j++) { 13 printf("%d番: 科目%d=", i+1, j+1); 14 fflush(stdout); 15 scanf("%d", &table[i][j]); 16 } 17 } 18} 19 20int average(int table[][NUMBER_OF_COLUMNS], int row, int column) { 21 int rowStart = row == ALL ? 0 : row; 22 int rowEnd = row == ALL ? NUMBER_OF_ROWS : row+1; 23 24 int columnStart = column == ALL ? 0 : column; 25 int columnEnd = column == ALL ? NUMBER_OF_COLUMNS : column+1; 26 27 int total = 0; 28 int count = 0; 29 for(row=rowStart; row<rowEnd; row++) { 30 for(column=columnStart; column<columnEnd; column++) { 31 total += table[row][column]; 32 count ++; 33 } 34 } 35 36 return round((double)total / count); 37} 38 39void outputHeader() { 40 for(int column=0; column<NUMBER_OF_COLUMNS; column++) { 41 printf("科目%d ", column+1); 42 } 43 printf("%d科目の平均点\n", NUMBER_OF_COLUMNS); 44} 45 46void outputSeparator() { 47 for(int i=0; i<NUMBER_OF_COLUMNS*8+13; i++) { 48 printf("-"); 49 } 50 printf("\n"); 51} 52 53void outputRow(int table[][NUMBER_OF_COLUMNS], int row) { 54 for(int column=0; column<NUMBER_OF_COLUMNS; column++) { 55 printf("%4d ", table[row][column]); 56 } 57 printf("%4d\n", average(table, row, ALL)); 58} 59 60void outputSummary(int table[][NUMBER_OF_COLUMNS]) { 61 for(int column=0; column<NUMBER_OF_COLUMNS; column++) { 62 printf("%4d ", average(table, ALL, column)); 63 } 64 printf("%4d\n", average(table, ALL, ALL)); 65} 66 67void output(int table[][NUMBER_OF_COLUMNS]) { 68 printf("\n"); 69 outputSeparator(); 70 71 outputHeader(); 72 for(int row=0; row<NUMBER_OF_ROWS; row++) { 73 outputRow(table, row); 74 } 75 outputSeparator(); 76 77 outputSummary(table); 78 outputSeparator(); 79} 80 81int main() { 82 int table[NUMBER_OF_ROWS][NUMBER_OF_COLUMNS]; 83 memset(&table, 0, sizeof(table)); 84 85 input(table); 86 output(table); 87 88 return 0; 89}

投稿2021/12/31 11:44

jimbe

総合スコア12545

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

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

0

僕なら配列内には合計を求めておいて、プリントするとこで要素数で割るけどな...
printf("%d", (int)floor((double)合計/要素数+0.5)); みたいに。

※ 「平均(小数点1位で四捨五入)をデータとして持ちたい」のであればそうするが。

投稿2021/12/31 01:27

編集2021/12/31 01:29
episteme

総合スコア16614

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

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

tatsu99

2021/12/31 02:31

業務用のプログラムとして作るならその方がベターですね。 あとで、その合計を使うような、仕様変更が発生する可能性もありますので。
thkana

2021/12/31 02:55

しがない組み込み屋としては、敢えて総和を2倍しておいて3を足してから6で割る、とするかも。int型で全て収めるために。
episteme

2021/12/31 03:40 編集

(総和*2 + N)/2N (=総和/N + 1/2)か、なるほど。
guest

0

ベストアンサー

1例です。

C

1#include<stdio.h> 2main() 3{ 4 int i,j,a; 5 int ten[6][4]; 6 double total; 7 int ave; 8 for(i=0;i<=4;i++){ 9 for(j=0;j<=2;j++){ 10 printf("ten[%d][%d]=",i,j); 11 scanf("%d",&a); 12 ten[i][j]=a; 13 } 14 } 15 16 for(i=0;i<=4;i++){ 17 ten[i][3]=0; 18 for(j=0;j<=2;j++){ 19 ten[i][3]=ten[i][3]+ten[i][j]; 20 } 21 printf("ten[%d][3]=%d\n",i,ten[i][3]); 22 //合計を平均点に変える 23 total = ten[i][3]; 24 ten[i][3] = (total / 3) + 0.5; 25 printf("ten[%d][3]=%d\n",i,ten[i][3]); 26 } 27 28 29 for(j=0;j<=3;j++){ 30 ten[5][j]=0; 31 for(i=0;i<=4;i++){ 32 ten[5][j]=ten[5][j]+ten[i][j]; 33 } 34 printf("ten[5][%d]=%d\n",j,ten[5][j]); 35 //合計を平均点に変える 36 total = ten[5][j]; 37 ten[5][j] = (total / 5) + 0.5; 38 printf("ten[5][%d]=%d\n",j,ten[5][j]); 39 } 40 41 printf("\n"); 42 43 printf("----------------------------------------------\n"); 44 45 printf("科目1\t科目2\t科目3\t3科目の平均点\n"); 46 47 for (i = 0; i <= 5; i++) { 48 49 50 if (i == 5) { 51 printf("----------------------------------------------\n"); 52 } 53 54 for (j = 0; j <= 3; j++) { 55 56 printf("%d\t", ten[i][j]); 57 58 } 59 printf("\n"); 60 } 61 62 printf("----------------------------------------------\n"); 63 64} 65

投稿2021/12/31 01:21

tatsu99

総合スコア5424

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

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

0

その3科目の点数を積算して、それに0.5を足して、それを3で割りましょう

投稿2021/12/31 00:04

y_waiwai

総合スコア87719

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

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

thkana

2021/12/31 00:55

> それに0.5を足して、それを3で割りましょう 割ってから0.5を足して切り捨てするんじゃないかしら?
episteme

2021/12/31 01:15

四捨五入のための+0.5なら、最後に+0.5して小数点以下切り捨て。
guest

0

小学生でも考えればわかる問題です。

投稿2021/12/30 21:49

qqfsdfsafd

総合スコア599

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問