配列 最大値、最低値、平均点を求めるんですが、、、

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
x最強

配列 最大値、最低値、平均点を求めるんですが、、、

#1

投稿記事 by x最強 » 11年前

コード:

#include	<stdio.h>

int main()
{
	int i,  k,  sum,  max,  min;
	int allmax,  allmin;
	int Amin[3], Amax[3];
	int data[3][5] = {	{56,73,45,80,95},	{88,90,50,73,80},	{80,65,50,88,90} };
	float ave = 0;
	float ave1,  ave2,  ave3,  allave;
	printf("受験者	   A  B  C  D  E\n");
	for( i=0; i<3; i++ ){
		sum = 0;
		max = 0x80000000;
		min = 0x7FFFFFFF;
		if(i == 0){
			printf("国語の素点:");	
			for( k = 0; k < 5; k++ ){
				printf("%3d",data[i][k]);
				if( data[0][k] > max ){
					max = data[0][k];
					Amax[0] = max;
				}
				if( data[0][k] < min ){
					min = data[0][k];
					Amin[0] = min;
				}
					sum += data[0][k];
			}
			ave = (float)sum / k;
			ave1 = ave;
			printf(" : 最高点 = %d",max);
			printf(" : 最低点 = %d",min);
			printf(" : 平均点 = %.2f",ave);
		}
		if( i == 1 ){
			printf("\n");
			printf("数学の素点:"); 
			for( k =0; k < 5; k++ ){
				printf("%3d",data[i][k]);
				if( data[1][k] > max ){
					max = data[1][k];
					Amax[1] = max;
				}
				if( data[1][k] < min ){
					min = data[1][k];
					Amin[1] = min;
				}
				sum += data[1][k];
			}
			ave = (float)sum / k;
			ave2 = ave;
			printf(" : 最高点 = %d", max);
			printf(" : 最低点 = %d", min);
			printf(" : 平均点 = %.2f", ave);
		}
			if( i == 2 ){
				printf("\n");
				printf("英語の素点:");	
				for( k = 0; k < 5; k++ ){
					printf("%3d", data[i][k]);
					if( data[2][k] > max ){
						max = data[2][k];
						Amax[2] = max;
					}
					if( data[2][k] < min ){
						min = data[2][k];
						Amin[2] = min;
					}
					sum += data[2][k];
				}
				ave = (float)sum / k;
				ave3 = ave;
				printf(" : 最高点 = %d", max);
				printf(" : 最低点 = %d", min);
				printf(" : 平均点 = %.2f", ave);	
			}
	}
	if( Amax[0] > Amax[1] || Amax[0] > Amax[2] ){
		allmax = Amax[0];
	}
	if( Amax[1] > Amax[0] || Amax[1] > Amax[2] ){
		allmax = Amax[1];
	}
	if( Amax[2] > Amax[0] || Amax[2] > Amax[1] ){
		allmax = Amax[2];
	}
	if( Amin[0] < Amin[1] || Amin[0] < Amin[2] ){
		allmin = Amin[0];
	}
	if( Amin[1] < Amin[0] || Amin[1] < Amin[2] ){
		allmin = Amin[1];
	}
	if( Amin[2] < Amin[0] || Amin[2] < Amin[1] ){
		allmin = Amin[2];
	}
	allave = ave1 + ave2 + ave3;
	allave /= 3;
	printf("\n");
	printf("全科目最高点 = %d : 最低点 = %d : 平均点 = %.2lf \n",  allmax, allmin,  allave);
	return 0;
}
[プログラムの実行結果]
受験者   A B C D E
国語の素点: 56 73 45 80 95 : 最高点 = 95 : 最低点 = 45 : 平均点 = 69.80
数学の素点: 88 90 50 73 80 : 最高点 = 90 : 最低点 = 50 : 平均点 = 76.20
英語の素点: 80 65 50 88 90 : 最高点 = 90 : 最低点 = 50 : 平均点 = 74.60
全科目最高点 = 95 : 最低点 = 45 : 平均点 = 73.53

このプログラムは、各教科の最高得点,最低得点,平均点を求め表示して
全受験者・全科目の中で最高得点,最低得点,平均点を求め表示するものなんですが、、、一応は形にはなっているんですが、、、
「これって、プログラマーとしてどうなの」ってかんじになってしまいました。
これを縮小して書く方法がわかりません
もしよろしければ、縮小版みたいなのが見たいので
是非お願い致します。

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: 配列 最大値、最低値、平均点を求めるんですが、、、

#2

投稿記事 by h2so5 » 11年前

書いてみました

コード:

#include <stdio.h>
#include <limits.h>

#define MAX(a, b) (a > b ? a : b)
#define MIN(a, b) (a < b ? a : b)

#define PERSON_COUNT  5
#define SUBJECT_COUNT 3

typedef struct {
	int max;
	int min;
	double avg;
} Result;

const char* persons_name[PERSON_COUNT] = {
	"A",
	"B",
	"C",
	"D",
	"E"
};

const char* subjects_name[SUBJECT_COUNT] = {
	"国語",
	"数学",
	"英語"
};

int scores[SUBJECT_COUNT][PERSON_COUNT] = {
	{56, 73, 45, 80, 95},
	{88, 90, 50, 73, 80},
	{80, 65, 50, 88, 90}
};

void getStatistics(const int* scores, int count, Result *result) 
{
	int i;
	int max = INT_MIN;
	int min = INT_MAX;
	int sum = 0;
	
	for(i = 0; i < count; ++i) {
		int score = scores[i];
		max = MAX(score, max);
		min = MIN(score, min);
		sum += score;
	}
	
	result->max = max;
	result->min = min;
	result->avg = (double)sum / count;
}

int main(void) 
{
	int i, j;
	int all_max = INT_MIN;
	int all_min = INT_MAX;
	double all_tmp_sum = 0.0;
	double all_avg = 0.0;
	
	printf("受験者     ");
	
	for (i = 0; i < PERSON_COUNT; ++i) {
		printf(" %s", persons_name[i]);
	}
	
	printf("\n");
	
	for(i = 0; i < SUBJECT_COUNT; ++i) {
		Result result;
		getStatistics(scores[i], PERSON_COUNT, &result);
		
		all_max = MAX(result.max, all_max);
		all_min = MIN(result.min, all_min);
		all_tmp_sum += result.avg;
		
		printf("%sの素点:",        subjects_name[i]);
		for (j = 0; j < PERSON_COUNT; ++j) {
			printf(" %d", scores[i][j]);
		}
		
	    printf(" : 最高点 = %d",   result.max);
	    printf(" : 最低点 = %d",   result.min);
	    printf(" : 平均点 = %.2f", result.avg);
		printf("\n");
	}
	
	all_avg = all_tmp_sum / SUBJECT_COUNT;
	
	printf("全科目最高点 = %d : 最低点 = %d : 平均点 = %.2lf \n", all_max, all_min, all_avg);
	return 0;
}
※素点表示の抜けを修正

x最強

Re: 配列 最大値、最低値、平均点を求めるんですが、、、

#3

投稿記事 by x最強 » 11年前

ありがとうございます。こんな感じになるんですね♪
なるほどです。

あと、ホントに申し訳ないのですがmain関数のみのバージョンも書いてくれたらありがたいのですが
頼めますか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: 配列 最大値、最低値、平均点を求めるんですが、、、

#4

投稿記事 by h2so5 » 11年前

main関数に全部詰め込むのは良いプログラムではありません。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 配列 最大値、最低値、平均点を求めるんですが、、、

#5

投稿記事 by みけCAT » 11年前

h2so5さんのコードの改造です。
ついでの各受験者の素点の表示が抜けていたので補いました。

コード:

#include <stdio.h>
#include <limits.h>

#define MAX(a, b) (a > b ? a : b)
#define MIN(a, b) (a < b ? a : b)

#define PERSON_COUNT  5
#define SUBJECT_COUNT 3

typedef struct {
	int max;
	int min;
	double avg;
} Result;

int main(void) 
{
	const char* persons_name[PERSON_COUNT] = {
		"A","B","C","D","E"
	};
	const char* subjects_name[SUBJECT_COUNT] = {
		"国語","数学","英語"
	};
	int scores[SUBJECT_COUNT][PERSON_COUNT] = {
		{56, 73, 45, 80, 95},
		{88, 90, 50, 73, 80},
		{80, 65, 50, 88, 90}
	};

	int i;
	int all_max = INT_MIN;
	int all_min = INT_MAX;
	double all_sum = 0.0;
	double all_avg = 0.0;
	
	printf("受験者     ");
	
	for (i = 0; i < PERSON_COUNT; ++i) {
		printf(" %s", persons_name[i]);
	}
	
	printf("\n");
	
	for(i = 0; i < SUBJECT_COUNT; ++i) {
		Result result;
		int j;
		int max = INT_MIN;
		int min = INT_MAX;
		int sum = 0;
		
		printf("%sの素点",subjects_name[i]);
		for(j = 0; j < PERSON_COUNT; ++j) {
			int score = scores[i][j];
			printf("%3d",score);
			max = MAX(score, max);
			min = MIN(score, min);
			sum += score;
		}
		
		result.max = max;
		result.min = min;
		result.avg = (double)sum / PERSON_COUNT;
		
		all_max = MAX(result.max, all_max);
		all_min = MIN(result.min, all_min);
		all_sum += result.avg;
		
		printf(" : 最高点 = %d",   result.max);
		printf(" : 最低点 = %d",   result.min);
		printf(" : 平均点 = %.2f", result.avg);
		putchar('\n');
	}
	
	all_avg = all_sum / SUBJECT_COUNT;
	
	printf("全科目最高点 = %d : 最低点 = %d : 平均点 = %.2lf \n", all_max, all_min, all_avg);
	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 14年前

Re: 配列 最大値、最低値、平均点を求めるんですが、、、

#6

投稿記事 by box » 11年前

x最強 さんが書きました:main関数のみのバージョン
それはまあ書けなくはないと思います。
ただ、main関数だけで何でもかんでも仕事をしようとすることは
個人的にあまりおすすめしません。
「この関数はこの仕事(だけ)をする」というポリシーを持つことが、
後から見てわかりやすく、修正や機能拡張がしやすいプログラムを
書くことにつながると思います。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

とっち
記事: 56
登録日時: 13年前
住所: 岡山

Re: 配列 最大値、最低値、平均点を求めるんですが、、、

#7

投稿記事 by とっち » 11年前

せっかくなので私も書いてみました
(変数の宣言位置とかc++な書き方のところは許してください)

コード:

#include <stdio.h>
#define PEOPLE_NUM 5
#define SUBJECT_NUM 3
#define SUCORE_MAX 100

void SetData(int *max,int *min,int data){
	if(*max<data)
		*max=data;
	if(data<*min)
		*min=data;
}

int main(){
	const char *name[PEOPLE_NUM]={"A","B","C","D","E"};
	const char *subject[SUBJECT_NUM]={"国語","数学","英語"};
	int data[SUBJECT_NUM][PEOPLE_NUM]={
		{56,73,45,80,95},
		{88,90,50,73,80},
		{80,65,50,88,90}
	};
	printf("受験者      ");
	for(int i=0;i<PEOPLE_NUM;i++)
		printf("%s ",name[i]);
	puts("");
	int all_max=0,all_min=SUCORE_MAX+1,all_sum=0;
	for(int i=0;i<SUBJECT_NUM;i++){
		int max=0,min=SUCORE_MAX+1,sum=0;
		printf("%sの素点:",subject[i]);
		for(int j=0;j<PEOPLE_NUM;j++){
			SetData(&max,&min,data[i][j]);
			sum+=data[i][j];
			SetData(&all_max,&all_min,data[i][j]);
			all_sum+=data[i][j];
			printf("%3d",data[i][j]);
		}
		printf(" : 最高点 = %d : 最低点 = %d : 平均点 = %.2lf\n",max,min,(double)sum/PEOPLE_NUM);
	}
	printf("全科目最高点 = %d : 最低点 = %d : 平均点 = %.2lf \n",all_max,all_min,(double)all_sum/(PEOPLE_NUM*SUBJECT_NUM));
}

x最強

Re: 配列 最大値、最低値、平均点を求めるんですが、、、

#8

投稿記事 by x最強 » 11年前

なるほど、、、ひとりひとりが組むプログラムどれもこんなに違ってくるんですね~
ホント勉強になります
記入してくださった皆様感謝です

閉鎖

“C言語何でも質問掲示板” へ戻る