ページ 11

C言語 関数を使って2次元配列

Posted: 2013年11月12日(火) 22:17
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_min_2( int , int , int [][5] );
void    f_ave( int , int , int [][5] );
void    f_ave_2( int , int , int [][5] );
 
int main()
{
	int     row = 3, col = 5;
	int     data1[3][5];

	printf("data                          max  min  ave\n");
	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++ ){
		printf( "   " );
		for( j = 0; j < col; j++ ){
			printf( "%5d", dat[i][j] );
		}
			if( i == 0 ){
				f_max_2( row, col, dat );
				f_min_2( row, col, dat );
				f_ave_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];

	printf( "max" );
	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( "%5d", 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 } ;

	printf( "min" );
	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( "%5d", Amin[k] );
	}
	printf( "\n" );
}

void    f_ave( int row, int col, int dat[][5] )
{
	int		i, j, sum;
 
	printf( "ave  " );
	for( j = 0; j < col; j++ ){
		sum = 0;
		for( i = 0; i < row; i++ ){
			sum += dat[i][j];
		}
		printf( "%5.1f", (double)sum / row );
	}
	printf( "\n" );
}

void    f_max_2( int row, int col, int dat[][5] )
{
	int		i, j;
	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( "%5d",Amax_2[i] );
	}
}
void    f_min_2( int row, int col, int dat[][5] )
{
	int		i, j;
	int		Amin_2[3], min_2[3] = {99,99,99};
 
	for( i = 0; i < row; i++ ){
		for( j = 0; j < col; j++ ){
			if( dat[i][j] < min_2[i] ){
				min_2[i] = dat[i][j];
				Amin_2[i] = min_2[i];
			}
		}
		printf( "%5d", Amin_2[i] );
	}
}

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

	for( i = 0; i < row; i++ ){
		sum = 0;
		for( j = 0; j < col; j++ ){
			sum += dat[i][j];
		}
		printf( "%5.1f", (double)sum / col );
	}
}
実行していただけるとわかると思うんですが、、、行のそれぞれmax,min,aveを表示したいのですが、一列で表示ます、、、if( i == 0 )が原因なのは分かっています。
でもそれをなくすと3回ずつ表示されます、、、

前回の質問のときよりだいぶ考えたのですが、、、やっぱりよくわかりませんでしたorz
本当にもうお手上げです、、、

Re: C言語 関数を使って2次元配列

Posted: 2013年11月12日(火) 22:28
by みけCAT
f_max_2、f_min_2、f_ave_2にそれぞれ表示すべき行を渡す引数を作り、その行の情報のみを計算・表示するべきだと思います。
関数のプロトタイプ宣言(引数の取り方)は変えられない縛りですか?

Re: C言語 関数を使って2次元配列

Posted: 2013年11月12日(火) 22:30
by みけCAT
よく考えたら、引数を追加しなくても、上で述べた3関数のrowの意味を全サイズ→表示すべき行に変更すれば、
プロトタイプ宣言を変更せずに済みますね。

Re: C言語 関数を使って2次元配列

Posted: 2013年11月12日(火) 22:45
by box
私のところで実行したら、結果はこうなりました。

コード:

data                          max  min  ave
      41   67   34    0   69    4   78    0    0   24    5 42.2 57.2 43.8
      24   78   58   62   64
       5   45   81   27   61

max   102293424   8122937282008964244
min    5   45   34    0   61
ave   23.3 63.3 57.7 29.7 64.7
何だか謎の数値を出力しているように見えます。
どういう結果を得ることが正しいと想定されていますか?

Re: C言語 関数を使って2次元配列

Posted: 2013年11月12日(火) 22:57
by みけCAT
Ideoneでの実行結果です。
http://ideone.com/zCTtue

コード:

data                          max  min  ave
      83   86   77   15   93   93   92   90   15   21   27 70.8 56.6 60.2
      35   86   92   49   21
      62   27   90   59   63

max   83   86   92   63   93
min   35   27   77   15   21
ave   60.0 66.3 86.3 41.0 59.0

Re: C言語 関数を使って2次元配列

Posted: 2013年11月13日(水) 05:57
by x最強
みけCAT さんが書きました:f_max_2、f_min_2、f_ave_2にそれぞれ表示すべき行を渡す引数を作り、その行の情報のみを計算・表示するべきだと思います。
関数のプロトタイプ宣言(引数の取り方)は変えられない縛りですか?
特にそう言った縛りみたいなのはありません。

Re: C言語 関数を使って2次元配列

Posted: 2013年11月13日(水) 07:16
by little
とりあえず形だけ直してみました。
こんな感じでしょうか…?
http://ideone.com/urYfmp

結果
► スポイラーを表示
ソース
► スポイラーを表示

Re: C言語 関数を使って2次元配列

Posted: 2013年11月13日(水) 07:48
by みけCAT
f_max関数(修正前の関数ではf_max2関数も)で、maxを初期化していないのがやばそうですね。
たまたま実際の最大値より大きい値が入っていたため、Amaxが更新されず、不定の値が出力されたのでしょう。
そもそもmaxとAmax、minとAminは分けなくていいと思います。

Re: C言語 関数を使って2次元配列

Posted: 2013年11月13日(水) 17:18
by usao
以前の質問時に,
 関数を呼んだ時点で表示されてしまう仕様 に悩まされてそれらの関数を呼びだす側で四苦八苦するよりも,
 f_max_2()等の関数が「計算→表示」という2つの仕事をするのではなくて
 計算のみを行って結果を返すようにすれば済む(あとは好きに並べて表示すればいい)のでは?
という旨のことを言った気がしますが,そういう方針は無しなのでしょうか.

コード:

int GetMaxValue_of_Row( int row, int dat[][5] )
{
    //※関数の中では表示を行わない.
    //返された値を表示する方法やタイミングは,この関数を使う側で勝手に調整すればよい.
    return (rowで指定された行の最大値);
}

int GetMaxValue_of_Column( int col, int dat[][5] )
{
    //※同上
    return (colで指定された列の最大値);
}

Re: C言語 関数を使って2次元配列

Posted: 2013年11月13日(水) 19:16
by x最強
以前質問次の解答については考えたんですが、、、なんかうまくいかず
断念、で、結局また一から考えてまたこの考えに至ってしまったわけです、、、
ホント自分の頭の悪さに、、、ry

皆様ホント回答ありがとうございました
理解力なくてホントにすみませんでした

Re: C言語 関数を使って2次元配列

Posted: 2013年11月13日(水) 22:02
by little
か、解決したようで何よりです。。
久しぶりにやったせいか、ちょっと面白かったので内容を見つついじってみました。

http://ideone.com/l1j0YF

結果
► スポイラーを表示
ソース
► スポイラーを表示