Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
SirDeLis
1 / 1 / 0
Регистрация: 19.03.2018
Сообщений: 14
1

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

22.05.2018, 21:40. Просмотров 748. Ответов 8
Метки нет (Все метки)

Нужно в заданной квадратной матрице поменять местами максимальный элемент в строке с элементом главной диагонали. Как выведенная матрица получается не такой, какой задавал, так и результат не является желаемым, плюсом там появляются странные числа.
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <malloc.h>
using std::cin;
using std::cout;
#define N 50
 
int size(int *ra, char sim);
void in(int *ra, int *pa, char sim);
void out1(int *ra, int *pa, char sim);
void out2(int *ra, int *pa, char sim);
void proc(int *ra, int *pa, char sim);
 
int size(int *ra, char sim)
{
    while (1)
    {
        cout << "Введите размерность массива " << sim << ":";
        cin >> *ra;
        if ((*ra > 0) && (*ra <= N)) break;
    }
    return (*ra);
}
 
void in(int *ra, int *pa, char sim)
{
    int i,j;
    cout << "\n Введите массив " << sim << "\n";
    for (j = 1; j <= *ra; j++) 
    {
        for (i = 1; i <= *ra; i++)
        {
            cout << "a[" << j << "][" << i << "]";
            scanf_s("%d", ((pa + i)+j));
        }
    }
}
 
void out1(int *ra, int *pa, char sim)
{
    int i,j;
    cout << "\ Исходный массив " << sim << ":\n";
    for (j = 1; j <= *ra; j++) {
        for (i = 1; i <= *ra; i++)
            cout << *((pa + i)+j) << " ";
        cout << "\n";
    }
}
 
void proc(int *ra, int *pa, char sim)
{   
    int i, j,m,im,jm;
    for (i = 0; i <= *ra; i++) {
        m = *((pa+i)+0);
        im = i;
        jm = 0;
        for (j = 0; j <= *ra; j++) {
            if (*((pa+i)+j) > m) {
                m = *((pa + i) + j); im = i; jm = j;
            }
            if (j == *ra) {
                *((pa + im) + jm) = *((pa + i) + j);
                *((pa + i) + i) = m;
            }
        }
    }
}
 
void out2(int *ra, int *pa, char sim)
{
    int i, j;
    cout << "\ Полученный массив " << sim << ":\n";
    for (j = 1; j <= *ra; j++) 
    {
        for (i = 1; i <= *ra; i++)
            cout << *((pa + i) + j) << " ";
        cout << "\n";
    }
}
 
int main()
{
    int r1; int *a;
    setlocale(LC_ALL, "RUSSIAN");
    cout << "В каждой строке заданной целочисленной квадратной матрицы найти максимальный элемент и поменять его местами с элементом основной диагонали \n";
    while (1) {
        r1 = size(&r1, 'a');
        a = (int*)malloc(r1 * sizeof(int));
        in(&r1, &*a, 'a');
        out1(&r1, &*a, 'a');
        proc(&r1, &*a, 'a');
        out2(&r1, &*a, 'a');
        cout << "\n Продолжить работу? (Y/N) - ";
        char otv;
        cin >> otv;
        if (otv == 'N' || otv == 'n')break;
    }
    cout << "Программу выполнил студент группы 22П Дергачев Денис \n";
    system("pause");
    return 0;
}
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.05.2018, 21:40
Ответы с готовыми решениями:

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

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

Найти в каждой строке матрицы наибольший элемент и поменять его местами с элементом главной диагонали
Задание: Дана целочисленная квадратная матрица. Найти в каждой стро*ке наибольший элемент и...

Найти в каждой строке наибольший элемент и поменять его местами с элементом главной диагонали
Дана целочисленная квадратная матрица. Найти в каждой строке наибольший элемент и поменять его...

Найти в каждой строке наибольший элемент и поменять его местами с элементом главной диагонали
Двумерные массивы, условие в заголовке! Заранее спасибо)

8
SuperKir
464 / 417 / 290
Регистрация: 10.03.2015
Сообщений: 1,778
Завершенные тесты: 1
22.05.2018, 23:18 2
Цитата Сообщение от SirDeLis Посмотреть сообщение
в заданной квадратной матрице поменять местами максимальный элемент в строке с элементом главной диагонали.
Че с чем менять-то?
0
mvngr
186 / 147 / 88
Регистрация: 15.04.2018
Сообщений: 580
22.05.2018, 23:25 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
#include <iostream>
#include <ctime>
#include <cstdlib>
 
#define SIZE 5
 
using namespace std;
int main() {
    int **a;
    srand(time(NULL));
    a = new int*[SIZE];
 
    //заполняем массив
    for(int i = 0; i < SIZE; i++){
        a[i] = new int[SIZE];
        for(int j = 0; j < SIZE; j++)
            a[i][j] = rand() % 1000;
    }
 
    //вывод
    for(int i = 0; i < SIZE; i++){
        for(int j = 0; j < SIZE; j++)
            cout << a[i][j] << ' ';
        cout << endl;
    }
 
    //выполняем вашу задачу
    for(int i = 0; i < SIZE; i++){
        int max = -2;
        int maxInd = -1;
        for(int j = 0; j < SIZE; j++){
            if(a[i][j] > max){
                max = a[i][j];
                maxInd = j;
            }
        }
        a[i][maxInd] = a[i][i];
        a[i][i] = max;
    }
 
    //вывод
    for(int i = 0; i < SIZE; i++){
        for(int j = 0; j < SIZE; j++)
            cout << a[i][j] << ' ';
        cout << endl;
    }
 
 
 
    return 0;
}
SuperKir, черным по белому (если не меняли css стили )

Цитата Сообщение от SirDeLis Посмотреть сообщение
поменять местами максимальный элемент в строке с элементом главной диагонали
0
SuperKir
22.05.2018, 23:48
  #4

Не по теме:

mvngr, Всё, я понял.. "В каждой строке макс. элемент махнуть с элементом главной диагонали этой строки"

0
SirDeLis
1 / 1 / 0
Регистрация: 19.03.2018
Сообщений: 14
23.05.2018, 00:18  [ТС] 5
mvngr, мне нужно именно с указателями и функциями, хочу в них разобраться. Можете помочь?

Добавлено через 2 минуты
Просто так-то я прогу уже саму запилил по-простому, захотелось по-сложному, ибо я не до конца понимаю указатели и функции.
0
mvngr
186 / 147 / 88
Регистрация: 15.04.2018
Сообщений: 580
23.05.2018, 00:21 6
ну, что вам стоит переписать пару строк

Не до конца понимаете - читайте статьи с примерами, мне тут расписывать всё это бессмысленно, ибо всё уже сделали за меня

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void functionName(int **a, const int size){
    for(int i = 0; i < size; i++){
        int max = -2;
        int maxInd = -1;
        for(int j = 0; j < size; j++){
            if(a[i][j] > max){
                max = a[i][j];
                maxInd = j;
            }
        }
        a[i][maxInd] = a[i][i];
        a[i][i] = max;
    }
    return;
}
int main(){
//code
functionName(a, SIZE);
//code
}
1
SirDeLis
1 / 1 / 0
Регистрация: 19.03.2018
Сообщений: 14
23.05.2018, 00:35  [ТС] 7
mvngr, так прикол в том, что прога работает, но не правильно. А почему неправильно - понять не могу, хотя уже гуглил и искал причины, но так и не нашёл. В коде, вроде, всё нормально, но оно не работает. Не буду ругаться на "компудахтер", программа плохо работает только тогда, когда её плохо написали, но ошибок понять не могу. Вроде как, я сделал всё по примерам и, де факто, должно работать
0
mvngr
186 / 147 / 88
Регистрация: 15.04.2018
Сообщений: 580
23.05.2018, 00:39 8
SirDeLis, де факто не должно работать, ибо ошибки в коде. Debug знаете что такое? Так вот дебажте с самого начала до самого конца каждую функцию, если не можете найти причину
1
SuperKir
464 / 417 / 290
Регистрация: 10.03.2015
Сообщений: 1,778
Завершенные тесты: 1
23.05.2018, 12:02 9
SirDeLis, Значит нужно разобраться, почему так происходит и где.
А разбираться нужно последовательно. Т.к. готовый код как бы уже есть, значит необходимо восходящим тестированием проверить функционал. Берем, оставляем изначально Ввод/Вывод (Я так и не понял, правда, нафига 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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
#include <locale.h>
 
using std::cin;
using std::cout;
 
void in(int **arr, int size, char sim);
void out(int **arr, int size, char sim);
 
int main()
{
    setlocale(0, "");
    int r1, **a = NULL;
 
    cout << "Enter size: ";
    cin >> r1;
 
    a = new int*[r1];
    for (int i = 0; i < r1; i++)
        a[i] = new int[r1];
 
 
    in(a, r1, 'a');
    out(a, r1, 'a');
    cout << a[0][0] << std::endl << a[2][1];
 
    for (int i = 0; i < r1; i++)
        delete []a[i];
    delete[]a;
 
    system("pause");
    return 0;
}
 
void in(int **arr, int size, char sim)
{
    cout << "\n Введите массив " << sim << "\n";
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size; j++)
        {
            cout << "a[" << j << "][" << i << "]";
            cin >> *(*(arr + i) + j);
        }
    }
}
 
void out(int **arr, int size, char sim)
{
    cout << "\ Исходный массив " << sim << ":\n";
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size; j++)
            cout << *(*(arr + i) + j) << " ";
        cout << "\n";
    }
}
Проверяем, работает или нет? Лично мной переделанный - да.
То что было у тебя - все поперепутано, индексы не на своих местах, да еще и отсчет с 1 до Size, что не приемлимо.

Далее "наращиваем" функционал.
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
int size(char sim);
...
int main()
{
    setlocale(0, "");
    int r1, **a = NULL;
 
    r1 = size('a');
 
    a = new int*[r1];
    for (int i = 0; i < r1; i++)
        a[i] = new int[r1];
 
    in(a, r1, 'a');
    out(a, r1, 'a');
 
    for (int i = 0; i < r1; i++)
        delete []a[i];
    delete[]a;
 
    system("pause");
    return 0;
}
 
...
 
int size(char sim)
{
    int size = 0;
    while (true)
    {
        cout << "Введите размерность массива " << sim << ": ";
        cin >> size;
        if ((size > 0) && (size <= N)) 
            break;
    }
    return size;
}
Поясняю, конкретно в твоем случае незачем передавать указатель в функцию, если сама функция возвращает значение в эту переменную. Если уж на то пошло, то проще передать просто адрес и по нему задавать значение переменной, что на выходе даст тот же результат без излишеств:

C++
1
2
3
4
5
6
7
8
9
10
void size(int &r1, char sim)
{
    while (true)
    {
        cout << "Введите размерность массива " << sim << ": ";
        cin >> r1;
        if ((r1 > 0) && (r1 <= N)) 
            break;
    }
}
Проверили первый вариант - заработало. Теперь перейдем к выполнению задания.
Сразу задам вопрос: Почему, когда вводил и выводил начинаешь с 1 до Size (включительно), а в Proc уже с 0 до Size (включительно)? Вообще не проверяешь, что пишешь?

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
void proc(int **arr, int size, char sim);
...
int main()
{
    setlocale(0, "");
    int r1, **a = NULL;
 
    r1 = size('a');
 
    a = new int*[r1];
    for (int i = 0; i < r1; i++)
        a[i] = new int[r1];
 
    in(a, r1, 'a');
    out(a, r1, 'a');
    proc(a, r1, 'a');
    out(a, r1, 'a');
 
    for (int i = 0; i < r1; i++)
        delete []a[i];
    delete[]a;
 
    system("pause");
    return 0;
}
 
...
 
void proc(int **arr, int size, char sim)
{
    int i, j, m, im, jm;
    for (i = 0; i < size; i++)
    {
        int max = *(*(arr + i) + 0);
        int maxInd = 0;
        for (j = 0; j < size; j++)
        {
            if (*(*(arr + i) + j) > max) 
            {
                max = *(*(arr + i) + j); 
                maxInd = j;
            }
        }       
        *(*(arr + i) + maxInd) = *(*(arr + i) + i);
        *(*(arr + i) + i) = max;
    }
}
Проверили - Работает как надо! Ура! Всего-то чуть тестов и последовательная проверка.

Получили итог:

Кликните здесь для просмотра всего текста
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <iostream>
#include <locale.h>
 
using std::cin;
using std::cout;
#define N 50
 
int size(char sim);
void in(int **arr, int size, char sim);
void out(int **arr, int size, char sim);
void proc(int **arr, int size, char sim);
 
int main()
{
    setlocale(0, "");
    int r1, **a = NULL;
 
    r1 = size('a');
 
    a = new int*[r1];
    for (int i = 0; i < r1; i++)
        a[i] = new int[r1];
 
    in(a, r1, 'a');
    out(a, r1, 'a');
    proc(a, r1, 'a');
    out(a, r1, 'a');
 
    for (int i = 0; i < r1; i++)
        delete []a[i];
    delete[]a;
 
    system("pause");
    return 0;
}
 
void in(int **arr, int size, char sim)
{
    cout << "\n Введите массив " << sim << "\n";
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size; j++)
        {
            cout << "a[" << j << "][" << i << "]";
            cin >> *(*(arr + i) + j);
        }
    }
}
 
void out(int **arr, int size, char sim)
{
    cout << "\ Исходный массив " << sim << ":\n";
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size; j++)
            cout << *(*(arr + i) + j) << " ";
        cout << "\n";
    }
}
 
int size(char sim)
{
    int size = 0;
    while (true)
    {
        cout << "Введите размерность массива " << sim << ": ";
        cin >> size;
        if ((size > 0) && (size <= N)) 
            break;
    }
    return size;
}
 
void proc(int **arr, int size, char sim)
{
    int i, j, m, im, jm;
    for (i = 0; i < size; i++)
    {
        int max = *(*(arr + i) + 0);
        int maxInd = 0;
        for (j = 0; j < size; j++)
        {
            if (*(*(arr + i) + j) > max) 
            {
                max = *(*(arr + i) + j); 
                maxInd = j;
            }
        }       
        *(*(arr + i) + maxInd) = *(*(arr + i) + i);
        *(*(arr + i) + i) = max;
    }
}


Теперь непосредственно по тому, что за чудеса были у тебя:
1. Как я уже говорил, полный хаос с индексами, циклами, входными параметрами.
Поясняю: это не одномерная матрица, а двумерная (хотя это все лишь для понимания нашего, но не суть сейчас), а посему нужно правильно обращаться к элементам. Хаос с индексами ужасен - в с++ "массивы" отсчитываются с 0 до N-1, у тебя же, то с 1 до N, то с 0 до N. Циклы - это про индексы, собственно. Входные параметры - даже не знаю, как лучше сказать, но зачем всё это "какашко" - не понятно.

2. Раз уж пишите на с++, то используйте new, разве это сложно? Куда проще чем Сишный malloc (по-моему мнению), да еще и с выделением непонятным.
Система, конечно, гарантирует очистку ресурсов, выделенных процессу, но мы же хорошие программисты и позаботиться об этом должны сами (а то брать берем, а отдавать - не хотим, обидится еще).

3. К массивам можно обращаться по индексу, но т.к. хотелка была именно указателями, то никто не запрещает, собственно.
Но почему нельзя было использовать индексы для сверки? Это же пару лишних строк но которые тебе дадут четко понять, то ты делаешь, правильно ли или нет.
Когда ты написал ф-ции Ввода/Вывода, ты проверял, как они работают и увидел, что о чудо, то что я ввел - то и вывел. Но ты не пробовал обратиться к элементу по индексу? У тебя сразу же возникли бы отпало куча вопросов о том, почему результат такой неожиданный.

Ну как-то так)
0
23.05.2018, 12:02
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2018, 12:02

Найти в каждой строке наибольший элемент и поменять его местами с элементом главной диагонали
Есть целочисленная квадратная матрица.Найти в каждой строке наибольший элемент и поменять его...

Найти в каждой строке наибольший элемент и поменять его местами с элементом главной диагонали.
Дана целочисленная квадратная матрица. Найти в каждой строке наибольший элемент и поменять его...

Матрицы: элементы главной диагонали поменять местами с максимальным элементом в каждой строке
Дана квадратичная матрица.элементы главной диагонали должны поменяться местами с максимальным...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.