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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.75
McRowan
0 / 0 / 0
Регистрация: 08.05.2012
Сообщений: 23
#1

Помогите написать программу для решения слау методом Гаусса - C++

09.05.2012, 02:57. Просмотров 2638. Ответов 3
Метки нет (Все метки)

Осталось как обычно пару дней до сдачи курсовой, а она еще не готова! Помогите пожалуйста.
Вот код, который чуть-чуть работает
Главная проблема в том, чтобы привести систему к диагональному виду без дробных коэффициентов, там возможно 0/0.... линейную комбинацию осуществить нужно верно. Однако нужно произвести сортировку так, чтобы на диагонали при каждом шаге не было "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
// курсовая.cpp : Defines the entry point for the console application.
 // курсовая.cpp: определяет точку входа для консольного приложения.
 //
 
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <math.h>
#include <cstdlib>
#include <cstdlib>
using namespace std;
 
bool CProg()
 {
cout << "\n" << "Продолжим? (1-да) "<<"\t";
char c;
 cin >> c;
return c=='1';
}
 
 int main ()
 {
setlocale (0,"");
do
 {
int i(0), j(0);
 cout << "Введите число неизвестных" << endl;
cin >> n;
int MassivA[20][20], MassivC[20], MassivItog[20][20];
double x[20];
cout << "Введите коэффициенты" << endl;
for ( i = 0; i < n; ++i)
{
for (j = 0; j < n; ++j)
 cin >> MassivA [i][j];
 cout << endl;
 }
cout << "Введите солбец свободных членов" << endl;
for ( i = 0; i < n; ++i)
 {
cin >> MassivC [i];
 cout << endl;
 } 
//заполняем окончательный массив 
for ( i = 0; i < n; ++i)
 {
for ( j = 0; j < n; ++j)
 MassivItog[i][j] = MassivA [i][j];
for ( j = n; j < n+1; ++j)
 MassivItog[i][j] = MassivC [i];
 }
cout <<"Полная система" << endl;
for ( i = 0; i < n; ++i)
{
for (j = 0; j < n +1; ++j)
{
 cout.setf(ios::left);
 cout.width (7);
 cout << MassivItog [i][j] << '\t';
 }
 cout << endl;
 }
cout << "------------------------------------------------" << endl;
// сортировка на диагональных местах не должно быть "0", нужно соединить с прямым ходом
for (i = 0; i < n - 1 ; ++i)
for (j = 0; j < n+1 ; ++j)
if (MassivItog[i][j] == 0)
if (MassivItog[i+1][j] != 0)
 {
int t = MassivItog[i][j];
 MassivItog[i][j] = MassivItog[i+1][j];
 MassivItog[i+1][j] = t;
 }
//прямой ход
for (i = 0; i < n ; ++i) 
{
int a = MassivItog[i][i];
for (j = i + 1; j < n; ++j)
 {
int b = MassivItog[j][i];
for ( int k = 0; k < n+1; ++k)
MassivItog[j][k] = a * MassivItog[j][k] - b * MassivItog[i][k];
 }
 }
cout << "-------------------------------" << endl;
for ( j = 0; j < n; ++j)
{
for (int k = 0; k < n + 1 ; ++k)
{
 cout.setf(ios::left);
 cout.width (7);
 cout << MassivItog [j][k] << '\t';
 }
 cout << endl;
 }
 
 //вывод матрицы треугольного вида
 cout <<"Матрица приведенная к треугольному виду:"<< endl;
for (j = 0; j < Sys.n; j++)
 {
for (i = 0; i < Sys.n + 1; i++)
{
 cout.setf(ios::left);
 cout.width (7);
 cout << MassivItog[j][i] << '\t';
 }
 cout << endl;
 }
 
//обратный ход еще не осуществлен
 
 
 }
while (CProg());
}
Вложения
Тип файла: doc курсовая.doc (38.0 Кб, 43 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2012, 02:57     Помогите написать программу для решения слау методом Гаусса
Посмотрите здесь:
C++ Разработать программу для решения СЛАУ методом Гаусса.
C++ Кто сможет? Написать функцию для решения СЛАУ методом Гаусса
C++ Написать программу для решения системы уравнений методом Гаусса (c++)
C++ Решения СЛАУ методом Гаусса по шагу
Нужен рабочий пример решения СЛАУ методом Гаусса C++
Метод Гаусса для решения СЛАУ C++
C++ Реализовать программу, решающую СЛАУ методом Гаусса
Метод Гаусса для решения СЛАУ с использованием одномерного массива C++
Написать программу для вычисления СЛАУ методом простой итерации с использованием динамических массивов C++
Вылет программы для вычисления СЛАУ методом Жордана-Гаусса при исполнении C++
Написание программы для решения СЛАУ методом Зейделя C++
Программа для решения слау методом главных элементов для всеразмерной матрицы C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
09.05.2012, 12:42     Помогите написать программу для решения слау методом Гаусса #2
Так-с. Сначала покритикуем код.
Цитата Сообщение от McRowan Посмотреть сообщение
int MassivA[20][20], MassivC[20], MassivItog[20][20];
-- такие вещи делаются динамическими массивами, и без "сферических в вакууме" 20.

Цитата Сообщение от McRowan Посмотреть сообщение
// сортировка на диагональных местах не должно быть "0", нужно соединить с прямым ходом
-- здесь есть 2 минуса. 1-й в том, что 0 у вас может выйти и не в самом начале, а позднее, когда вы уже отнимете несколько строк. Второй в том, что у вас и на следующей строке в этом столбце может стоять 0, и тогда проблемма не решена.
Теперь советы.
1) Массивы обьявляем так:
C++
1
2
3
4
5
6
7
8
int* *MassivA=new int*[n];
int* MassivC=new int[n];
int* *MassivItog=new int*[n];
for(int i=0; i<n; i++)
{
MassivA[i]=new int[n];
MassivItog[i]=new int[n+1];
}
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
for(int i=0; i<n; i++)
{
if(MassivItog[i][i]!=0)
{
int a = MassivItog[i][i];
for (j = i + 1; j < n; ++j)
 {
int b = MassivItog[j][i];
for ( int k = 0; k < n+1; ++k)
MassivItog[j][k] = a * MassivItog[j][k] - b * MassivItog[i][k];
 }
}
else
{
bool flag=false;//Этот флаг нам говорит, есть ли строки с не 0 в этом столбце
for(int j=i+1; j<n; j++)
if(MassivItog[j][i]!=0)
{
flag=true;
for(int k=0; k<n+1; k++)
{
int tmp=0;
tmp=MassivItog[i][k];
MassivItog[i][k]=MassivItog[j][k];
MassivItog[j][k]=tmp;
}
break;
}
if(flag==flase)
{
printf("System has no solunions, or it has infinity solutions\n");
system("PAUSE");
return 0;
}
else
i--;
}
}
На обратном проходе у нас уже не могут быть 0 на главной диагонали.
Отнимаем и не паримся. Даже более того, отнимаем от столбца свободных членов, а в матрице просто зануляем.
C++
1
2
3
4
5
6
7
8
9
10
for(int i=n-1; i>0; i--)
{
int a=MassivItog[i][i];
for(int j=i-1; j>=0; j++)
{
int b=MassivItog[j][i];
MassivItog[j][n]=a*MassivItog[j][n]-b*MassivItog[i][n];
MassivItog[j][i]=0;
}
}
McRowan
0 / 0 / 0
Регистрация: 08.05.2012
Сообщений: 23
09.05.2012, 19:39  [ТС]     Помогите написать программу для решения слау методом Гаусса #3
Спасибо огромное!!! Вы очень выручили. Я на самом деле понимала, что при вычитании строк могут получаться нули, причем не в изначальной матрице.
Цитата Сообщение от McRowan Посмотреть сообщение
нужно произвести сортировку так, чтобы на диагонали при каждом шаге не было "0".
Именно это я и имела в виду. А с динамическими массивами я на самом деле сразу делала, но ступила, и решила переписать... В общем дура...
Только, кажется при обратном ходе опечатка,
Цитата Сообщение от UFO94 Посмотреть сообщение
for(int j=i-1; j>=0; j++)
возможно должно быть j--, а при выводе программа работает отлично. прогнала ее пару раз на разных значениях - все как и должно быть!

Спасибо большущее!!!!
UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
09.05.2012, 23:22     Помогите написать программу для решения слау методом Гаусса #4
Да, там j--, это я сплоховал. Привык уже писать циклы от 0 до n с увеличением....
Yandex
Объявления
09.05.2012, 23:22     Помогите написать программу для решения слау методом Гаусса
Ответ Создать тему
Опции темы

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