#include <stdio.h>
#include <stdlib.h>
void count_odd_neg(int A[5][5], int *odd_neg_sum, int *odd_neg_count) {
*odd_neg_sum = 0;
*odd_neg_count = 0;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (A[i][j] < 0 && A[i][j] % 2 != 0) {
*odd_neg_sum += A[i][j];
*odd_neg_count++;
}
}
}
}
void count_local_max(int A[5][5], int *local_max_count) {
*local_max_count = 0;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
int is_local_max = 1;
for (int k = i - 1; k <= i + 1; k++) {
for (int l = j - 1; l <= j + 1; l++) {
if (k >= 0 && k < 5 && l >= 0 && l < 5 && (k != i || l != j)) {
if (A[k][l] >= A[i][j]) {
is_local_max = 0;
break;
}
}
}
if (!is_local_max) {
break;
}
}
if (is_local_max) {
*local_max_count++;
}
}
}
}
int main() {
int A[5][5];
int odd_neg_sum, odd_neg_count, local_max_count;
printf("Ввидите матрицу 5х5:\n");
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
scanf("%d", &A[i][j]);
}
}
count_odd_neg(A, &odd_neg_sum, &odd_neg_count);
count_local_max(A, &local_max_count);
printf("Odd negative sum: %d\n", odd_neg_sum);
printf("Odd negative count: %d\n", odd_neg_count);
printf("Локальный максимум: %d\n", local_max_count);
return 0;
}
C/C++
Ошибка в коде не считается локальный максимум
Ошибка в коде заключается в неправильной проверке условия для определения локального максимума. В текущей реализации, если соседний элемент больше или равен текущему элементу, он считается максимумом, что неверно. Нужно проверить, что все соседние элементы меньше текущего элемента.
Вот исправленный код для функции `count_local_max`:
```c
void count_local_max(int A[5][5], int *local_max_count) {
*local_max_count = 0;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
int is_local_max = 1;
for (int k = i - 1; k <= i + 1; k++) {
for (int l = j - 1; l <= j + 1; l++) {
if (k >= 0 && k < 5 && l >= 0 && l < 5 && (k != i || l != j)) {
if (A[k][l] >= A[i][j]) {
is_local_max = 0;
break;
}
}
}
if (!is_local_max) {
break;
}
}
if (is_local_max) {
(*local_max_count)++;
}
}
}
}
```
Теперь проверяется, что все соседние элементы меньше текущего элемента, чтобы его можно было считать локальным максимумом.
Вот исправленный код для функции `count_local_max`:
```c
void count_local_max(int A[5][5], int *local_max_count) {
*local_max_count = 0;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
int is_local_max = 1;
for (int k = i - 1; k <= i + 1; k++) {
for (int l = j - 1; l <= j + 1; l++) {
if (k >= 0 && k < 5 && l >= 0 && l < 5 && (k != i || l != j)) {
if (A[k][l] >= A[i][j]) {
is_local_max = 0;
break;
}
}
}
if (!is_local_max) {
break;
}
}
if (is_local_max) {
(*local_max_count)++;
}
}
}
}
```
Теперь проверяется, что все соседние элементы меньше текущего элемента, чтобы его можно было считать локальным максимумом.
Локальный максимум в строке или в матрице?
Если в матрице, учитываются 4 прилегающих или 8 соседних элементов?
Максимум может быть в углу матрицы?
Если проверяемый элемент совпадает с одним из соседних, он может быть максимумом?
Ты выдал только неправильно работающий код, но не выдал само задание. Без которого ответ превращается в гадание на кофейной гуще.
Учитываются 8, может быть в углу, совпадает - всё равно максимум. И нормальная функция с нормально возвращаемым значением. Городить указатели для возврата единственного целого числа бессмысленно.
Если в матрице, учитываются 4 прилегающих или 8 соседних элементов?
Максимум может быть в углу матрицы?
Если проверяемый элемент совпадает с одним из соседних, он может быть максимумом?
Ты выдал только неправильно работающий код, но не выдал само задание. Без которого ответ превращается в гадание на кофейной гуще.
Учитываются 8, может быть в углу, совпадает - всё равно максимум. И нормальная функция с нормально возвращаемым значением. Городить указатели для возврата единственного целого числа бессмысленно.
int count_local_max(int A[5][5]) {
int cnt = 0;
for (int i = 0; i < 5; ++i) {
for int j = 0; j < 5; ++j) {
int tmp = 0;
for (int k = max(0, i - 1), k1 = min(i + 2, 5); k < k1; ++k) {
for (int m = max(0, j - 1), m1 = min(j + 2, 5); m < m1; ++m) {
tmp += A[k][m] > A[i][j];
}
}
cnt += tmp == 0;
}
}
return cnt;
}
Вариант, считающий только строгие максимумы (никаких "равно"): int count_local_max(int A[5][5]) {
int cnt = 0;
for (int i = 0; i < 5; ++i) {
for int j = 0; j < 5; ++j) {
int tmp = -1;
for (int k = max(0, i - 1), k1 = min(i + 2, 5); k < k1; ++k) {
for (int m = max(0, j - 1), m1 = min(j + 2, 5); m < m1; ++m) {
tmp += A[k][m] >= A[i][j];
}
}
cnt += tmp == 0;
}
}
return cnt;
}
Похожие вопросы
- Ошибки в коде c++
- Помогите, пожалуйста, исправить ошибку в коде (C++).
- Помогите найти ошибку в коде
- Где ошибка в коде с++
- Ошибки в коде. Почему не работает и как сделать чтобы заработало ?
- Задача на максимальное произведение в векторе C++ Где ошибка в коде?
- Помогите найти ошибки в коде на C++, не выводится последняя строчка
- Выдаёт ошибку в коде.Помогите
- Помогите исправить ошибку в коде, смотри внутри.
- Где ошибка в коде?