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

Как удалить столбцы

16.04.2013, 22:57. Показов 2711. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужна программа , которая удаляет столбцы из двумерного массива , запрашивая номер столбца по одному.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.04.2013, 22:57
Ответы с готовыми решениями:

Как сравнить столбцы динамического двумерного массива и удалить второй одинаковый?
Нужно написать такой способ чтобы одинаковые столбцы запоминались не более одного раза и вывести сжатую матрицу Например из матрицы: ...

Как удалить столбцы из матрицы?
как удалить столбцы из матрицы?

Как удалить столбцы в текстовом файле.
Здравствуйте. Подскажите, пожалуйста, как, или при помощи чего, например, в данном текстовом файле оставить 1,2,6-й столбцы, а остальные...

14
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
16.04.2013, 23:38
Для таких целей как раз подходит структура данных под названием "список".
Вот пример с "двумерным" массивом. Работает по принципу: 1) создать новый указатель на массив на один элемент меньше; 2) скопировать все элементы кроме заданного; 3) освободить память под текущую строку и присоединить новую:
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
#include <iostream>
#include <cstdlib>
#include <ctime>
 
 
int** genArr(int h, int l)
{
    int** b = new int*[h];
    for (int i = 0; i < h; ++i)
    {
        b[i] = new int[l];
        for (int j = 0; j < l; ++j)
        {
            b[i][j] = rand() % 100;
        }
    }
    return b;
}
 
void delCol(int** b, int h, int l, int vl)
{
    if (vl < 0 || vl > l)
    {
        return;
    }
 
    for (int i = 0; i < h; ++i)
    {
        int* tmp = new int[l-1];
        for (int j = 0, k = 0; j < l; ++j)
        {
            if (j == vl)
            {
                continue;
            }
            tmp[k++] = b[i][j];
        }
        delete [] b[i];
        b[i] = tmp;
    }
}
 
void freeArr(int** b, int h)
{
    for (int i = 0; i < h; ++i)
    {
        delete [] b[i];
    }
    delete [] b;
}
 
void showArr(int** b, int h, int l)
{
    for (int i = 0; i < h; ++i)
    {
        for (int j = 0; j < l; ++j)
        {
            std::cout.width(3);
            std::cout << b[i][j] << ' ';
        }
        std::cout << '\n';
    }
}
 
 
int main()
{
    const int HEIGHT = 10;
    const int LENGTH = 10;
 
    srand(time(0));
    int** array = genArr(HEIGHT, LENGTH);
    showArr(array, HEIGHT, LENGTH);
    std::cout << '\n';
 
    delCol(array, HEIGHT, LENGTH, 0);
    delCol(array, HEIGHT, LENGTH, 4);
    showArr(array, HEIGHT, LENGTH-2); // на 2 поинта меньше.
    std::cout << '\n';
 
    freeArr(array, HEIGHT);
 
    return 0;
}
0
0 / 0 / 0
Регистрация: 25.03.2013
Сообщений: 112
22.04.2013, 09:36  [ТС]
Как удалить столбцы в динамическом массиве, при удалении номера столбцов запрашивать по одному
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
22.04.2013, 09:41
А с какого он вообще состоит из столбцов?
0
0 / 0 / 0
Регистрация: 25.03.2013
Сообщений: 112
22.04.2013, 11:41  [ТС]
массив двумерный
0
 Аватар для Olivеr
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
22.04.2013, 12:24
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
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <algorithm>
 
using namespace std;
 
typedef int vecType;
typedef vector<vecType> oneDimenVec;
typedef vector<oneDimenVec> twoDimenVec;
 
vecType random()
{   return rand() % 90 + 10;    }
 
void delCol(twoDimenVec &vec, unsigned col)
{
    if (col >= vec.size())
        return;
    for (size_t i = 0; i != vec.size(); i++)
        vec[i].erase(vec[i].begin() + col);
}
 
void print(const oneDimenVec &vec)
{
    for (size_t i = 0; i != vec.size(); i++)
        cout << vec[i] << " ";
    cout << endl;
}
 
int main()
{
    srand(time(0));
    unsigned rows = 5, cols = 5, col_to_delete = 3;
 
    twoDimenVec vec(rows, oneDimenVec(cols));
 
    for (size_t i = 0; i != vec.size(); i++)
        generate(vec[i].begin(), vec[i].end(), random);
 
    for_each(vec.begin(), vec.end(), print);
 
    cout << "Removed " << col_to_delete << "th column:" << endl;
    delCol(vec, col_to_delete);
 
    for_each(vec.begin(), vec.end(), print);
 
    return 0;
}
0
Модератор
 Аватар для vxg
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
22.04.2013, 12:54
что значит динамическом: мы просто выделили память для всего массива? для каждой строки? для каждого столбца?
0
0 / 0 / 0
Регистрация: 25.03.2013
Сообщений: 112
23.04.2013, 12:05  [ТС]
да выделили память
0
Модератор
 Аватар для vxg
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
23.04.2013, 14:06
Цитата Сообщение от Kolek000 Посмотреть сообщение
да
что да? так
C++
1
2
3
double **p = new double *[n];
for (int i = 0; i < n; i++)
    p[i] = new double[n];
или иначе?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.04.2013, 14:19
1)Сдвинуть массив на один столбец влево, начиная со следующего столбца за удаляемым. Уменьшить количество столбцов на один.

2)Выделить память под новый массив, с количестом столбцов на один меньше. Скопировать туда старый массив, за исключением удаляемого столбца. Удалить старый массив.
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
23.04.2013, 14:27
Из двумерного массива невозможно удалить столбец. Число столбцов указывается на этапе компиляции, поэтому, например, разница между адресами элементов a[1][0] a[0][0] всегда равна числу столбцов умноженному на размер элемента массива.
0
Модератор
 Аватар для vxg
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
23.04.2013, 14:36
Цитата Сообщение от palva Посмотреть сообщение
невозможно
возможно но танцы с повторным выделением памяти меньшего размера и копированием в него элементов за исключением расположенных в удаляемых столбцах нельзя назвать медом
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
23.04.2013, 15:02
Трудно что-то посоветовать, когда неизвестно, какие средства языка ТС уже может использовать, а какие они еще не проходили.

Цитата Сообщение от vxg Посмотреть сообщение
возможно
Ну тогда это уже не двумерный массив будет, а объект некоторого класса где переопределена операция [].
В двумерном массиве адрес элемента a[i][j] вычисляется по формуле, куда входит количество столбцов, и изменить эту формулу программа не может.

Перевыделение памяти -- можно ли такое делать? Ведь удаление второго столбца подразумевает, что первый столбец должен оставаться на месте, а третий занять место второго. А при выделении новой памяти первый столбце изменит свое положение. Это вопрос к ТС.

Хотя это больше вопросы к тому, кто задал такую задачу. Может быть он всего лишь подразумевал сдвиг столбцов на освободившееся после удаленного столбца место и заполнение нулями или мусором освободившегося последнего столбца? Но это не называется удалением столбца. Количество столбцов останется тем же, что и было. Еще тут возникает вопрос, что значит номер столбца по одному. Если столбцы сдвигаются, то изменяются ли их номера. Скажем нам нужно удалить 2 и 5 столбцы. Мы обращается к подпрограмме с номером 2, а дальше что делать? Пятый столбце стал четвертым. Какой номер столбца надо указывать при втором обращении к программе. Если ТС объяснит нам все эти вопросы, тогда можно будет предложить ему код. А так кроме непонятных ему советов он вряд ли чего получит.
0
Модератор
 Аватар для vxg
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
23.04.2013, 15:12
Цитата Сообщение от palva Посмотреть сообщение
можно ли такое делать
имеется ввиду что мы фактически создаем новый массив с меньшим количеством столбцов, копируем в него данные, а старый массив освобождаем
0
 Аватар для Olivеr
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
23.04.2013, 18:30
можно переопределять память через realloc и смещать только часть элементов. так будет быстрее чем полное копирование
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.04.2013, 18:30
Помогаю со студенческими работами здесь

Как удалить чётные столбцы в матрице
Помогите пожалуйста написать программу в VBA которая удаляет чётные столбцы в матрице А(8,5)

Как удалить повторяющиеся столбцы в Stringrid?
Как удалить повторяющиеся столбцы в Stringrid?

Как удалить столбцы из таблицы (DBF)
Доброго времени суток уважаемые форумчане. Сразу приношу вам извинение за возможно глупый вопрос, я не профи, а всего лишь...

Как удалить столбцы DGV до определённого столбца?
как удалять столбцы datagridview до определенногостолбца, вот скрин

Как удалить все четные столбцы матрицы
матрица mxn надо удалить все четные столбцы... помогите..а то вообще не пойму ни как...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru