ページ 1 / 1
2次元配列(関数)を利用した最高値、最小値、平均を求めたい
Posted: 2013年10月16日(水) 21:39
by HELP!
コード:
#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は縦の比較と平均です。
はっきり言って、お手上げです。
どなたか、、、お助けください、、、お願い致します。
Re: 2次元配列(関数)を利用した最高値、最小値、平均を求めたい
Posted: 2013年10月16日(水) 21:43
by softya(ソフト屋)
x最強 さんですよね。
名前を変えることはフォーラムルール上禁止させていただいております。
http://dixq.net/board/board.html
この機会にルールをお読み下さい。
課題だと思いますが、ルールに従った質問をお願いします。
なお、前のトピックを放置することもルール違反となっております。
Re: 2次元配列(関数)を利用した最高値、最小値、平均を求めたい
Posted: 2013年10月16日(水) 21:47
by x最強
申し訳ありません、、、ちゃんとしたルールがあるとは思いませんでした(反省です)。
はい、課題です。
Re: 2次元配列(関数)を利用した最高値、最小値、平均を求めたい
Posted: 2013年10月16日(水) 21:53
by softya(ソフト屋)
前のコードは書けたのに、今回は書けない理由は何でしょうか?
どこまでが課題のコードで自分で書いたコードはどの部分でしょうか?
理解度合い次第でアドバイスが変わるかと思います。
Re: 2次元配列(関数)を利用した最高値、最小値、平均を求めたい
Posted: 2013年10月16日(水) 22:05
by x最強
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()関数も書き換えて構いません。
というものでした
Re: 2次元配列(関数)を利用した最高値、最小値、平均を求めたい
Posted: 2013年10月16日(水) 22:16
by softya(ソフト屋)
関数を分けなければ、各行の最大値、最低値、平均点は前回出来ているので今回もできるのではないでしょうか?
まず、それを書いてみて下さい。
Re: 2次元配列(関数)を利用した最高値、最小値、平均を求めたい
Posted: 2013年10月16日(水) 22:26
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_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]);
}
というところまで作成してみたところ、ん?ってなりまして、、、
このままいくと、とんでもない行になる、、、人から見たら「なんだこれって」って
言われそうだと思い、打つ手を止めて
試行錯誤していた次第です。
Re: 2次元配列(関数)を利用した最高値、最小値、平均を求めたい
Posted: 2013年10月16日(水) 22:46
by Nao
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文でさらに楽に書けそうな気がしますがそうは思いませんか?
ヒントは配列の要素の数字です。
Re: 2次元配列(関数)を利用した最高値、最小値、平均を求めたい
Posted: 2013年10月16日(水) 22:53
by x最強
for文なんだろうなとわ
わかっていてやっても見たんですが、、、代入?の時にうまくいかず断念しました
Re: 2次元配列(関数)を利用した最高値、最小値、平均を求めたい
Posted: 2013年10月16日(水) 23:46
by Nao
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];
}
}
}
(プログラムは動かしていないのであくまで参考程度に)
これで恐らく正常に動くであろう楽に書けるコードができました。
実際に自分で書いて試してください。
(重要なのはこのコードを理解することです。写しただけでは意味がありませんよ。)
Re: 2次元配列(関数)を利用した最高値、最小値、平均を求めたい
Posted: 2013年10月20日(日) 17:56
by x最強
返事本当に遅くてすみませんでした
実際解決してません
というより、自分の知識不足過ぎたので
また一から勉強します。
本当にすみませんでした