簡體   English   中英

C ++在數組中查找max(按行)和min(按列)元素

[英]C++ Find max(by row) and min(by column) element in array

我需要按行在二維(4,4)數組中找到最小元素,並按列在最大元素中找到它們,然后將它們存儲在另一個數組(5,5)中。也許我沒有正確解釋。

這就是新數組(5,5)的外觀:

1 2 3 4 min
1 2 3 4 min
1 2 3 4 min
m m m m 0 

* m-最大值

所以這是第一個數組:

int array[4][4];
int i, j;

for(i = 0; i < 4; i++) {
    for(j = 0; j < 4; j++) {
        cout << "\n array[" << i + 1 << "][" << j + 1 <<"]=";
        cin >> array[i][j];
    }
}

我試圖找到每一行的最小值:

int min;
for (i = 0; i<4; i++) {
    min[i] = array[0][i];/*expression must have pointer-to-object type*/
    for (j = 1; j<4; j++) {
        if (min[i]>array[i][j])/*expression must have pointer-to-object type*/
            min[i] = array[i][j];/*expression must have pointer-to-object type*/
    }
}

我哪里錯了? 我無法理解這個錯誤“表達式必須具有指針到對象的類型”。

並以此,我將嘗試制作新的數組:

for(i = 0; i < 4; i++) {
    for(j = 0; j < 4; j++) { 
        newarr[i][j]=array[i][j];
        newarr[i][5]=max[i];
    }
}

for(j = 0; j < 4; j++) 
    newarr[5][j]=min[j];

這個可以嗎? 無法檢查它,因為我無法找到最小和最大。

int min;

min[i]

是錯誤的根源。 min是整數變量,不是整數數組。

將int min更改為int min [4];

你有int min; 此變量只能包含單個值,並且后面的格式不正確,是min[i] ,因為min不是數組。

只需將其設置為數組即可解決該問題: int min[4];

還要注意,二維數組的第一個索引通常表示行,第二個表示列。 並檢查循環中索引的使用情況:為什么在不同的地方將i用作bot的第一和第二索引?

這里顯示了一種簡單的方法。 您可以將其用作程序的基礎

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>

int main()
{
    const int MAX_VALUE = 100;

    const size_t N = 4;
    int a[N][N];
    int b[N+1][N+1];

    std::srand( ( unsigned int )std::time( nullptr ) );

    for ( auto &row : a )
    {
        for ( int &x : row ) x = std::rand() % MAX_VALUE;
    }

    for ( const auto &row : a )
    {
        for ( int x : row ) std::cout << std::setw( 2 ) << x << ' ';
        std::cout << std::endl;
    }

    std::cout << std::endl;

    for ( size_t i = 0; i < N; i++ ) b[N][i] = a[0][i];
    b[N][N] = 0;

    for ( size_t i = 0; i < N; i++ )
    {
        int min = a[i][0];
        for ( size_t j = 0; j < N; j++ )
        {
            b[i][j] = a[i][j];
            if ( a[i][j] < min ) min = a[i][j];
            if ( b[N][j] < b[i][j] ) b[N][j] = b[i][j];
        }
        b[i][N] = min;
    }

    for ( const auto &row : b )
    {
        for ( int x : row ) std::cout << std::setw( 2 ) << x << ' ';
        std::cout << std::endl;
    }

    std::cout << std::endl;
}

程序輸出可能看起來像

77 53 41 90 
67 57 90 94 
20 41 29 38 
 3 72 33 43 

77 53 41 90 41 
67 57 90 94 57 
20 41 29 38 20 
 3 72 33 43  3 
77 72 90 94  0 

這個想法是用原始數組的第一行的值填充新數組的最后一行,然后將最后一行的每個值與當前列中當前行的值進行比較。

好吧,這就是整個代碼:

#include <iostream>
using namespace std;
int main() {
    int A[4][4];
    int i, j;


    for (i = 0; i < 4; i++)
        for (j = 0; j < 4; j++) {
            cout << "\n A[" << i + 1 << "][" << j + 1 << "]=";
            cin >> A[i][j];
        }

    for (i = 0; i < 4; i++) {
        for (j = 0; j < 4; j++)
            cout << A[i][j] << "\t";

        cout << "\n";
    }
    {
        int min[4];
        for (i = 0; i < 4; i++) {
            min[i] = A[0][i];
            for (j = 1; j < 4; j++) {
                if (min[i] > A[i][j])
                    min[i] = A[i][j];
            }
        }
        int newarr[5][5];
        int max[5] = { 1,2,3,4,5 };
        for (i = 0; i < 4; i++) {
            for (j = 0; j < 4; j++) {
                newarr[i][j] = A[i][j];
                newarr[i][5] = max[i];
            }
        }

        for (j = 0; j < 4; j++)
            newarr[5][j] = min[j];
        cout << newarr[5][j] << "\t";
        cout << "\n";

    }

}

我把隨機元素最大化。 因為到目前為止我只測試。 但是一旦我啟動程序,它只會顯示第一個數組正確的內容。 新數組應該在哪里顯示零。 這是調試的結果:

5   4   3   1   
5   6   7   9   
4   2   3   9   
4   8   4   6   
0   

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM