Тип возвращаемого типа, адресное значение, а ожидалось число
Вычислить сумму элементов вещественной матрицы, находящихся между минимальным и максимальным элементами. Создать функции для:
- определения номера минимального элемента
- определения номера максимального элемента
- определения суммы.
- Функции описать после главной функции
#include <iostream>
using namespace std;
void minimum(int** mas, int n, int m) {
int min = mas[0][0];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
if (min > mas[i][j]) {
min = mas[i][j];
}
}
cout << "Минимальный элемент в массиве\t" << min << endl;
}
void maximum(int** mas, int n, int m) {
int max = mas[0][0];
int sum = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
if (max < mas[i][j]) {
max = mas[i][j];
}
}
cout << "Максимальный элемент в массиве\t" << max << endl;
}
int sum(int min, int max) {
int summa = 0;
summa = min + max;
return summa;
}
int main() {
int n, m;
setlocale(LC_ALL, "RUS");
cout << "Вводите матрицу" << endl;
cin >> n >> m;
cout << "Вводите значения" << endl;
int** mas = new int* [n];
for (int i = 0; i < n; i++)
mas[i] = new int [m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
cin >> mas[i][j];
}
for (int i = 0; i < n; i++) {
cout << "(";
for (int j = 0; j < m; j++)
cout << mas[i][j];
cout << ")" << endl;
}
minimum( mas, n, m);
maximum(mas, n, m);
cout << sum;
}
Ожидал вывод числа в функции суммирование чисел, а выводит адресное значение. В чем может быть ошибка?
Ответы (2 шт):
Не забывайте скобки при вызове функции (в данном случае ещё и аргументы)
cout << sum(minvalue, maxvalue);
А чтобы поиметь minvalue и maxvalue, соответствующие функции нужно сделать полноценными - с возвращаемым значением и return
И, наконец, функция суммы считает совсем не то, о чём говорится в задании сумму элементов вещественной матрицы, находящихся между минимальным и максимальным элементами
И ещё раз "наконец": функции minimum и maximum не определяют "номер" соответствующего элемента.
Функции
minimumиmaximumникак не возвращают максимальный и минимальный элемент соответственно. Можно сделать так:Вернуть
minиmaxчерез операторreturn.Например для функции
minimumтак (дляmaximumаналогично):int minimum(int** mas, int n, int m){ ... //Расчет min ... //Вывод min в консоль return min; } int main(){ ... int min = minimum(mas, n, m); int max = maximum(mas, n, m); }Возвращать
minиmaxчерез ссылкуНапример для функции
minimumтак (дляmaximumаналогично):void minimum(int** mas, int n, int m, int& min){ min = mas[0][0]; ... //Дальнейший расчет min ... //Вывод min в консоль } int main(){ ... int min, max; minimum(mas, n, m, min); maximum(mas, n, m, max); }Используя глобальные переменные.
Для функции
minimumнапример так (дляmaximumаналогично):int min; void minimum(int** mas, int n, int m){ min = mas[0][0]; ... //Расчет min ... //Вывод min }Вызов функций из
mainосуществляется так же, как у вас в вопросе.Так же можно через указатели, но вам лучше выбрать или
1,2или3пункт.
Далее вы пишите так:
cout << sum;Но не передаёте никаких аргументов и поэтому выводится адрес функции.
Нужно писать так:
cout << sum(min, max);minиmaxэто переменные, которые мы определили одним из3методов из1пунктаВы пишите, что вам нужно посчитать сумму элементов между максимальным и минимальным элементом матрицы, но функция
sumпросто считает сумму минимального и максимального значения.Чтобы найти сумму между максимальным и минимальным элементов, можно например, функции
minimumиmaximumизменить так:int minimum(int** mas, int n, int m, int& minRow, int& minCol) { //По ссылке передаем minRow и minCol int min = mas[0][0]; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) if (min > mas[i][j]) { min = mas[i][j]; //Сохраняем координаты минимального элемента в матрице minRow = i; minCol = j; } } cout << "Минимальный элемент в массиве\t" << min << endl; return min; }После завершения функции, через
returnмы получим минимальный элемент, а через ссылки получим его координаты в матрице. Аналогично нужно сделать и в функцииmaximum.Потом после того как получили координаты минимального и максимального элемента, нам нужно поменять их местами, т.к. будем проходится циклами по матрице и чтобы не учитывать,
i++илиi--сделаем так, чтобы например циклiначинался с минимальной, а заканчивался максимальной координатой.Например так (но лучше обмен в функцию вынести):
int row1, row2, col1, col2; int min = minimum(mas, n, m, row1, col1); int max = maximum(mas, n, m, row2, col2); int temp; if (row1 > row2) { temp = row1; row1 = row2; row2 = temp; } if (col1 > col2) { temp = col1; col1 = col2; col2 = temp; }Теперь
row1- минимальная строка,col1- минимальный столбецДело за малым, просто подсчитать сумму между найденными координатами не учитывая минимальный и максимальный элемент:
Например так:
int summa = 0; //Проходимся по матрице for (int i = row1; i <= row2; i++) { for (int j = col1; j <= col2; j++) { //Пропускаем минимальный и максимальный элемент if (i == row1 && j == col1) continue; if (i == row2 && j == col2) continue; //остальное суммируем summa += mas[i][j]; } } //и возвращаем return summa;
Надеюсь понятно все объяснил. Удачи! :)