0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 23
1

Ввод из файла

15.03.2014, 20:27. Показов 490. Ответов 0
Метки нет (Все метки)

Здравствуйте, мне нужна помощь. Есть программа решения системы линейных уравнений методом Гаусса, нужно сделать так что бы данные матрицы А и вектора В вводились из файла.
Вот моя программа, скажите как правильно записать это все.
Код программы:
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
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.03.2014, 20:27
Ответы с готовыми решениями:

Что работает быстрее, ввод с консоли или ввод с файла?
вводятся множество списков программа удаляет первое число списка и удаляет все числа в этом списке...

Переделать ввод из файла на ввод с клавиатуры
void openfile(int**a) { std::ifstream file(&quot;input.txt&quot;, std::ios_base::binary); file.seekg(0,...

Переделать ввод с консоли на ввод из файла
Здравствуйте! Написала программу, но результат таков: я брала информацию из строки. Мне нужно,...

ввод из файла
всем доброго времени суток.. есть вопрос... можно ли из таблицы Амельченко Гомель Победы 35...

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.03.2014, 20:27
Помогаю со студенческими работами здесь

Ввод с файла
Привет, Написал алгоритм которые выполняет проверку на закрытие скобок. Он работает. Например :...

Ввод из файла
Помогите написать код программы которая проверяет правильно ли указано имя файла и производится...

Ввод из файла
Хочу сделать файловый ввод, открывая текстовый файл OpenDialog'ом и выводя в Memo. Далее надо найти...

Ввод из файла
Написал такой метод, но отказывается работать. void file_in(){ ...

ввод из файла
подскажите как делать ввод из файла

Ввод из файла.
дана программа. в ней нужно ввести данные из файла. при выводе их на экран выводит не той...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru