Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 02.12.2018
Сообщений: 22
1

Упорядочить строки матрицы по возрастанию значений элементов ее побочной диагонали

17.06.2020, 11:35. Показов 632. Ответов 2

Author24 — интернет-сервис помощи студентам
Здравствуйте! Есть задача "Упорядочить строки матрицы по возрастанию значений элементов ее побочной диагонали". Матрица считывается с файла. Всё работает прекрасно, но не получается написать корректный код сортировки и перестановки.
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
#include <iostream>
#include <cstdlib>
#include <fstream>
#include <ctime>
#include <vector>
#include <windows.h>
#include <algorithm>
 
using namespace std;
 
void Create_arix(int n, int min, int max) {
    ofstream out("arix.txt", false);
 
    if (out.is_open())
    {
        srand(time(NULL));
        static const double fraction = 1.0 / (static_cast<double>(RAND_MAX) + 1.0);
        
        string s;
        for (int i = 0; i < n; i++)
        {
            s = "\t";
            for (int j = 0; j < n; j++)
            {
                if (j == n - 1)s = "\n";
                out << static_cast<int>(rand() * fraction * (max - min + 1) + min) << s;
            }
        }
        out.close();
    }
    else cout << "Произошла невиданная ошибка!";
}
 
int Read_File(vector<int>& a) {
    ifstream in("arix.txt");
    if (in.is_open())
    {
        int number;
        do
        {
            in >> number;
            a.push_back(number);
 
        } while (!in.eof());
        a.pop_back();
        return a.size();
    }
    else { cout << "Не удалось открыть файл!"; return -1; }
}
 
void Sort_arix(int** a, int n) {
    bool flag = true;
    int counter = 0;
    
    while (flag && counter < 50)
    {
        flag = false;
        counter++;
        for (int i = 0; i < n - 1; i++) {
 
            if (a[i][n - 1 - i] < a[i + 1][n - 1 - (i + 1)]) {
                for (int k = 0; k < n; k++)
                {
                    flag = true;
                    int tmp = a[i][k];
                    a[i][k] = a[i + 1][k];
                    a[i + 1][k] = tmp;
                }
 
            }
 
        }
    }
}
 
void Print(int** a, int n) {
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cout << a[i][j] << "\t";
 
        }
        cout << endl;
 
    }
}
int main() {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    Create_arix(5, -100, 100);
    vector<int>arr;
    bool check = false;
    int n = Read_File(arr);
    n = sqrt(n);
    
    
    if (n % 1 == 0) {
        int** arix = new int* [n];
        for (int count = 0; count < n; count++)
            arix[count] = new int[n];
        int k = 0;
 
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                arix[i][j] = arr[k];
                k++;
                
            }
            
        }
 
        Print(arix, n);
        Sort_arix(arix, n);
        cout << endl << endl;
        Print(arix, n);
 
 
        for (int count = 0; count < n; count++)
            delete[] arix[count];
    }
 
    system("pause");
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.06.2020, 11:35
Ответы с готовыми решениями:

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

Составить одномерный массив из элементов побочной диагонали исходной матрицы, и упорядочить его по возрастанию
С клавиатуры вводится вещественная матрица NxN (N&lt;=17). Составить одномерный массив из элементов...

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

Упорядочить строки матрицы по возрастанию значений их наибольших элементов
Задание: Дана матрица целых чисел. Упорядочить ее строки по возрастанию значений их наибольших...

2
2528 / 1247 / 461
Регистрация: 08.11.2016
Сообщений: 3,428
17.06.2020, 13:57 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
void MySort(int ** &arr, int n) // передаем массив по ссылке
{
    int *sm = new int[n];  // объявляем сортировочный массив
    for (int i = 0; i < n; ++i)
        sm[i] = i; // изначальное расположение строк в исходной матрице (от 0 до n - 1)
 
    for (int i = 0; i < n - 1; ++i) // необычная сортировка пузырьком
    {
        for (int j = 0; j < n - i - 1; ++j)
        {
            if (arr[sm[j]][sm[j]] > arr[sm[j + 1]][sm[j + 1]]) // сортируем не исходный массив, а массив сортировочный sm
            {
                int tmp = sm[j];
                sm[j] = sm[j + 1];
                sm[j + 1] = tmp;
            } /* в результате в массиве sm получим сопоставление:
                строка отсортированной матрицы по индексу i равна 
                строке исходной матрицы по индексу в i-ом элементе sm*/
        }
    }
 
    int **newarr = new int*[n]; // объявляем массив указателей (сюда скинем результат сортировки)
 
    for (int i = 0; i < n; ++i) // собственно скидываем (см. пояснение в цикле сортировки
        newarr[i] = arr[sm[i]];
        
    arr = newarr; // сохраняем отсортированный массив указателей в исходный
 
    delete[] newarr; // освобождаем память
    delete[] sm;
}
Добавлено через 3 минуты
UPD: заметил что в программе вы используете вектора int-ов, а функцию сортировки написали для массива указателей на int - тут, как говорится, либо крестик снимите, либо трусы наденьте (сиречь: функцию переделать на вектора или в программе использовать массивы указателей на int.
0
0 / 0 / 0
Регистрация: 02.12.2018
Сообщений: 22
17.06.2020, 14:29  [ТС] 3
Что-то не работает, или это я туплю опять. В функцию передаю динамическую матрицу, а не матрицу из векторов.
Миниатюры
Упорядочить строки матрицы по возрастанию значений элементов ее побочной диагонали  
0
17.06.2020, 14:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.06.2020, 14:29
Помогаю со студенческими работами здесь

Упорядочить строки матрицы по возрастанию значений их наибольших элементов
Задание такое: Дана матрица целых чисел. Упорядочить ее строки по возрастанию значений их...

Упорядочить массив по возрастанию элементов побочной диагонали
Дан двухмерный массив, содержащий 8 строк и 8 столбцов. Элементами массива являются целые числа....

Упорядочить строки матрицы по возрастанию значений самых больших элементов строк
Здравствуйте. Имеется задание: Дано действительную матрицу размером m x n. Упорядочить...

Вычислить верно ли, что наибольшее из значений главной диагонали матрицы, больше чем наименьшее из значений элементов побочной диагонали
Помогите задачу сделать, с бейсиком никогда не работал) Дана квадратная матрица A (4 x 4)....

Определить сумму элементов каждой строки матрицы и упорядочить номера строк по возрастанию значений найденных сумм
Помогите пожалуйста. Только учусь программировать в Eclipse Java. Дана квадратная матрица размером...

Наибольшее из значений элементов главной диагонали матрицы больше, чем наименьшее из значении элементов побочной диагонали
Дана квадратная матрица А(4,4) Выяснить верно ли, что наибольшее из значений элементов главной...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru