У меня есть программа, которая генерирует 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;
}
Ваша логика здесь:
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
, Это, как говорится, вышеупомянутый результат (неинициализированные переменные) приведет вас к неопределенное поведение.
В современном 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).
Что касается нахождения минимума и максимума каждой записи в строке, вы можете
просто примените функцию алгоритма под названием
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;
}
Прежде всего, подготовьте свою среду следующим образом:
#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 для объявления собственного массива с разными размерами, проще обрабатывать их таким образом
Если вы хотите, вы можете изменить функцию, чтобы она возвращала максимум всех строк.
Если вы хотите получить максимум матрицы, подход аналогичен.