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

Удаление столбцов из динамической матрицы - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
Vashtanerada
1 / 1 / 0
Регистрация: 29.11.2012
Сообщений: 142
21.12.2013, 16:38     Удаление столбцов из динамической матрицы #1
Здравствуйте, уважаемые форумчане!
Возникла такая вот беда:
Нужно из двумерного динамического массива удалить все столбцы, в которых есть хотя бы один нулевой элемент. В общем я понимаю принцип, как это должно быть реализовано, т.е. с начала мы перебираем все элементы в поисках нулевого и попутно считаем количество строк без нулей - это будет кол-во столбцов в новой матрице. Затем создаем вторую матрицу (соответственно выделяем память) и после этого записываем в нее все столбцы без гулей, ну и выводим.
Дак вот, на деле это оказалось не так просто, я тут даже не совсем въезжаю как правильно сделать, чтобы прога столбцы просчитывала. В принципе я понимаю как выделяется память, но не могу понять, как удаляются столбцы. Будьте добры, помогите кто чем сможет.
Заранее спасибо.

Добавлено через 14 часов 58 минут
Простите, забыла про код:
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
//ÑôîðìèðîâГ*ГІГј äèГ*Г*ìè÷åñêèé äâóìåðГ*ûé Г¬Г*Г±Г±ГЁГў, 
//Г§Г*ïîëГ*ГЁГІГј ГҐГЈГ® ñëó÷Г*Г©Г*ûìè Г·ГЁГ±Г«Г*ìè ГЁ âûâåñòè Г*Г* ГЇГҐГ·Г*ГІГј
int m,n;
cout << "Ââåäèòå êîë-âî ñòðîê: ";
cin >> n;
cout << "Ââåäèòå êîë-âî ñòîëáöîâ: ";
cin >> m;
int ** matr=new int * [n];
    for (int i=0; i<n; i++)
        matr[i]=new int [m];
 
    for (int i=0; i<n; i++)
        for (int j=0; j<m; j++)
            matr[i][j]=rand()%100-50;
                        
        
 cout << "Âûâîä Г¬Г*òðèöû:" << endl << endl;
 for (int i=0; i<n; i++)
 {
     for(int j=0; j<m; j++)
         printf ("%5d", matr[i][j]);
     cout << endl;
 }
 
 
 cout << endl;
        for (int i=0; i<n; i++)
            delete [] matr[i];
        delete [] matr;
 
//ÓäГ*ëèòü ГўГ±ГҐ ñòîëáöû, Гў êîòîðûõ ГҐГ±ГІГј õîòÿ ГЎГ» îäèГ* Г*óëåâîé ýëåìåГ*ГІ
int t=0;
int **matr2;
matr2=new int * [n];
for (int i=0; i<n; i++)
{
  for (int j=0; j<m; j++)
   {
     if (matr[i][j]!=0); //t-êîë-ГўГ® ñòîëáöîâ Гў Г*îâîé Г¬Г*òðèöå     
   }     
}
cout << t;
 
cout << endl;
matr=matr2;
        for (int i=0; i<n; i++)
            delete [] matr2[i];
        delete [] matr2;  
        
 cout << "Âûâîä Г¬Г*òðèöû2:" << endl << endl;
 for (int i=0; i<n; i++)
 {
     for(int t=0; t<m; t++)
         printf ("%5d", matr[i][t]);
     cout << endl;
 }
system("PAUSE");
С вводом и выводом, вроде все норм, а вот с удалением не понимаю
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.12.2013, 16:38     Удаление столбцов из динамической матрицы
Посмотрите здесь:

Удаление динамической памяти C++
C++ Удаление столбцов из матрицы содержащих число 1
C++ Вычитание столбцов динамической матрицы
C++ Удаление строчек и столбцов матрицы заполненных только отрицательными элементами
C++ Написать 4 функции для матриц(Создание матрицы, печать, поиск минимального элемента, удаление столбцов)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
21.12.2013, 16:45     Удаление столбцов из динамической матрицы #2
Цитата Сообщение от Vashtanerada Посмотреть сообщение
Нужно из двумерного динамического массива удалить все столбцы, в которых есть хотя бы один нулевой элемент
Проходишь по столбцу циклом, как только появляется ноль делаешь выход из цикла с помощью break и удаляешь этот столбец delete [] stolbetz;
Vashtanerada
1 / 1 / 0
Регистрация: 29.11.2012
Сообщений: 142
22.12.2013, 16:10  [ТС]     Удаление столбцов из динамической матрицы #3
Я попыталась сделать таким образом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//Удалить все столбцы, содержащие хотя бы один ноль
int t=m, s=0, schet=0;
int **matr2;
matr2=new int * [s];
for (i=0; i<n; i++)
{
  for (j=0; j<m; j++)
   {
     if (matr[i][j]==0) 
       {
         matr[0][j]=0; 
         delete [] matr[j];
         break; 
       }
   }     
}
У меня выходит вот такая бяка:

Добавлено через 4 минуты
Код
   
Введите кол-во строк: 7
Введите кол-во столбцов: 6
Вывод матрицы:

  -24   41   28   34   29   19
  -32   44  -22   34   43  -28
  -46    8   44  -34   -7   44
    2   43   29   47  -37   38
  -43   12   -9   15    9  -25
   46   16    1  -36    0   21
   49    7   43    2   25    9
Вывод матрицы:

       -24        41        28        34         0        19
       -32        44       -22        34        43       -28
       -46         8        44       -34        -7        44
         2        43        29        47       -37        38
   7148288   3216176        -9        15         9       -25
        46        16         1       -36         0        21
        49         7        43         2        25         9
Подскажите, где я не права
m1Rr0r
 Аватар для m1Rr0r
247 / 230 / 15
Регистрация: 05.02.2010
Сообщений: 3,213
Завершенные тесты: 2
22.12.2013, 16:57     Удаление столбцов из динамической матрицы #4
В строке 27-29 матрица удаляется
Цитата Сообщение от Vashtanerada Посмотреть сообщение
for (int i=0; i<n; i++) delete [] matr[i]; delete [] matr;
Матрицы уже нет, и сравнивать не с чем
Цитата Сообщение от Vashtanerada Посмотреть сообщение
if (matr[i][j]!=0); //t-кол-
Так можно удалить строку но не столбец
Цитата Сообщение от Vashtanerada Посмотреть сообщение
matr[0][j]=0; delete [] matr[j];
Предлагаю такой ходе решения:
1)Создали матрицу1, заполнили, показали
2)Подсчитали количество столбцов с нулевыми элементами (t)
3)Создали матрицу2 в которой строк столько же сколько матрице1, а столбцов на t шт. меньше(подсчитали в п.2).
4)Заполнить матрицу2 элементами матрица1, избегая столбцов в которых нулевые есть.
5) Удалили матрицу1, матрицу2
Vashtanerada
1 / 1 / 0
Регистрация: 29.11.2012
Сообщений: 142
22.12.2013, 21:38  [ТС]     Удаление столбцов из динамической матрицы #5
Цитата Сообщение от m1Rr0r Посмотреть сообщение
Предлагаю такой ходе решения:
1)Создали матрицу1, заполнили, показали
2)Подсчитали количество столбцов с нулевыми элементами (t)
3)Создали матрицу2 в которой строк столько же сколько матрице1, а столбцов на t шт. меньше(подсчитали в п.2).
4)Заполнить матрицу2 элементами матрица1, избегая столбцов в которых нулевые есть.
5) Удалили матрицу1, матрицу2
Я изначально так и пыталась сделать, но, не сочтите меня совсем глупой, не знаю как подсчитать кол-во столбцов, содержащих 0. у меня все уходит либо на подсчет элементов, либо на подсчет строк.
Чтобы подсчитать столбцы с нулями, я при встрече 0, j-му элементу в первой строке присваиваю 0.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int s=0, schet=0;
int **matr2;
matr2=new int * [t];
for (i=0; i<n; i++)
{
  for (j=0; j<m; j++)
   {
     if (matr[i][j]==0) 
       {
         matr[0][j]=0; 
       }
   }     
}
t=m;
for (j=0; j<m; j++)
{
if (matr[0][j]==0) t--; //Г±Г·ГЁГІГ*ГҐГ¬ êîë-ГўГ® ñòîëáöîâ Гў Г*îâîé Г¬Г*òðèöå
}
И у меня появилась идея все элементы в этом столбце заменить нулями и при записи во вторую матрицу с t столбцами пропускать нули, но пока не совсем понимаю, как сделать все нули в столбце.
Как думаете, такая идея имеет право на существование?

Добавлено через 1 минуту
Здесь я считаю количество столбцов, в новой матрице считаю по нулям в первой строке исходной матрицы.
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
22.12.2013, 22:14     Удаление столбцов из динамической матрицы #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
//Вставка строки в матрицу
// матрица a[i][j],  i<n,  j<m  ( n строк, m столбцов ) 
// вставить новую строку на k-ю позицию 0 <= k <= n 
// ( т.к. значения a и n будут изменены, то используются ссылки )
void insert( int** & a, int & n, int m, int k )
{
    if( ! a ) return; 
    if( k < 0 || k > n ) return;
 
    int** b = new int*[n+1]; 
 
    // строки a[0], a[1], ..., a[k-1] не меняются 
    for( int i = 0; i < k; ++i ) 
        b[i] = a[i];
 
    // строки a[k], ..., a[n-1] сдвигаются на 1 позицию вниз 
    for( int i = k; i < n; ++i )
    {
        b[i+1] = a[i];
    }
 
    // на k-м месте новая строка 
    b[k] = new int[m];
 
    // старые значения a[] теперь не нужны 
    delete[] a;
 
    a = b;
 
    // т.к. добавили одну строку, теперь число строк n+1
    ++n;
 
    // новую строку заполним нулями 
    for( int j = 0; j < m; ++j )
    {
        b[k][j] = 0;
    }
 
    return;
}
m1Rr0r
 Аватар для m1Rr0r
247 / 230 / 15
Регистрация: 05.02.2010
Сообщений: 3,213
Завершенные тесты: 2
23.12.2013, 00:41     Удаление столбцов из динамической матрицы #7
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
#include <iostream>
#include <time.h>
using namespace std;
 
int main()
{
    srand((unsigned)time(NULL));
    setlocale(LC_ALL, "Russian");
    int m, n, count = 0;
    cout << "Введите кол-во строк: ";
    cin >> n;
    cout << "Введите кол-во столбцов: ";
    cin >> m;
    int ** matr = new int * [n];
    for (int i = 0; i < n; i++)
        matr[i] = new int [m];
 
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            matr[i][j] = rand()%10-7;
            cout << matr[i][j] << ((j < m - 1) ? "\t" : "");
        }
        cout << endl;
    }
    //Ищем ненужные столбцы
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
            //Нашли нулевой элемент в столбце
            if(matr[j][i] == 0)
            {
                //Зануляем весь столбец
                for(int k = 0; k < n; k++)
                    matr[k][i] = 0;
                //Увеличим счетчик ненужных столбцев
                count++;
                //Переходим к след. столбцу
                break;
            }
    }
    //Если количество столбцев для удаления совпадает с текущим количеством столбцев в матрице - выход
    if(count == m)
        goto end;
    //
    int * temp;
    int k = 0;
 
    for(int i = 0; i < n; i++)
    {
        //Выделяем память под строку короче на количество удаляемых столбцев
        temp = new int[m - count];
        //Копируем только не нулевые
        for(int j = 0; j < m; j++)
            if(matr[i][j] != 0)
                temp[k++] = matr[i][j];
        k = 0;
        //Удаялем всю строку
        delete []matr[i];
        //Сохраняем строку покороче но уже без лишних элементов
        matr[i] = temp;
    }
 
    //Размерность столбцев матрицы уменьшим на количество удаленных
    m -= count;
    
    cout << endl << endl;
    //Распечатаем что получилось
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
            cout << matr[i][j] << ((j < m - 1) ? "\t" : "");
        cout << endl;
    }
end:
    //Инквизиция памяти
    for (int i = 0; i < n; i++)
        delete []matr[i];
    delete []matr;
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.09.2014, 17:44     Удаление столбцов из динамической матрицы
Еще ссылки по теме:

C++ Дописать код о удаление строк и столбцов с матрицы
C++ Удаление динамической памяти
Сдвиг стоки вниз и Удаление столбцов Матрицы C++

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

Или воспользуйтесь поиском по форуму:
SmittWesson
 Аватар для SmittWesson
120 / 169 / 17
Регистрация: 04.06.2014
Сообщений: 1,273
30.09.2014, 17:44     Удаление столбцов из динамической матрицы #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
typedef unsigned int uint; // Новое имя целочисленного неотрицательного типа
struct index{uint col, row;};// Структура индексов обрабатываемого массива
 
// Удалить строку матрицы
double **DeleteRow(double **A, index &x, uint s)
{
// если строка не последняя, сдвигаем их на место удаляемой
  if(s >= x.row) return A;
    x.row--;
    for(uint i=s; i<x.row; i++)
      for(uint j=0; j<x.col; j++)
        A[i][j] = A[i+1][j];
  delete[] A[x.row];
  return A;
}
 
 
// Удалить столбец матрицы
double **DeleteCol(double **A, index &x, uint c)
{
  if(c >= x.col) return A;
  x.col--;
  double **B = CreateMatrix(x);
  for(uint i=0; i<x.row; i++)
    for(uint j=0; j<x.col; j++)
      if(j < c) B[i][j] = A[i][j];
      else B[i][j] = A[i][j+1];
  DeleteMatrix(A, x);
  return B;
}
Вспомогательные функции
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Создание динамической матрицы
double **CreateMatrix(index x)
{
  double **A = new double *[x.row];
  for(uint i=0; i<x.row; i++) A[i] = new double[x.col];
  return A;
}
 
// Удаление динамической матрицы
  void DeleteMatrix(double **A, index x)
  {
      for(uint i=0; i<x.row; i++) delete[] A[i];
      delete[] A;
  }
Yandex
Объявления
30.09.2014, 17:44     Удаление столбцов из динамической матрицы
Ответ Создать тему
Опции темы

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