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

Программа для решения СЛАУ - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Fedor N
 Аватар для Fedor N
0 / 0 / 0
Регистрация: 22.06.2012
Сообщений: 17
22.06.2012, 13:39     Программа для решения СЛАУ #1
Здравствуйте,в общем, моя программа решает СЛАУ матричным методом, на основе библиотеки Matrixclass, программа вылетает из-за привышения размера матрицы. И я не могу понять, где ошибка!? Помогите, пожалуйста! В приложенном файле Main, библиотека Matrixclass.h, exe.

Matrixclass.h
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
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
#include <iostream>
#include <stdlib.h>
#include <conio.h>
 
using namespace std;
 
enum ElemStatus {minimal=-5000, maximal};
enum Action {sum=-6000, prod};
enum ConvertType{row, column};
class Matrix
{
    private:
        // Размеры массива
        unsigned xsize, ysize;
        // Указатель на начало массива в динамической памяти
        double *Array;
      // Флаг временности
      int temporary;
    public:
        // Возвратить размеры матрицы
        unsigned getxsize(void) {return xsize;}
        unsigned getysize(void) {return ysize;}
        void inversion(Matrix &, unsigned);
        // конструктор, заполняет матрицу
        Matrix(unsigned y , unsigned x );
        Matrix(unsigned y , unsigned x , double v );
        // конструктор копирования
        Matrix(Matrix &);
      // Конструктор "скалярной матрицы" xsize=ysize=1
        Matrix(double v);
        // деструктор, вывод "!" для отслеживания вызовов
        //~Matrix(){delete []Array; cout << "!";}
        // "Примитивный" вывод
        void show(void);
      // Последовательный доступ к элементу
      double & operator()(unsigned n) const;
       Matrix & operator*(Matrix& M);
       Matrix & operator()(unsigned n, unsigned v)
       {
           Array[n]=v;
       }
};
 
Matrix::Matrix(unsigned y, unsigned x)
{
    unsigned asize = x*y;
    double v;
    Array = new double[asize];
    xsize = x;
    ysize = y;
   temporary = 0;
    for(unsigned i = 0; i<asize; i++) {
                                  cout<<"Enter "<< i+1 <<" elemet ";
                                  cin>>v;
                                  Array[i] = v;
                                  }
}
 
void inversion(Matrix &A, unsigned N)
{
    unsigned temp;
    unsigned p[2];
 
    double **E = new double *[N];
 
    for (int i = 0; i < N; i++)
        E[i] = new double [N];
 
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
        {
            E[i][j] = 0.0;
 
            if (i == j)
                E[i][j] = 1.0;
        }
 
    for (unsigned k = 0; k < N; k++)
    {
        temp = A(k+k);
 
        for (unsigned j = 0; j < N; j++)
        {
            //A.Array[k*j] /= temp;
          A((k*N+j),(A(k*j)/ temp));
            E[k][j] /= temp;
        }
 
        for (unsigned i = k + 1; i < N; i++)
        {
            temp = A(k*i);
 
            for (unsigned j = 0; j < N; j++)
            {
               // A.Array[i*j] -= A(k*j)* temp;
                A((i*N+j),(A(i*j)-(A(k*j)* temp)));
                E[i][j] -= E[k][j] * temp;
            }
        }
    }
 
    for (unsigned k = N - 1; k > 0; k--)
    {
        for (unsigned i = k - 1; i >= 0; i--)
        {
            temp = A(k*i);
 
            for (unsigned j = 0; j < N; j++)
            {
              // A.Array[i*j] -= A(k*j) * temp;
              A((i*N+j),(A(i*j)-(A(k*j)* temp)));
                E[i][j] -= E[k][j] * temp;
            }
        }
    }
 
    for (unsigned i = 0; i < N; i++)
        for (unsigned j = 0; j < N; j++)
         //  A.Array[i*j] = E[i][j];
         {
      A((i*j),E[i][j]);
         }
 
    for (int i = 0; i < N; i++)
        delete [] E[i];
 
    delete [] E;
}
 
Matrix::Matrix(Matrix & M)
{
    xsize = M.xsize;
    ysize = M.ysize;
    unsigned asize = xsize*ysize;
    Array = new double[asize];
            // вычисляем определитель раскладывая по нулевой строке
            for(int k=0; k<asize; k++)
            {
                // заполняем вспомогательную матрицу
                // строки берем из основной матрицы все кроме нулевой
                // столбцы все кроме k-го
                for (unsigned i=0; i<asize-1; i++)
                    for(unsigned j=0; j<asize-1; j++)
                    {
                        if(j<k)
Array[i*j]=M(j*(i+1));
                        else Array[i*j]=M((i+1)*(j+1));
                    };
   temporary = 0;
    if (M.temporary) delete &M;
}
}
 
Matrix::Matrix( double v)
{
    xsize = ysize = 1;
   Array = new double;
    *Array = v;
   temporary = 0;
}
 
void Matrix::show(void)
{
    cout << '\n';
    for (int i = 0; i<ysize; i++)
   {
        for (int j = 0; j<xsize; j++)
                cout << Array[i*xsize+j]<< '\t';
        cout << '\n';
   }
    if (temporary) delete this;
}
double & Matrix::operator()(unsigned n) const
{
    if (n > xsize*ysize)
   {
       cerr << "Index exceeds matrix dimensions!";
       exit(1);
   }
    if (temporary)
   {
       cerr << "Operation is not allowed!";
       exit(1);
   }
    return Array[n-1];
}
 Matrix & Matrix::operator*(Matrix& M)
 {
  // double a;
   if(ysize==M.xsize)
   //реализация алгоритма перемножения матриц
      for(int i=0;i<ysize;i++)
         for(int j=0;j<M.xsize;j++)
            for(int k=0;k<ysize;k++)
               M(i*j) += Array[i*k]*M(k*j);
   else cout<<"Размерности матриц не верны"<<endl;
   return M ;
 
}
 
Matrix::Matrix(unsigned y, unsigned x, double v)
{
   temporary = 0;
     Array[y*x] = v;
}
main()
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
#include <iostream>
#include <conio.h>
#include "Matrixclass.h"
 
using namespace std;
 
int main()
{
   unsigned n;
   cout<<"Enter size matrix: ";
   cin>>n;
   cout<<"Input matrix: "<<endl;
   Matrix A(n,n);
   cout<<"Output matrix: "<<endl;
   A.show();
   cout<<"Output inversion matrix "<<endl;
   inversion(A,n);
   A.show();
   cout<<"Output matrix free elements"<<endl;
   Matrix B(n,1);
   A*B;
   cout<<"Output solution"<<endl;
   B.show();
   cin>>n;
   return 0;
   getch();
 
}
Вложения
Тип файла: rar Курсовая.rar (185.7 Кб, 18 просмотров)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
programm1r
 Аватар для programm1r
46 / 45 / 1
Регистрация: 19.06.2012
Сообщений: 134
22.06.2012, 17:24     Программа для решения СЛАУ #2
Цитата Сообщение от Fedor N Посмотреть сообщение
C++
1
void Matrix::show(void) { ... } if (temporary) delete this; }
Не понятно для чего, поясните? Может не внимательно посмотрел, но ни где не нашел в приведенном коде установку temporary... В архив не заглядывал.
Fedor N
 Аватар для Fedor N
0 / 0 / 0
Регистрация: 22.06.2012
Сообщений: 17
22.06.2012, 19:16  [ТС]     Программа для решения СЛАУ #3
Компонентная функция show предназначена для организации простейшего вывода матрицы на экран. Если выводится «временный» объект, – например, по вызову (A+B).show(), то после вывода он уничтожается.
Fedor N
 Аватар для Fedor N
0 / 0 / 0
Регистрация: 22.06.2012
Сообщений: 17
26.06.2012, 15:41  [ТС]     Программа для решения СЛАУ #4
Пришлось полностью все переделывать. Тема не актуальна)
-=ЮрА=-
Заблокирован
Автор FAQ
26.06.2012, 16:31     Программа для решения СЛАУ #5
Fedor N, посмотри сюда
класс Матрица
Способы решения СЛАУ
Yandex
Объявления
26.06.2012, 16:31     Программа для решения СЛАУ
Ответ Создать тему
Опции темы

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