Biomorphix
@Biomorphix

Почему выводится ошибка «необработанное исключение по адресу»?

Привет!
Задача: составить функцию, которая находит первый и последний отрицательный элемент в матрице.
Совсем запутался с указателями и не могу понять в чем дело.
Выводит ошибку "необработанное исключение по адресу". Почему?

#include <iostream>
using namespace std;


void find_first_last(){
   int m, n, first, last;
   cout << "Введите размер матрицы \n\n\n";
   cin >> m >> n;
   /*Создание динамического массива*/
   int **matrix = new int*[m];
   for (int i = 0; i < m; i++)
      matrix[i] = new int[n];

   
   
   /*Заполнение матрицы*/
   cout << "Заполните матрицу \n\n\n";
   for (int i = 0; i < m; i++){
   for (int j = 0; j < n; j++) cin >> matrix[i][j];

   }

   /*Поиск первого и последнего отрицательного элементов в столбцах*/
   for (int j = 0; j < n; j++){
      cout << endl;
      for (int i = 0; i < m; i++){
         if (matrix[m][n] < 0) first = matrix[m][n];
         cout << "Первый отрицательный элементв в столбце " << n << "равен " << first << endl;
         break;
      }
      for (int i = m; i < m; i--){
         if (matrix[m][n] < 0) last = matrix[m][n];
         cout << "Последний отрицательный элементв в столбце " << n << "равен " << last << endl;
         break;
      }
   }
   

}

int main(){

   setlocale(LC_ALL, "Russian");

   find_first_last();
   system("pause");


}
  • Вопрос задан
  • 7590 просмотров
Решения вопроса 2
tsarevfs
@tsarevfs Куратор тега C++
C++ developer
matrix[m][n] вместо matrix[i][j] в поиске элемента это выход за границу массива.

for (int i = m; i < m; i--) //хм
Ответ написан
Комментировать
bogolt
@bogolt
Про неверные индексы матрицы тут вам уже сказали, добавлю что вы не очищаете за собой память. На каждый выделенный блок памяти нужно вызвать delete x[];
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Biomorphix
@Biomorphix Автор вопроса
Наконец-то добрался до ноута.
Понял свои ошибки, разобрался - теперь программа работает. Спасибо!
Вот конечный код программы, если кому интересно:

/*Cоставить ф-цию нахождения первого (first) и последнего (last) по счету отрицательного элемента в столбце матрицы.
Используя эту функкцию, в матрице А(4,6) найти сумму произведения first*last для всех столбцов, а в матрице В(6,5) произведение 
сумм first*last для четных столбцов */



#include <iostream>
using namespace std;
           

 void find_first_last(){
           int m, n, first, last, sum = 0;
           cout << "Введите размер матрицы \n\n\n";
           cin >> m >> n;
           /*Создание динамического массива*/
           int **matrix = new int*[m];
           for (int i = 0; i < m; i++)
                      matrix[i] = new int[n];

           
           
           /*Заполнение матрицы*/
           cout << "Заполните матрицу \n\n\n";
           for (int i = 0; i < m; i++){
           for (int j = 0; j < n; j++) cin >> matrix[i][j];

           }

           /*Поиск первого и последнего отрицательного элементов в столбцах*/
           for (int j = 0; j < n; j++){
                      int fin = 0;
                      cout << endl;

                      //поиск первого отрицательного элемента
                      for (int i = 0; i < m; i++){
                                 if (matrix[i][j] < 0) {first = matrix[i][j]; fin = i;}
                                            else first = NULL;
                                            
                                 if (first){
                                            cout << "Первый отрицательный элементв в столбце " << j << " равен " << first << endl;
                                            break;
                                 }                                 
                                 
                      }
                      
                      if (!first) cout << "Отрицательных элементов в столбце "<< j <<" нет\n";

                      //поиск последнего отрицательного элемента
                      for (int i = m - 1; i > fin; i--){

                                 if (matrix[i][j] < 0) last = matrix[i][j]; 
                                            else last = NULL;
                                 
                                 if (last) 
                                            {
                                            cout << "Последний отрицательный элементв в столбце " << j << " равен " << last << endl;
                                            break;
                                            }
                      }

                      /*
                      Если количество столбцов четное, то вычислять сумму всех столбцов, если нет - то только четных. 
                      Из условия А(4,6), а В(6,5) - закономерность.
                      */

                      if (n % 2 == 0)           sum += last*first;
                                 else if ((j + 1) % 2 == 0) sum += last*first;
                                 
           }
           
           cout << sum;
}

int main(){

           setlocale(LC_ALL, "Russian");

           find_first_last();
           system("pause");


}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы