2016-06-13 9 views
0

私は2D配列を持っていますが、どの行が最大の合計を持つかを調べる関数を書く必要があります。同じ合計を持つ複数の行がある場合は、特にmaxを出力する必要はありません。これは私がこれまでに書いたものです:2D配列の中で最も大きな行を見つける方法は?

int find_max_sum(int b[N][N]) 
{ 
    int row_sum = 0; 
    int row_max = -1; 
    int i,j,k; 
    int counter=0; 
    for(int i =0;i<N;i++) 
    { 
     row_sum = 0; 
     for (j = 0; j < N; ++j) 
     { 
      row_sum += b[i][j] ; 
     } 
     if(row_max < row_sum) 
     { 
      row_max = row_sum; 
     } 
    } 
    for (i = 0; i < N; i++) 
    { 
     for (j= 0;j< N;j++) 
     { 
      if(k=row_max); 
      counter++; 
     } 
    } 
    if (counter>1) 
     return(printf("No unique max.\n")); 
    else 
     return row_max; 
} 

は今、私はカウンターの事で助けを必要とし、機能がintがある場合、どのようにプリントを返すことができますか?出来ますか?

+1

'printf()'は印刷された文字数を返すので、戻り値を返すことができますが、おそらくあなたが望むものではありません。 –

+1

あなたは[配列内の最大数をカウントする方法]を尋ねた[kayan](https://stackoverflow.com/users/6457718/kayan)と同じ問題に取り組んでいますか(https://stackoverflow.com/questions/37780992 /)。違いはありますが、コードのいくつかは非常に似ています。そこにコメントとして書き留めたように、配列を一回通過する回数が最大になる回数をカウントできるはずです。現在の値が現在の最大値より大きい場合は、新しい最大値を記録し、カウントを1に設定するか、現在の値が現在の最大値と等しい場合は、カウントに1を加算します。 –

+0

ネストされたループの2番目のセットに割り当てられた 'if(k = row_max)'というバグがあります。おそらく 'if(k == row_max)'が必要です。 –

答えて

1

例を示します。

#include <stdio.h> 
#include <stdbool.h> 

#define N 2 
#define NO_UNIQUE -1 

int find_max_sum(int b[][N]) 
{ 
    int row_sum, i, j; 
    int row_max = -1; 
    bool unique = false; 

    for (i = 0; i < N; ++i) { 
     row_sum = 0; 
     for (j = 0; j < N; ++j) 
      row_sum += b[i][j]; 

     if (row_max < row_sum) { 
      row_max = row_sum; 
      unique = true; 
     } else if (row_max == row_sum) 
      unique = false; 
    } 

    if (unique) 
     return row_max; 
    else { 
     printf("No unique max.\n"); 
     return NO_UNIQUE; 
    } 
} 

int main(void) 
{ 
    int b[N][N] = {1, 2, 3, 4}; 

    printf("Max sum is %d\n", find_max_sum(b)); 

    return 0; 
} 
+0

彼は配列を渡したいと思います。なぜ彼は 'int **'を使うのだろうか?それは単なるひどい、間違ったアドバイスです。あなたの答えからその部分を削除してください。 – Lundin

+0

@Lundin'find_max_sum(int ** b、int size) 'はグローバル環境で' #define N'を避けるかもしれませんが、それは味の問題だと思います。それは実装する別の選択肢、なぜ*悪いと間違って*? – Wenfeng

+0

ポインタへのポインタは配列とはまったく関係がないためです。 2D配列は、ポインタへのポインタと互換性がありません。だから悪いと間違っている - それは単に使用することはできません - あなたはコーラーコードを変更する必要がありますし、正当な理由がないでしょう。グローバルを持たない実際のプログラムの正しい関数の定義は 'find_max_sum(size_t size、int b [size ] [サイズ]) '。 – Lundin

0

私はあなたがそのようなことを、現在の最大値を持つ行の量を格納する(のがrowsWithMaxCountそれを呼びましょう)3番目の変数を使用することをお勧め:あなたは新しい最大で行を見つけた場合

  • その後、rowsWithMaxCount = 1
  • あなたは row_max == row_sumその後、 ++rowsWithMaxCount
  • はそうrowsWithMaxCountが影響を受けているような行を見つけた場合

これは、二次元配列をループさせないようにします。これは、配列の単一の走査で必要なすべての情報を得ることができるので、コードの無駄です。

どんな意味がありません「のprintfを返す」とあなたはintは、あなたがintを返す必要があります返す関数を宣言した場合、それは、ことはできません。ユニークな最大値がないことを発信者に知らせるために特別な値を使用することを検討してください。たとえば、値が常に正であると仮定すると、次のようになります。

static const int NO_UNIQUE_MAX = -1; 

int find_max_sum(int b[N][N]) { 
    ... 
    if (counter > 1) 
    return NO_UNIQUE_MAX; 
    ... 
} 

しかし、これにより、固有でない最大値が返されなくなります。あなたは両方の返却する必要があるなら、あなたは、あなたが正確に機能の両方の値を返すことができ

struct MaxRowStatus { 
    int value; 
    int count; 
}; 

したがって、たとえば、新しい型を宣言することができます。

+0

okですから、カウンタを見つけるためにループを削除していますか? rowsWithMaxCountを追加するだけですか? – jasmin

+0

こんにちはジャック、私はちょうどそれが動作したいコードを小さくするためにこの義務は重要ではありません!カウントのことは機能していません。 – jasmin

0

あなたが正しくしたいことを理解していれば、この機能を熟考しているかもしれません。 が一意の max sumを含む行の行インデックスを返すだけの場合、またはmax sumが非一意でない場合はno unique max.を出力するだけで、ネストされたループの単一のセットを使用して配列を1回だけ繰り返すだけです。

あなたも、それが発生した行のインデックスと一緒に戻ってあなたの呼び出し元の関数(ここではmain())で利用可能な最大合計を作るための関数にパラメータとしてポインタを渡すことができます。一意性を追跡する最も簡単な方法は、合計の状態を追跡するトグル(0, 1)を維持することです。

例は次のようになります。

int maxrow (int (*a)[NCOL], size_t n, long *msum) 
{ 
    long max = 0; 
    size_t i, j, idx = 0, u = 1; 

    for (i = 0; i < n; i++) {  /* for each row  */ 
     long sum = 0; 
     for (j = 0; j < NCOL; j++) /* compute row sum */ 
      sum += a[i][j]; 
     if (sum == max) u = 0;  /* if dup, unique 0 */ 
     if (sum > max) /* if new max, save idx, u = 1 */ 
      max = sum, idx = i, u = 1; 
    } 
    if (u) { /* if unique, update msum, return index */ 
     if (msum) *msum = max; 
     return idx; 
    } 
    fprintf (stderr, "no unique max.\n"); 
    return -1; /* return -1 if non-unique */ 
} 

注:あなたは、単にmsumパラメータにNULLを渡し、呼び出し元で利用可能な最大の和を持っていることについて気にしない場合)

短いテストプログラムは次のようなものです。単に非ユニーク最大和のための機能の動作をテストするために、第2行のコメントを解除:

#include <stdio.h> 
#include <stdlib.h> 

enum { NCOL = 7 }; 

int maxrow (int (*a)[NCOL], size_t n, long *msum) 
{ 
    long max = 0; 
    size_t i, j, idx = 0, u = 1; 

    for (i = 0; i < n; i++) {  /* for each row  */ 
     long sum = 0; 
     for (j = 0; j < NCOL; j++) /* compute row sum */ 
      sum += a[i][j]; 
     if (sum == max) u = 0;  /* if dup, unique 0 */ 
     if (sum > max) /* if new max, save idx, u = 1 */ 
      max = sum, idx = i, u = 1; 
    } 
    if (u) { /* if unique, update msum, return index */ 
     if (msum) *msum = max; 
     return idx; 
    } 
    fprintf (stderr, "no unique max.\n"); 
    return -1; /* return -1 if non-unique */ 
} 

int main (void) { 

    int a[][7] = {{ 0, 9, 3, 6, 4, 8, 3 }, 
      /* { 3, 9, 2, 7, 9, 1, 6 }, uncomment for test */ 
       { 6, 1, 5, 2, 6, 3, 4 }, 
       { 4, 3, 3, 8, 1, 2, 5 }, 
       { 3, 9, 2, 7, 9, 1, 6 }}, 
     maxidx; 
    long sum = 0; 
    size_t nrow = sizeof a/sizeof *a; 

    if ((maxidx = maxrow (a, nrow, &sum)) != -1) 
     printf (" max sum '%ld' occurs at row : %d (0 - indexed).\n", 
       sum, maxidx); 

    return 0; 
} 

使用例/出力

ユニークな和ケースの場合:

$ ./array2Drow 
max sum '37' occurs at row : 3 (0 - indexed). 

ユニークでない場合:

$ ./array2Drow 
no unique max. 

質問がある場合、または私があなたのニーズを誤解した場合は、それを見て、私に知らせてください。

関連する問題