Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2021, 11:56   #1
bulka_v_pechali
Новичок
Джуниор
 
Регистрация: 10.06.2021
Сообщений: 5
Печаль Поиск элементов матрицы

Дана квадратная матрица. Посчитать, сколько четных элементов в матрице, соседи которых по вертикали и по горизонтали нечетные числа. Динамически выделить необходимую память для элементов матрицы.
Заранее огромное спасибо. Вот код моей функции, не рабочий.
Код:
void searching(int **m,int n)
{
    int k=0;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(m[i][j]%2==0){
                if(m[i+1][j]%2==1 && m[i-1][j]%2==1 &&  m[i][j+1]%2==1 && m[i][j-1]%2==1)
                    SetColor(5);
                    k++;
            }
        }
    }
    printf("В матрице %i искомых элементов.",k);
    for ( int i=0;i<n;i++) {
            puts("");
        for (int j=0;j<n;j++) {
            printf("%6i",m[i][j]);
        }
    }
    SetColor(15);
}
bulka_v_pechali вне форума Ответить с цитированием
Старый 10.06.2021, 12:13   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Что-то не вижу динамического выделения памяти под матрицу.
Не отработан вариант, когда проверяемый элемент у границы массива - у него только 1 сосед слева или справа или сверху или снизу.
Код:
    SetColor(15);
Впечатлило. Ну прямо в яблочко в этой задаче.
digitalis вне форума Ответить с цитированием
Старый 10.06.2021, 12:18   #3
bulka_v_pechali
Новичок
Джуниор
 
Регистрация: 10.06.2021
Сообщений: 5
По умолчанию

digitalis, Динамическое там есть, просто в другой функции! Благодарю за замечание)
bulka_v_pechali вне форума Ответить с цитированием
Старый 10.06.2021, 14:47   #4
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Вопрос с "приграничным" элементом остаётся. Вылетит на первом же шагу цикла, потому что там нет ни "соседа слева", ни "соседа сверху" . Это в лучшем случае, если отключён контроль границ массива. А в худшем - как бы работает, а результат - БСК.

Код:
    SetColor(15);
- по-прежнему оставляет в недоумении. Кого красим ?
Изображения
Тип файла: jpg 246.JPG (7.0 Кб, 26 просмотров)

Последний раз редактировалось digitalis; 10.06.2021 в 14:51.
digitalis вне форума Ответить с цитированием
Старый 10.06.2021, 16:43   #5
bulka_v_pechali
Новичок
Джуниор
 
Регистрация: 10.06.2021
Сообщений: 5
По умолчанию

digitalis, реализовал все проверки, работать не хочет
Код:
int searching(int **m,int n)
{
    int k=0;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(m[i][j]%2==0){
                if(m[i+1][j]%2==1 && m[i-1][j]%2==1 &&  m[i][j+1]%2==1 && m[i][j-1]%2==1 && j!=0 && i!=0 && j!=n-1 && i!=n-1)//для обладателей 4 соседей
                    k++;

                    else if(i==0 && m[i][j-1]%2==1 && m[i][j+1]%2==1 && m[i+1][j]%2==1) k++;//верхняя граница
                    else if(j==0 && m[i-1][j]%2==1 && m[i][j+1]%2==1 && m[i+1][j]%2==1) k++;//правая граница
                    else if(j==n-1 && m[i-1][j]%2==1 && m[i][j-1]%2==1 && m[i+1][j]%2==1) k++;//левая граница
                    else if(i==n-1 && m[i][j-1]%2==1 && m[i-1][j]%2==1 && m[i][j+1]%2==1) k++;//нижняя граница

                    else if(m[i-1][j]%2==1 && m[i][j+1]%2==1 && i==n-1 && j==0) k++;//правый нижний угол
                    else if(m[i+1][j]%2==1 && m[i][j+1]%2==1 && j==i) k++;//верхний правый угол
                    else if(m[i][j-1]%2==1 && m[i+1][j]%2==1 && j==n-1 && i==0) k++;//верхний левый угол
                    else if(m[i-1][j]%2==1 && m[i][j-1]%2==1 && i==j) k++;//нижний левый угол

            }
        }
    }
    return k;

}
bulka_v_pechali вне форума Ответить с цитированием
Старый 11.06.2021, 05:05   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Сначала надо проверять индекс, а только потом лезть по нему в массив. А еще, мне кажется, что "проваливание" в следующее условие может быть неверным. Допустим, что условия на индексы в первом if выполнены, но сами соседи не все нечетны, тогда будет выполнена проверка этих соседей, будто они являются верхней границей, но это неверно. Попробуйте так:
Код:
if (
    m[i][j] % 2 == 0 &&
    ((i != 0 && m[i - 1][j] % 2 == 1) || i == 0) &&
    ((j != 0 && m[i][j - 1] % 2 == 1) || j == 0) &&
    ((i != n - 1 && m[i + 1][j] % 2 == 1) || i == n - 1) &&
    ((j != n - 1 && m[i][j + 1] % 2 == 1) || j == n - 1)
) k++;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 11.06.2021 в 05:08.
BDA на форуме Ответить с цитированием
Старый 11.06.2021, 11:42   #7
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Я как не сторонник длинных "многоэтажных" выражений , способствующих закипанию мозгов и воспроизведению матовых слов - ввёл бы дополнительные 4 переменные, которые бы определяли "соседей" - если не приграничные - то по общему правилу, если да, то вместо несуществующего элемента массива - нечётную константу. И уж затем if - ить однообразно. Но предварительно, чтоб не делать лишней работы , выполнил бы
Код:
if (m[i][j] % 2 != 0) continue ;
Возможно, умный компилятор так и делает, но что на него полагаться - "сам себе оптимизатор" .
Вообще разбивание монстрообразных конструкций, дающих благодатную почву для произрастания трудноуловимых ошибок, на более простые и ясные для понимания считается хорошей практикой, imho.

Последний раз редактировалось digitalis; 11.06.2021 в 11:46.
digitalis вне форума Ответить с цитированием
Старый 11.06.2021, 15:34   #8
bulka_v_pechali
Новичок
Джуниор
 
Регистрация: 10.06.2021
Сообщений: 5
По умолчанию

BDA, спасибо большое!
bulka_v_pechali вне форума Ответить с цитированием
Старый 11.06.2021, 15:34   #9
bulka_v_pechali
Новичок
Джуниор
 
Регистрация: 10.06.2021
Сообщений: 5
По умолчанию

digitalis, спасибо огромное, разобрался
bulka_v_pechali вне форума Ответить с цитированием
Старый 11.06.2021, 16:05   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

digitalis, согласен насчет неприятности многоэтажных условий, но в данном случае получилось достаточно однообразно, на мой взгляд. По поводу лишней работы: что в си, что в дельфи (если не включать Compiler - Complete boolean eval) логическое "и" считается лениво слева-направо.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск максимального значения элемента из наименьших элементов каждой строки матрицы (Assembler Linux) TIMON_Dark Фриланс 2 08.12.2016 22:08
Поиск элементов матрицы C++++ Помощь студентам 3 15.06.2014 16:26
Матрицы.Поиск координат элементов матрицы. dima-intro Помощь студентам 1 11.12.2010 22:48
поиск серии одинаковых элементов строк матрицы Termit1995 Помощь студентам 1 20.05.2010 06:44
Сумма четных элементов матрицы. Произведение элементов 3-го столбца. Минимальный элемент матрицы. renovare Помощь студентам 2 03.07.2009 21:13