Нужна помощь в языке С, касательно матриц, возможно циклов -?

Мне нужно сравнивать каждый элемент матрицы сначала с элементами строки, а затем с элементами столбца. Так вот, у элемента к примеру а(1,1) нет элемента слева и нет элемента сверху, а элемента (3,3) все наоборот, а у элемента (2,2) есть элементы со всех сторон. Ну и каждого элемента соответственно такие же нюансы. Так вот, как поведет себя программа, если в условии if я укажу элемент, которого по сути нет? Крашнется или пропустит это условие? Если крашнется, то как реализовать сравнения, чтобы не прописывать это отдельно для каждого элемента матрицы?
  • Вопрос задан
  • 69 просмотров
Пригласить эксперта
Ответы на вопрос 3
В с контроль за массивами на программисте.
Обращаться можно к любому значение, не зависимо от того как определили массив. М[i], i можетбыть любым при чтении. Вы просто прочитаете что в памяти по этому адресу.
А вот при записи, если писать в область за пределы выделенной при компиляции или динамически - результат не предсказуем.
Ответ написан
Комментировать
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Надо проверять на выход за границы массива. В некоторых языках программа может крэшнутся, в других может работать неправильно, читая какой-то мусор.

Можно писать так:
if ((i > 0 && a[i-1][j] > a[i][j]) || (i < n-1 &&  a[i+1][j] > a[i][j])) {
  // текущий элемент меньше хотя бы одного соседа в том же столбце.
}

еще можно так:
if ((i == 0 || a[i-1][j] > a[i][j]) && (i == n-1 ||  a[i+1][j] > a[i][j])) {
  // текущий элемент меньше всех соседей в том же столбце.
}



Комбинируя условия на циклы через || и && можно составить любое нужное вам условие, которое смотрит только на существующих соседей. Но тут важен порядок операций. В C++ (да и почти везде, на самом деле) условия выполняются слева направо и прекращают выполнение, как только результат становится известен. Вот, в первом примере сначала идет проверка на i>0 а потом обращение к массиву через логическое И. Поэтому, если программа будет обрабатывать первый элемент в строке уже на первом условии она заметит, что все условие обязательно false, ведь там стоит &&. И условие с обращением к массиву не будет произведено никогда.
Ответ написан
Комментировать
CityCat4
@CityCat4 Куратор тега C
//COPY01 EXEC PGM=IEBGENER
Во-первых, в С нет матриц :) То есть, нет специального типа matrix, который бы при прибавлении 1 к индексу столбцов корректно туда переходил. Все массивы в С - одномерные. Представление их в виде матрицы - это уже программистская абстракция.
Если Вы укажете элемент которого нет, возникнет исключение SIGSEGV - обращение по неразрешенному адресу, программа упадет.
Циклы работы с матрицами нужно граничить их максимальным индексом.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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