2016-11-24 5 views
1

2次元配列の各行に最大値と最小値を見つけて印刷する必要があります。これはこれまで私が試したことです。2D配列番号を印刷する方法とその座標

int max(int N, int masyvas[][]) 
{ 
    int i, j, max[N][N] 
    for(i=0; i<N; i++) 
     for(j=i; j<N; j++) 
      if(masyvas[i][j] > max) max=masyvas[i][j]; 
    return max; 
} 

私はこれがうまくいかないことは知っていますが、少なくともそれほど有用ではないと思いますか?どのように私はこれにアプローチすべきかに関する提案?

+2

おはよう、あなたは行列の各列の最小値と最大値を印刷しますか? – eyllanesc

+0

はい。それに応じて座標を印刷したい。たとえば、私の行列が5x5で、最大数が行1の列5で9であるとします。私はprintf( "1行目、2行目などの最大数は9で、座標は1と5です" )よくこれらの種類の何か:) – Rytis

+0

ステップバイステップします。 1. 1D配列の最小値と最大値を見つけるプログラムを作成します。それらを座標で印刷してください。 2. 2D配列の各行に対してこの関数を呼び出します。 – MayurK

答えて

0
int i, j, max, min; 
for(i=0; i<N; i++) { 
    max = 0; 
    min = 0; 
    for(j=i; j<N; j++ ) { 
    if (masyvas[i][j] > max) 
     max = masyvas[i][j]; 
    if (masyvas[i][j] < min) 
     min = masyvas[i][j]; 
    } 
} 
1

あなたはとても近くです。 2つの主な問題はmaxタイプです( 別の配列ではなく、通常のint)。 maxの値を各行の前にリセットしなかったという事実です。

int i, j, max; 
for(i=0; i<N; i++) { 
    max = 0; // reset max before checking a row 
    for(j=i; j<N; j++) { 
     if (masyvas[i][j] > max) max = masyvas[i][j]; 
    } 
} 

それはあまりにもminチェックを追加することは困難ではありません。

int i, j, max, min; 
for(i=0; i<N; i++) { 
    max = min = 0; // reset max & min before checking a row 
    for(j=i; j<N; j++) { 
     if (masyvas[i][j] > max) max = masyvas[i][j]; 
     if (masyvas[i][j] < min) min = masyvas[i][j]; 
    } 
    // print the values here 
} 

さて、あなたはそれらの値を印刷したいと言います。上記のように、外側のループ の最後にこれを行うことができます。元の コードのような最終値を返すことは、最後の行の最大値と最小値だけがまだ になるため、あまり意味がありません。あなたがが意図したものであるかもしれないもう一つのアプローチは、 メイクmaxまでで、配列をMINとポインタを返す:

int *maxValues = calloc(sizeof(int) * N); 
int i, j; 
for(i=0; i<N; i++) 
    for(j=i; j<N; j++) 
     if (masyvas[i][j] > maxValues[i]) maxValues[i] = masyvas[i][j]; 

return maxValues; 

あなたはおそらくすでに最大値と最小値(配列)の両方を返すことに気づい 必要になります私の解決策

int ** 
find_max_and_min(int **masyvas) 
{ 
    int **values = malloc(sizeof(int *) * 2); 
    values[0] = calloc(sizeof(int) * N); // to hold min 
    values[1] = calloc(sizeof(int) * N); // to hold max 

    for (int i = 0; i < N; i++) { 
     for (int j = i; j < N; j++) { 
      if (masyvas[i][j] > values[1][i]) values[1][i] = masyvas[i][j]; 
      if (masyvas[i][j] < values[0][i]) values[0][i] = masyvas[i][j]; 
     } 
    } 
    return values; 
} 

int **result = find_max_and_min(data); 
// now result[0] is a 1d array of N size with the minimal values of each 
// row i from data, and result[1] is a similar array but holding the max 
// of each row. 
+0

ありがとう、今私はポインタがどのように動作するか把握する必要があります:x – Rytis

+0

もちろん、これは非常に特定のコードです。ポインタへのポインタ、ポインターへの対処、関数の入出力を行う場合は、メモリ管理とメモリアクセスの全体的な安全性が正しく行われることを保証する必要があります。 – sidyll

+0

ああ、別の質問があります。すべての行の最小値を見つける必要がなく、最大値の最小値とその座標値を表示するとどうなりますか?例えば:私は4x4を持ち、最大値は4行すべてから4 3 8 9であるので、最小値は3です。ポインターなしで保存/操作すれば、3とその座標を出力できますか? – Rytis

1

...ポインタの別のレベルを必要とする:

#include <stdio.h> 

struct Output { 
    int value; 
    int pos; 
}; 

void max(int N, int masyvas[N][N], struct Output max_by_rows[N]){ 
    int i, j; 
    for(i=0; i<N; i++){ 
     max_by_rows[i].value = masyvas[i][0]; 
     max_by_rows[i].pos = 0; 
     for(j=i; j<N; j++) 
      if(masyvas[i][j] > max_by_rows[i].value) 
      { 
       max_by_rows[i].value=masyvas[i][j]; 
       max_by_rows[i].pos = j; 
      } 
    } 
} 


void min(int N, int masyvas[N][N], struct Output min_by_rows[N]){ 
    int i, j; 
    for(i=0; i<N; i++){ 
     min_by_rows[i].value = masyvas[i][0]; 
     min_by_rows[i].pos = 0; 
     for(j=i; j<N; j++) 
      if(masyvas[i][j] < min_by_rows[i].value) 
      { 
       min_by_rows[i].value=masyvas[i][j]; 
       min_by_rows[i].pos = j; 
      } 
    } 
} 

int main(){ 
    int N = 4; 
    int a[4][4] = { 
     {0, 1, 2, 3} , 
     {7, 6, 5, 4} , 
     {8, 9, 10, 11}, 
     {15, 14, 13,12} 
    }; 
    struct Output maxs[4]; 
    struct Output mins[4]; 
    max(N, a, maxs); 
    min(N, a, mins); 
    int i; 
    for(i=0; i <N; i++) 
    { 
     printf("row %d \tmax: %d\tpos: %d\tmin: %d\tpos: %d\n", i, maxs[i].value, maxs[i].pos, mins[i].value, mins[i].pos); 
    } 
    return 0; 
} 

出力:

row 0 max: 3 pos: 3 min: 0 pos: 0 
row 1 max: 7 pos: 0 min: 4 pos: 3 
row 2 max: 11 pos: 3 min: 8 pos: 0 
row 3 max: 15 pos: 0 min: 12 pos: 3 
+0

ありがとうございました。しかし、私は誤ってエクササイズを書いた、私は構造を使用することはできませんし、最大数の最小値を見つける必要があります。また、私の配列のサイズは、手で入力すると任意のサイズにすることができます。良い一日を。 – Rytis

+0

ご迷惑をおかけして申し訳ありません。 – Rytis

関連する問題