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

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

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

#1

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

以前同じ質問をしたのですが
すみませんもう一度、教えていただきませんか?

コード:

#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
本当にもうお手上げです、、、

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

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

#2

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

f_max_2、f_min_2、f_ave_2にそれぞれ表示すべき行を渡す引数を作り、その行の情報のみを計算・表示するべきだと思います。
関数のプロトタイプ宣言(引数の取り方)は変えられない縛りですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

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

#3

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

よく考えたら、引数を追加しなくても、上で述べた3関数のrowの意味を全サイズ→表示すべき行に変更すれば、
プロトタイプ宣言を変更せずに済みますね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

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

#4

投稿記事 by box » 11年前

私のところで実行したら、結果はこうなりました。

コード:

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
何だか謎の数値を出力しているように見えます。
どういう結果を得ることが正しいと想定されていますか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

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

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

#5

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

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
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

x最強

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

#6

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

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

アバター
little
記事: 44
登録日時: 13年前
連絡を取る:

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

#7

投稿記事 by little » 11年前

とりあえず形だけ直してみました。
こんな感じでしょうか…?
http://ideone.com/urYfmp

結果
► スポイラーを表示
ソース
► スポイラーを表示
百聞は~

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

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

#8

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

f_max関数(修正前の関数ではf_max2関数も)で、maxを初期化していないのがやばそうですね。
たまたま実際の最大値より大きい値が入っていたため、Amaxが更新されず、不定の値が出力されたのでしょう。
そもそもmaxとAmax、minとAminは分けなくていいと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

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

#9

投稿記事 by usao » 11年前

以前の質問時に,
 関数を呼んだ時点で表示されてしまう仕様 に悩まされてそれらの関数を呼びだす側で四苦八苦するよりも,
 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で指定された列の最大値);
}

x最強

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

#10

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

以前質問次の解答については考えたんですが、、、なんかうまくいかず
断念、で、結局また一から考えてまたこの考えに至ってしまったわけです、、、
ホント自分の頭の悪さに、、、ry

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

アバター
little
記事: 44
登録日時: 13年前
連絡を取る:

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

#11

投稿記事 by little » 11年前

か、解決したようで何よりです。。
久しぶりにやったせいか、ちょっと面白かったので内容を見つついじってみました。

http://ideone.com/l1j0YF

結果
► スポイラーを表示
ソース
► スポイラーを表示
百聞は~

閉鎖

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