Помогите с матрицей на C++
Дана матрица размером nxm. Упорядочить матрицу по возрастанию элементов первого столбца. Использовать метод пузырька. Алгоритм заключается в следующем: матрица просматривается по перекрещивающимся парам чисел (a[i][0], a[i + 1][0]). Если нулевой элемент i-й строки больше, чем нулевой элемент i + 1-й строки, то строки меняются местами. Поскольку строки матрицы — это одномерные массивы, имеет смысл написать функцию перемены указателей, адресующих строки a[i] и a[i + 1]. Перестановки подсчитываются. Алгоритм завершает работу, если при просмотре матрицы нет ни одной перестановки.
#include <iostream>
#include <vector>
// Функция для обмена двух строк матрицы
void swapRows(std::vector<std::vector<int>>& matrix, int row1, int row2) {
std::swap(matrix[row1], matrix[row2]);
}
// Функция для сортировки матрицы по возрастанию элементов первого столбца
void bubbleSort(std::vector<std::vector<int>>& matrix) {
int rows = matrix.size();
int cols = matrix[0].size();
bool swapped;
for (int i = 0; i < rows - 1; i++) {
swapped = false;
for (int j = 0; j < rows - i - 1; j++) {
if (matrix[j][0] > matrix[j + 1][0]) {
swapRows(matrix, j, j + 1);
swapped = true;
}
}
if (!swapped) {
break;
}
}
}
// Функция для вывода матрицы на экран
void printMatrix(const std::vector<std::vector<int>>& matrix) {
for (const auto& row : matrix) {
for (const auto& element : row) {
std::cout << element << " ";
}
std::cout << std::endl;
}
}
int main() {
int n, m;
std::cout << "Введите размеры матрицы (n m): ";
std::cin >> n >> m;
// Создание матрицы
std::vector<std::vector<int>> matrix(n, std::vector<int>(m));
// Ввод элементов матрицы
std::cout << "Введите элементы матрицы:" << std::endl;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
std::cin >> matrix[i][j];
}
}
// Сортировка матрицы
bubbleSort(matrix);
// Вывод отсортированной матрицы
std::cout << "Отсортированная матрица:" << std::endl;
printMatrix(matrix);
return 0;
}
Этот код сначала запрашивает у пользователя размеры матрицы (количество строк и столбцов) и затем заполняет матрицу элементами с помощью вложенных циклов. Затем он вызывает функцию bubbleSort, которая сортирует матрицу по возрастанию элементов первого столбца. Наконец, он выводит отсортированную матрицу на экран с помощью функции printMatrix.
#include <windows.h>
#include <string>
#include <iostream>
#include <iomanip>
#include <random>
#include <ctime>
using namespace std;
class DinArr
{
public:
int **arr;
int *a;
int col;
int row;
////////////////
DinArr()
{
col= 0;
while (col<3 || col>10) //Разумные ограничения размера 3...10
{
cout << "Введите количество столбцов от 3 до 10 = ";
cin >> col;
}
row= 0;
while ( row<2 || row>col )
{
cout << "Введите количество строк от 2 до " << col << " = ";
cin >> row;
}
}
/////////////////
void MakeArr()
{
int i;
arr = new int*[row]; if (arr==NULL) throw 10;
for(i=0;i<row;i++)
{
a =new int[col];
if (a==NULL) { Alarm= i; throw 11; }
arr[i]= a;
}
Alarm= i;
mt19937 gen ((int)time(0));
uniform_int_distribution <int> distribution(-50,50);
for (int r= 0; r< row; r++)
{
for (int c= 0; c< col; c++)
{
arr[r][c] = distribution(gen);
}
}
}
/////////////////
void PrintArr()
{
int i= 0;
for (int r= 0; r< row; r++)
{
for (int c= 0; c< col; c++)
{
cout << arr[r][c] << '\t';
}
cout << endl << endl;
}
}
/////////////////
void MainFunc()
{
for (int r= 0; r< row-1; r++)
{
for (int rr=r+1; rr< row; rr++)
if (arr[r][0]>arr[rr][0]) { a= arr[r]; arr[r]= arr[rr]; arr[rr]= a; }
}
}
/////////////////
~DinArr()
{
cout << "Выход из программы и освобождаем память" << endl;
for(int i=0;i<Alarm;i++) delete [] arr[i];
delete [] arr;
delete [] a;
}
protected:
int Alarm;
private:
};
int main(int argc, char **argv)
{
system("chcp 1251 > nul"); // Руссификация сообщений
setlocale(LC_ALL, "Russian");
DinArr da;
try
{
da.MakeArr();
cout << endl << endl;
da.PrintArr();
da.MainFunc();
cout << endl << endl;
da.PrintArr();
}
catch(int i)
{
switch (i)
{
case 10:
cout << "Ошибка выделения памяти под строки..." << endl; break;
case 11:
cout << "Ошибка выделения памяти под столбцы..." << endl; break;
}
}
system("pause"); // system("pause > nul");
return 0;
}