0 / 0 / 0
Регистрация: 02.12.2019
Сообщений: 28
1

Для строк, содержащих на главной диагонали отрицательные элементы,найти максимальный элемент

19.01.2020, 15:50. Показов 3872. Ответов 8

Author24 — интернет-сервис помощи студентам
Добрый день!
Помогите, пожалуйста, вроде код должен работать, но выводит постоянно -3.
строки 34-45
При правильной работе программа должна вернуть значения 9 для первой строки и 3 для 3й.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <stdio.h>
#define K 4
int max_matrix(int[K][K], int n);
int print_matrix(int[K][K], int n);
 
int main(){
int matrix[K][K];
matrix[0][0] = -3;
matrix[0][1] = 1;
matrix[0][2] = 9;
matrix[0][3] = 8;
matrix[1][0] = 10;
matrix[1][1] = 3;
matrix[1][2] = 2;
matrix[1][3] = 3;
matrix[2][0] = -4;
matrix[2][1] = 1;
matrix[2][2] = -2;
matrix[2][3] = 3;
matrix[3][0] = 1;
matrix[3][1] = 7;
matrix[3][2] = 5;
matrix[3][3] = 0;
 
 
print_matrix(matrix, K);
printf ("\n");
 
max_matrix(matrix, K);
}
 
 
 
int max_matrix(int a[K][K], int n){
int max = a[0][0];
int i, j;
for(i=0; i<n; i++){
    if(a[i][i]<0){
        for(j=0; j<n; j++){
            if(a[i][j]>max)
                a[i][j]=max;
        }
    }
        
}
 
 
{
printf("The maximum meaning is: %d\n", max);
 
}
return max;
}
 
int print_matrix(int a[K][K], int n){
for(int i=0; i<n; i++){
printf("\n");
for ( int j =0; j<n; j++)
printf("%4d", a[i][j]);
 
}
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.01.2020, 15:50
Ответы с готовыми решениями:

Для строк, содержащих на главной диагонали отрицательные элементы, вывести на экран сумму элементов.
Помогите, буду благодарен) Дана матрица действительных чисел F размерности mxm, содержащая как...

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

Заменить элементы главной диагонали матрицы нулями и найти максимальный элемент ниже побочной диагонали
Есть пример для решения другой задачи(она находит суму всех элементов каждой строки и выводит...

В двумерном массиве найти максимальный среди элементов вне главной диагонали и разделить отрицательные элементы на 40
В двумерном массиве А из m строк и n столбцов найти максимальный среди элементов вне главной...

8
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12454 / 7479 / 1752
Регистрация: 25.07.2009
Сообщений: 13,755
19.01.2020, 16:55 2
Честно лень вникать, что там не так, проще заново сделать
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
 
int * max_element(const int * array, size_t size) {
    return ( size < 2 ) ? (int*)array : max_element(array + ( array[0] < array[size - 1] ), size - 1);
}
 
void dump_array(const int * array, size_t size) {
    while ( size-- )
        printf("%3d ", *array++);
    printf("\n");
}
 
#define SIZE 4
 
int main(void) {
    int i, matrix[SIZE][SIZE] = {
        { -3, 1, 9, 8 },
        { 10, 3, 2, 3 },
        { -4, 1, -2, 3 },
        { 1, 7, 5, 0 }
    };
 
    printf("Matrix:\n");
    for ( i = 0; i < SIZE; ++i )
        dump_array(matrix[i], SIZE);
    
    printf("\nMax elements on some rows:\n");
    for ( i = 0; i < SIZE; ++i )
        if ( matrix[i][i] < 0 )
            printf("Row #%d Max: %d\n", i + 1, *max_element(matrix[i], SIZE));
    
    return 0;
}
Код
[andrew@easybook numbers]$ gcc -Wall max_in_matrix_rows.c 
[andrew@easybook numbers]$ ./a.out 
Matrix:
 -3   1   9   8 
 10   3   2   3 
 -4   1  -2   3 
  1   7   5   0 

Max elements on some rows:
Row #1 Max: 9
Row #3 Max: 3
[andrew@easybook numbers]$
1
0 / 0 / 0
Регистрация: 02.12.2019
Сообщений: 28
19.01.2020, 17:49  [ТС] 3
Спасибо большое! Вы, правда, используете более продвинутые способы выполнения этой задачи. А можете прокомментировать саму функцию поиска максимального элемента?Хочу понять

В момент нахождения отрицательного знач. на главной диагонали, мы передаем туда значение i и размер матрицы(4).
Если размер меньше 2х, т.е 1, мы возвращаем что?рядок? а далее, если размер больше, то каким образом мы прибавляем к array сравнение в скобках?

А также не совсем понятно вот что: мы уменьшаем размер на единицу и возвращаем эти данные в printf, а что происходит дальше?Просто выводится на экран? Или каким-то образом происходит рекурсия внутри функции поиска элемента?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12454 / 7479 / 1752
Регистрация: 25.07.2009
Сообщений: 13,755
19.01.2020, 18:19 4
Лучший ответ Сообщение было отмечено Lockal как решение

Решение

Цитата Сообщение от Lockal Посмотреть сообщение
А можете прокомментировать саму функцию поиска максимального элемента?
C
1
2
3
int * max_element(const int * array, size_t size) {
    return ( size < 2 ) ? (int*)array : max_element(array + ( array[0] < array[size - 1] ), size - 1);
}
Рекурсивная функция поиска максимального элемента. На вход принимает указатель на массив (фактически на первый элемент массива) и количество элементов. Возвращает указатель на первый максимальный элемент. Работает примерно так:
Если количество элементов для проверки меньше двух ( size < 2 ) возвращается указатель на элемент массива, уже не обязательно первый, но первый максимальный. Приведение типов пока можно считать условностью. Если элементов два или больше, функция вызывает сама себя с изменёнными параметрами max_element(array + ( array[0] < array[size - 1] ), size - 1). Здесь надо учитывать особенность вычисления логических выражений в языке С. Истинное выражение возвращает 1, ложное - 0. Если первый проверяемый элемент меньше последнего ( array[0] < array[size - 1] ) значение указателя сместится на следующий элемент, в противном случае останется прежним. Ну и количество элементов, передаваемое вторым параметром, в любом случае уменьшится size - 1.
Весь профит с такого варианта функции - компактная запись. На самом деле рекурсивные функции имеют ряд особенностей, сильно ограничивающих их применение.

Цитата Сообщение от Lockal Посмотреть сообщение
В момент нахождения отрицательного знач. на главной диагонали, мы передаем туда значение i и размер матрицы(4).
Нет. Элемент строки, находящийся на главной диагонали - это тот, у которого индекс строки и индекс столбца совпадают.

Цитата Сообщение от Lockal Посмотреть сообщение
мы уменьшаем размер на единицу и возвращаем эти данные в printf,
Это где там такое?
1
0 / 0 / 0
Регистрация: 02.12.2019
Сообщений: 28
20.01.2020, 17:26  [ТС] 5
Ого, спасибо большое! Я и не знал до этого, что таким образом можно использовать буллевые функции(надеюсь, правильно написал).
В целом, стало понятней, хотя самостоятельно такую функцию не напишу.
C
1
(array + ( array[0] < array[size - 1] )
вот здесь, например, -3 на главн. диагонале < 0 и я отправляю в ф-ию ссылку на первый элемент рядка(-3) и размер, т.е. 4
элементов больше 2х, поэтому ф-ция вызывает себя же с параметрами(-3 + (-3<9)? и уменьшает размер до 3х,
дальше все по новой, -3 остается, а каретка сравнивает уже другой элемент(переместилась, потому что -3 меньше 9), т.е.
(-3 + (-3<1)? и снова уменьшаем размер....непонятно то, что в данном случае -3 самый маленький элемент строки и каждый раз возвращает значение "да" и провоцирует движение к следующему числу, а также не понятно почему сравнивается массив с первым элементом [0] и с предпоследним[size-1], почему не последним?Как нам потом сравнить с 8кой?
Простите, просто Ваш код вызвал такой сумбур в голове...

Добавлено через 11 минут
или значение array тоже меняется, при этих манипуляций?
И если да, то каким образом? к -3 добавляется 1(если да) и значение становится уже 1ей?(на примере нашей матрицы)
0
2 / 1 / 1
Регистрация: 13.11.2019
Сообщений: 4
20.01.2020, 17:49 6
Лучший ответ Сообщение было отмечено Lockal как решение

Решение

на 41-строке напиши вот так: max = a[i][j];
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12454 / 7479 / 1752
Регистрация: 25.07.2009
Сообщений: 13,755
20.01.2020, 18:27 7
Лучший ответ Сообщение было отмечено Lockal как решение

Решение

Цитата Сообщение от Lockal Посмотреть сообщение
вот здесь, например, -3 на главн. диагонале < 0 и я отправляю в ф-ию ссылку на первый элемент рядка(-3) и размер, т.е. 4
элементов больше 2х, поэтому ф-ция вызывает себя же с параметрами(-3 + (-3<9)? и уменьшает размер до 3х,
дальше все по новой, -3 остается, а каретка сравнивает уже другой элемент(переместилась, потому что -3 меньше 9), т.е.
(-3 + (-3<1)? и снова уменьшаем размер....непонятно то, что в данном случае -3 самый маленький элемент строки и каждый раз возвращает значение "да" и провоцирует движение к следующему числу, а также не понятно почему сравнивается массив с первым элементом [0] и с предпоследним[size-1], почему не последним?Как нам потом сравнить с 8кой?
Ну в принципе ход мысли правильный, немного уточнить осталось:
Прежде всего в массиве из SIZE элементов у первого элемента индекс (смещение от начала массива) равен 0, у последнего SIZE - 1.
Рассмотрим на примере первой строки матрицы:
массив: -3, 1, 9, 8 размер 4
1 вызов: размер больше одного, сравниваем элементы с индексами 0 и 3: -3 < 8 - истина, то есть единица, указатель сдвигается на следующий элемент, размер уменьшается
2 вызов: массив: 1, 9, 8 размер 3. 1 < 8 истина, указатель сдвигается, размер - 1
3 вызов: массив: 9, 8 размер 2. 9 < 8 ложь, указатель на месте, размер - 1
4 вызов: массив: 9 размер 1. Выполняется условие "размер < 2", указатель на девятку "всплывает" через предыдущие вызовы и возвращается, как результат.

Цитата Сообщение от Lockal Посмотреть сообщение
Простите, просто Ваш код вызвал такой сумбур в голове...
Это не на долго.
1
0 / 0 / 0
Регистрация: 02.12.2019
Сообщений: 28
20.01.2020, 22:15  [ТС] 8
Все, теперь понятно) Такая себе пузырьковая сортировка, но с одним циклом!
Спасибо, буду использовать

Добавлено через 2 часа 36 минут
SergiozZz, тю ..работает!)))я уже думал, что совсем котелок у меня не вариант, а нужно было правильно присвоить переменной значение. Спасибо большое!
А не подскажите, как сделать так, чтобы код дальше продолжал проверять главную диагональ?осуществить это через цикл while?
0
2 / 1 / 1
Регистрация: 13.11.2019
Сообщений: 4
18.10.2020, 13:11 9
даа
0
18.10.2020, 13:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.10.2020, 13:11
Помогаю со студенческими работами здесь

Если максимальный элемент матрицы стоит на главной диагонали, то все элементы главной диагонали сделать равными максимальному.
Задана матрица D(4,4). Если максимальный элемент матрицы стоит на главной диагонали, то все...

Переписать элементы главной диагонали матрицы в одномерный массив и разделить их на максимальный элемент главной диагонали
Дана матрица A(N,N). Перепишите элементы её главной диагонали в одномерный массив Y(N) и разделите...

Найти суммы элементов тех строк матрицы, на главной диагонали которой стоят отрицательные элементы
Дана квадратная матрица А порядка n. Найдите суммы элементов тех строк матрицы, на главной...

Найти суммы элементов тех строк матрицы, на главной диагонали которой стоят отрицательные элементы
Помогите пожалуйста зарешать Дана квадратная матрица А порядка n. Найдите суммы элементов тех...

Найти максимальный элемент главной диагонали матрицы и занулить элементы соответствующей строки
1)Вводя произвольное количество чисел и интерпретируя полоожительное число как площадь круга, а...

Заменить элементы главной диагонали матрицы на максимальный элемент побочной диагонали на минимальный элемент
в квадратной матрице находящейся в файле найти максимальный и минимальный элементы и заменить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru