Как найти минимальное и максимальное значение в 2D массиве ROW?

У меня есть программа, которая генерирует 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;
}

1

Решение

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

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::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

Пример решения с использованием одномерный векторный массив будет выглядеть так: СМОТРИТЕ ЖИТЬ

#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) будет выглядеть так: СМОТРИТЕ ЖИТЬ

#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;
}
2

Другие решения

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

#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 для объявления собственного массива с разными размерами, проще обрабатывать их таким образом

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

1

По вопросам рекламы [email protected]