Как найти минимальное и максимальное значение в 2D массиве ROW? - PullRequest
0 голосов
/ 27 октября 2018

У меня есть программа, которая генерирует 10 строки и 5 столбцы и данные, вводимые пользователем.У меня вопрос, как я могу найти максимальные и минимальные значения в каждой строке?Я работал над этим в течение хорошего часа, но не могу понять это.Я пытался решить это много раз;вот мой текущий код.

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

int returnMax(int[][]);
int main() 
{
    double sales[10][5];
    string name[10];
    double highest;
    double lowest;
    double avg;
    // Populating table
    for (int row = 0; row < 1; row++) 
    {
        cout << "Enter the salesman's name: " << endl;
        cin >> name[row];
        cout << "Enter the amount of sales for the five years" << endl;
        for (int col = 0; col < 5; col++) {
            cin >> sales[row][col];
        }
    }
    cout << returnMax(sales[1][0]) << endl;
    return 0;
}

int returnMax(int a[][]) 
{
    int max;
    for (int i = 0; i < 1; i++) {
        max = a[i][0];
        for (int j = 0; j < 5; j++) {
            if (a[i][j] > max)
                max = a[i][j];
        }
    }
    return max;
}

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Ваша логика здесь:

cout << returnMax(sales[1][0]) << endl;

неправильно. sales[1][0] - это только один элемент из всего sales массива . Это означает, sales[1][0] = element of 1st row and 0th column в sales массиве, в котором у вас не было инициализированных значений . Потому что у вас инициализирована только одна строка во всем вашем массиве, так как у вас есть строка:

for (int row = 0; row < 1; row++)

Помните, что в C ++ индексация начинается с 0, а не с 1. При этом приведенный выше результат ( неинициализированные переменные ) приведет к тому, что вы будете иметь неопределенное поведение .


Предложения:

  1. В современном C ++ у вас есть лучшие варианты, чем использование сырых массивов. За Например, использование станд :: вектор <> или std :: array <> делает ваш код проще и безопаснее. В вашем случае вы можете либо есть

    std::vector<int> sales(50, 0) // one dimentional: with 10 * 5 entries
    

    и управляйте строками соответственно ( см. Решение-1 ) или

    std::vector<std::vector<int>> sales(10, std::vector<int>(5, 0));
                          // two dimensional: with 10 rows and 5 columns
    

    и используйте основанные на диапазоне значения для циклов, так что вы никогда не получите проблемы за пределами границ ( см. решение-2 ) .

  2. Относительно нахождения минимума и максимума для каждой записи в строке, вы можете просто примените функцию алгоритма под названием std::minmax_element из алгоритм заголовок.


Образец раствора - 1

Пример решения с использованием одномерного векторного массива будет выглядеть следующим образом: SEE LIVE

#include <iostream>
#include <vector>    // std::vector
#include <algorithm> // std::minmax_element
#include <string>

int main()
{
    constexpr std::size_t rawMax = 2;
    constexpr std::size_t colMax = 5;
    // one dimentional array with size = (rawMax * colMax)
    std::vector<int> sales(rawMax * colMax, 0);
    std::vector<std::string> name(rawMax);

    // Populating table
    for (std::size_t row = 0; row < rawMax; ++row)
    {
        std::cout << "Enter the salesman's name: "; std::cin >> name[row];
        std::cout << "Enter the amount of sales for the five years: " ;
        for (std::size_t col = 0; col < colMax; ++col)
            std::cin >> sales[(row*colMax) + col]; // convert col and raw to 1D index.
    }
    /// get the begin and end of each row as iterators
    auto rowBeginIter = sales.begin();
    auto rowEndIter = sales.begin() + colMax - 1;
    for (const std::string& str: name)
    {
        std::cout << "salesman's name: "; std::cout << str;
        auto getMinMaxRow = std::minmax_element(rowBeginIter, rowEndIter + 1);
        std::cout << " min: " << *getMinMaxRow.first
                  << " max: " << *getMinMaxRow .second << std::endl;
        rowBeginIter += colMax;  // increment both iterator to the next raw
        rowEndIter += colMax;
    }
    return 0;
}

Пример раствора - 2

Пример решения с использованием вектора векторов (2D) будет выглядеть следующим образом: SEE LIVE

#include <iostream>
#include <vector>    // std::vector
#include <algorithm> // std::minmax_element
#include <string>

int main()
{
    constexpr std::size_t rawMax = 2; // to test
    constexpr std::size_t colMax = 5;
    // initilize thw 2D vector of vectors with (rawMax x colMax)
    std::vector<std::vector<int>> sales(rawMax, std::vector<int>(colMax, 0));
    // initilize with  0's with a size that of maximum number of rows.
    std::vector<std::string> name(rawMax, "");
    // Populating table
    for (std::size_t row = 0; row < rawMax; row++)
    {
        std::cout << "Enter the salesman's name: "; std::cin >> name[row];
        std::cout << "Enter the amount of sales for the five years: " ;
        for (std::size_t col = 0; col < colMax; col++) {
            std::cin >> sales[row][col];
        }
    }
    /* print max and min of each person
     * use range based for loops to loop through them
     * (optional: index based loops can also be used like above)
     */
    auto nameIter = name.cbegin();
    for(const std::vector<int>& each_row: sales)
    {
        std::cout << "salesman's name: "; std::cout << *nameIter << "\t";
        auto getMinMaxRow = std::minmax_element(each_row.cbegin(), each_row.cend());
        std::cout << " min: " << *getMinMaxRow.first
                  << " max: " << *getMinMaxRow.second << std::endl;
        ++nameIter; // increment the iterator of name-vector
    }
    return 0;
}
0 голосов
/ 27 октября 2018

Прежде всего, подготовьте свою среду следующим образом:

#define NROWS 10 //use a constant for number of rows
#define NCOLUMNS 5 // use a constant for number of columns

typedef int Matrix[NROWS][NCOLUMNS]; // declare the type Matrix which is 2d Array using NROWS and NCOLUMNS as size

int returnMaxForRow(int,Matrix); //If you want to know the max value of a row, you need to pass the row

так что в основном вы можете сделать:

int main () {
 Matrix sales; //You don't need to specify the size, which is done before
 string name[10];
 double highest;
 double lowest;
 double avg;

 ecc....

Теперь ваша функция должна сделать это:

  int returnMaxForRow (int row, Matrix a) {
    int max = a[row][0];

    for (int i = 0; i < NCOLUMNS; i++) {
       if (a[row][i] > max){
         max = a[row][i];
       }
    }
    return max;
   }

так что вы можете назвать это так:

 cout<< returnMaxForRow(0,sales);
 cout<< returnMaxForRow(1,sales);
 cout<< returnMaxForRow(2,sales);
 cout<< returnMaxForRow(3,sales);

Несколько советов:

Используйте константы или переменную для установки индекса массива, например, определение оператора Когда вы делаете продажи [1] [0], вы получаете одно значение (строка 1, столбец 0), а не всю строку Используйте typedef для объявления собственного массива с разными размерами, проще обрабатывать его таким образом

Если вы хотите, вы можете изменить функцию так, чтобы она возвращала максимум всех строк. Если вы хотите получить максимум матрицы, подход аналогичен.

...