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

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

28.04.2016, 18:38. Показов 2603. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Дана матрица nxn. Найти максимальные элементы главной и побочной диагоналей матрицы и поменять их местами.
Нашел максимальные элементы, но не могу поменять их местами.
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
#include <stdio.h>
 
int main(int argc, const char * argv[])
{
    int i, j, n, m, b[30][30], maxg, maxp;
    do{
        printf("vvedite kol-vo strok (<30)\n");
        scanf("%d", &n);
        printf("vvedite kol-vo stolbcov matrici (<30)\n");
        scanf("%d", &m);
    }while (n >= 30 || m >= 30);
    for(i = 0; i < n; i++)
        for(j = 0; j < m; j++)
        {
            printf("vvedite element [%d, %d]\n", i + 1, j + 1);
            scanf("%d", &b[i][j]);
        }
    
    maxp = b[0][n-1];
    for(i = 0; i < n; i++)
        if(b[i][n-1-i] > maxp)
            maxp = b[i][n-1-i];
     printf("max el pb diag = %.d\n", maxp);
    
    maxg = b[0][0];
    for (i = 0; i < n; i++)
        if(b[i][i] > maxg)
            maxg = b[i][i];
    printf("max el gl diag = %.d\n", maxg);
    printf("MATRICA\n");
    for(i = 0; i < n; i++)
    {
        for(j = 0; j < m; j++)
            printf("%.d ", b[i][j]);
        printf("\n");
    }
 
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.04.2016, 18:38
Ответы с готовыми решениями:

Поменять местами элементы главной и побочной диагоналей матрицы
помогите пожайлуста. Поменять местами элементы главной и побочной диагоналей матрицы. делал...

7*7 вещественный Поменять местами элементы главной и побочной диагоналей матрицы
7*7 вещественный Поменять местами элементы главной и побочной диагоналей матрицы.

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

Поменять местами максимальные элементы главной и побочной диагоналей.
В заданном целочисленном массиве Ann поменять местами максимальные элементы главной и побочной...

14
60 / 60 / 53
Регистрация: 17.02.2013
Сообщений: 242
28.04.2016, 19:25 2
Запомнить номера строк, в которых находятся максимальные элементы. У максимального элемента главной диагонали он будет равен номеру столбца, а у побочное - порядок матрицы минус номер столбца и минус один. Отсюда выразите номер столбца и дальше функция swap() или обмен значениями с использованием вспомогательной переменной.
0
0 / 0 / 2
Регистрация: 28.04.2016
Сообщений: 58
28.04.2016, 20:11  [ТС] 3
Я их запомнил
C++
1
2
3
4
5
6
7
8
9
10
11
maxp = b[0][n-1];
    for(i = 0; i < n; i++)
        if(b[i][n-1-i] > maxp)
            maxp = b[i][n-1-i];
     printf("max el pb diag = %.d\n", maxp);
    
    maxg = b[0][0];
    for (i = 0; i < n; i++)
        if(b[i][i] > maxg)
            maxg = b[i][i];
    printf("max el gl diag = %.d\n", maxg);
, а вот как дальше - не знаю. Можете показать, как делать с помощью функции или обмена?
0
60 / 60 / 53
Регистрация: 17.02.2013
Сообщений: 242
28.04.2016, 21:04 4
Переменные pMax и gMax объявить не забудьте. Вот вы запомнили номер строки того и другого масимального элемента. Теперь функцией swap() меняете их значения местами.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
maxp = b[0][n-1];
    for(i = 0; i < n; i++)
        if(b[i][n-1-i] > maxp){
            maxp = b[i][n-1-i];
            pMax=i;
        }
     printf("max el pb diag = %.d\n", maxp);
    
    maxg = b[0][0];
    for (i = 0; i < n; i++)
        if(b[i][i] > maxg){
            maxg = b[i][i];
            gMax=i;
        }
    printf("max el gl diag = %.d\n", maxg);
 
    swap(b[gMax][gMax], b[pMax][n-1-pMax]);
1
0 / 0 / 2
Регистрация: 28.04.2016
Сообщений: 58
29.04.2016, 22:05  [ТС] 5
а можете продемонстрировать способ с обменом, а то что-то не совсем понятно с функцией.
0
60 / 60 / 53
Регистрация: 17.02.2013
Сообщений: 242
29.04.2016, 22:41 6
C++
1
2
3
4
int temp;
temp=b[gMax][gMax];
b[gMax][gMax]=b[pMax][n-1-pMax];
b[pMax][n-1-pMax]=temp;
0
0 / 0 / 2
Регистрация: 28.04.2016
Сообщений: 58
29.04.2016, 23:09  [ТС] 7
вот такой код в итоге, но не меняется. Или это с выводом проблемы?
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
#include <stdio.h>
 
int main(int argc, const char * argv[])
{
    int i, j, n, m, b[30][30], maxg, maxp;
    do{
        printf("vvedite kol-vo strok (<30)\n");
        scanf("%d", &n);
        printf("vvedite kol-vo stolbcov matrici (<30)\n");
        scanf("%d", &m);
    }while (n >= 30 || m >= 30);
    for(i = 0; i < n; i++)
        for(j = 0; j < m; j++)
        {
            printf("vvedite element [%d, %d]\n", i + 1, j + 1);
            scanf("%d", &b[i][j]);
        }
    
    maxp = b[0][n-1];
    for(i = 0; i < n; i++)
        if(b[i][n-1-i] > maxp)
            maxp = b[i][n-1-i];
     printf("max el pb diag = %.d\n", maxp);
    
    maxg = b[0][0];
    for (i = 0; i < n; i++)
        if(b[i][i] > maxg)
            maxg = b[i][i];
    printf("max el gl diag = %.d\n", maxg);
    printf("MATRICA\n");
    for(i = 0; i < n; i++)
    {
        for(j = 0; j < m; j++)
            printf("%.d ", b[i][j]);
        printf("\n");
    }
    
    int temp;
    temp=b[maxg][maxg];
    b[maxg][maxg]=b[maxp][n-1-maxp];
    b[maxp][n-1-maxp]=temp;
 
    printf("MATRICA\n");
    for(i = 0; i < n; i++)
    {
        for(j = 0; j < m; j++)
            printf("%.d ", b[i][j]);
        printf("\n");
    }
    return 0;
}
0
60 / 60 / 53
Регистрация: 17.02.2013
Сообщений: 242
29.04.2016, 23:12 8
Посмотрите на мой код. Я не только запоминаю максимальное и минимальное значение, но и номер строки, в которой они располагаются. А при замене в качестве индексов я использую выражения с номерами строк.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
maxp = b[0][n-1];
    for(i = 0; i < n; i++)
        if(b[i][n-1-i] > maxp){
            maxp = b[i][n-1-i];
            pMax=i;
        }
     printf("max el pb diag = %.d\n", maxp);
    
    maxg = b[0][0];
    for (i = 0; i < n; i++)
        if(b[i][i] > maxg){
            maxg = b[i][i];
            gMax=i;
        }
    printf("max el gl diag = %.d\n", maxg);
 
int temp;
temp=b[gMax][gMax];
b[gMax][gMax]=b[pMax][n-1-pMax];
b[pMax][n-1-pMax]=temp;
0
0 / 0 / 2
Регистрация: 28.04.2016
Сообщений: 58
29.04.2016, 23:27  [ТС] 9
Да, точно. Я невнимательно прочитал ваш код в первый раз. Спасибо большое.

Добавлено через 6 минут
А вот если я захочу поменять местами максимальные и минимальные элементы в каждой строке, это так же делается?! Только цикл будет вот таким?!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
max = b[0][0];
    for(i = 0; i < n; i++)
for(j = 0; j < m; j++)
        if(b[i][j] > max){
            max = b[i][j];
            Max=i;
        }
     printf("max el  = %.d\n", max);
    
    min = b[0][0];
    for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
        if(b[i][j] < min){
            min = b[i][j];
            Min=i;
        }
    printf("min el = %.d\n", min);
0
60 / 60 / 53
Регистрация: 17.02.2013
Сообщений: 242
30.04.2016, 08:15 10
Вообще, поиск элементов можно было в один цикл поместить.
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
63
64
65
#include <iostream>
#include <clocale>
#include <cstdio>
#include <climits>
 
using namespace std;
 
int main(int argc, const char * argv[]){
    setlocale(LC_ALL, "RUSSIAN");
    int n, m, b[30][30], maxg=INT_MIN, maxp=INT_MIN, pMax, gMax, temp;
 
    do{
        cout<<"Введите количество строк (<30): ";
        cin>>n;
        cout<<"Введите количество столбцов (<30): ";
        cin>>m;
    }while ((n >= 30) || (m >= 30));
 
    cout<<"\n";
 
    for(int i = 0; i < n; i++)
        for(int j = 0; j < m; j++){
            cout<<"Введите элемент ["<<i + 1<<"]["<< j + 1<<"]: ";
            cin>>b[i][j];
        }
 
    for(int i = 0; i < n; i++){
        if(b[i][n-1-i] > maxp){
            maxp = b[i][n-1-i];
            pMax=i;
        }
 
        if(b[i][i] > maxg){
            maxg = b[i][i];
            gMax=i;
        }
    }
 
    cout<<"\nМаксимальный элемент побочной диагонали = "<<maxp<<".";
    cout<<"\nМаксимальный элемент главной диагонали = "<<maxg<<".\n";
 
    cout<<"\nВывод матрицы:\n";
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            cout.width(4);
            cout<<b[i][j];
        }
        cout<<"\n";
    }
 
    temp=b[gMax][gMax];
    b[gMax][gMax]=b[pMax][n-1-pMax];
    b[pMax][n-1-pMax]=temp;
 
    cout<<"\nВывод матрицы:\n";
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            cout.width(4);
            cout<<b[i][j];
        }
        cout<<"\n";
    }
 
    return 0;
}
А для каждой строки это будет выглядеть так:
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
63
64
65
66
67
68
#include <iostream>
#include <clocale>
#include <cstdio>
#include <climits>
 
using namespace std;
 
int main(int argc, const char * argv[]){
    setlocale(LC_ALL, "RUSSIAN");
    int n, m, b[30][30], maximum, minimum, minIndex, maxIndex, temp;
 
    do{
        cout<<"Введите количество строк (<30): ";
        cin>>n;
        cout<<"Введите количество столбцов (<30): ";
        cin>>m;
    }while ((n >= 30) || (m >= 30));
 
    cout<<"\n";
 
    for(int i = 0; i < n; i++)
        for(int j = 0; j < m; j++){
            cout<<"Введите элемент ["<<i + 1<<"]["<< j + 1<<"]: ";
            cin>>b[i][j];
        }
 
    cout<<"\nВывод матрицы:\n";
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            cout.width(4);
            cout<<b[i][j];
        }
        cout<<"\n";
    }
 
    for(int i = 0; i < n; i++){
        maximum=INT_MIN;
        minimum=INT_MAX;
 
        for(int j=0; j<m; j++){
            if(b[i][j] > maximum){
                maximum = b[i][j];
                maxIndex=j;
            }else if(b[i][j] < minimum){
                minimum = b[i][j];
                minIndex=j;
            }
        }
 
        cout<<"\nМаксимальный элемент строки = "<<maximum<<".";
        cout<<"\nМинимальный элемент строки = "<<minimum<<".\n";
 
        temp=b[i][maxIndex];
        b[i][maxIndex]=b[i][minIndex];
        b[i][minIndex]=temp;
    }
 
    cout<<"\nВывод матрицы:\n";
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            cout.width(4);
            cout<<b[i][j];
        }
        cout<<"\n";
    }
 
    return 0;
}
Добавлено через 2 минуты
В вашем коде будут сохранены только максимальное и минимальное значения последней строки. Нужно в одном цикле всё делать.
1
0 / 0 / 2
Регистрация: 28.04.2016
Сообщений: 58
30.04.2016, 08:27  [ТС] 11
Спасибо большое. А что вот этот оператор делает?
C++
1
cout.width(4);
0
60 / 60 / 53
Регистрация: 17.02.2013
Сообщений: 242
30.04.2016, 08:29 12
itema, устанавливает ширину поля вывода. Аналогично:
C
1
printf("%4i");
1
0 / 0 / 2
Регистрация: 28.04.2016
Сообщений: 58
02.05.2016, 21:42  [ТС] 13
Спасибо большое.
0
60 / 60 / 53
Регистрация: 17.02.2013
Сообщений: 242
02.05.2016, 21:46 14
Не совсем понял, что вы имеете в виду. Для чего оттуда убирать INT_MIN и INT_MAX? b[0][0] не выходит потому, что он располагается в первой строке, а менять нужно элементы каждой строки.
0
0 / 0 / 2
Регистрация: 28.04.2016
Сообщений: 58
03.05.2016, 15:58  [ТС] 15
Да, разобрался с этим. Только почему-то не всегда правильно работает прога. vvedite kolichestvo stork (<30): 3

vvedite kolichestvo stolbcov (<30): 3
vvedite element [1, 1] : 3
vvedite element [1, 2] : 6
vvedite element [1, 3] : 4
vvedite element [2, 1] : 8
vvedite element [2, 2] : 6
vvedite element [2, 3] : 5
vvedite element [3, 1] : 6
vvedite element [3, 2] : 9
vvedite element [3, 3] : 5
summa elementov glavnoi diagonali = 14

MATRIX
3 6 4
8 6 5
6 9 5

max element stroki = 6
min element stroki = 3
max element stroki = 8
min element stroki = 5
max element stroki = 9
min element stroki = 5
MATRIX
6 3 4
8 5 6
6 5 9
Не правильно меняются элементы второй строки.

Добавлено через 39 секунд
Да, разобрался с этим. Только почему-то не всегда правильно работает прога. vvedite kolichestvo stork (<30): 3

vvedite kolichestvo stolbcov (<30): 3
vvedite element [1, 1] : 3
vvedite element [1, 2] : 6
vvedite element [1, 3] : 4
vvedite element [2, 1] : 8
vvedite element [2, 2] : 6
vvedite element [2, 3] : 5
vvedite element [3, 1] : 6
vvedite element [3, 2] : 9
vvedite element [3, 3] : 5
summa elementov glavnoi diagonali = 14

MATRIX
3 6 4
8 6 5
6 9 5

max element stroki = 6
min element stroki = 3
max element stroki = 8
min element stroki = 5
max element stroki = 9
min element stroki = 5
MATRIX
6 3 4
8 5 6
6 5 9
Не правильно меняются элементы второй строки.

Добавлено через 16 часов 54 минуты
Разобрался.
0
03.05.2016, 15:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.05.2016, 15:58
Помогаю со студенческими работами здесь

В квадратной матрице А(7,7) поменять местами минимальные элементы первой и третьей строк, максимальные элементы главной и побочной диагоналей
Составил программу, но похоже неправильно. При вводе пишет ошибка проверки диапазона и курсор...

Поменять местами элементы главной и побочной диагоналей матрицы
Задача 2. Дана матрица целых чисел . Поменять местами элементы главной и побочной диагоналей.

Поменять местами максимальные элементы главной и побочной диагонали матрицы
В матрице А(7x7) поменять местами максимальные элементы главной и побочной диогонали. Помогите...

Поменять местами элементы первой и третьей строк, максимальные элементы главной и побочной диагонали матрицы
Помогите пожалуйста с решением двумерного массива В квадратной матрице А(7,7) поменять местами...

Найти максимальные элементы на главной и побочной диагонали и поменять их местами
Дан массив элементов 4х5. Найти максимальные элементы на главной и побочной диагонали и поменять их...

Поменять местами строки, содержащие минимальные элементы главной и побочной диагоналей матрицы
5. Дана матрица А. Поменять местами строки, содержащие минимальные элементы главной и побочной...


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

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

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