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

Перестановка строк в матрице

28.03.2020, 10:54. Показов 1367. Ответов 2

Студворк — интернет-сервис помощи студентам
Приветствую! Программа работает исправно, за исключением одного но:
При попытке очистить память появляется ошибка.
И еще одно, основное, как можно выполнить сдвиг строчки матрицы? Мой алгоритм работает верно, но мне необходимо другое решение. А ничего в голову не приходит.
Задача: Найти в матрице максимальный элемент и продублировать строчку с ним.
Я выполни программу так:
1. Выделил память на 1 строчку больше, чем необходимо.
2. Нашёл элемент, запомнил индекс.
3. Спускаю в последнюю(в пустую) строчку(Rows) строчку выше(Rows-1). И так до тех пор, пока не дойду до индекса строчки, где находится максимальный элемент.
Как только цикл дошёл до этого индекса, я спускаю вниз эту строчку, таким образом дублирую эту строку и выхожу из цикла с помощью break. Заранее спасибо.
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include <stdio.h>//Подключаем библиотеки для корректной работы программы.
#include <stdlib.h>
#include <locale.h>
#include <time.h>
void InputArray(int** Array, int Rows, int Cols); //Прототипы функций.
void InputRandom(int** Array, int Rows, int Cols);
void OutputArray(int** Array, int Rows, int Cols);
void MainLogic(int** Array, int Rows, int Cols);
void OutputNewArray(int** Array, int Rows, int Cols);
 
 
 
 
int main() {
    setlocale(LC_ALL, "RUS"); //Подключаем русскую раскладку.
    srand(time(NULL)); //Вызываем функцию для rand.
    int Number, Rows = 0, Cols = 0;
 
    do {
        printf("Введите количество строчек вашей матрицы: "); //Проверка на корректный ввод.
        scanf_s("%d", &Rows);
        if (Rows < 0) printf("Ошибка! Повторите ввод.\n");
    } while (Rows <= 0);
 
    do {
        printf("Введите количество столбцов вашей матрицы: ");
        scanf_s("%d", &Cols);
        if (Cols < 0) printf("Ошибка! Повторите ввод.\n");
    } while (Cols <= 0);
 
    int** Array = (int**)malloc(Rows * sizeof(int*)); //Создаем динамический массив на одну строчку больше.
    for (int i = 0; i < (Rows + 1); i++) {
        Array[i] = (int*)malloc(Cols * sizeof(int));
    }
 
    if ((Array == NULL)) { //Проверка на выделение памяти. 
        printf("Память не выделена.\n");
        printf("Заверешение программы...");
        return 1;
    }
 
    printf("Введите 1, для ручного заполнения матрицы. Введите 0, для заполнения матрицы cлучайными числами.\n");
    do {
        printf("Ваш выбор: ");
        scanf_s("%d", &Number);
        if (Number < 0 || Number > 1) printf("Ошибка! Повторите ввод.\n");
    } while (Number < 0 || Number > 1);
 
 
    if (Number) {
        InputArray(Array, Rows, Cols);
        OutputArray(Array, Rows, Cols);
    }
 
    else {
        InputRandom(Array, Rows, Cols);
        OutputArray(Array, Rows, Cols);
    }
    MainLogic(Array, Rows, Cols);
    OutputNewArray(Array, Rows, Cols);
    for (int i = 0; i < Rows + 1; i++) {
        free(Array[i]);
    }
    free(Array);
 
}
 
 
 
 
 
 
void InputArray(int** Array, int Rows, int Cols) { //Ручной ввод элементов массива.
    for (int i = 0; i < Rows; i++) {
        for (int j = 0; j < Cols; j++) {
            printf("Введите элемент Array[%d][%d] = ", i, j);
            scanf_s("%d", &Array[i][j]);
        }
        printf("\n");
    }
}
 
 
void InputRandom(int** Array, int Rows, int Cols) { //Автоматический ввод элементов массива.
    printf("Заполним массив случайными числами.\n");
    for (int i = 0; i < Rows; i++) {
        for (int j = 0; j < Cols; j++) {
            Array[i][j] = rand() % 100 - 50;
        }
    }
}
 
 
void OutputArray(int** Array, int Rows, int Cols) { //Вывод исходного массива.
    printf("Выведем исходную матрицу на экран.\n");
    for (int i = 0; i < Rows; i++) {
        for (int j = 0; j < Cols; j++) {
            printf("%6d", Array[i][j]);
        }
        printf("\n");
    }
}
 
 
void MainLogic(int** Array, int Rows, int Cols) { //Логика программы.
    int MaxEl = 0, iMax = 0, jMax = 0;
    for (int i = 0; i < Rows; i++) {
        for (int j = 0; j < Cols; j++) {
            if (Array[i][j] > MaxEl) {
                MaxEl = Array[i][j];
                iMax = i;
                jMax = j;
            }
        }
    }
    printf("Максимальный элемент = %d. \nИндекс = [%d][%d]\n", MaxEl, iMax, jMax);
 
 
    for (int j = Rows; j >= iMax; j--) { //Перестановка строк. Необходимо заменить.
        if (j - 1 != iMax)
            Array[j] = Array[j - 1];
        else {
            Array[j] = Array[j - 1];
            break;
        }
 
    }
    
 
}
 
 
void OutputNewArray(int** Array, int Rows, int Cols) { //Вывод измененного массива.
    printf("Продублируем строчку с максимальным элементом.\nИ выведем новый массив.\n");
    for (int i = 0; i < Rows + 1; i++) {
        for (int j = 0; j < Cols; j++) {
            printf("%6d", Array[i][j]);
        }
        printf("\n");
    }
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.03.2020, 10:54
Ответы с готовыми решениями:

Перестановка двух произвольных строк в матрице
Для заданной матрицы A размерности MxN написать программу перестановки двух произвольных строк.

Перестановка строк матрицы в функциях
Дана матрица n*m переставить строки матрицы таким макаром: было: 1 2 3 4 5 6 7 8 9 стало: 7 8 9 1 2 3

Перестановка строк двумерного массива
Переставить строки двумерного массива по убыванию значений максимальных елементов строк.

2
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
28.03.2020, 11:13
Лучший ответ Сообщение было отмечено ProgrammNew как решение

Решение

Цитата Сообщение от ProgrammNew Посмотреть сообщение
Выделил память на 1 строчку больше, чем необходимо.
Цитата Сообщение от ProgrammNew Посмотреть сообщение
int** Array = (int**)malloc(Rows * sizeof(int*));
Нет, не выделили (нужно было выделить Rows+1 строк).
1
0 / 0 / 0
Регистрация: 17.03.2020
Сообщений: 7
28.03.2020, 11:25  [ТС]
Проблема с перестановкой строк решена - глупо вышло. Решил попробовать изменить так, как хотел раньше. И всё вышло. Хотя до этого не получалось.
Но проблема с ошибкой памяти - актуально.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.03.2020, 11:25
Помогаю со студенческими работами здесь

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

Перестановка строк текстовой матрицы через указатели
int swapStr(char** str, int first, int second) { char *temp = str; str = str; str = temp; temp = &quot;&quot;; ...

Перестановка строк в матрице
Дана целочисленная матрица размера 6х9. Найти матрицу, получающуюся из данной: перестановкой строк первой с последней, второй с...

Перестановка строк в матрице
Добрый день Дана заданная целочисленная матрица 6x9. Нужно чтобы по заданному пользователем распорядку чисел от 1 до 9 выстаивались в...

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru