С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
MahovIV
5 / 6 / 1
Регистрация: 17.09.2013
Сообщений: 337
#1

Класс для динамических матриц. После ввода элементов матрицы программа аварийно закрывается - C++

15.03.2014, 20:32. Просмотров 445. Ответов 4
Метки нет (Все метки)

В программе я создал класс, отвечающий за ввод и вывод динамической матрицы. Однако после ввода элементов матрицы программа аварийно закрывается. В чём причина?
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
#include <iostream> 
#include <conio.h>
using namespace std;
 class MyClass //Îáúÿâèëè ГЄГ«Г*Г±Г± MyClass
    {
               int **a; // ГіГЄГ*Г§Г*òåëü Г*Г* ГіГЄГ*Г§Г*òåëü Г*Г* ГІГЁГЇ double
 
     int N, M, i, j;
     public:
       void Show() //ÔóГ*êöèÿ ГўГ*óòðè ГЄГ«Г*Г±Г±Г* (ìåòîä ГЄГ«Г*Г±Г±Г*)
         {
          cin >> N >> M;
         }
       MyClass() //ГЉГ®Г*ñòðóêòîð. ГЉГ®Г*ñòðóêòîð ГўГ±ГҐГЈГ¤Г* èìååò ГІГ® æå èìÿ, Г·ГІГ® ГЁ ГЄГ«Г*Г±Г±
         { 
           
a = new int* [N];
                           for(i = 0; i < N; i++)
 
      a[i] = new int[M];
 
                           }
                           void Vvod() {
      for(i = 0; i < N; i++) {
                     for(j = 0; j < M; j++) {
                           cin >> a[i][j];
                           }
                           }
                           }
                           void Vivod() {
                                for(i = 0; i < N; i++) {
                                      for(j = 0; j < M; j++) {
                                            cout << a[i][j] << " ";
                                            }
                                            cout << "\n";
                                            }
                                            }
                           ~MyClass() {
                                      for(i = 0; i < N; i++)
 
       delete []a[i];
   delete []a;
}
   } obj1,obj2; // 2 îáúåêòГ* ГІГЁГЇГ* MyClass
  int main() 
   {
     obj1.Show();
     obj1.Vvod();
     obj1.Vivod();
 
     getch(); //ÎæèäГ*ГҐГ¬ Г*Г*Г¦Г*ГІГЁГҐ Enter
     
    return 0; 
 }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2014, 20:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Класс для динамических матриц. После ввода элементов матрицы программа аварийно закрывается (C++):

Программа закрывается после ввода массива - C++
Доброго времени суток, помогите, пожалуйста, поправить код. Опыт программирования = 0. В visual studio 2013 запускается без ошибок, но...

Программа сразу после ввода закрывается - C++
Ввела код { int buf; int a; int n,i; cin &gt;&gt; n; for (int i=0; i&lt;n; i++) { ...

Почему после ввода переменной программа закрывается? - C++
#include&lt;iostream&gt; using namespace std; int main() { int n, a=10,b, g=1; cin&gt;&gt;n;

Программа компилируется, но после ввода данных просто закрывается - C++
Программа компилируется,но после ввода номера дня она просто закрывается. #include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; ...

После ввода данных программа закрывается, не показав ответ (Dev C++) - C++
Ребят помогите!!!! работаю в dev c++, после ввода суммы просто закрывает командную стоку и ответа не выдает вот код # include...

После ввода первой строки программа дает ошибку и закрывается - C++
#include&lt;iostream&gt; #include&lt;cstring&gt; #include&quot;stdio.h&quot; using namespace std; struct strk{ char *a,*b; int c,d; }el; int...

4
fishec
119 / 119 / 30
Регистрация: 07.09.2013
Сообщений: 338
15.03.2014, 20:52 #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
#include <iostream> 
#include <conio.h>
using namespace std;
class MyClass{
    int **a; // указатель на указатель на тип double
    int N, M;
public:
    MyClass(int x,int y){
        N = x;
        M = y;
        a = new int*[N];
        for (int i = 0; i < N; i++)
            a[i] = new int[M];
    }
    void Vvod() {
        for (int i = 0; i < N; i++) 
            for (int j = 0; j < M; j++) 
                cin >> a[i][j];
    }
    void Vivod() {
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++)
                cout << a[i][j] << " ";
            cout << "\n";
        }
    }
    ~MyClass(){
        for (int i = 0; i < N; i++)
            delete[]a[i];
        delete[]a;
    }
};
 
int main(){
    int N, M;
    cin >> N >> M;
    MyClass obj1(N, M);
    obj1.Vvod();
    obj1.Vivod();
    system("pause");
    return 0;
}
Добавлено через 5 минут
В полях класса не нужны рабочие индексы i и j. Конструктор лучше сделать с двумя параметрами - размерами матрицы.
0
MahovIV
5 / 6 / 1
Регистрация: 17.09.2013
Сообщений: 337
15.03.2014, 20:53  [ТС] #3
А можно ли сделать так, чтобы можно было ввести N и M из класса?

Добавлено через 43 секунды
Задача такая.
Создать класс прямоугольных динамических матриц, переопределить базовые операции над ними (сложение, вычитание, умножение, транспонирование…). Размерность матрицы должна задаваться при создании элемента класса. Резервирование и освобождение памяти регулируется конструктором и деструктором класса. Написать программу, демонстрирующую возможности созданного класса.
0
fishec
119 / 119 / 30
Регистрация: 07.09.2013
Сообщений: 338
15.03.2014, 21:03 #4
Цитата Сообщение от MahovIV Посмотреть сообщение
Размерность матрицы должна задаваться при создании элемента класса.
Так и происходит в строке 37. MyClass obj1(N, M);
А в случае с твоим методом void Show такого не происходит. В задании не требуется, чтобы размер матрицы вводился в методе класса.

Если сильно хочется)) Но вообще так не очень логично делать. И еще, обычно большие реализации методов выносят из интерфейса класса.
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
#include <iostream> 
#include <conio.h>
using namespace std;
class MyMatrix{
    int **a; // указатель на указатель на тип double
    int N, M;
public:
    MyMatrix();
    void Vvod();
    void Vivod();
    ~MyMatrix();
};
 
int main(){
    MyMatrix obj1;
    obj1.Vvod();
    obj1.Vivod();
    system("pause");
    return 0;
}
 
MyMatrix::MyMatrix(){
    cout << "Enter N and M : ";
    cin >> N >> M;
    a = new int*[N];
    for (int i = 0; i < N; i++)
        a[i] = new int[M];
}
void MyMatrix::Vvod() {
    cout << "Enter Matrix: " << endl;
    for (int i = 0; i < N; i++)
    for (int j = 0; j < M; j++)
        cin >> a[i][j];
}
void MyMatrix::Vivod() {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++)
            cout << a[i][j] << " ";
        cout << "\n";
    }
}
MyMatrix::~MyMatrix(){
    for (int i = 0; i < N; i++)
        delete[]a[i];
    delete[]a;
}
0
MahovIV
5 / 6 / 1
Регистрация: 17.09.2013
Сообщений: 337
18.03.2014, 15:52  [ТС] #5
Цитата Сообщение от fishec Посмотреть сообщение
Размерность матрицы должна задаваться при создании элемента класса. Так и происходит в строке 37. MyClass obj1(N, M);
А в случае с твоим методом void Show такого не происходит. В задании не требуется, чтобы размер матрицы вводился в методе класса.
Если сильно хочется)) Но вообще так не очень логично делать. И еще, обычно большие реализации методов выносят из интерфейса класса.
Спасобо. При сложении матриц не отображается правильный результат. Как тут можно исправить?
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
#include <iostream> 
#include <conio.h>
using namespace std;
class MyMatrix{
    int **a, **sum; // ГіГЄГ*Г§Г*òåëü Г*Г* ГіГЄГ*Г§Г*òåëü Г*Г* ГІГЁГЇ double
    int N, M;
public:
    MyMatrix();
    void Vvod();
    void Summa();
    void Null();
    void Vivod();
    ~MyMatrix();
};
 
int main(){
    MyMatrix obj1, obj2;
    obj1.Vvod();
    obj1.Null();
    obj1.Vvod();
    obj1.Vivod();
    obj2.Vvod();
    obj2.Summa();
    obj2.Vivod();
    system("pause");
    return 0;
}
 
MyMatrix::MyMatrix(){
    cout << "Enter N and M : ";
    cin >> N >> M;
    a = new int*[N];
    for (int i = 0; i < N; i++)
        a[i] = new int[M];
        sum = new int*[N];
        for(int i = 0; i < N; i++) {
              sum[i] = new int[M];
              }
              }
void MyMatrix::Vvod() {
    cout << "Enter Matrix: " << endl;
    for (int i = 0; i < N; i++)
    for (int j = 0; j < M; j++)
        cin >> a[i][j];
            
}
void MyMatrix::Vivod() {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++)
            cout << a[i][j] << " ";
        cout << "\n";
    }
    for(int i = 0; i < N; i++) {
                for(int j = 0; j < M; j++) {
                 sum[i][j] = sum[i][j] +  a[i][j];
                 }
                 }  
    for(int i = 0; i < N; i++) {
             for(int j = 0; j < M; j++) {
                     cout << sum[i][j] << " ";
                     }
                     cout << "\n";
                     }
}
void MyMatrix::Summa() {
     for(int i = 0; i < N; i++) {
                                      for(int j = 0; j < M; j++) {
                                              sum[i][j] = sum[i][j] + a[i][j];
                                              }
                                              }
                     }
                     void MyMatrix::Null() {
                                      for(int i = 0; i < N; i++) {
                                              for(int j = 0; j < N; j++) {
                                                      sum[i][j] = 0;
                                                      }
                                                      }
                                                      }
MyMatrix::~MyMatrix(){
    for (int i = 0; i < N; i++)
        delete[]a[i];
    delete[]a;
    for(int i = 0; i < N; i++) {
            delete[]sum[i];
            }
            delete[]sum;
}
0
18.03.2014, 15:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2014, 15:52
Привет! Вот еще темы с ответами:

Программа для поиска седловых точек матрицы перестала работать после добавления функции ввода - C++
есть программа для на поиска седловых точек матрицы (Максимальный элемент в рядке и максимальный в столбце одновременно), после ввода...

Программа аварийно завершается после оператора scanf - C++
Такая проблема. Я начинающий. Занимаюсь уже вторую неделю. Написал такой код, запускаю программа. Все хорошо, но стоит дойти программе до...

Класс "Матрица" для нахождения суммы, разности, умножения матриц и суммы элементов матрицы. - C++
Всем привет. Вы могли бы протестировать работу на предмет ошибок, и если нетрудно указать места, где можно было бы написать код как-то...

Программа закрывается после первой команды - C++
Например, вводим -h, программа выдает справку и завершает свою работу. Как нужно сделать, чтобы она закрывалась только после введения -q?...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.