Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Kolek000
0 / 0 / 0
Регистрация: 25.03.2013
Сообщений: 112
16.04.2013, 22:57     Как удалить столбцы #1
Нужна программа , которая удаляет столбцы из двумерного массива , запрашивая номер столбца по одному.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
16.04.2013, 23:38     Как удалить столбцы #2
Для таких целей как раз подходит структура данных под названием "список".
Вот пример с "двумерным" массивом. Работает по принципу: 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;
}
Kolek000
0 / 0 / 0
Регистрация: 25.03.2013
Сообщений: 112
22.04.2013, 09:36  [ТС]     Как удалить столбцы #3
Как удалить столбцы в динамическом массиве, при удалении номера столбцов запрашивать по одному
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
22.04.2013, 09:41     Как удалить столбцы #4
А с какого он вообще состоит из столбцов?
Kolek000
0 / 0 / 0
Регистрация: 25.03.2013
Сообщений: 112
22.04.2013, 11:41  [ТС]     Как удалить столбцы #5
массив двумерный
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
22.04.2013, 12:24     Как удалить столбцы #6
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;
}
vxg
Модератор
 Аватар для vxg
2667 / 1678 / 158
Регистрация: 13.01.2012
Сообщений: 6,271
22.04.2013, 12:54     Как удалить столбцы #7
что значит динамическом: мы просто выделили память для всего массива? для каждой строки? для каждого столбца?
Kolek000
0 / 0 / 0
Регистрация: 25.03.2013
Сообщений: 112
23.04.2013, 12:05  [ТС]     Как удалить столбцы #8
да выделили память
vxg
Модератор
 Аватар для vxg
2667 / 1678 / 158
Регистрация: 13.01.2012
Сообщений: 6,271
23.04.2013, 14:06     Как удалить столбцы #9
Цитата Сообщение от Kolek000 Посмотреть сообщение
да
что да? так
C++
1
2
3
double **p = new double *[n];
for (int i = 0; i < n; i++)
    p[i] = new double[n];
или иначе?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.04.2013, 14:19     Как удалить столбцы #10
1)Сдвинуть массив на один столбец влево, начиная со следующего столбца за удаляемым. Уменьшить количество столбцов на один.

2)Выделить память под новый массив, с количестом столбцов на один меньше. Скопировать туда старый массив, за исключением удаляемого столбца. Удалить старый массив.
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
23.04.2013, 14:27     Как удалить столбцы #11
Из двумерного массива невозможно удалить столбец. Число столбцов указывается на этапе компиляции, поэтому, например, разница между адресами элементов a[1][0] a[0][0] всегда равна числу столбцов умноженному на размер элемента массива.
vxg
Модератор
 Аватар для vxg
2667 / 1678 / 158
Регистрация: 13.01.2012
Сообщений: 6,271
23.04.2013, 14:36     Как удалить столбцы #12
Цитата Сообщение от palva Посмотреть сообщение
невозможно
возможно но танцы с повторным выделением памяти меньшего размера и копированием в него элементов за исключением расположенных в удаляемых столбцах нельзя назвать медом
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
23.04.2013, 15:02     Как удалить столбцы #13
Трудно что-то посоветовать, когда неизвестно, какие средства языка ТС уже может использовать, а какие они еще не проходили.

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

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

Хотя это больше вопросы к тому, кто задал такую задачу. Может быть он всего лишь подразумевал сдвиг столбцов на освободившееся после удаленного столбца место и заполнение нулями или мусором освободившегося последнего столбца? Но это не называется удалением столбца. Количество столбцов останется тем же, что и было. Еще тут возникает вопрос, что значит номер столбца по одному. Если столбцы сдвигаются, то изменяются ли их номера. Скажем нам нужно удалить 2 и 5 столбцы. Мы обращается к подпрограмме с номером 2, а дальше что делать? Пятый столбце стал четвертым. Какой номер столбца надо указывать при втором обращении к программе. Если ТС объяснит нам все эти вопросы, тогда можно будет предложить ему код. А так кроме непонятных ему советов он вряд ли чего получит.
vxg
Модератор
 Аватар для vxg
2667 / 1678 / 158
Регистрация: 13.01.2012
Сообщений: 6,271
23.04.2013, 15:12     Как удалить столбцы #14
Цитата Сообщение от palva Посмотреть сообщение
можно ли такое делать
имеется ввиду что мы фактически создаем новый массив с меньшим количеством столбцов, копируем в него данные, а старый массив освобождаем
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.04.2013, 18:30     Как удалить столбцы
Еще ссылки по теме:

C++ Массив: Удалить в матрице столбцы количество нулей в которых больше половины.
Удалить столбцы, элементы которых повторяются C++
C++ Удалить все столбцы, в которых первый элемент больше последнего

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

Или воспользуйтесь поиском по форуму:
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
23.04.2013, 18:30     Как удалить столбцы #15
можно переопределять память через realloc и смещать только часть элементов. так будет быстрее чем полное копирование
Yandex
Объявления
23.04.2013, 18:30     Как удалить столбцы
Ответ Создать тему
Опции темы

Текущее время: 03:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru