Тип возвращаемого типа, адресное значение, а ожидалось число

Вычислить сумму элементов вещественной матрицы, находящихся между минимальным и максимальным элементами. Создать функции для:

  • определения номера минимального элемента
  • определения номера максимального элемента
  • определения суммы.
  • Функции описать после главной функции
#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 шт):

Автор решения: MBo

Не забывайте скобки при вызове функции (в данном случае ещё и аргументы)

cout << sum(minvalue, maxvalue);

А чтобы поиметь minvalue и maxvalue, соответствующие функции нужно сделать полноценными - с возвращаемым значением и return

И, наконец, функция суммы считает совсем не то, о чём говорится в задании сумму элементов вещественной матрицы, находящихся между минимальным и максимальным элементами

И ещё раз "наконец": функции minimum и maximum не определяют "номер" соответствующего элемента.

→ Ссылка
Автор решения: Павел Ериков
  1. Функции minimum и maximum никак не возвращают максимальный и минимальный элемент соответственно. Можно сделать так:

    1. Вернуть 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);
      }
      
    2. Возвращать 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);
      }
      
    3. Используя глобальные переменные.

      Для функции minimum например так (для maximum аналогично):

      int min;
      void minimum(int** mas, int n, int m){
          min = mas[0][0];
          ... //Расчет min 
          ... //Вывод min
      }
      

      Вызов функций из main осуществляется так же, как у вас в вопросе.

    4. Так же можно через указатели, но вам лучше выбрать или 1, 2 или 3 пункт.

  2. Далее вы пишите так:

    cout << sum;
    

    Но не передаёте никаких аргументов и поэтому выводится адрес функции.

    Нужно писать так:

    cout << sum(min, max);
    

    min и max это переменные, которые мы определили одним из 3 методов из 1 пункта

  3. Вы пишите, что вам нужно посчитать сумму элементов между максимальным и минимальным элементом матрицы, но функция 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;
    

Надеюсь понятно все объяснил. Удачи! :)

→ Ссылка