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

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

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

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

09.05.2012, 02:57. Просмотров 2673. Ответов 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++
Разработать программу для решения СЛАУ методом Гаусса. вот заданный массив 7x1-x2+2x3+x4+x5=7 2x1+5x2-x3-x5=3 ...

Кто сможет? Написать функцию для решения СЛАУ методом Гаусса - C++
Кто может написать функцию для решения СЛАУ методом Гаусса используя базовые знания.

Написать программу для решения системы уравнений методом Гаусса (c++) - C++
Добрый вечер! Нужно написать программу для решения системы уравнений методом Гаусса. Уравнений всего два: a11*x1 + a12*x2 = z1...

Решения СЛАУ методом Гаусса по шагу - C++
Добрый день! Очередной раз прошу советов! Имеется СЛАУ, которое требуется решить методом Гаусса на с++. Соответственно, на...

Нужен рабочий пример решения СЛАУ методом Гаусса - C++
Нужен рабочий (ну или более менее рабочий) код для решения СЛАУ методом Гауса на С++. Уже замучился искать

Метод Гаусса для решения СЛАУ - C++
Здравствуйте! У меня есть алгоритм решения СЛАУ методом Гаусса, но почему-то он не работает((( Я проверил промежуточные матрицы, все ОК! И...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
UFO94
264 / 253 / 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
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
09.05.2012, 23:22 #4
Да, там j--, это я сплоховал. Привык уже писать циклы от 0 до n с увеличением....
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.05.2012, 23:22
Привет! Вот еще темы с ответами:

Реализовать программу, решающую СЛАУ методом Гаусса - C++
Реализовать программу, решающую СЛАУ методом Гаусса. Требования: 1. Программа должна выдавать решение для СЛАУ, имеющих единственное...

Метод Гаусса для решения СЛАУ с использованием одномерного массива - C++
Доброго всем времени суток. У меня есть прога для двумерного массива #include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;conio.h&gt; ...

Написать программу для вычисления СЛАУ методом простой итерации с использованием динамических массивов - C++
Нужно написать программу для вычисления СЛАУ методом простой итерации с использованием динамических массивов. СЛАУ выглядит так: ...

Вылет программы для вычисления СЛАУ методом Жордана-Гаусса при исполнении - C++
День добрый! Написал программу для вычисления СЛАУ методом Жордана-Гаусса. Однако при исполнении программа вылетает с ошибкой &quot;Прекращена...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.05.2012, 23:22
Ответ Создать тему
Опции темы

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