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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 47, средняя оценка - 4.94
Alexandr1966
25 / 25 / 1
Регистрация: 17.12.2012
Сообщений: 431
#1

Метод прогонки - исправить код - C++

13.02.2014, 09:58. Просмотров 6627. Ответов 18
Метки нет (Все метки)

Всем здравствуйте!!!
Друзья, передо мной стоит задача, программная реализация метода прогонки.
У меня есть код, который реализует это самый метод прогонки, НО матрица A и матрица B там задается по-моему рандомно, а мне нужно чтоб я их вводил сам с клавиатуры. Программа должна работать в консольном приложении VS 2008. Если кто-то сталкивался с этим и знает как сделать, помогите пожалуйста) Вот код:
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
#include "stdafx.h"
 
#include <math.h>
 
#include <iostream>
using namespace std;
int i,n,k,n1=5; 
 
double t,z,q,d;
 
double A[5][5];
 
double B[5]; 
 
double eps[5];
 
double X[5]; 
 
double et[5];
 
int main()
 
{
 
for (i=0;i<5;i++)
 
{
 
for (k=0;k<5;k++)
 
{
 
A[i][k]=0;
 
}
 
}
 
cout<<"Enter q: ";
 
cin>>q;
 
cout<<endl<<"Enter d: ";
 
cin>>d;
 
cout<<endl;
A[0][0]=A[4][4]=q;
 
A[1][1]=A[2][2]=A[3][3]=-2;
 
for (i=0;i<4;i++)
 
{
 
k=i+1;
 
A[i][k]=A[k][i]=1;
 
} 
cout<<"Matrix A:"<<endl;
 
for (i=0;i<5;i++)
 
{
 
for (k=0;k<5;k++)
 
{
 
cout<<A[k][i]<<"\t ";
 
}
 
cout<<endl;
 
}
 
B[0]=B[4]=0;
 
for(i=1;i<=3;i++)
 
{
 
B[i]=d;
 
}
 
cout<<"Matrix B:"<<endl;
 
for (i=0;i<5;i++)
 
{
 
cout<<B[i]<<endl;
 
}
 
n=n1-1;
 
eps[0]=-A[0][1]/A[0][0];
 
et[0]=B[0]/A[0][0];
 
for(i=1;i<n;i++)
 
{
 
z=A[i][i]+A[i][i-1]*eps[i-1];
 
eps[i]=-A[i][i+1]/z;
 
et[i]=(B[i]-A[i][i-1]*et[i-1])/z;
 
}
 
X[n]=(B[n]-A[n][n-1]*et[n-1])/(A[n][n]+A[n][n-1]*eps[n-1]);
 
for(i=n-1;i>=0;i--)
 
{
 
X[i]=eps[i]*X[i+1]+et[i];
 
}
 
cout<<"Matrix X:"<<endl;
 
for(i=0;i<n1;i++)
 
{
 
cout<<X[i]<<endl;
 
}
 
return 0;
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2014, 09:58     Метод прогонки - исправить код
Посмотрите здесь:

C++ Метод прогонки
C++ Исправить код С++ "Метод Гаусса с выбором главного элемента по строке"
C++ метод прогонки С++
C++ Алгоритм и код программы решения уравнения Пуассона методом матричной прогонки
что делает эта программа распишите пожалуйста? это ведь метод прогонки? C++
Динамическое программирование. Метод прямой прогонки C++
Метод прямой прогонки. Динамическое программирование C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
S_el
2075 / 1582 / 303
Регистрация: 15.12.2013
Сообщений: 6,283
13.02.2014, 10:21     Метод прогонки - исправить код #2
Вводить элементы с консоли можно в цикле через cin.
Trainer
2 / 2 / 0
Регистрация: 10.11.2011
Сообщений: 14
13.02.2014, 10:23     Метод прогонки - исправить код #3
Вот так:
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
#include <math.h>
#include <iostream>
#include <conio.h>
using namespace std;
 
int i,n,k,n1=5; 
double t,z,q,d;
double A[5][5];
double B[5]; 
double eps[5];
double X[5]; 
double et[5];
 
int main()
{
cout<<"Vvedite 5 strok po 5 4isel:"<<endl;
for (i=0;i<5;i++)
    for (k=0;k<5;k++)
        cin>>A[i][k];
 
cout<<"Matrix A:"<<endl;
for (i=0;i<5;i++)
    {
    for (k=0;k<5;k++)
        cout<<A[k][i]<<"\t ";
    cout<<endl;
    }
 
cout<<"Vvedite 3 4isla:"<<endl;
for(i=1;i<=3;i++)
    cin>>B[i];
 
cout<<"Matrix B:"<<endl;
for (i=0;i<5;i++)
    cout<<B[i]<<endl;
 
n=n1-1;
eps[0]=-A[0][1]/A[0][0];
et[0]=B[0]/A[0][0];
 
for(i=1;i<n;i++)
    {
    z=A[i][i]+A[i][i-1]*eps[i-1];
    eps[i]=-A[i][i+1]/z;
    et[i]=(B[i]-A[i][i-1]*et[i-1])/z;
    }
 
X[n]=(B[n]-A[n][n-1]*et[n-1])/(A[n][n]+A[n][n-1]*eps[n-1]);
 
for(i=n-1;i>=0;i--)
    X[i]=eps[i]*X[i+1]+et[i];
 
cout<<"Matrix X:"<<endl;
for(i=0;i<n1;i++)
    cout<<X[i]<<endl;
 
getch();
return 0;
}
Alexandr1966
25 / 25 / 1
Регистрация: 17.12.2012
Сообщений: 431
13.02.2014, 10:50  [ТС]     Метод прогонки - исправить код #4
а матрица A должна быть обязательно 5 на 5 и матрица B из 3 элементов?
Можно вы поможете реализовать так чтоб я еще и размерности матриц задавал??
S_el
2075 / 1582 / 303
Регистрация: 15.12.2013
Сообщений: 6,283
13.02.2014, 11:02     Метод прогонки - исправить код #5
Цитата Сообщение от Alexandr1966 Посмотреть сообщение
Можно вы поможете реализовать так чтоб я еще и размерности матриц задавал??
Читайте про динамический массивы.
Alexandr1966
25 / 25 / 1
Регистрация: 17.12.2012
Сообщений: 431
13.02.2014, 11:27  [ТС]     Метод прогонки - исправить код #6
Trainer, помогите правильно сделать, будьте любезны?)
zss
Модератор
Эксперт С++
6180 / 5783 / 1872
Регистрация: 18.12.2011
Сообщений: 14,772
Завершенные тесты: 1
13.02.2014, 11:38     Метод прогонки - исправить код #7
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
 
int main()
{
   double** A;
   double* B; 
   double* eps;
   double* X; 
   double* et;
   int N;
   cout<<"Vvedite Razmer massivov:";
   cin>>N;
// динамическое создание всех массивов
   B=new double[N];
   eps=new double[N];
   X=new double[N];
   et=new double[N];
   A=new double*[N];
   for(int i=0;i<N;i++)
       A[i]=new double[N];
   cout<<"Vvedite "<<N<<" strok po "<<N<<" 4isel:\n";
   for (i=0;i<N;i++)
       for (k=0;k<N;k++)
           cin>>A[i][k];
   n1=N;
// дальше как было только поменяйте константу 5 на N
// ...
// в конце удаление масивов
   getch();
   delete[] B;
   delete[] eps;
   delete[] et;
   delete[] X;
   for(int i=0;i<N;i++)
       delete[] A[i];
   delete[] A;
   return 0;
}
getch();
return 0;
}
Trainer
2 / 2 / 0
Регистрация: 10.11.2011
Сообщений: 14
13.02.2014, 11:42     Метод прогонки - исправить код #8
Если я правильно понял, то матрица А должна иметь одинаковое число столбцов и строк, а матрица В - то же число строк, правильно?
Alexandr1966
25 / 25 / 1
Регистрация: 17.12.2012
Сообщений: 431
13.02.2014, 11:51  [ТС]     Метод прогонки - исправить код #9
Trainer, да да)
Trainer
2 / 2 / 0
Регистрация: 10.11.2011
Сообщений: 14
13.02.2014, 11:57     Метод прогонки - исправить код #10
Тогда можно так (без использования дин. массивов):
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
#include <math.h>
#include <iostream>
#include <conio.h>
using namespace std;
 
int i,n,k,n1; 
double z;
double A[50][50];
double B[50]; 
double eps[50];
double X[50]; 
double et[50];
 
int main()
{
cout<<"Vvedite razmernost matrici: ";
cin>>n1;
 
cout<<"Vvedite "<<n1<<" strok po "<<n1<<" 4isel:"<<endl;
for (i=0;i<n1;i++)
    for (k=0;k<n1;k++)
        cin>>A[i][k];
 
cout<<"Matrix A:"<<endl;
for (i=0;i<n1;i++)
    {
    for (k=0;k<n1;k++)
        cout<<A[k][i]<<"\t ";
    cout<<endl;
    }
 
cout<<"Vvedite "<<n1<<" 4isel:"<<endl;
for(i=1;i<=n1;i++)
    cin>>B[i];
 
cout<<"Matrix B:"<<endl;
for (i=0;i<n1;i++)
    cout<<B[i]<<endl;
 
n=n1-1;
eps[0]=-A[0][1]/A[0][0];
et[0]=B[0]/A[0][0];
 
for(i=1;i<n;i++)
    {
    z=A[i][i]+A[i][i-1]*eps[i-1];
    eps[i]=-A[i][i+1]/z;
    et[i]=(B[i]-A[i][i-1]*et[i-1])/z;
    }
 
X[n]=(B[n]-A[n][n-1]*et[n-1])/(A[n][n]+A[n][n-1]*eps[n-1]);
 
for(i=n-1;i>=0;i--)
    X[i]=eps[i]*X[i+1]+et[i];
 
cout<<"Matrix X:"<<endl;
for(i=0;i<n1;i++)
    cout<<X[i]<<endl;
 
getch();
return 0;
}
Размерность не больше 50. Хотя дин. массивы использовать правильней.
Ev_Hyper
Заблокирован
13.02.2014, 12:00     Метод прогонки - исправить код #11
Trainer, в чем смысл использования глобальных переменных?
Trainer
2 / 2 / 0
Регистрация: 10.11.2011
Сообщений: 14
13.02.2014, 12:04     Метод прогонки - исправить код #12
Ни в чем, я не обратил внимание. Как было в предложенном примере, так я и оставил.
Их можно сделать и локальными, ничего не изменится конкретно в этом проекте.
Alexandr1966
25 / 25 / 1
Регистрация: 17.12.2012
Сообщений: 431
13.02.2014, 12:18  [ТС]     Метод прогонки - исправить код #13
Trainer, спасибо огромное)))
zss
Модератор
Эксперт С++
6180 / 5783 / 1872
Регистрация: 18.12.2011
Сообщений: 14,772
Завершенные тесты: 1
13.02.2014, 12:25     Метод прогонки - исправить код #14
Alexandr1966, Так все-таки, надо было делать динамическое выделение памяти или нет?
Цитата Сообщение от Alexandr1966 Посмотреть сообщение
Можно вы поможете реализовать так чтоб я еще и размерности матриц задавал??
Alexandr1966
25 / 25 / 1
Регистрация: 17.12.2012
Сообщений: 431
13.02.2014, 15:42  [ТС]     Метод прогонки - исправить код #15
Да в принципе хоть как)))

Добавлено через 2 часа 31 минуту
А вот в этом методе прогонки матрицу А когда ввёл, она потом переворачивает столбцы и строки, так надо да в этом методе?
И вот матрицу В когда ввел допустим 1 2 3, она выводит её 0 1 2, так тоже надо в этом методе?
просто я не очень разбираюсь подскажите?

Добавлено через 38 минут
Ребят подскажите Trainer, zss
Trainer
2 / 2 / 0
Регистрация: 10.11.2011
Сообщений: 14
13.02.2014, 23:33     Метод прогонки - исправить код #16
Действительно, часть кода неправильна. Строки 32-34:
C++
1
2
3
cout<<"Vvedite "<<n1<<" 4isel:"<<endl;
for(i=0;i<n1;i++)
    cin>>B[i];
В предложенном примере матрица А действительно переворачивается. Не знаю, правильно ли это, но если неправильно, то в строке 28 поменять cout<<A[k][i]<<"\t "; на cout<<A[i][k]<<"\t ";
Alexandr1966
25 / 25 / 1
Регистрация: 17.12.2012
Сообщений: 431
19.02.2014, 08:39  [ТС]     Метод прогонки - исправить код #17
Trainer, zss, Ребята, вот смотрите, программа вот эта работает неправильно, что-то в ней не так.
Вот пример с ответами который взят из задачника, он правильно решенный:
Матрица А:
1 0 0 0
1 -2 1 0
0 1 -2 1
0 0 0 1
Матрица В:
0
0
0
2
Матрица Х (ответы):
0
0,66667
1,3333
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
#include "stdafx.h"
#include "conio.h"
#include "math.h"
#include "iostream"
using namespace std;
 
int i,n,k,n1; 
double z;
double A[50][50];
double B[50]; 
double eps[50];
double X[50]; 
double et[50];
 
int main()
{
cout<<"Vvedite razmernost matrici: ";
cin>>n1;
 
cout<<"Vvedite "<<n1<<" strok po "<<n1<<" 4isel:"<<endl;
for (i=0;i<n1;i++)
    for (k=0;k<n1;k++)
        cin>>A[i][k];
 
cout<<"Matrix A:"<<endl;
for (i=0;i<n1;i++)
    {
    for (k=0;k<n1;k++)
        cout<<A[k][i]<<"\t ";
    cout<<endl;
    }
 
cout<<"Vvedite "<<n1<<" 4isel:"<<endl;
for(i=1;i<=n1;i++)
    cin>>B[i];
 
cout<<"Matrix B:"<<endl;
for (i=0;i<n1;i++)
    cout<<B[i]<<endl;
 
n=n1-1;
eps[0]=-A[0][1]/A[0][0];
et[0]=B[0]/A[0][0];
 
for(i=1;i<n;i++)
    {
    z=A[i][i]+A[i][i-1]*eps[i-1];
    eps[i]=-A[i][i+1]/z;
    et[i]=(B[i]-A[i][i-1]*et[i-1])/z;
    }
 
X[n]=(B[n]-A[n][n-1]*et[n-1])/(A[n][n]+A[n][n-1]*eps[n-1]);
 
for(i=n-1;i>=0;i--)
    X[i]=eps[i]*X[i+1]+et[i];
 
cout<<"Matrix X:"<<endl;
for(i=0;i<n1;i++)
    cout<<X[i]<<endl;
 
getch();
return 0;
}
Ev_Hyper
Заблокирован
19.02.2014, 09:28     Метод прогонки - исправить код #18
Alexandr1966, если выводит не то, что ввели значит напутали с индексацией.
Вот тут:

C++
1
2
3
4
5
6
for (i=0;i<n1;i++)
    {
    for (k=0;k<n1;k++)
        cout<<A[k][i]<<"\t ";
    cout<<endl;
    }
У вас A[k][i] вместо A[i][k];

и вот тут:
C++
1
2
3
cout<<"Vvedite "<<n1<<" 4isel:"<<endl;
for(i=1;i<=n1;i++)
    cin>>B[i];
зачем-то начинаете заполнять с 1, хотя везде используете 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
#include "stdafx.h"
#include "conio.h"
#include "math.h"
#include "iostream"
using namespace std;
 
int i,n,k,n1; 
double z;
double A[50][50];
double B[50]; 
double eps[50];
double X[50]; 
double et[50];
 
int main()
{
cout<<"Vvedite razmernost matrici: ";
cin>>n1;
 
cout<<"Vvedite "<<n1<<" strok po "<<n1<<" 4isel:"<<endl;
for (i=0;i<n1;i++)
    for (k=0;k<n1;k++)
        cin>>A[i][k];
 
cout<<"Matrix A:"<<endl;
for (i=0;i<n1;i++)
    {
    for (k=0;k<n1;k++)
        cout<<A[i][k]<<"\t ";
    cout<<endl;
    }
 
cout<<"Vvedite "<<n1<<" 4isel:"<<endl;
for(i=0;i<n1;i++)
    cin>>B[i];
 
cout<<"Matrix B:"<<endl;
for (i=0;i<n1;i++)
    cout<<B[i]<<endl;
 
n=n1-1;
eps[0]=-A[0][1]/A[0][0];
et[0]=B[0]/A[0][0];
 
for(i=1;i<n;i++)
    {
    z=A[i][i]+A[i][i-1]*eps[i-1];
    eps[i]=-A[i][i+1]/z;
    et[i]=(B[i]-A[i][i-1]*et[i-1])/z;
    }
 
X[n]=(B[n]-A[n][n-1]*et[n-1])/(A[n][n]+A[n][n-1]*eps[n-1]);
 
for(i=n-1;i>=0;i--)
    X[i]=eps[i]*X[i+1]+et[i];
 
cout<<"Matrix X:"<<endl;
for(i=0;i<n1;i++)
    cout<<X[i]<<endl;
 
getch();
return 0;
}
Результат:
Код
Vvedite razmernost matrici: 4
Vvedite 4 strok po 4 4isel:
1
0

0
0
1
-2
1
0
0
1
-2
1
0
0
0
1
Matrix A:
1        0       0       0
1        -2      1       0
0        1       -2      1
0        0       0       1
Vvedite 4 4isel:
0
0
0
2
Matrix B:
0
0
0
2
Matrix X:
0
0.666667
1.33333
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2014, 09:58     Метод прогонки - исправить код
Еще ссылки по теме:

метод обратной прогонки C++
Метод прогонки краевых задач для обыкновеных дифф. уравнений C++
C++ Метод Рунге-Кутта 4 порядка (исправить код)
Метод прогонки для СЛАУ C++
Исправить код метод Ньютона для решения систем нелинейных уравнений под нужное условие C++

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

Или воспользуйтесь поиском по форуму:
Alexandr1966
25 / 25 / 1
Регистрация: 17.12.2012
Сообщений: 431
19.02.2014, 09:58  [ТС]     Метод прогонки - исправить код #19
Благодарю вас за помощь))
Yandex
Объявления
19.02.2014, 09:58     Метод прогонки - исправить код
Ответ Создать тему
Опции темы

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