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

Ввод из файла - C++

Войти
Регистрация
Восстановить пароль
 
mark12552
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 23
15.03.2014, 20:27     Ввод из файла #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
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
206
207
208
209
210
211
212
213
#include <iostream>
#include <math.h>
#include <iomanip>
#include <fstream>
using namespace std;
int SLAU(double **matrica_a,  int n, double *massiv_b, double *x)
// Функция SLAU возвращает значение типа int:
// 0, если решение найдено, -1 – если система имеет
// бесконечное множество 
// решений, -2 – если система не имеет решений.
// Формальные параметры функции: n – размерность системы,
// matrica_a –  матрица коэффициентов СЛАУ, massiv_b –
// вектор правых частей, x – решение СЛАУ,
// a, b,x передаются как указатели.
{
     int i,j,k,r;
    double c,M,max,s;
// Матрица a – копия матрицы коэффициентов, 
//массив b – копия вектора  правых частей.
    double **a, *b; 
// Выделение памяти для a и b.
a=new double *[n];
for(i=0;i<n;i++)
a[i]=new double[n];
b=new double [n];
// В a записываем копию матрицы коэффициентов, в b копию
// вектора правых частей.
     for(i=0;i<n;i++)
         for(j=0;j<n;j++)
            a[i][j]=matrica_a[i][j];
     for(i=0;i<n;i++)
         b[i]=massiv_b[i];
// Прямой ход метода Гаусса: приводим матрицу a 
//(копию матрицы коэффициентов СЛАУ) к диагональному виду.
        for(k=0;k<n;k++)
    {
// Поиск максимального по модулю элемента в k-м столбце.
        max=fabs(a[k][k]);
        r=k;
        for(i=k+1;i<n;i++)
            if (fabs(a[i][k])>max)
            {
                max=fabs(a[i][k]);
                r=i;
            }
// Меняем местами k-ю и r-ю (строку, где находится 
//максимальный по модулю элемент) строки.
        for(j=0;j<n;j++)
        {
            c=a[k][j];
            a[k][j]=a[r][j];
            a[r][j]=c;
        }
        c=b[k];
        b[k]=b[r];
        b[r]=c;
// Приведение матрицы к диагональному виду.
        for(i=k+1;i<n;i++)
        {
            for(M=a[i][k]/a[k][k],j=k;j<n;j++)
                a[i][j]-=M*a[k][j];
            b[i]-=M*b[k];
        }
    }
// Обратный ход метода Гаусса.
// Если последний диагональный элемент равен 0 и 
    if (a[n-1][n-1]==0)
// если последний коэффициент вектора свободных членов
// равен 0,
        if(b[n-1]==0)
// то система имеет бесконечное множество решений
            return -1;
// если последний коэффициент вектора свободных членов не
// равен 0, то система решений не имеет.
        else return -2;
    else
// Если последний диагональный элемент не равен 0, то 
//начинается обратный ход метода Гаусса.
    {
        for(i=n-1;i>=0;i--)
        {
            for(s=0,j=i+1;j<n;j++)
                s+=a[i][j]*x[j];
            x[i]=(b[i]-s)/a[i][i];
        }
        return 0;
    }   
}
 
int **minus_m(int **A, int **B, int N, int M)
{int i,j;
 
int **temp;
 
temp=new int *[N];
for(i=0;i<N;i++)
temp[i]=new int [M];
 
for(i=0;i<N;i++)
for(j=0;j<M;j++)
temp[i][j]=A[i][j]-B[i][j]; 
 
return temp;
}
 
int **product_m(int **A, int **B, int N, int M, int L)
{
    int i,j,k;
 
int **temp;
temp=new int *[N];
for(i=0;i<N;i++)
temp[i]=new int [L];
for(i=0;i<N;i++)
for(j=0;j<L;j++) 
for(temp[i][j]=k=0;k<M;k++)
temp[i][j]+=A[i][k]*B[k][j];
return temp;
}
 
 
int main()
{
 
int result,i,j,N;
double **a, *b, *x, **H,S,**E;
 
// Ввод размерности системы.
setlocale (LC_CTYPE, "Russian");
cout<<"N=";
cin>>N;
// Выделение памяти для матрицы правых частей и вектора
// свободных членов.
a=new double *[N];
for(i=0;i<N;i++)
a[i]=new double[N];
b=new double [N];
x=new double [N];
H=new double *[N];
for(i=0; i<N; i++)
H[i]=new double [N];
// Ввод матрицы правых частей и вектора свободных членов.
cout<<"Ввод матрицы A"<<endl;
for(i=0;i<N;i++)
for(j=0;j<N;j++)
{
ifstream F;
F.open("D:\\test.txt", ios::in);
if (F)              //Если открытие файла
                            //прошло корректно, то
    {
        while (!F.eof())        //Организован цикл,
                            //выполнение цикла
                            //прервется, когда ,будет
                            //достигнут конца файла.
        {
                F>>a[i][j];     //Чтение очередного значения
                setlocale (LC_CTYPE, "Russian");            //из потока f в переменную a.
                //Вывод значения переменной a 
                    //Увеличение количества
                            //считанных чисел.
        }
        F.close();  
        }
    else cout<<"File not found"<<endl;}
cout<<"Ввод вектора B"<<endl;
for(i=0;i<N;i++)
cin>>b[i];
 
result=SLAU(a,N,b,x);
if (result==0)
{
// Вывод массива решения.
cout<<"Massiv X"<<endl;
for(i=0;i<N;i++)
cout<<x[i]<<"\t";
cout<<endl;
}
else if (result==-1)
cout<<"Бесконечное множество решений\n";
else if (result==-2)
cout<<"Нет решений\n";
if (result==0)
{
 
E=new double *[N];
    for (i=0; i<N; i++)
    E[i]=new double [N];
    for(i=0;i<N;i++)
    for(j=0;j<N;j++)
    {
    if(i==j) E[i][j]=1;
    else E[i][j]=0;
}
    cout<<"Matrica E"<<endl;
    
for(i=0;i<N;i++) 
{
for(j=0;j<N;j++) 
cout<<E[i][j]<<"\t"; 
cout<<endl;}
 
for(i=0;i<N;i++)
for(S=j=0;j<N;j++)
{
S=x[i]*x[j];
H[i][j]=E[i][j]-S;}
cout<<"Massiv H"<<endl;
for(i=0;i<N;i++)
{for(j=0;j<N;j++)
cout<<H[i][j]<<"\t";
cout<<endl;}
}}
Матрица А 4 на 4
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2014, 20:27     Ввод из файла
Посмотрите здесь:

C++ ввод из файла
Ввод из файла C++
C++ Ввод данных из файла
Ввод\вывод из файла C++
C++ Ввод из файла.
Ввод из файла C++
C++ Ввод из файла
C++ Ввод-вывод из файла
Ввод из файла в вектор C++
C++ Ввод\вывод файла
C++ Ввод данных из файла
Ввод данных с файла C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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