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

Класс "Матрица" - C++

Восстановить пароль Регистрация
 
ArhiDeuZ
0 / 0 / 0
Регистрация: 14.05.2014
Сообщений: 6
18.05.2014, 23:29     Класс "Матрица" #1
Задача: Описать тип-объект MATRIX (матрица произвольной размерности M*N) и его методы: ввод матрицы; вывод матрицы; дублирование столбцов матрицы, где каждый элемент содержит только неповторяющиеся цифры. Описать тип и методы его потомка MATR (методы: дублирование строк матрицы, где количество нулей среди цифр всех чисел строки равно номеру строки; дублирование столбцов матрицы, где все элементы повторяются одинаковое количество раз ).

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
#include "stdafx.h"
#include <stdlib.h>
#include <iomanip>
#include <cstdlib>
#include <iostream>
using namespace std;
 
class Matrix {
public:
int m,n;
int a[20][20];
Matrix ( );// конструктор
~Matrix ( );// деструктор
void Enter ();
void Display ();
void Dubl ();
};
 
Matrix:: Matrix ( )
{
cout << "Vvod v matrix \n";
cout << "Vvedite kolvo strok: ";
cin >> m;
cout << "Vvedite kolvo stolbcov: ";
cin >> n;
}
 
Matrix:: ~Matrix()
{
//cout << "Deleted...\n";
}
void Matrix :: Enter ( )
{
  int i;
  int j;
  for (i=1; i<=m; i++) 
  {
    for (j=1; j<=n;j++) 
    {
       cout << "Vvod chisel v matricu: " << "a["<<i<<"]["<<j<<"]:" ;
       cin >> a[i][j];
    }
  }
   cout <<"\n";
};
 
void Matrix :: Display ()
{
  int i;
  int j;
  int l=0;
  for (i=1; i<=m; i++)
  {
    for (j=1; j<=n; j++)
    {
       cout << a[i][j] << " ";
    }
    cout << "\n";
  }
  cout << "\n";
  cin >> l;
};
void Matrix :: Dubl ( ) 
{
  int i = 0;
  int j = 0;
  int k = 0;
  int x = 0;
  for (j=1; j<=n;j++) 
  {
    for (i=1;i<=m;i++) 
    {
       k=i;
       for (i=1;i<=m;i++)
       {
           if (a[k][j]!=a[i+1][j])
           {
             x=x+1;
           }
       }
    }
    if (x>=i-1)
    {
     n=n+1;
     for(i=1;i<=m;i++)
      {
        a[i][n+1]=a[i][j];
      }
    }
  }
};
class Matr : public Matrix 
{
public:
    int z;
    int i;
    int j;
void Dubl2 ( );
};
 
void Matr :: Dubl2 () 
{
    for (i=1;i<=m;i++) 
    {
        while (j<n) 
        {
            for (j=1;j<=n+1;j++) 
            {
                if (a[i][j]=0) 
                {
                  z=z+1;
                }
            }
            if (z==i) {
                m+=1;
                for (j=1; j<=n;j++) 
                   {
                      a[m+1][j]=a[i][j];
                   }
            }
              
        }
 
    }
};
 
int prompt_menu_item()
{
    // Выбранный вариант менюж
    int variant;
    cout << "VblBerite variant\n" << endl;
    cout << "1. Vvesti Massiv\n"
         << "2. Vblvesti massiv\n"
         << "3. Dublirovanie stolbcov\n"
         << "4. отсортировать\n"
         << "5. найти среднее кол-во элементов\n"
         << "6. дополнить таблицу\n"
         << "7. выйти\n" << endl;
    cout << ">>> ";
    cin >> variant;
    return variant;
};
 
int main ()
{
    Matrix ob;
    Matr ob2;
    ob.Enter ();
    ob.Display();
    ob.Dubl ();
    ob.Display();
    ob2.Dubl2();
    ob.Display();
};
Метод Display не выводит изменения после метода Dubl и Dubl2

Добавлено через 20 минут
помогите проверить Matrix :: Dubl() и Matrix :: Display () - вывод информации на экран. Приложение консольное
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
19.05.2014, 00:08     Класс "Матрица" #2
ArhiDeuZ, я не знаю как вы там дублируете, но явно выходите за границы массива.
Да и ввод некорректный. Вы ничего не записываете в нулевой индекс массива. Замените сначала цикл ввода:
C++
1
2
3
4
5
6
7
8
for(int i = 0; i < m; i++) 
{
    for(int j = 0; j < n; j++) 
    {
       cout << "Vvod chisel v matricu: " << "a["<<i<<"]["<<j<<"]:" ;
       cin >> a[i][j];
    }
}
Таким образом меняйте всё остальное. Не увеличивайте размер m и n. Будет выход за границу массива.
Программа зависнет.
ArhiDeuZ
0 / 0 / 0
Регистрация: 14.05.2014
Сообщений: 6
19.05.2014, 00:28  [ТС]     Класс "Матрица" #3
поменял, изменений никаких. Недавно получил ошибку на ob.Display Необработанное исключение в "0x772e15de" в "laba2.exe": 0xC0000005: Нарушение прав доступа при чтении "0x003c0000". я так и не понял что за ошибка, почему то перестало работать
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
19.05.2014, 00:43     Класс "Матрица" #4
ArhiDeuZ, вы вышли за границы массива.
Грубо говоря, пытались прочитать содержимое незарезервированной ячейки.

Кликните здесь для просмотра всего текста
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
#include "stdafx.h"
#include <stdlib.h>
#include <iomanip>
#include <cstdlib>
#include <iostream>
using namespace std;
 
class Matrix {
public:
int m,n;
int a[20][20];
Matrix:: Matrix ( ){}
~Matrix ( ){}// äåñòðóêòîð
void Enter ();
void Display ();
void Dubl ();
};
 
void Matrix :: Enter ( )
{
  cout << "Vvod v matrix \n";
  cout << "Vvedite kolvo strok: ";
  cin >> m;
  cout << "Vvedite kolvo stolbcov: ";
  cin >> n;
  int i;
  int j;
  for (i=0; i<m; i++) 
  {
    for (j=0; j<n;j++) 
    {
       cout << "Vvod chisel v matricu: " << "a["<<i<<"]["<<j<<"]:" ;
       cin >> a[i][j];
    }
  }
   cout <<"\n";
};
 
void Matrix :: Display ()
{
  int i;
  int j;
  int l=0;
  for (i=0; i<m; i++)
  {
    for (j=0; j<n; j++)
    {
       cout << a[i][j] << " ";
    }
    cout << "\n";
  }
  cout << "\n";
};
void Matrix :: Dubl ( ) 
{
  int i = 0;
  int j = 0;
  int k = 0;
  int x = 0;
  for (; j<n;j++) 
  {
    for (;i<m;i++) 
    {
       k=i;
       for (;i<m;i++)
       {
           if (a[k][j]!=a[i][j])
           {
             x=x+1;
           }
       }
    }
    if (x>=i-1)
    {
     for(i=0;i<m;i++)
      {
        a[i][n]=a[i][j];
      }
    }
  }
};
class Matr : public Matrix 
{
public:
    int z;
    int i;
    int j;
void Dubl2 ( );
};
 
void Matr :: Dubl2 () 
{
    for (i=0;i<m;i++) 
    {
        while (j<n) 
        {
            for (j=0;j<n;j++) 
            {
                if (a[i][j]=0) 
                {
                  z=z+1;
                }
            }
            if (z==i) {
                for (j=0; j<n;j++) 
                   {
                      a[m][j]=a[i][j];
                   }
            }
              
        }
 
    }
};
 
 
int main()
{
    Matrix ob;
    Matr ob2;
    ob.Enter ();
    ob.Display();
    ob.Dubl ();
    ob.Display();
    ob2.Dubl2();
    ob.Display();
    system("pause");
    return 0;
}

Вот так просто печатает, вы измените логику функций дублирования и.т.д.
Повторюсь, не увеличивайте размер m и n после инициализации.
ArhiDeuZ
0 / 0 / 0
Регистрация: 14.05.2014
Сообщений: 6
19.05.2014, 00:51  [ТС]     Класс "Матрица" #5
Проблему с ob.Display решил. Не работает видимо Dubl

Добавлено через 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
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
#include "stdafx.h"
//#include <stdlib.h>
//#include <iomanip>
//#include <cstdlib>
#include <iostream>
using namespace std;
 
class Matrix {
public:
int m,n;
int a[100][100];
Matrix ( );// конструктор
~Matrix ( );// деструктор
void Enter ();
void Display ();
void Dubl ();
};
 
Matrix:: Matrix ( )
{
cout << "Vvod v matrix \n";
cout << "Vvedite kolvo strok: ";
cin >> m;
cout << "Vvedite kolvo stolbcov: ";
cin >> n;
}
 
Matrix:: ~Matrix()
{
cout << "Deleted...\n";
}
void Matrix :: Enter ( )
{
  int i;
  int j;
  for (i=0; i<m; i++) 
  {
    for (j=0; j<n;j++) 
    {
       cout << "Vvod chisel v matricu: " << "a["<<i<<"]["<<j<<"]:" ;
       cin >> a[i][j];
    }
  }
   cout <<"\n";
};
 
void Matrix :: Display ()
{
  int i;
  int j;
  int l=0;
  for (i=0; i<m; i++)
  {
    for (j=0; j<n; j++)
    {
       cout << a[i][j] << " ";
    }
    cout << "\n";
  }
  cout << "\n";
  cin >> l;
};
void Matrix :: Dubl ( ) 
{
  int i = 0;
  int j = 0;
  int k = 0;
  int x = 0;
  int p = 0;
  int b = 0;
  for (j=0; j<n;j++) 
  {
    for (i=0;i<m;i++) 
    {
       k=i;
       p=i;
       for (p=0;p<m;p++)
       {
           if (a[k][j]!=a[p+1][j])
           {
             x=x+1;
           }
       }
    }
    if (x >= i-1)
    {
     for(b=0;b<m;b++)
      {
        a[b][n+1]=a[b][j];
      }
    }
  }
};
class Matr : public Matrix 
{
public:
    int z;
    int i;
    int j;
void Dubl2 ( );
};
 
void Matr :: Dubl2 () 
{
    for (i=0;i<m;i++) 
    {
        while (j<n) 
        {
            for (j=0;j<n+1;j++) 
            {
                if (a[i][j]=0) 
                {
                  z=z+1;
                }
            }
            if (z==i) {
                m+=1;
                for (j=0; j<n;j++) 
                   {
                      a[m+1][j]=a[i][j];
                   }
            }
              
        }
 
    }
};
 
int prompt_menu_item()
{
    // Выбранный вариант менюж
    int variant;
    cout << "VblBerite variant\n" << endl;
    cout << "1. Vvesti Massiv\n"
         << "2. Vblvesti massiv\n"
         << "3. Dublirovanie stolbcov\n"
         << "4. отсортировать\n"
         << "5. найти среднее кол-во элементов\n"
         << "6. дополнить таблицу\n"
         << "7. выйти\n" << endl;
    cout << ">>> ";
    cin >> variant;
    return variant;
};
 
int main ()
{
    Matrix ob;
    Matr ob2;
    ob.Enter ();
    ob.Display();
    ob.Dubl ();
    ob.Display();
};

немного доработанный код, но также не работает Dubl и соответственно Dubl2
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
19.05.2014, 00:58     Класс "Матрица" #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
void Matrix :: Dubl ( ) 
{
  int i = 0;
  int j = 0;
  int k = 0;
  int x = 0;
  int p = 0;
  int b = 0;
  for (j=0; j<n;j++) 
  {
    for (i=0;i<m;i++) 
    {
       k=i;
       p=i;
       for (p=0;p<m;p++)
       {
           if (a[k][j]!=a[p+1][j]) //Будет выход за границу массива. Допустим вы ввели m = 5 n = 4.
           {                            //Когда цикл дойдёт до p = 4, a[p+1][j] - a[5][j] это уже выход за границу т.к.
             x=x+1;                  //p должно быть меньше m.
           }
       }
    }
    if (x >= i-1)
    {
     for(b=0;b<m;b++)
      {
        a[b][n+1]=a[b][j]; //То же самое...
      }
    }
  }
};
ArhiDeuZ
0 / 0 / 0
Регистрация: 14.05.2014
Сообщений: 6
19.05.2014, 01:22  [ТС]     Класс "Матрица" #7
Помогите доработать, не пойму никак что сделать необходимо, исправил как вы сказали. Теперь дублирует, но идет замена 1 строки, а не добавление столбца.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.05.2014, 02:14     Класс "Матрица"
Еще ссылки по теме:

Шаблоны С++. Класс "Квадратная матрица" C++
C++ Класс "Матрица" с шаблоном
C++ Класс "Матрица": ввод/вывод, умножение, сложение/вычитание, транспонирование, сдвиг

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

Или воспользуйтесь поиском по форуму:
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
19.05.2014, 02:14     Класс "Матрица" #8
ArhiDeuZ, вы хотите добавить столбец к массиву? Т. е. увеличить его размер?
У вас не получится или создайте новый массив с другими размерами или используйте vector.
Yandex
Объявления
19.05.2014, 02:14     Класс "Матрица"
Ответ Создать тему
Опции темы

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