Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/19: Рейтинг темы: голосов - 19, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 02.12.2019
Сообщений: 28

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

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

Студворк — интернет-сервис помощи студентам
Добрый день!
Помогите, пожалуйста, вроде код должен работать, но выводит постоянно -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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.01.2020, 15:50
Ответы с готовыми решениями:

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

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

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

8
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,977
19.01.2020, 16:55
Честно лень вникать, что там не так, проще заново сделать
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;
}
Code
1
2
3
4
5
6
7
8
9
10
11
12
[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  [ТС]
Спасибо большое! Вы, правда, используете более продвинутые способы выполнения этой задачи. А можете прокомментировать саму функцию поиска максимального элемента?Хочу понять

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

А также не совсем понятно вот что: мы уменьшаем размер на единицу и возвращаем эти данные в printf, а что происходит дальше?Просто выводится на экран? Или каким-то образом происходит рекурсия внутри функции поиска элемента?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,977
19.01.2020, 18:19
Лучший ответ Сообщение было отмечено 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  [ТС]
Ого, спасибо большое! Я и не знал до этого, что таким образом можно использовать буллевые функции(надеюсь, правильно написал).
В целом, стало понятней, хотя самостоятельно такую функцию не напишу.
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
Лучший ответ Сообщение было отмечено Lockal как решение

Решение

на 41-строке напиши вот так: max = a[i][j];
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,977
20.01.2020, 18:27
Лучший ответ Сообщение было отмечено 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  [ТС]
Все, теперь понятно) Такая себе пузырьковая сортировка, но с одним циклом!
Спасибо, буду использовать

Добавлено через 2 часа 36 минут
SergiozZz, тю ..работает!)))я уже думал, что совсем котелок у меня не вариант, а нужно было правильно присвоить переменной значение. Спасибо большое!
А не подскажите, как сделать так, чтобы код дальше продолжал проверять главную диагональ?осуществить это через цикл while?
0
2 / 1 / 1
Регистрация: 13.11.2019
Сообщений: 4
18.10.2020, 13:11
даа
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.10.2020, 13:11
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru