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

Удаление столбцов из матрицы содержащих число 1 - C++

Восстановить пароль Регистрация
 
mishe4ka
0 / 0 / 0
Регистрация: 21.09.2011
Сообщений: 21
30.01.2012, 18:14     Удаление столбцов из матрицы содержащих число 1 #1
дана матрица необходимо удалить столбцы содержащие 1.
Хелп плиз(( где то рядом но....

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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include<iostream>
#include<iomanip>
#include<cstdlib>
#include<cstddef>
using namespace std;
/////////////////////////////////////////////
//void deleteone(int n,int m,int one);
void outputm(double** a,int n,int m);
double** inputm(int n,int m);
double** udal(double** a,int n,int m,int &r);
 
///////////////////////////////////////////////
void deleteone(double** a,int n, int m, int one)
{
        int i,j;
        cout<<"Udalen stolb: "<<one<<endl;
        for(j=one; j<m-1; j++)
        {
           for(i=0; i<n; i++)
           {
                        a[i][j]=a[i][j+1];
           }
        }
}
// vvod matrici
double** inputm(int n,int m)
{
    int i,j;
    double** a;
    a=new double*[n];
    if(a==NULL)
    {cout<<endl;
                 exit(1);
    }
 
    for(i=0;i<n;i++)
    {
        a[i]=new double[m];
        if(a[i]==NULL)
        {
            cout<<"net op";
        }
    }
    //vvod matrici
    for(i=0;i<n;i++)
    {
        cout<<"\nVvesti "<<i<<"stroky"<<endl;
        for(j=0;j<m;j++)
            cin>>a[i][j];
    }
    return a;
}
//////////////////////////////////////////////////
//vivod matrici
void outputm(double** a,int n,int m)
{
    int i,j;
    
    for(i=0;i<n;i++)
    {
        cout<<endl;
        for(j=0;j<m;j++)
            cout<<setw(10)<<a[i][j];
    }
}
 
/////////////////////////////////////////////////////////////////
 
//iskluchenie stolbcov s chislom 1
double** udal(double** a,int n,int m,int &r)
{
    int i,j;
    double** b;
    bool  isOne;
 
 
    b=new double*[n];
    if(b==NULL)
    {cout<<endl;
                 exit(1);
    }
 
    for(i=0;i<n;i++)
    {
        b[i]=new double[m];
        if(b[i]==NULL)
        {
            cout<<"net op";
        }
    }
    //kopiryem matr a v matr b
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            b[i][j]=a[i][j];
          
        }
    }   
    /////////////////////////////////////////////////////////////////
  for(j=0; j<m; j++)      // Удаление столбцов
        
  {
      isOne=true;
           for(i=0; i<n; i++)
           
                        if (b[i][j] != 1)
                        {
                                isOne=false;
                                break;
                        }
           
           if(isOne)
           {
             int  one=j;
             cout<<"Udalen stolb: "<<one<<endl;
             r=m-1;
              for(j=one; j<r; j++)
              {
                for(i=0; i<n; i++)
                    {
                        b[i][j]=b[i][j+1];
                       
                     }
              }
           }
  }
 
 
 return b;
    
}
 
 
/////////////////////////////////////////////////////////////////////
void main()
{
    int n,m,r;
    double** matr;
    double** b;
    cout<<"\nVvedite chislo strok\n";
    cin>>n;
    cout<<"\nVvedite chislo stolbcov\n";
    cin>>m;
    cout<<"\nVvesti cherez probel koordinati massiva matr\n";
    matr=inputm(n,m);
 
    cout<<"\nVivod massiva\n";
    outputm(matr,n,m);
    cout<<"\n yplotnenai matrica\n";
    b=udal(matr,n,m,r);
    outputm(b,n,r);
    
 
 
 
    cout<<endl;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.01.2012, 18:14     Удаление столбцов из матрицы содержащих число 1
Посмотрите здесь:

C++ Определить количество столбцов матрицы, содержащих хотя бы один нулевой элемент
определить номера столбцов содержащих только отрицательные элементы матрицы n x m C++
Найти номер первого из столбцов матрицы, не содержащих ни одного отрицательного элемента. C++
C++ Преобразовать программу, которая выводит количество столбцов матрицы не содержащих 0
Элементы столбцов матрицы, не содержащих положительных элементов, заменить суммой их цифр C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
30.01.2012, 18:22     Удаление столбцов из матрицы содержащих число 1 #2
Цитата Сообщение от mishe4ka Посмотреть сообщение
необходимо удалить
А что Вы понимаете под удалением столбцов? В Си/С++ нельзя так просто взять и удалить. Можно создать новый массив и скопировать туда все значения. Можно затереть столбцы с единицами другими столбцами. Можно много еще чего. Так что именно Вам нужно?
mishe4ka
0 / 0 / 0
Регистрация: 21.09.2011
Сообщений: 21
30.01.2012, 20:33  [ТС]     Удаление столбцов из матрицы содержащих число 1 #3
Сформировать матрицу В, исключив из матрицы А столбцы,содержащие элементы, равные 1.
Сформировать массив D номеров столбцов матрицы содержащей элементы, равные 1.
Матрица динамическая. Далее буду реализовывать в однодокументном приложении
Roof
 Аватар для Roof
154 / 154 / 10
Регистрация: 03.11.2010
Сообщений: 393
01.02.2012, 07:10     Удаление столбцов из матрицы содержащих число 1 #4
Для динамических структур лучше использовать контейнеры stl, но если нужны именно массивы, то вот мой вариант:
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <iomanip>
using namespace std;
 
typedef const size_t cst;
typedef unsigned ui;
 
// создание двухмерного динамического массива
ui** create_array_2d( cst, cst );
// удаление двухмерного динамического массива
void free_array_2d( ui**, cst );
// заполнение двухмерного массива псевдослучайными целочисленными значениями
void fill_rand_array_2d( ui**, cst, cst );
// вывод двухмерного массива на экран
void print_array_2d( ui**, cst, cst );
// вывод одномерного массива на экран
void print_array_1d( ui*, cst );
// формирование массива индексов столбцов другого массива, в которых содержаться элементы равные 1
ui* generate_array_num_cols( ui**, cst, cst );
// формирование массива из столбцов другого массива, в которых отсутствуют элементы, равные 1
ui** generate_array_scheme( ui**, ui*, cst, cst, cst );
 
int main() {
    srand( time( NULL ) );
 
    size_t rows, a_cols, b_cols, d_size = 0;
    ui **a, **b;
    ui *d;
 
    // вводим исходные данные для массива a
    cout << "Введите количество строк и количество столбцов через пробел"
            << endl;
    cin >> rows >> a_cols;
 
    a = create_array_2d( rows, a_cols ); //создаем массив a
    fill_rand_array_2d( a, rows, a_cols ); // заполняем массив a
    d = generate_array_num_cols( a, rows, a_cols ); // генерируем массив d
    d_size = d[ -1 ]; //узнаем размер массива d, если больше нуля, то массив сгенерирован
    b_cols = a_cols - d_size; // считаем размер массива b
 
    // выводим на экран массив a
    cout << "Исходный массив A:" << endl;
    print_array_2d( a, rows, a_cols );
 
    // если размер массива b больше нуля, то генерируем его
    if ( b_cols ) {
        b = generate_array_scheme( a, d, rows, a_cols, b_cols );
 
        // выводим на экран массив b
        cout
                << "Новый массив B - столбцы массива A, в которых отсутствуют элементы равные 1:"
                << endl;
        print_array_2d( b, rows, b_cols );
 
        // освобождаем память от массива b
        free_array_2d( b, rows );
    }
    //  если размер массива b равен нулю, то выводим на экран сообщение
    else
        cout
                << "Массив B пустой, так как в каждом столбце массива A содержаться элементы равные 1"
                << endl;
 
 
 
    // если размер массива d больше нуля, то выводим его на экран
    if ( d_size ) {
        cout
                << "Новый массив D - индексы столбцов массива A, в которых содержаться элементы равные 1:"
                << endl;
        print_array_1d( d, d_size );
 
        // освобождаем память от массива d
        delete[] --d;
 
    } else
        cout
                << "Массив D пустой, так как массив A на содержит элементов равных 1"
                << endl;
 
 
    // // освобождаем память от массива a
    free_array_2d( a, rows );
 
    return 0;
}
 
ui** create_array_2d( cst dimm1, cst dimm2 ) {
    ui** temp_arr = new ui*[ dimm1 ];
 
    for ( size_t i = 0; i != dimm1; ++i )
        temp_arr[ i ] = new ui[ dimm2 ];
 
    return temp_arr;
}
 
void free_array_2d( ui** arr, cst dimm ) {
    for ( size_t i = 0; i < dimm; i++ )
        delete[] arr[ i ];
    delete[] arr;
 
}
 
void fill_rand_array_2d( ui** arr, cst dimm1, cst dimm2 ) {
    for ( size_t i = 0; i != dimm1; ++i )
        for ( size_t j = 0; j != dimm2; ++j )
            arr[ i ][ j ] = rand() % 11; //[ 0..10 ]
}
 
void print_array_2d( ui** arr, cst dimm1, cst dimm2 ) {
    for ( size_t i = 0; i != dimm1; ++i ) {
        for ( size_t j = 0; j != dimm2; ++j )
            cout << setw( 3 ) << arr[ i ][ j ];
        cout << endl;
    }
}
 
void print_array_1d( ui* arr, cst dimm ) {
    for ( size_t i = 0; i != dimm; ++i )
        cout << setw( 3 ) << arr[ i ];
    cout << endl;
}
 
ui* generate_array_num_cols( ui** src_arr, cst dimm1, cst dimm2 ) {
    size_t temp_dimm = 0;
    ui *temp_arr = new ui[ dimm2 ], *dest_arr;
 
    for ( size_t j = 0; j != dimm2; ++j )
        for ( size_t i = 0; i != dimm1; ++i )
            if ( src_arr[ i ][ j ] == 1 ) {
                temp_arr[ temp_dimm ] = j;
                ++temp_dimm;
                break;
            }
 
    if ( temp_dimm ) {
        dest_arr = new ui[ temp_dimm + 1 ];
        dest_arr[ 0 ] = temp_dimm; // тут храним размер массива
        for ( size_t i = 1; i <= temp_dimm; ++i )
            dest_arr[ i ] = temp_arr[ i - 1 ];
    }
 
    delete[] temp_arr;
 
    return ++dest_arr;
}
 
ui** generate_array_scheme( ui** src_arr, ui* arr_nums, cst dimm1, cst dimm2,
        cst dimm_dest_cols ) {
    ui** dest_arr = create_array_2d( dimm1, dimm_dest_cols );
    size_t temp_dimm = dimm2 - dimm_dest_cols, ind = 0;
    bool flag;
 
    for ( size_t j = 0; j != dimm2; ++j ) {
        flag = false;
        for ( size_t i = 0; i != dimm1; ++i ) {
            for ( size_t k = 0; k != temp_dimm; ++k )
 
                if ( arr_nums[ k ] == j ) {
                    flag = true;
                    ++ind;
                    break;
                }
 
            if ( flag )
                break;
            else
                dest_arr[ i ][ j - ind ] = src_arr[ i ][ j ];
        }
    }
    return dest_arr;
}
Консоль
Введите количество строк и количество столбцов через пробел
3 6
Исходный массив A:
8 1 7 1 9 6
2 10 9 1 6 0
7 3 9 5 5 7
Новый массив B - столбцы массива A, в которых отсутствуют элементы равные 1:
8 7 9 6
2 9 6 0
7 9 5 7
Новый массив D - индексы столбцов массива A, в которых содержаться элементы равные 1:
1 3
Yandex
Объявления
01.02.2012, 07:10     Удаление столбцов из матрицы содержащих число 1
Ответ Создать тему
Опции темы

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