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

Удаление ВСЕХ столбцов и строк, на пересечении которых есть отрицательные элементы

28.04.2018, 20:54. Показов 1240. Ответов 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
int ThirdTask()
{
    int n, m;
    n = InputRow(n); //здесь из функции отдельной вводится кол-во строк
    m = InputCol(m); //здесь кол-во столбцов
    int** a = Massive(n, m); //создается двумерный динамический массив
    PrintMassive(a, n, m); //выводится пользователю в консоли
    for (int j = 0; j < n; j++) {    //начало моих "попыток" удаления столбцов и строк
        for (int i = 0; i < m; i++) {
            if (a[j][i] < 0) {
                for (int l = i; l < m - 1; l++) {
                    for (int b = 0; b < n; b++) {
                        a[b][l] = a[b][l + 1];
                    }
                }
                m--;
                for (int k = j; k < n - 1; k++)
                    for (int b = 0; b < m; b++) {
                        a[k][b] = a[k + 1][b];
                    }
                n--;
                i--;
            }
        }
    }
    if (m <= 0 || n <= 0)
        cout << "После модификации в матрице не осталось элементов, упс\n";
    else {
        cout << "Матрица после модификации:" << endl;
        for (int j = 0; j < n; j++) {
            for (int i = 0; i < m; i++) {
                cout << a[j][i] << ' ';
            }
            cout << endl;
        }
    }
    for (int i = 0; i < n; i++) { 
        free(a[i]);
    }
    free(a);
}
Но! данная программа удаляет не все строки, потому что, если в программе встречается в одном столбце два отрицательных числа, про удаление строки второго числа он забывает.
Пример:
-2 3 4 5
-3 4 2 1
3 5 6 1
получается:
4 2 1
5 6 1
а должно остаться: 5 6 1
Ну, в общем, понятно объяснила, я думаю. Преподаватель сказал попробовать сделать через вторую матрицу, где заменить положительные числа 1, а отрицательные нулями, но сколько бы я не билась в этот способ, он не выходит у меня, остается такая же не_до_конца_отформатированная матрица.

Собственно, вопрос. Подскажите, как поправить мой код или что придумать, чтобы выполнить задание?
Буду безмерно благодарная за любую помощь.


P.S. Было еще предположение создать два массива линейных: в один записать номер строки, которую надо удалить, а в другой номер столбца, а после просто последовательно "пройтись" удалением строк и столбцов с "вытаскиванием" их номеров из созданных массивов, но я не могу додуматься, как это реализовать.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.04.2018, 20:54
Ответы с готовыми решениями:

Найти суммы элементов строк и столбцов матрицы, на пересечении которых лежат не отрицательные элементы
Дана прямоугольная матрица B с размером m x n 1)Сформировать из строк матрицы B с нулевым первым элементом матрицу C с размером k x n,...

Вставьте первый столбец после всех столбцов, в которых есть отрицательные элементы.
Дан двумерный массив. Вставьте первый столбец после всех столбцов, в которых есть отрицательные элементы. (С помощью процедур).

Вставить перед всеми строками в которых есть 0 первую строку после всех столбцов, в которых есть отрицательные
Вставить перед всеми строками в которых есть 0 первую строку после всех столбцов, в которых есть отрицательные элементы - первый столбец. ...

2
2 / 2 / 2
Регистрация: 18.04.2017
Сообщений: 9
29.04.2018, 02:19
Возможно лучше будет находить элементы, которые меньше нуля запоминать их (то есть их позицию), а затем по данным удалять столбцы и строки.

Добавлено через 27 минут
Предлагаю проходиться по массиву и смотреть если есть элемент меньше нуля то в массив строк, записать индекс текущей строки, причем не допуская дубликатов.
В нашем случае будет два массива со значениями
arr_col = [0];
arr_row = [0, 1];
а потом удаляем по этим данным (для упрощения нужно удалять с конца в начало). Для начала столбци
|-2| 3 4 5
|-3| 4 2 1
| 3| 5 6 1
после смещение получиться
3 4 5
4 2 1
5 6 1
а далее строки
3 4 5
5 6 1
=>
5 6 1

Добавлено через 3 минуты
Можно еще когда ты удаляешь / меняешь строку / столбец проверять каждый эле ли он меньше нуля. если меньше то тутже удалять столбец / строку в соответствии
0
0 / 0 / 1
Регистрация: 18.08.2015
Сообщений: 6
29.04.2018, 13:45  [ТС]
Цитата Сообщение от Werdna Посмотреть сообщение
Возможно лучше будет находить элементы, которые меньше нуля запоминать их (то есть их позицию), а затем по данным удалять столбцы и строки.

Добавлено через 27 минут
Предлагаю проходиться по массиву и смотреть если есть элемент меньше нуля то в массив строк, записать индекс текущей строки, причем не допуская дубликатов.
В нашем случае будет два массива со значениями
arr_col = [0];
arr_row = [0, 1];
а потом удаляем по этим данным (для упрощения нужно удалять с конца в начало). Для начала столбци
|-2| 3 4 5
|-3| 4 2 1
| 3| 5 6 1
после смещение получиться
3 4 5
4 2 1
5 6 1
а далее строки
3 4 5
5 6 1
=>
5 6 1

Добавлено через 3 минуты
Можно еще когда ты удаляешь / меняешь строку / столбец проверять каждый эле ли он меньше нуля. если меньше то тутже удалять столбец / строку в соответствии
Я написала вот такую программу, но у меня работает почему-то через раз, а я совсем не могу найти этому причину.
Аглоритм вроде похож на Ваш и на тот, который я изначально придумала. Создала два одномерных массива, размеры которых равны у одного -- числу столбцов, у другого строк. И удаляя элемент одномерного массива с индексом [l] я удаляю строку с таким индексом и т.д.

Посмотрите, пожалуйста, что надо исправить.

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
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <cmath>
using namespace std;
 
int main()
{
    int n, m, r, c;
    cout << "Введите количество столбцов: \n";
    cin >> m;
    cout << "Введите количество строк: \n";
    cin >> n;
    int** a = (int**)malloc(n * sizeof(int*));
    for (int i = 0; i < n; i++) {
        a[i] = (int*)malloc(m * sizeof(int));
    }
    for (int j = 0; j < n; j++) {
        for (int i = 0; i < m; i++) {
            cout << "Введите элемент [" << j << "][" << i << "] ";
            cin >> a[j][i];
        }
    }
     cout << "Исходный массив: \n";
    for (int j = 0; j < n; j++) {
        for (int i = 0; i < m; i++) {
            cout << a[j][i] << ' ';
        }
        cout << endl;
    }
    int* col = (int*)malloc(m * sizeof(int));
    int* row = (int*)malloc(n * sizeof(int));
    for (int j = 0; j < n; j++) {
        for (int i = 0; i < m; i++) {
            if (a[j][i] < 0) {
                col[i] = 1;
                row[j] = 1;
            }
        }
    }
    cout << "Массивы, где 1 - надо удалить строку/столбец (по порядку в соответствии с начальным массивом), 0 - не надо удалять\n";
    cout << "По строкам:\n";
    for (int j = 0; j < n; j++) {
        cout << row[j] << ' ';
    }
    cout << endl;
    cout << "По столбцам:\n";
    for (int i = 0; i < m; i++) {
        cout << col[i] << ' ';
    }
    cout << endl;
 
    for (int i = 0; i < m; i++) { //удаление столбцов
        if (col[i] == 1) { //удаляем единицы, соответствующие номерам столбцов, в векторе
            for (int l = i; l < m - 1; l++) {
                col[l] = col[l + 1];
            }
            m--;
            for (int l = i; l < m - 1; l++) {
                for (int b = 0; b < n; b++) { //удаляем столбцы в исходной матрице
                    a[b][l] = a[b][l + 1];
                }
            }
            i--;
        }
    }
    for (int j = 0; j < n; j++) { //удаление строк
        if (row[j] == 1) { //удаляем единицы, соответствующие номерам строк в векторе
            for (int l = j; l < n - 1; l++) {
                row[l] = row[l + 1];
            }
            n--;
            for (int l = j; l < n - 1; l++) {
                for (int b = 0; b < m; b++) { //удаляем строки в исходной матрице
                    a[l][b] = a[l + 1][b];
                }
            }
            j--;
        }
    }
    cout << "После модификации векторов: \n";
    cout << "По строкам:\n";
    for (int j = 0; j < n; j++) {
        cout << row[j] << ' ';
    }
    cout << endl;
    cout << "По столбцам:\n";
    for (int i = 0; i < m; i++) {
        cout << col[i] << ' ';
    }
    cout << endl;
    if (m <= 0 || n <= 0)
        cout << "После модификации в матрице не осталось элементов, упс\n";
    else {
        cout << "Матрица после модификации:" << endl;
        for (int j = 0; j < n; j++) {
            for (int i = 0; i < m; i++) {
                cout << a[j][i] << ' ';
            }
            cout << endl;
        }
    }
    for (int i = 0; i < n; i++) { //не получилось использовать ф-цию FreeMassive, тк нет второго динамического массива
        free(a[i]);
    }
    free(a);
    free(row);
    free(col);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.04.2018, 13:45
Помогаю со студенческими работами здесь

Удаление всех столбцов массива, в которых есть хотя бы один нулевой элемент
Задание такое:Сформировать матрицу.Удалить все столбцы, в которых есть хотя бы один нулевой элемент. Я сделал массив, и составил программу...

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

Нахождение числа строк двумерного массива A (N, N), в которых есть отрицательные элементы
помогите пожалуйста решить задачи в турбопаскале , буду очень признателен)) 1)составить программу нахождения числа строк двумерного...

Вывести номера строк и столбцов в которых есть одинаковые элементы.
Дана матрица A(nxn). Вывести номера строк и столбцов в которых есть одинаковые элементы.

Двумерный массив: посчитать количество строк и столбцов, в которых есть нулевые элементы
Имеется двумерный массив, нужно посчитать количество строк и столбцов, в которых есть нулевые элементы, помогите пожалуйста) Добавлено...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru