Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Иван Богатков
0 / 0 / 0
Регистрация: 15.11.2016
Сообщений: 10
#1

Переставляя строки заданной матрицы, расположить их в соответствии с ростом характеристик - C++

19.01.2017, 17:44. Просмотров 296. Ответов 10
Метки нет (Все метки)

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

Нужно сделать это задание в функции. В этой же функции все отсортировать. Я не понимаю ни алгоритма, ни как это делать.

Добавлено через 16 минут
Пожалуйста помогите!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.01.2017, 17:44
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Переставляя строки заданной матрицы, расположить их в соответствии с ростом характеристик (C++):

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

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

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

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

Массив: Переставляя строки заданной матрицы, расположить их в соответствии с ростом характеристик. - C++
Дана целочисленная прямоугольная матрица. Определить количество столбцов, не содержащих ни одного нулевого элемента. Характеристикой строки...

Переставляя столбцы заданной матрицы, расположить их в соответствии с ростом характеристик - C++
Задание такое: Переставляя столбцы заданной матрицы, расположить их в соответствии с ростом характеристик (характеристикой столбца...

10
MrGluck
Модератор
Эксперт CЭксперт С++
7800 / 4844 / 754
Регистрация: 29.11.2010
Сообщений: 13,211
19.01.2017, 17:54 #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
#include <algorithm>
#include <iostream>
#include <iterator>
#include <numeric>
#include <random>
#include <vector>
 
int main()
{
    std::size_t M, N;
    std::cin >> M >> N;
    std::vector<std::vector<int>> A(M, std::vector<int>(N));
    std::mt19937 gen { std::random_device()() };
    std::uniform_int_distribution<> dist (0, 9);
 
    auto print_v = [](const std::vector<int> &v)
    {
        std::copy(v.cbegin(), v.cend(), std::ostream_iterator<int> (std::cout, " "));
        std::cout << std::endl;
    };
    auto sumOfPosEven = [](const std::vector<int> &v)
    {
        return std::accumulate(v.cbegin(), v.cend(), 0,
            [](const int x, const int y) { return x + (y > 0 && !(y & 1)) * y; } );
    };
 
    std::cout << "Before:\n";
    for (auto &v : A)
    {
        std::generate(v.begin(), v.begin() + N, [&dist, &gen] { return dist(gen); } );
        print_v(v);
    }
 
    std::sort(A.begin(), A.end(), [sumOfPosEven](const auto &lhs, const auto &rhs)
    {
        return sumOfPosEven(lhs) < sumOfPosEven(rhs);
    });
 
    std::cout << "\nAfter:\n";
    for (const auto &v : A)
        print_v(v);
}
2
nonedark2008
1011 / 751 / 175
Регистрация: 28.07.2012
Сообщений: 2,089
19.01.2017, 18:07 #3
Ну, на C++ это делается обычно вот так:
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
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
 
using namespace std;
 
// Сравнивалка двух строк матриц по заданногму критерию
struct rowcomp {
    int rowsum(const vector<int> &a) {
        int sum = accumulate(a.begin(), a.end(), 0, [](int s, int x) {return (x > 0 && x % 2 == 0 ? s + x : s); });
        return  sum;
    }
    bool operator() (const vector<int> &a, const vector<int> &b) {
        return rowsum(a) < rowsum(b);
    }
};
 
// Сортировка строк матрицы при помощи сравнивалки сверху
void matrsort(vector<vector<int>> &m) {
    sort(m.begin(), m.end(), rowcomp());
}
 
ostream & operator << (ostream &out, const vector<vector<int>> &a) {
    for (const auto &row : a) {
        for (const auto &col : row)
            out << col << " ";
        out << endl;
    }
    return out;
}
 
int main() {
    vector<vector<int>> m = {{2, 0, 0}, {4, 0, 0}, {9, 0, 0}};
    cout << "Old:\n" << m;
    matrsort(m);
    cout << "Sorted:\n" << m;
    return 0;
}
1
Иван Богатков
0 / 0 / 0
Регистрация: 15.11.2016
Сообщений: 10
19.01.2017, 18:10  [ТС] #4
В общем. У меня Вижуалка на твой код ругается. Я тебе скину то, что сделал сам:
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
#include <iostream> 
#include <fstream> 
using namespace std;
int main() {
    setlocale(LC_CTYPE, "Russian");
    int n, m;
    int i = 0; int j = 0;
    cout<< "Задайте размер матрицы: " << endl;
    cin >> n;
    cin >> m;
    int ** matr = new int *[n];
    for (i = 0; i < n; ++i) {
        matr[i] = new int[m];
    }
    
    f2(matr, n, m);
    
 
    for (i = 0; i < n; i++) // освобождение динамической памяти 
        delete[] matr[i];
    delete[] matr;
    return 0;
}
void f2(int **matr, int n, int m){
cout << "Вариант 2. Задание 2." << endl;
int s[10];
    for (int i = 0; i<n; i++)
        s[i] = 0;
    // обработка
 
    for (int i = 0; i<n; i++) // для каждой строки
    {
        for (int j = 0; j<m; j++) // суммируем эл-ты
            if (matr[i][j]>0 && matr[i][j] % 2 == 0) s[i] += matr[i][j];
    }
    cout << endl;
    for (int i = 0; i < m; i++)
        cout <<"Суммы: "<< s[i] << endl;
    int matr2[4][4];
    for (int i = 0; i<n; i++) // для каждой строки нового массива
    {
        int mini = 0; //принимаем 0-й индекс минимальным 
        int mins = -1;//принимаем заведомо минимальную сумму
 
                      //ищем минимальную сумму
        for (int j = 0; j<m; j++) // для каждой строки исходного массива
            if (s[j] > mins)
            {
                mins = s[j];
                mini = j;
            }
 
        for (int j = 0; j<m; j++) // копируем строку в новый массив
        matr[i][j] = matr[mini][j];
        s[mini] = -1; //исключаем из проверки строку с минимальной суммой
    
    cout << mins << endl;}
}
Вот. "Оно" вывело суммы, а потом их вывела по порядку. Мне главное отсортировать и вывести готовую матрицу, а не только сумму.
0
nonedark2008
19.01.2017, 18:11
  #5

Не по теме:

Цитата Сообщение от MrGluck Посмотреть сообщение
Если по простому, то так:
Ох, мы мыслим почти схоже, только я чутка более ленивый

0
MrGluck
Модератор
Эксперт CЭксперт С++
7800 / 4844 / 754
Регистрация: 29.11.2010
Сообщений: 13,211
19.01.2017, 18:20 #6
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Ох, мы мыслим почти схоже, только я чутка более ленивый
Вы думаете я сам писал часть кода с генерацией матриц?) Я взял готовую заготовку Единственное, что дописал - функцию сортировки и предикат для неё.

Добавлено через 5 минут
Цитата Сообщение от Иван Богатков Посмотреть сообщение
У меня Вижуалка на твой код ругается.
С++14 support needed. Хотя, если поменять тип параметров у лямбды в сортировке с auto на std::vector<int>, то С++11.
1
Иван Богатков
0 / 0 / 0
Регистрация: 15.11.2016
Сообщений: 10
19.01.2017, 18:27  [ТС] #7
ну как? Возможно ли вывести как-то отсортированную матрицу?

Добавлено через 1 минуту
вы не поняли. Мне нужно сделать все задание в функции.
Т.е, Мэйн и Функция ,в которой производится сортировка.
Только 1 функция.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7800 / 4844 / 754
Регистрация: 29.11.2010
Сообщений: 13,211
19.01.2017, 18:38 #8
Решение на примитивах:
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
#include <cstdlib>
#include <ctime>
#include <iostream>
 
void Swap(int &a, int &b)
{
    int tmp = a;
    a = b;
    b = tmp;
}
 
int SumOfPosEven(const int *arr, const int size)
{
    int sum = 0;
    for (int i = 0; i < size; i++)
        if (arr[i] > 0 && !(arr[i] & 1))
            sum += arr[i];
    return sum;
}
 
void Sort(int **arr, const int M, const int N)
{
    // создаём вспомогательный массив, хранящий характеристики для каждой линии
    int *tmp = new int[M];
    // вычисляем характеристики
    for (int i = 0; i < M; i++)
        tmp[i] = SumOfPosEven(arr[i], N); // передаём строку и размер
 
    // используем пузырьковую сортировку, сравнивая элементы массива с характеристиками.
    // при сдвиге элементов, сдвигаем также линии с соответствующими индексами
    for (int i = 0; i < M; i++)
        for (int j = M - 1; j > i; j--)
            if (tmp[j] < tmp[i])
            {
                Swap(tmp[i], tmp[j]);
                // меняем местами элементы строк
                for (int k = 0; k < N; k++)
                    Swap(arr[i][k], arr[j][k]);
            }
 
    delete[] tmp;
}
 
void Print(int **arr, const int M, const int N)
{
    for (int i = 0; i < M; i++)
    {
        for (int j = 0; j < N; j++)
            std::cout << arr[i][j] << " ";
        std::cout << std::endl;
    }
}
 
int main()
{
    srand(time(0));
    int M, N;
    std::cin >> M >> N;
    int **arr = new int*[M];
    for (int i = 0; i < M; i++)
    {
        arr[i] = new int[N];
        for (int j = 0; j < N; j++)
            arr[i][j] = rand() % 10;
    }
 
    std::cout << "Before:\n";
    Print(arr, M, N);
    Sort(arr, M, N);
    std::cout << "\nAfter:\n";
    Print(arr, M, N);
 
    for (int i = 0; i < M; i++)
        delete[] arr[i];
    delete[] arr;
}
1
Иван Богатков
0 / 0 / 0
Регистрация: 15.11.2016
Сообщений: 10
19.01.2017, 19:00  [ТС] #9
Можно это сделать все в одной функции? Или это анрил?

Добавлено через 14 минут
Вот, что я смог сделать. Посмотрите , я уже вроде как могу вывести данную матрицу ,но че-то не то.
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
int main() {
    setlocale(LC_CTYPE, "Russian");
    int n, m;
    int i = 0; int j = 0;
    cout<< "Задайте размер матрицы: " << endl;
    cin >> n;
    cin >> m;
    int ** matr = new int *[n];
    for (i = 0; i < n; ++i) {
        matr[i] = new int[m];
    }
    f2(matr, n, m);
    for (i = 0; i < n; i++) // освобождение динамической памяти 
        delete[] matr[i];
    delete[] matr;
    return 0;
}void f2(int **matr, int n, int m) {
int s[10];
    for (int i = 0; i<n; i++)
        s[i] = 0;
    // обработка
 
    for (int i = 0; i<n; i++) // для каждой строки
    {
        for (int j = 0; j<m; j++) // суммируем эл-ты
            if (matr[i][j]>0 && matr[i][j] % 2 == 0) s[i] += matr[i][j];
    }
    cout << endl;
    for (int i = 0; i < m; i++)
        cout <<"Суммы: "<< s[i] << endl;
    int matr2[4][4];
    for (int i = 0; i<n; i++) // для каждой строки нового массива
    {
        int mini = 0; //принимаем 0-й индекс минимальным 
        int mins = -1;//принимаем заведомо минимальную сумму
                      //ищем минимальную сумму
        for (int j = 0; j<m; j++) // для каждой строки исходного массива
            if (s[j] > mins)
            {
                mins = s[j];
                mini = j;
            }
 
        for (int j = 0; j < m; j++) { // копируем строку в новый массив
            matr2[i][j] = matr2[mini][j];
            s[mini] = -1; //исключаем из проверки строку с минимальной суммой
        }
    cout << mins << endl;}
    for (int i=0; i<n; i++){
        for (int j = 0; j < m; j++) {
            cout << matr2[i][j] << endl; 
    }
        cout << endl;
    }
 
}
0
MrGluck
Модератор
Эксперт CЭксперт С++
7800 / 4844 / 754
Регистрация: 29.11.2010
Сообщений: 13,211
19.01.2017, 19:02 #10
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
void Sort(int **arr, const int M, const int N)
{
    // создаём вспомогательный массив, хранящий характеристики для каждой линии
    int *tmp = new int[M]();
    // вычисляем характеристики
    for (int i = 0; i < M; i++)
        for (int j = 0; j < N; j++)
            if (arr[i][j] > 0 && !(arr[i][j] & 1))
                tmp[i] += arr[i][j];
 
    // используем пузырьковую сортировку, сравнивая элементы массива с характеристиками.
    // при сдвиге элементов, сдвигаем также линии с соответствующими индексами
    for (int i = 0; i < M; i++)
        for (int j = M - 1; j > i; j--)
            if (tmp[j] < tmp[i])
            {
                int t = tmp[i];
                tmp[i] = tmp[j];
                tmp[j] = t;
                // меняем местами элементы строк
                for (int k = 0; k < N; k++)
                {
                    t = arr[i][k];
                    arr[i][k] = arr[j][k];
                    arr[j][k] = t;
                }
            }
 
    delete[] tmp;
}
Или вы вывод тоже хотите запихнуть в функцию сортировки?
1
Иван Богатков
0 / 0 / 0
Регистрация: 15.11.2016
Сообщений: 10
19.01.2017, 20:25  [ТС] #11
Господа! Я это сделал! Извините, что потратил ваше время, ибо ваши коды мне не пригодились! Я это сделал!
Вот, настоящий правильный вариант весь! 1 и 2 задание!

Задание:
1. Написать программу на языке С++ согласно своему варианту из практического занятия 7.
2. Использовать динамическое выделение памяти для двумерных массивов. Каждый пункт задания должен быть оформлен в виде функции. Для выделения памяти под динамический массив предусмотреть отдельную функцию, получающую в качестве параметров размеры матрицы и возвращающую указатель на вспомогательный массив указателей на строки. Матрицу заполнять, считывая данные из заранее созданного файла. Результаты вывести на экран и в файл.
2. Отладить программу.
Вариант 2
Дана целочисленная прямоугольная матрица.
1) Определить количество столбцов, не содержащих ни одного нулевого элемента.
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <iostream> 
#include <fstream> 
using namespace std;
int vvod(int **matr, int n, int m)
{
    ifstream inarray("matrix.txt"); // открытие файла для ввода 
    if (!inarray) {
        cout << "File can not be opened" << endl;
        return 1; //выход из программы 
    }
    // заполнение матрицы считыванием из файла 
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            inarray >> matr[i][j];
            //cout « matr[i][j] « "\t"; 
        } // for j 
          //cout « endl; 
    } // for i 
    inarray.close(); // закрытие файла 
    cout << endl;
}
void f2(int **matr, int n, int m) {
    cout << "Вариант 2. Задание 1." << endl;
    int u = 0;
    for (int j = 0; j < m; j++)
    {
        for (int i = 0; i < n; i++)
            if (matr[i][j] == 0)
            {
                --u;
                break;
            }
        u++;
    }
    cout << "Количество столбов без нулей: " << u << endl;
 
    cout << "Вариант 2. Задание 2." << endl;
    int s[10];
    for (int i = 0; i<n; i++)
        s[i] = 0;
    // обработка
 
    for (int i = 0; i<n; i++) // для каждой строки
    {
        for (int j = 0; j<m; j++) // суммируем эл-ты
            if (matr[i][j]>0 && matr[i][j] % 2 == 0) s[i] += matr[i][j];
    }
    cout << endl;
    for (int i = 0; i < m; i++)
        cout <<"Суммы: "<< s[i] << endl;
    int matr2[4][4];
    for (int i = 0; i < n; i++) // для каждой строки нового массива
    {
        int mini = 0; //принимаем 0-й индекс минимальным 
        int mins = 1000000;//принимаем заведомо максимальную сумму
                      //ищем минимальную сумму
        for (int j = 0; j < m; j++) // для каждой строки исходного массива
            if (s[j] < mins)
            {
                mins = s[j];
                mini = j;
            }
 
        for (int j = 0; j < m; j++) { // копируем строку в новый массив
             matr2[i][j] = matr2[mini][j];
            s[mini] = 1000000;
            cout <<  matr[mini][j] << "\t";//исключаем из проверки строку с минимальной суммой
        }       cout << endl;
    }
 
}
void vyvod(int **matr, int n, int m) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cout << matr[i][j] << "\t";
        }
        cout << endl;
    }
}
int main() {
    setlocale(LC_CTYPE, "Russian");
    int n, m;
    int i = 0; int j = 0;
    cout<< "Задайте размер матрицы: " << endl;
    cin >> n;
    cin >> m;
    int ** matr = new int *[n];
    for (i = 0; i < n; ++i) {
        matr[i] = new int[m];
    }
    vvod(matr, n, m);
    vyvod(matr, n, m);
    f3(matr, n, m);
    
 
    for (i = 0; i < n; i++) // освобождение динамической памяти 
        delete[] matr[i];
    delete[] matr;
    return 0;
}
Огромное спасибо мне))0 . Пользуйтесь, это действительно правильный и рабочий вариант, согласно полному заданию.
Если что, пишите мне. Еще что-нить сделаю.
P.S Также , если есть вопросы по проге, задавайте!
0
19.01.2017, 20:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.01.2017, 20:25
Привет! Вот еще темы с ответами:

Переставляя столбцы заданной матрицы, расположить их в соответствии с ростом характеристик - C++
Добрый вечер всем. #include &lt;iostream.h&gt; #include &lt;math.h&gt; using namespace std; } int main (){ int **mas, n, m, i, j,...

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

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

Переставляя столбцы заданной матрицы, расположить их в соответствии с ростом характеристик - C++
Привет...помогите пожалуйста..я не понимаю услови задачи... 18. Характеристикой столбца целочисленной матрицы назовем сумму...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru