Как сохранить индекс элемента из двухмерного массива в одномерный массив, а затем поменять эти значения - PullRequest
0 голосов
/ 06 мая 2019

У меня проблемы с поиском, как сохранить индекс строки и столбца одного элемента из двумерного массива в одномерный массив.Как только эти индексы сохранены, мне нужно поменять местами элементы друг с другом.Кроме того, я полностью понимаю, что использование 'использование пространства имен std;'не лучший для практики, однако это то, что требуется в этом классе.Вот что у меня есть:

#include <iostream>
#include <iomanip>
using namespace std;

//function prototypes
void minVal(int array2D[4][4], int array1D[], int numElements);
void maxVal(int array2D[4][4], int array1D[], int numElements);
void swapValues(int array2D[4][4], int array1D[], int numElements);


int main() {
    //begin program
    cout << "Array Swap Program" << endl;
    cout << "---------------------------" << endl;

    //initialize 2D array
    int twoDimensionalArray[4][4] = {
            {9, 8, 16, 7},
            {11, 6, 3, 14},
            {13, 4, 5, 12},
            {15, 1, 2, 10}
    };

    //display 2D array to user
    cout << "Below is the two dimensional array: " << endl;
    int row = 4;
    int column = 4;
    for (int i = 0; i < column; i++){
        for (int j = 0; j < row; j++){
            cout << twoDimensionalArray[i][j] << ' ';
        }//end inner for loop
        cout << endl;
    }//end outer for loop

    //initialize 1D array
    int oneDimensionalArray[4] = {{}, {}, {}, {}};


    //find minimum value using minVal function prototype
    minVal(twoDimensionalArray, oneDimensionalArray, 16);

    //find maximum value using maxVal function prototype
    maxVal(twoDimensionalArray, oneDimensionalArray, 16);
    return 0;
}

//function descriptions

//Minimum Value Void Function
void minVal(int array2D[4][4], int array1D[], int numElements){
    cout << "Searching array for minimum vale." << endl;
    cout << "Please wait..." << endl;

    //assign first element to the high variable
    int min = array2D[0][0];
    int row;
    int column;

    //begin search with second element
    for (int sub = 1; sub < numElements; sub += 1){
        if (array2D[0][sub] < min){
            min = array2D[0][sub];
            array1D[0] = array2D[0][sub];
        }//end if
    }//end for
    cout << "The minimum value of the 2D array is: " << min << endl;



    //assign row index to 1D array's first element
    cout << "It's located at row: " << array1D[0] << endl;


}//end of minVal

//Maximum Value Void Function
void maxVal(int array2D[4][4], int array1D[], int numElements){
    cout << "Searching array for maximum value." << endl;
    cout << "Please wait..." << endl;

    //assign first element to the high variable
    int max = array2D[0][0];

    //begin search with second element
    for (int sub = 1; sub < numElements; sub += 1){
        if (array2D[0][sub] > max){
            max = array2D[0][sub];
        }//end if
    }//end for
    cout << "The maximum value of the 2D array is: " << max << endl;
}//end of maxVal

Я ожидаю, что на выходе будут значения индекса oneDimensionalArray

{{индекс строки minVal 2D-массива}, {столбец minValиндекс двумерного массива}, {индекс строки maxVal двумерного массива}, {индекс столбца maxVal двумерного массива}};

Затем следует поменять местами минимальное и максимальное значения, указанные в двумерном массиве.

Буду признателен за объяснение того, как найти эти вещи, а не только за решение.Спасибо!

1 Ответ

3 голосов
/ 06 мая 2019

Поскольку двумерный массив хранит свои элементы в смежной памяти, вы можете получить как минимум, так и максимум, а также расстояние от начала массива, используя std :: minmax_element и std :: distance .

Вот небольшой пример:

#include <iostream>
#include <algorithm>

int main() 
{
    //initialize 2D array
    int twoDimensionalArray[4][4] = {
            {9, 8, 16, 7},
            {11, 6, 3, 14},
            {13, 4, 5, 12},
            {15, 1, 2, 10}
    };

    // get both the minimum and maximum element in the 2D array
    auto pr = std::minmax_element(&twoDimensionalArray[0][0], &twoDimensionalArray[3][4]);

    // get the distances 
    auto dist_min = std::distance(&twoDimensionalArray[0][0], pr.first);
    auto dist_max = std::distance(&twoDimensionalArray[0][0], pr.second);
    std::cout << "Min Value: " << *(pr.first) <<  "  Distance: " << dist_min << "\n";
    std::cout << "Max Value: " << *(pr.second) << "  Distance: " << dist_max;
}

Вывод:

Min Value: 1  Distance: 13
Max Value: 16  Distance: 2

Живой пример

Обратите внимание на использование std::minmax_element - параметры - это, в основном, адрес первого элемента в 2D-массиве и адрес одного последнего элемента в 2D-массиве.Это дает нам диапазон для поиска и соответствует требованиям для minmax_element относительно итераторов, которые используются для первых двух параметров.


Если матрица гарантированно будет квадратной, томы можем получить строку и столбец минимума и максимума, используя небольшую часть математики, используя модуль и деление:

#include <iostream>
#include <algorithm>

int main() 
{
    //initialize 2D array
    int twoDimensionalArray[4][4] = {
            {9, 8, 16, 7},
            {11, 6, 3, 14},
            {13, 4, 5, 12},
            {15, 1, 2, 10}
    };

    auto pr = std::minmax_element(&twoDimensionalArray[0][0], &twoDimensionalArray[3][4]);
    auto dist_min = std::distance(&twoDimensionalArray[0][0], pr.first);
    auto dist_max = std::distance(&twoDimensionalArray[0][0], pr.second);
    int row_min = dist_min / 4;
    int col_min = dist_min % 4;
    int row_max = dist_max / 4;
    int col_max = dist_max % 4;
    std::cout << "Min Value: " << *(pr.first) << "\n" << "Min Location: (" << row_min << "," << col_min << ")\n\n";
    std::cout << "Max Value: " << *(pr.second) << "\n" << "Max Location: (" << row_max << "," << col_max << ")\n";
}

Вывод:

Min Value: 1
Min Location: (3,1)

Max Value: 16
Max Location: (0,2)

Так что если вы хотите использовать этоВ этом случае вам просто нужно настроить свой код так, чтобы он содержал значения индексов строк и столбцов в объявленных одномерных массивах.

Live Example

...