2次元配列(関数)を利用した最高値、最小値、平均を求めたい

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

2次元配列(関数)を利用した最高値、最小値、平均を求めたい

#1

投稿記事 by HELP! » 10年前

コード:


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

//関数のプロトタイプ宣言
void	f_init( int, int, int [][5] );
void	f_pout( 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 );

	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] );
		}
		printf( "\n" );
	}
}
[プログラム実行例]
data________________max_min_ave
_____41 67 34 0 69_□____□___□
_____24 78 58 62 64_□____□___□
_____5 45 81 27 61_□____□___□
max_□__□_□_□_□
min_□__□_□_□_□
ave_□__□_□_□_□
少々ずれてますが申し訳ないです。
アンダーバー記入はなしでお願い致します。

下のmax,min,aveは縦の比較と平均です。
はっきり言って、お手上げです。
どなたか、、、お助けください、、、お願い致します。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 2次元配列(関数)を利用した最高値、最小値、平均を求めたい

#2

投稿記事 by softya(ソフト屋) » 10年前

x最強 さんですよね。
名前を変えることはフォーラムルール上禁止させていただいております。
http://dixq.net/board/board.html
この機会にルールをお読み下さい。

課題だと思いますが、ルールに従った質問をお願いします。
なお、前のトピックを放置することもルール違反となっております。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

x最強

Re: 2次元配列(関数)を利用した最高値、最小値、平均を求めたい

#3

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

申し訳ありません、、、ちゃんとしたルールがあるとは思いませんでした(反省です)。

はい、課題です。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 2次元配列(関数)を利用した最高値、最小値、平均を求めたい

#4

投稿記事 by softya(ソフト屋) » 10年前

前のコードは書けたのに、今回は書けない理由は何でしょうか?
どこまでが課題のコードで自分で書いたコードはどの部分でしょうか?
理解度合い次第でアドバイスが変わるかと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

x最強

Re: 2次元配列(関数)を利用した最高値、最小値、平均を求めたい

#5

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

18行目までは用意されたものでした、それから先はテキストを見ながら書きました。
課題内容ですが、、、
配列の各行各列の最大,最小,平均を求める関数を追加しなさい。
void f_max( int row, int col, int dat[][5] );
void f_min( int row, int col, int dat[][5] );
void f_ave( int row, int col, int dat[][5] );
上記のプロトタイプ宣言は一例なので,各自が使い易い形式に変更して下さい。
rand()を使い配列をつくり
また,f_pout関数を配列の最大,最小,平均(double)が出力できるように変更しなさい。
必要に応じて変数や関数を追加したり,main()関数も書き換えて構いません。
というものでした

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 2次元配列(関数)を利用した最高値、最小値、平均を求めたい

#6

投稿記事 by softya(ソフト屋) » 10年前

関数を分けなければ、各行の最大値、最低値、平均点は前回出来ているので今回もできるのではないでしょうか?
まず、それを書いてみて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

x最強

Re: 2次元配列(関数)を利用した最高値、最小値、平均を求めたい

#7

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

コード:

#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_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 );
	f_max( row, col, data1 );
	f_min( 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] );
		}
		printf( "\n" );
	}
}

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

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

}

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

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

}
というところまで作成してみたところ、ん?ってなりまして、、、
このままいくと、とんでもない行になる、、、人から見たら「なんだこれって」って
言われそうだと思い、打つ手を止めて
試行錯誤していた次第です。

アバター
Nao
記事: 24
登録日時: 11年前

Re: 2次元配列(関数)を利用した最高値、最小値、平均を求めたい

#8

投稿記事 by Nao » 10年前

x最強 さんが書きました:

コード:

	for( i = 0; i < row; i++ ){
		if( dat[i][0] > max[0] ){
			max[0] = dat[i][0];
			Amax[0] = max[0];
		}
		if( dat[i][1] > max[1] ){
			max[1] = dat[i][1];
			Amax[1] = max[1];
		}
		if( dat[i][2] > max[2] ){
			max[2] = dat[i][2];
			Amax[2] = max[2];
		}
		if( dat[i][3] > max[3] ){
			max[3] = dat[i][3];
			Amax[3] = max[3];
		}
		if( dat[i][4] > max[4] ){
			max[4] = dat[i][4];
			Amax[4] = max[4];
		}
    }

	for( i = 0; i < row; i++ ){
		if( dat[i][0] < min[0] ){
			min[0] = dat[i][0];
			Amin[0] = min[0];
		}
		if( dat[i][1] < min[1] ){
			min[1] = dat[i][1];
			Amin[1] = min[1];
		}
		if( dat[i][2] < min[2] ){
			min[2] = dat[i][2];
			Amin[2] = min[2];
		}
		if( dat[i][3] < min[3] ){
			min[3] = dat[i][3];
			Amin[3] = min[3];
		}
		if( dat[i][4] < min[4] ){
			min[4] = dat[i][4];
			Amin[4] = min[4];
		}
	}
このあたりはfor文でさらに楽に書けそうな気がしますがそうは思いませんか?
ヒントは配列の要素の数字です。
まあ、何事も平穏に。

x最強

Re: 2次元配列(関数)を利用した最高値、最小値、平均を求めたい

#9

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

for文なんだろうなとわ
わかっていてやっても見たんですが、、、代入?の時にうまくいかず断念しました

アバター
Nao
記事: 24
登録日時: 11年前

Re: 2次元配列(関数)を利用した最高値、最小値、平均を求めたい

#10

投稿記事 by Nao » 10年前

x最強 さんが書きました:for文なんだろうなとわ
わかっていてやっても見たんですが、、、代入?の時にうまくいかず断念しました
何処がどううまくいかないのかは分かりません。ですが、

コード:

for( i = 0; i < row; i++ ){
	if( dat[i][i] < min[i] ){
		min[i] = dat[i][i];
		Amin[i] = min[i];
	}
}
もしかしたらこんな風に書いてたのではないか?と一つ推測してみました。
(本当に書いてたかどうかは別として)これではダメです。
dat[][]の要素数が[0][0],[1][1],[2][2](以下1ずつ増加)の場合のみ調べることになってしまいます。
(デバッグをすれば本当であると分かると思います。)
これでは[0][1]や[2][4]の場合が無視されてしまうのでいけませんね。


ではどうするかですが、このように書けばいいのです。

コード:

for( i = 0; i < row; i++ ){
	for(int j = 0; j < 5; j++ ){
		if( dat[i][j] < min[j] ){
			min[j] = dat[i][j];
			Amin[j] = min[j];
		}
	}
}
(プログラムは動かしていないのであくまで参考程度に)
これで恐らく正常に動くであろう楽に書けるコードができました。
実際に自分で書いて試してください。
(重要なのはこのコードを理解することです。写しただけでは意味がありませんよ。)
まあ、何事も平穏に。

x最強

Re: 2次元配列(関数)を利用した最高値、最小値、平均を求めたい

#11

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

返事本当に遅くてすみませんでした
実際解決してません
というより、自分の知識不足過ぎたので
また一から勉強します。
本当にすみませんでした

閉鎖

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