Top.Mail.Ru
Ответы

Помогите с матрицей на 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.

Аватар пользователя
Просветленный
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
 #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; 
}