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

Удалить столбец, содержащий минимальный элемент матрицы (как сократить код?)

30.03.2018, 17:18. Показов 6734. Ответов 24
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую. Подскажите, можно ли как-то сократить код? Мне он кажется громоздким, или это норм? Без использования векторов. И да, что можно улучшить в плане в плане оформления кода? То есть раньше была проблема, что писал "using ,,,, .. ". Теперь её нет, что дальше?

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
#include <iostream>
#include <ctime>
 
int main () {
    srand(time(NULL)); 
    int n, m, minMass, min, stolbik; 
    std::cout <<"Введите число строк N: "; std::cin >> n;
    std::cout <<"Введите число столбцов M: "; std::cin >> m;
    int mass[n][m];
   
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m ; j++) {
            mass[i][j] = rand() % 10;
            std::cout << mass[i][j] << "\t"; 
        }
        std::cout << std::endl;
    }
    
    minMass = mass[0][0];
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (mass[i][j] < minMass) {
                minMass = mass[i][j];
                min = j;
            }
        }
    }
    std::cout <<"\nСтолбик с минимальным элементом = " 
        << min+1 << std::endl; //спросить, как правильно показывать номер столбца без прибавления единицы в выводе ответа
    
    stolbik = m - 1;
    for (int i = 0; i < n; ++i) {
        for (int j = min; j < stolbik; ++j) {
            mass[i][j] = mass [i][j+1];
        }
    }
    
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < stolbik; ++j) {
            std::cout << mass[i][j] << "\t";
        }
        std::cout << std::endl;
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.03.2018, 17:18
Ответы с готовыми решениями:

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

Сформировать одномерный массив как столбец матрицы,содержащий минимальный элемент на побочной диагонали
2. Сформировать одномерный массив как столбец матрицы, содержащий минимальный элемент на побочной...

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

Удалить столбец, содержащий максимальный элемент матрицы
Дана матрица размера M х N. Удалить столбец, содержащий максимальный элемент матрицы Помоги плиз,...

24
0 / 0 / 1
Регистрация: 03.03.2018
Сообщений: 64
31.03.2018, 14:14  [ТС] 21
Author24 — интернет-сервис помощи студентам
zss, во, спасиб за ссылочку, увидел для себя полезную инфу
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
31.03.2018, 14:46 22
Enflamed, в курсе же, что это не C# и new int[n, m]; выделяет m элементов?
0
3 / 3 / 1
Регистрация: 12.04.2015
Сообщений: 74
31.03.2018, 14:57 23
Цитата Сообщение от Croessmah Посмотреть сообщение
в курсе же, что это не C# и new int[n, m]; выделяет m элементов?
Ну теперь я точно в курсе)). В общем, с поинтерами всё заработало.

Странно, что он выделяет m элементов. А не n*m... Странно, что такой синтаксис вообще корректен, если выделяется всего m элементов.

Или имеется в виду, что как бы указатель создаётся, а память при этом не выделяется?
Это имеете в виду?

А. Я, похоже, доехал. Мы не можем просто так взять и сказать, что у нас указатель указывает на двумерный массив...
Надо именно выделять массив указателей. Как бы, я так понимаю, мы единовременно не можем выделить больше, чем одномерный массив данных.
И поочерёдно нужно выделять под каждый указатель по единичному массиву (одномерному).
Ну да, теперь понял, спасибо.)

Ну да, можно сказать, что в моих первых сообщениях была своего рода дезинформация.

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

Заехал помочь новичку, а помог сам себе, ахах.

Заработало всё так:
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
int main() {
    // чтобы корректно отображались русские символы в консоли
    setlocale(LC_ALL, "russian");
 
    srand(time(NULL));
 
    int n,
        m,
        minElem = INT32_MAX, // минимальный элемент (вместо minMass)
        countOfNewColumns = -1,
        minColumn = INT32_MAX; // столбец с минимальным значением
    cout << "Введите число строк N: "; cin >> n;
    cout << "Введите число столбцов M: "; cin >> m;
 
    int **mass = new int*[n];
 
    for (int i = 0; i < n; i++)
    {
        mass[i] = new int[m];
    }
 
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            *(mass[i]+j) = rand() % 10;
            cout << *(mass[i] + j) << "\t";
        }
        cout << endl;
    }
 
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (*(mass[i]+j) < minElem) {
                minElem = *(mass[i] + j);
                minColumn = j;
            }
        }
    }
 
    cout << "\nСтолбик с минимальным элементом = "
        << minColumn + 1 << endl;
 
    countOfNewColumns = m - 1;
 
    int **newMass = new int*[n];
    for (int i = 0; i < n; i++)
    {
        newMass[i] = new int[countOfNewColumns];
    }
 
    if (minColumn != INT32_MAX && minElem != INT32_MAX)
    {
        int rw = 0, newCl = 0, oldCl = 0;
        while (rw < n)
        {
            while (oldCl < m)
            {
                if (oldCl != minColumn)
                {
                    *(newMass[rw] + newCl) = *(mass[rw]+oldCl);
                    newCl++;
                }
                oldCl++;
            }
            rw++;
            oldCl = 0;
            newCl = 0;
        }
    }
 
 
    int* elemPtr;
    if (newMass != nullptr) {
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < countOfNewColumns; ++j) {
                elemPtr = (newMass[i]+j);
                std::cout << std::to_string(*elemPtr) << "\t";
            }
            cout << endl;
        }
    }
 
    // удаляем выделенную из кучи память 
    // ибо в C++ делается много что вручную
 
    for (int i = 0; i < n; i++)
    {
        delete[] mass[i];
    }
 
    for (int i = 0; i < n; i++)
    {
        delete newMass[i];
    }
 
    delete[] mass;
    delete[] newMass;
    system("pause");
}
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
31.03.2018, 16:04 24
Цитата Сообщение от Enflamed Посмотреть сообщение
Странно, что он выделяет m элементов.
Ничего странного, так и должно быть.
Цитата Сообщение от Enflamed Посмотреть сообщение
Странно, что такой синтаксис вообще корректен, если выделяется всего m элементов.
Ничего странного, так и должно быть.
0
3 / 3 / 1
Регистрация: 12.04.2015
Сообщений: 74
31.03.2018, 19:35 25
Не знаю сокращу я Вам код или не сокращу, но я за Вас перепишу кусок кода (чтобы он работал), переименую переменные, можете комментарии оставить или замечания.

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
#include <iostream>
#include <ctime>
#include <string>
#include <vector>
 
using std::cout;
using std::endl;
using std::cin;
using std::vector;
 
int main() {
    // чтобы корректно отображались русские символы в консоли
    setlocale(LC_ALL, "russian");
 
    srand(time(NULL));
 
    int rowCount,
        columnCount,
        minElem = INT32_MAX, // минимальный элемент (вместо minMass)
        minColumn = INT32_MAX; // столбец с минимальным значением
    cout << "Введите число строк N: "; cin >> rowCount;
    cout << "Введите число столбцов M: "; cin >> columnCount;
 
    vector<vector<int>> massive = vector<vector<int>>();
 
    for (int row = 0; row < rowCount; row++) {
        massive.push_back(vector<int>());
 
        for (int column = 0; column < columnCount; column++) {
            massive[row].push_back(rand() % 10);
            cout << (massive[row])[column] << "\t";
        }
        cout << endl;
    }
    
    for (vector<int> &row : massive) {
        for (int column = 0; column < row.size(); column++) {
            if (row[column] < minElem) {
                minElem = row[column];
                minColumn = column;
            }
        }
    }
 
    cout << "\nСтолбик с минимальным элементом = "
        << minColumn + 1 << endl;
 
    if (minColumn != INT32_MAX && minElem != INT32_MAX) {
        for (vector<int>& row : massive) {
            row.erase(row.begin()+minColumn);
        }
    }
 
    for (vector<int>& row : massive) {
        for (int& cell : row) {
            cout << cell << "\t";
        }
        cout << endl;
    }
 
    system("pause");
}
0
31.03.2018, 19:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.03.2018, 19:35
Помогаю со студенческими работами здесь

Удалить столбец, содержащий максимальный элемент матрицы.
Дана матрица размера M × N. Удалить столбец, содержащий максимальный элемент матрицы.

Удалить столбец, содержащий максимальный элемент матрицы
Дана матрица размера M × N. Удалить столбец, содержащий максимальный элемент матрицы

Дана матрица размера M × N. Продублировать столбец матрицы, содержащий ее минимальный элемент.
Дана матрица размера M × N. Продублировать столбец матрицы, содержащий ее минимальный элемент....

Удалить столбец матрицы, в котором находится минимальный элемент.
Удалить столбец, в котором находится минимальный элемент.


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

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