2016-12-01 54 views
2

NxN double配列の1次元を入力できるコードを記述しました。次に、2D配列の乱数を出力し、各行の最大値と最小値を求めます。次に、それらとそれらの座標(行と列)を印刷します。C言語。最大限の最小値を見つける方法。 (2D配列)

注意! コードの最小値が見つかるようにコードを変更しました。

int N, i, j, min=1000, max, m , o; 
time_t t; 
int masyvas[100][100], minmax[100]; 
printf("Enter one dimension of a NxN array\n"); 
scanf("%d", &N); 



srand((unsigned) time(&t)); 
for (i=0; i<N; i++) 
{ 
    for (j=0; j<N; j++) 
    { 
     masyvas[i][j] = rand() % 10; 
     printf("%4d", masyvas[i][j]); 

    } 
    printf("\n"); 
} 




int k, l, idkeymax, idkeymin; 
for(k=0; k<N; k++) 
{ 

    max=-1000; 
    for(l=0; l<N; l++) 
    { 
     if(max<masyvas[k][l]) 
     { 
      max=masyvas[k][l]; 

     } 

    } 
    minmax[k]=max; 

} 
for(m=0; m<N; m++) 
    {if(minmax[m]<min) 
     min=minmax[m]; 
    } 

printf("maziausias skaicius tarp didziausiu yra %d eiluteje %d stulpelyje %d\n",min); 
+0

は関係ありませんが、ユーザが入力した「N」が[1,10]の範囲にあることを確認する必要があります。さもなければ、あなたは配列の境界から外れます( 'N == 0'でも問題ありませんが、何も起こりません)。 – yano

答えて

1

ここにあなたが何をする必要があるかの擬似コードだ:私は今、次のように

私のコードがある座標です見つける方法がわかりません。

for row in grid { 
    row_max = max_in_row(row) 
    grid_min = min(grid_min, row_max) 
} 

ステップ1は、リスト内でmaxとlocationを見つけるルーチンを作成することです。これを1つの大きな機能として実行できますが、断片的に理解してデバッグする方がはるかに簡単です。

また、見つかったインデックスも必要です。 Cは複数の値を返すことができないので、番号/インデックスのペアを格納する構造体が必要になります。構造体を作るたびに、それを作成して破壊するためのルーチンを作ります。これほど些細なことでは、あまりにも不愉快に思えるかもしれませんが、コードを理解してデバッグするのがはるかに簡単になります。

typedef struct { 
    int num; 
    size_t idx; 
} Int_Location_t; 

static Int_Location_t* Int_Location_new() { 
    return calloc(1, sizeof(Int_Location_t)); 
} 

static void Int_Location_destroy(Int_Location_t* loc) { 
    free(loc); 
} 

ここで、行の最大数と位置を見つける小さな関数を作成できます。

static Int_Location_t* max_in_row(int *row, size_t num_rows) { 
    Int_Location_t *loc = Int_Location_new(); 

    /* Start with the first element as the max */ 
    loc->num = row[0]; 
    loc->idx = 0; 

    /* Compare starting with the second element */ 
    for(size_t i = 1; i < num_rows; i++) { 
     if(row[i] > loc->num) { 
      loc->num = row[i]; 
      loc->idx = i; 
     } 
    } 

    return loc; 
} 

ではなく、いくつかの任意の最大または最小で始まる、私は最初の要素であることmaxに設定し、第1のチェックを開始別の技術を使用しました。


今、私は行の最大を見つけるための機能を持っていることを、私は今それ以上のループは、各列の最大値を取得し、テーブル全体の最小とそれを比較することができます。

int main() { 
    int grid[3][3] = { 
     {10, 12, 15}, 
     {-50, -15, -10}, 
     {1,2,3} 
    }; 

    int min = INT_MAX; 
    size_t row = 0; 
    size_t col = 0; 

    for(size_t i = 0; i < 3; i++) { 
     Int_Location_t *max = max_in_row(grid[i], 3); 
     printf("max for row %zu is %d at %zu\n", i, max->num, max->idx); 

     if(max->num < min) { 
      min = max->num; 
      col = max->idx; 
      row = i; 
     } 

     Int_Location_destroy(max); 
    } 

    printf("min for the grid is %d at row %zu, col %zu\n", min, row, col); 
} 

最初の最大値を得るにはループ内のコードを繰り返す必要があるため、最小限の位置を初期化するために別の手法を使用しました。代わりに、可能な限り小さい整数INT_MAXからlimits.hに、minを設定します。これにより、任意の整数の範囲でコードを使用できますが、制限はありません。これは、最小/最大アルゴリズムで作業する場合の非常に一般的な手法です。

+0

ありがとうございます。しかし、このexcersiseは私が構造体を使用しないように要求します。私は最小数を見つけるようにコードを変更しました。今私はそれが座標であることを見つけるのに苦労している。私はあなたが効率的な方法でコーディングしていることを理解しています。しかし、これはかなりシンプルな作業ですが、配列のみを使用することはできますが、多分私の好みのための関数かもしれませんが、単純さはこれを考えるのが難しいことです。 – Rytis

+0

@Rytis \ * sigh \ *愚かな宿題の制限で、彼らは悪い習慣を教えています。構造体の制限を回避するには、2要素の整数配列を使用します。最初は数字、2番目は場所です。 '#define NUM 0'と' #define IDX 1'を使うと、読みやすくするために 'max [NUM]'と 'max [IDX]'を書くことができます。これにより、すべてを多レベルのループに詰め込むのではなく、引き続き関数を使用することができます。 – Schwern

+0

愚かな質問ですが、私のコメントにコードを追加するにはどうすればいいのか分かりません。そして、私はあなたに同意します。制限は効率的ではありません。 :x – Rytis

関連する問題