2016-12-01 1012 views
2

我已經編寫了代碼,允許您輸入NxN雙數組的一個維度。然後它會在二維數組中打印隨機數,並找出每一行的最大和最小數量。然後打印它們和它們的座標(行和列)。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) 
} 

第一步是編寫一個例程,在列表中找到最大值和位置。你可以將它作爲一個大功能來完成,但是它更容易理解和調試。

您還需要找到它的索引。由於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; 
} 

,而不是與一些任意最大或最小起,我使用的備選技術,其中我設置最大爲第一元件,然後開始從第二個檢查。現在,我有一個函數來找到一排最大


,我現在可以遍歷它,得到各行的最大值,並與最低爲整個表進行比較。

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); 
} 

我使用了不同的技術來初始化最小位置,因爲獲取第一個最大值需要在循環中重複一些代碼。相反,我將min設置爲儘可能最低的整數,INT_MAX來自limits.h,這是可能的最高整數。這允許代碼與任何整數範圍一起使用,沒有限制。使用最小/最大算法時,這是一種非常常見的技術。

+0

謝謝你的回答。但是這個excersise要求我不要使用struct。我修改了代碼,以便找到最小編號。現在我很難找到它的座標。我明白你正在以有效的方式進行編碼。但是,這是一個相當簡單的任務,我只能使用數組,而沒有其他任何更多,也許功能符合我的偏好,但簡單性使得這很難想象。你有什麼想法,我怎麼能存儲座標,所以我可以打印它們,從這個代碼: – Rytis

+0

@Rytis \ *嘆\ *傻的作業限制,他們教壞習慣。您可以通過使用兩個元素的整數數組來避開結構限制;第一個是數字,第二個是位置。爲了便於閱讀,使用'#define NUM 0'和'#define IDX 1'可以編寫'max [NUM]'和'max [IDX]'。這允許您繼續使用函數,而不是將所有內容都塞進多級循環中。 – Schwern

+0

愚蠢的問題,但我如何添加代碼到我的評論,我認爲你會更容易看到我做了什麼,而不是咕about。我也同意你的觀點,限制對於提高效率並不好。 :x – Rytis

相關問題