ページ 11

2次元配列 後、一歩なのです!!

Posted: 2013年10月21日(月) 18:41
by x最強

コード:

#include "stdio.h"
#include "stdlib.h"

//関数のプロトタイプ宣言
void	f_init( int, int, int [][5] );
void	f_pout( int, int, int [][5] );
void	f_max( int , int , int [][5] );
void	f_max_2( int , int , int [][5] );
void	f_min( int, int, int [][5] );
void	f_ave( int , int , int [][5] );

int main()
{
	int		row = 3, col = 5;
	int		data1[3][5];

	f_init( row, col, data1 );
	f_pout( row, col, data1 );
	printf("\n");
	f_max( row, col, data1 );
	f_min( row, col, data1 );
	f_ave( row, col, data1 );

	return	1;
}

void	f_init( int row, int col, int dat[][5] )
{
	int	i, j;

	for( i = 0; i < row; i++ )
	{
		for( j = 0; j < col; j++ )
		{
			dat[i][j] = rand() % 100;
		}
	}
}

void	f_pout( int row, int col, int dat[][5] )
{
	int	i, j;

	for( i = 0; i < row; i++ )
	{	for( j = 0; j < col; j++ )
		{
			printf( "%4d", dat[i][j] );	
		}
			f_max_2( row, col, dat );			
			printf( "\n" );
	}
}

void	f_max( int row, int col, int dat[][5] )
{
	int i, j, k;
	int Amax[5], max[5];

	for( i = 0; i < row; i++ ){
		for( j = 0; j < col; j++ ){
			if( dat[i][j] > max[j] ){
					max[j] = dat[i][j];
					Amax[j] = max[j];
			}
		}
	}
	for( k = 0; k < col; k++ ){
		printf("%4d", Amax[k]);
	}
		printf("\n");
}

void	f_min( int row, int col, int dat[][5] )
{
	int i, j, k;
	int Amin[5], min[5] = {99,99,99,99,99} ;

	for( i = 0; i < row; i++ ){
		for( j = 0; j < col; j++ ){
			if( dat[i][j] < min[j] ){
				min[j] = dat[i][j];
				Amin[j] = min[j];
			}
		}
	}
	for( k = 0; k < col; k++ ){
		printf("%4d", Amin[k]);
	}
	printf("\n");
}

void	f_ave( int row, int col, int dat[][5] )
{
	int i, j;
	int sum;

	for( j = 0; j < col; j++ ){
		sum = 0;
		for( i = 0; i < row; i++ ){

			sum += dat[i][j];
		}
		printf( " %.1f",(double)sum/row );
	}
}
void	f_max_2( int row, int col, int dat[][5] )
{
	int i, j, k;
	int Amax_2[3], max_2[3];

	for( i = 0; i < row; i++ ){
		for( j = 0; j < col; j++ ){
			if( dat[i][j] > max_2[i] ){
					max_2[i] = dat[i][j];
					Amax_2[i] = max_2[i];
			}
		}
		printf("%4d",Amax_2[i]);	
	}
}
実行結果
↓この横3つの数字が縦に1ずつだけ表示したいんです
41 67 34 0 69   69 78 81
24 78 58 62 64   69 78 81
5 45 81 27 61   69 78 81

41 78 81 62 69
5 45 34 0 61
23.3 63.3 57.7 29.7 64.7

今回教えていただきたいのは、69 78 81の部分です
この表示を一回だけ縦に表示したいです
お願いします、わかんないです

Re: 2次元配列 後、一歩なのです!!

Posted: 2013年10月21日(月) 21:32
by みけCAT
f_max_2関数に新たにf_pout関数におけるiを渡す引数を追加し、
f_max_2関数内で、「渡されたf_pout関数のi」が「f_max_2関数でループに使用しているi」と一致している時だけ

コード:

printf("%4d",Amax_2[i]);
を実行してください。
実行する位置は現状で大丈夫だと思います。

また、f_max_2関数のmax_2、f_max関数のmaxがそれぞれ初期化されていないのが気になりました。

Re: 2次元配列 後、一歩なのです!!

Posted: 2013年10月21日(月) 21:42
by x最強
う~ん、、、書き方がわかりません。

Re: 2次元配列 後、一歩なのです!!

Posted: 2013年10月21日(月) 21:47
by みけCAT
では、f_max_2関数にf_pout関数からdatのみを渡す仕様にし、
f_max_2関数ではcolのループのみ行って最大値を求める、というのはどうですか?

Re: 2次元配列 後、一歩なのです!!

Posted: 2013年10月21日(月) 21:52
by x最強
というより基本がわかってないのもです。

もう一回勉強してきます。

解決はしていませんが、、、

Re: 2次元配列 後、一歩なのです!!

Posted: 2013年10月22日(火) 09:41
by usao
もう解決チェックがついてしまっているけど…

提示コードでは,f_max_2()とかf_ave()とかいう類の関数が
(1)最大値とか平均とかを計算すること
(2)計算した結果を(ある1つの決まった形で)表示すること
という2つの仕事をまとめて行っているけど,
(2)までが入りこんでいることによって,これらの関数を使いにくくなってしまっている,ということじゃないかな.

(1)の仕事 と (2)の仕事 とを分離してしまうのがわかりやすいと思う.

f_max_2()の仕事を(1)だけ(最大値を求めて,その結果をどこかしらに格納する)にして,
あとは その格納されてきた結果を f_pout()内とかで好きなように表示すればいい.

わかりやすく書くと,例えば,

コード:

//f_max_2()の結果を格納するための外部変数.
//#こんなことに外部変数を使うのは褒められた方法ではないから
//#外部変数を使わない方法でやれるなら そのようにしましょう.
int MaxOfRow[ 3 ] = { 0,0,0 };

//各行の最大値を求め,その結果をMaxOfRow[]に格納する
void f_max_2( int row, int col, int dat[][5] )
{
  int i;
  for( i=0; i<row; i++ )
  {
    MaxOfRow[i] = i行目の最大値;
  }
}
のような形にすれば,f_pout()とかでは,

コード:

void f_pout( 略 )
{
  int i;
  f_max_2();  //各行の最大値を求める.
  //↑の結果,MaxOfRow[]には最大値が格納されたから,あとは好きな形に表示する
  for( int i=0; i<3; i++ )
  {
    printf( "%d\n", MaxOfRow[i] );
  }
}
みたく,好きなレイアウトで表示すればOK.