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

Задача на сортировку строк целочисленной матрицы

16.02.2025, 18:15. Показов 2651. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Пытаюсь выполнить задачу из учебника по С++ Павловская Т.А. (Двумерные массивы вариант 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
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
#include <iostream>
 
int LineCharacteristic(int numberOfRows, int numberOfСolumns, int arr[]);
int main()
{
    system("chcp 1251");
    const int n = 5, m = 5;
    int matrix[n][m] = { {0, 1, 1, 2, 4},
                         {15, 16, 0, 18, 19},
                         {20, 21, 22, 24, 24},
                         {0, 6, 7, 8, 9},
                         {10, 11, 0, 13, 14} };
    std::cout << "Matrix:\n";
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            std::cout << matrix[i][j] << ' ';
        }
        std::cout << "\n";
    }
    //Определить количество столбцов, не содержащих ни одного нулевого элемента.
    int ZeroCounter = 0;
    bool ColumnZeroFlag = 0;
    for (int i = 0; i < m; i++) {
        ColumnZeroFlag = false;
        for (int j = 0; j < n; j++) {
            if (matrix[j][i] == 0) ColumnZeroFlag = true;
        }
        if (!ColumnZeroFlag) ZeroCounter++;
    }
 
    std::cout << "Кол-во столбцов, не содержащих ни одного 0: " << ZeroCounter << "\n";
 
    //Характеристикой строки целочисленной матрицы назовем сумму ее положитель
    //ных четных элементов.Переставляя строки заданной матрицы, расположить их в
    //соответствии с ростом характеристик.
    
    //Для начала создадим, целочисленный одномерный, массив для хранения характеристики каждой строки
    int CharacteristicArray[n] = { 0, 0, 0, 0, 0 };
 
    //Вычислим характеристику каждой строки матрицы
    int summ = 0;
    for (int i = 0; i < n; i++) {
        summ = 0;
        for (int j = 0; j < m; j++) {
            if (!(j % 2) && matrix[i][j] > 0) summ += matrix[i][j];
        }
        CharacteristicArray[i] = summ;
    }
    //выведем в консоль характеристику каждой строки матрицы
    for (int i = 0; i < n; i++) {
        std::cout << "Характеристика " << i << "-ой строки: " << CharacteristicArray[i] << "\n";
    }
 
    int TmpArr[n] = { 0, 0, 0, 0, 0 };//Создадим одномерный массив для временного хранения одной строки
    for (int i = 0; i < n - 1; i++) {//перечислим строки матрици от 0 до предпоследней
        //std::cout << LineCharacteristic(n,m, matrix[i]) << "\n"; //*(matrix[i])
        int imin = i;//индекс текущей строки матрици, принимаемой за минимальную по характеристике
        for (int j = i + 1; j < n; j++) {//просмотрим все последующие строки матрицы
            //вычислим и сравним характеристику текущей стоки м. и следующей сторки матрицы
            if (LineCharacteristic(n, m, matrix[j]) < LineCharacteristic(n, m, matrix[imin])) {//если характеристика следующей строки меньше характиристики текущей строки
                for (int a = 0; a < m; a++) {//обменяем элементы каждой строки между собой
                    TmpArr[a] = matrix[i][a];
                    matrix[i][a] = matrix[j][a];
                    matrix[j][a] = TmpArr[a];
                }
            }
        }
    }
 
    //выведем матрицу после сортировки
    std::cout << "Отсортированая матрица:\n";
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            std::cout << matrix[i][j] << ' ';
        }
        std::cout << "\n";
    }
}
 
int LineCharacteristic(int numberOfRows, int numberOfСolumns, int arr[]) {
    int summ = 0;
    for (int i = 0; i < numberOfСolumns; i++) {
        if (!(i % 2) && arr[i] > 0) summ += arr[i];
    }
    return summ;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.02.2025, 18:15
Ответы с готовыми решениями:

Сортировка строк матрицы по возрастанию максимальных элементов в строке
Подскажите как отсортировать двумерный массив по возрастанию. Например дан такой массив двумерный: 9 7 4 1 2 3 5 5 5 Должен...

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

Сортировка СТРОК матрицы m*m
задание: Упорядочить строки матрицы размером m*m в порядке возрастания елементов в главной диагонали. Чисто вручную получается только...

11
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,008
16.02.2025, 18:25
Цитата Сообщение от ВящЕ Посмотреть сообщение
правильно ли я понял условия
Наверно да (предположительно).
Но есть вопрос: четные элементы - это элементы с четными значениями или на четных местах (по номерам столбцов).
Ну и нумерация в последнем случае с 0 или 1 должна начинаться?
1
Злостный нарушитель
 Аватар для Verevkin
10236 / 5665 / 1260
Регистрация: 12.03.2015
Сообщений: 26,257
16.02.2025, 21:56
Цитата Сообщение от ВящЕ Посмотреть сообщение
Сразу я попытался поменять местами указатели на строки матрицы но тип массива является неназначаемым, просто присвоить массиву новый адрес не получилось.
Двумерный СТАТИЧЕСКИЙ массив только кажется двумерным. Это не массив указателей на строки, а НЕПРЕРЫВНЫЙ кусок памяти размером (n × m × sizeof(тип_элемента)) байт.
0
Заблокирован
17.02.2025, 00:05
Цитата Сообщение от ВящЕ Посмотреть сообщение
Сразу я попытался поменять местами указатели на строки матрицы но тип массива является неназначаемым, просто присвоить массиву новый адрес не получилось.
Создайте массив указателей на ряды матрицы (на одномерный массив чисел) и сортируйте эти указатели.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
int main(){
   const int n = 5, m = 5;
   int matrix[n][m]{ {1,1,1,1,1}, {2,2,2,2,2}, {3,3,3,3,3}, {4,4,4,4,4}, {5,5,5,5,5} };
   
   using t_arr = int[m];
   using pt_arr = t_arr*;
      
   pt_arr rows[n];  // array pointers to 'rows'
   // int (*rows[m])[n]; // without aliases
 
   for(int i = 0; i != n; ++i)
      rows[n-i-1] = &(matrix[i]);
   for(int r = 0; r != n; ++r){
      for(int c = 0; c != m; ++c)
         std::cout << (*rows[r])[c] << ' ';
      std::cout << std::endl;
   }
}
И пусть ваш преподаватель покурит.
3
Заблокирован
17.02.2025, 06:32
Цитата Сообщение от ВящЕ Посмотреть сообщение
Поэтому я стал обрабатывать отдельные строки матрицы как массивы и переставлять строки поэлементно.
Да. Это обычный лобовой подход. Который не использует особенность устройства используемой матрицы.
Используя лишь интерфейс доступа через индексацию.
Самый простой способ и самый неэффективный.
Если учесть что это учебная задача начинающего уровня, то наверное, так и нужно.
0
 Аватар для DeCrinal
64 / 40 / 31
Регистрация: 15.04.2017
Сообщений: 176
20.02.2025, 16:27
Цитата Сообщение от SmallEvil Посмотреть сообщение
C++
1
2
using t_arr = int[m];
using pt_arr = t_arr*;
Цитата Сообщение от SmallEvil Посмотреть сообщение
C++
1
const int
Раскроют ТСа с такими практиками быстро)
0
Заблокирован
20.02.2025, 16:44
DeCrinal, там же есть без using, закомментированная строчка.
И что вместо const int? Макросы, #define?
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6130 / 2825 / 1038
Регистрация: 01.06.2021
Сообщений: 10,300
20.02.2025, 18:35
Цитата Сообщение от SmallEvil Посмотреть сообщение
И что вместо const int?
может быть, constexpr int
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
20.02.2025, 22:55
Цитата Сообщение от ВящЕ Посмотреть сообщение
C++
1
if (LineCharacteristic(n, m, matrix[j]) < LineCharacteristic(n, m, matrix[imin])) {//если характеристика следующей строки меньше характиристики текущей строки
Тут стОит сделать массив характеристик рядов и использовать его, а не пересчитывать каждый раз характеристику, увеличивая сложность в N раз.
Причем у вас уже есть CharacteristicArray. Используйте его при сравнении характеристик. И не забудьте менять местами значения внутри него тоже.

Остальное вроде норм, хотя и довольно непоследовательно. Попробуйте упорядочить код, разбив его на функции.
1
0 / 0 / 0
Регистрация: 19.06.2015
Сообщений: 49
22.02.2025, 14:56  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Создайте массив указателей на ряды матрицы (на одномерный массив чисел) и сортируйте эти указатели.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
int main(){
 const int n = 5, m = 5;
 int matrix[n][m]{ {1,1,1,1,1}, {2,2,2,2,2}, {3,3,3,3,3}, {4,4,4,4,4}, {5,5,5,5,5} };
using t_arr = int[m];
 using pt_arr = t_arr*;
pt_arr rows[n]; // array pointers to 'rows'
 // int (*rows[m])[n]; // without aliases
for(int i = 0; i != n; ++i)
 rows[n-i-1] = &(matrix[i]);
 for(int r = 0; r != n; ++r){
 for(int c = 0; c != m; ++c)
 std::cout << (*rows[r])[c] << ' ';
 std::cout << std::endl;
 }
}
И пусть ваш преподаватель покурит.
Спасибо за пример, я сам не додумался как правильно присвоить указатели. Но я не понял зачем вы используете префиксный инкремент и заполняете новый массив строк с конца.

Вот код задачи, сортировка работает:
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
105
#include <iostream>
//#include <conio.h>
int LineCharacteristic(int numberOfRows, int numberOfСolumns, int arr[]);
int main()
{
    system("chcp 1251");
    const int n = 5, m = 5;
    int matrix[n][m] = { {0, 1, 1, 2, 4},
                         {15, 16, 0, 18, 19},
                         {20, 21, 22, 24, 24},
                         {0, 6, 7, 8, 9},
                         {10, 11, 0, 13, 14} };
    std::cout << "Matrix:\n";
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            std::cout << matrix[i][j] << ' ';
        }
        std::cout << "\n";
    }
    //Определить количество столбцов, не содержащих ни одного нулевого элемента.
    int ZeroCounter = 0;
    bool ColumnZeroFlag = 0;
    for (int i = 0; i < m; i++) {
        ColumnZeroFlag = false;
        for (int j = 0; j < n; j++) {
            if (matrix[j][i] == 0) ColumnZeroFlag = true;
        }
        if (!ColumnZeroFlag) ZeroCounter++;
    }
 
    std::cout << "Кол-во столбцов, не содержащих ни одного 0: " << ZeroCounter << "\n";
 
    //Характеристикой строки целочисленной матрицы назовем сумму ее положитель
    //ных четных элементов.Переставляя строки заданной матрицы, расположить их в
    //соответствии с ростом характеристик.
 
    //Для начала создадим, целочисленный одномерный, массив для хранения характеристики каждой строки
    int CharacteristicArray[n] = { 0, 0, 0, 0, 0 };
 
    //Вычислим характеристику каждой строки матрицы
    int summ = 0;
    for (int i = 0; i < n; i++) {
        summ = 0;
        for (int j = 0; j < m; j++) {
            if (!(j % 2) && matrix[i][j] > 0) summ += matrix[i][j];
        }
        CharacteristicArray[i] = summ;
    }
    //выведем в консоль характеристику каждой строки матрицы
    for (int i = 0; i < n; i++) {
        std::cout << "Характеристика " << i << "-ой строки: " << CharacteristicArray[i] << "\n";
    }
 
    //Создадим массив указателей на ряды матрицы (на одномерный массив чисел)
    //using t_arr = int[n];
    //using pt_arr = t_arr*;
 
    //pt_arr rows[n];  // array pointers to 'rows'
     int (*rows[n])[m]; // without aliases
 
    for (int i = 0; i != n; ++i)
        rows[i] = &(matrix[i]);
    //вывод в консоль неотсортированной матрицы через новые указатели на строки
    for (int r = 0; r != n; ++r) {
        for (int c = 0; c != m; ++c)
            std::cout << (*rows[r])[c] << ' ';
        std::cout << std::endl;
    }
 
    //отсортируем строки матрицы используя указатели на строки и массив CharacteristicArray в котором уже содержатся характеристики строк
    int (*p_arr)[m];//в этой строке я создал указатель на 5 целочисленных элементов, почему нельзя использовать указатель на 1 целочисленный элемент?
    int TmpCharacteristic;
    for (int i = 0; i < n - 1; i++) {//перечислим строки матрици от 0 до предпоследней
        int imin = i;//индекс текущей строки матрици, принимаемой за минимальную по характеристике
        for (int j = i + 1; j < n; j++) {//просмотрим все последующие строки матрицы
            //сравним характеристику текущей строки и следующей сторки матрицы
            //если характеристика текущей строки больше характиристики следующей строки
            if (CharacteristicArray[imin] > CharacteristicArray[j]) {
                //обменяем указатели строк между собой, а также обменяем характеристики этих строк в массиве CharacteristicArray
                p_arr = rows[i];
                rows[i] = rows[j];
                rows[j] = p_arr;
                TmpCharacteristic = CharacteristicArray[imin];
                CharacteristicArray[imin] = CharacteristicArray[j];
                CharacteristicArray[j] = TmpCharacteristic;
            }
        }
    }
 
    //вывод в консоль отсортированной матрицы через указатели на строки
    std::cout << "Отсортированая матрица:\n";
    for (int r = 0; r != n; ++r) {
        for (int c = 0; c != m; ++c)
            std::cout << (*rows[r])[c] << ' ';
        std::cout << std::endl;
    }
}
 
int LineCharacteristic(int numberOfRows, int numberOfСolumns, int arr[]) {
    int summ = 0;
    for (int i = 0; i < numberOfСolumns; i++) {
        if (!(i % 2) && arr[i] > 0) summ += arr[i];
    }
    return summ;
}
0
фрилансер
 Аватар для Алексей1153
6444 / 5637 / 1128
Регистрация: 11.10.2019
Сообщений: 14,993
22.02.2025, 15:12
Цитата Сообщение от ВящЕ Посмотреть сообщение
префиксный инкремент
в данном случае не имеет значения, префиксный или постфиксный, так как оптимизатор создаст одинаковый код в этом месте.
Но с идеологической точки зрения - префиксный более эффективный
0
Заблокирован
22.02.2025, 16:08
Цитата Сообщение от ВящЕ Посмотреть сообщение
Но я не понял зачем вы используете префиксный инкремент
Вопрос у вас должен быть ровно наоборот : "зачем вам использовать постфиксный инкремент?".
Если вы на него не ответили - то используйте префиксный.

Цитата Сообщение от ВящЕ Посмотреть сообщение
и заполняете новый массив строк с конца
Я поменял порядок "строк", что бы продемонстрировать работу массива указателей на "строки".
Но сортировку писать было лень и для примера сортировка и не нужна.

Добавлено через 7 минут
Про инкременты, как то раз мне понадобился автоматический счетчик :
C++
1
2
3
4
    struct auto_counter{
        int c{};
        operator int(){return ++c;};
    };
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.02.2025, 16:08
Помогаю со студенческими работами здесь

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

Сортировка строк матрицы по возрастанию первых элементов
Составить программу, которая переформирует заданную матрицу так, чтобы ее строки расспалагались в порядке возрастания их первых элементов. ...

Сортировка строк матрицы
Помогите пожалуйста с задачкой я в матрицах 0 ( Дана матрица 8*8 состоящая из нулей и единиц. Каждая строка представляет собой число в...

Сортировка строк матрицы
Приветствую! Ребята нужна помощь! Как реализовать сортировку строк матрицы не просто по первому числу каждой строки, а чтобы в случае...

сортировка столбцов / строк в матрице
Товарищи-программисты! Я бьюсь уже второй день, но не могу придумать как отсортировать, к примеру, столбцы матрицы по возрастанию сумм...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru