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

Решения СЛАУ методом Гаусса по шагу - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ почему не работает функция? http://www.cyberforum.ru/cpp-beginners/thread1088685.html
#include <iostream> #include <conio.h> void function (int k)// { for(int i=0;i<k;i++) std::cout<<"*"; } int main()
C++ DirectSound. Как правильно, и какую библиотеку следует добавить? Ребята, нужна ваша помощь. MVS 2010 выдаёт следующее 1>DXUTsound.obj : error LNK2019: unresolved external symbol __imp__mmioClose@8 referenced in function "public: long __thiscall CWaveFile::Open(char *,struct tWAVEFORMATEX *,unsigned long)" (?Open@CWaveFile@@QAEJPADPAUtWAVEFORMATEX@@K@Z) 1>DXUTsound.obj : error LNK2019: unresolved external symbol __imp__mmioOpenA@12 referenced in function... http://www.cyberforum.ru/cpp-beginners/thread1088683.html
C++ Составить программу для вычисления расстояния между точками пересечения окружностей
Две окружности на плоскости заданы координатами своих центров и радиусами. Составить программу для вычисления расстояния между точками пересечения окружностей. Если окружности соприкасаются в одной точке или не пересекаются, то выдать сообщения об этом.
В следующем слове после точки, первую строчную букву заменить на прописную C++
В строке, содержащей последовательность слов, найти конец предложения, обозначенный символом "точка". В следующем слове первую строчную букву заменить на прописную
C++ Растолкуйте код http://www.cyberforum.ru/cpp-beginners/thread1088660.html
Помогите с кодом cout << (i == 0 || j == 0 || i == N + 1 || j == M + 1 ? '#' : a) << (j <= M ? "" : "\n"); что делает cout << ( ? : ); я впервые с таким столкнулся.
C++ Содержимое массива Уважаемые подскажите пожалуйста, можно ли как-то посмотреть содержимое массива в MVS 2012, в режиме отладки, содержимое переменных можно посмотреть а массива никак не могу найти как ? подробнее

Показать сообщение отдельно
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
20.04.2014, 13:39  [ТС]     Решения СЛАУ методом Гаусса по шагу
Добрый день! Помогите, пожалуйста.
Остался тот же вопрос, не пойму почему немного на выводе не правильные цифры. Ответ верен, а вот треугольный вид матрицы не получается. т.е. привести матрицу к ступенчатому виду не получается.

Вот укороченный вариант программы, нужно загрузить матрицу из файла, файл прилагается (base.txt есть выше в теме, можно создать в ручную) в файле эти цифры. - 3 2 -5 -1 2 -1 3 13 1 2 -1 9
т.е. матрица вида:
Сам код:
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>
#include <conio.h>
using namespace std;
 
 
void MatrixFromFile(double **A, double *B, int& n, int& m) // вводим из файла
{
    string name;
    cout << " Важно.";
    cout << " Файл должен находится в папке с проектом." << endl;
    //  cout << " Введите название файла вместе с расширением, где записана матрица." << endl;
    //cout << " Имя файла: "; cin >> name; cout << endl;
    //std::ifstream in(name);
    std::ifstream in("base.txt");
    if (!in.is_open())
    {
        std::cerr << " Файл " << name << " не был открыт для чтения. ";
        return;
    }
 
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            in >> A[i][j];
        }
        in >> B[i];
    }
    in.close();
}
 
void swap(double **A, double*B, int& n, int &m) // меняем местами строки матрицы
{
    double buf = 0, buf2 = 0;
 
    for (int i = 0; i < n; ++i)
    if (A[i][0] == 1)
    {
        int p = i;
        for (int i = 0; i < (n / 2); ++i)
        for (int j = 0; j < m; ++j)
        {
            buf = A[i][j];
            A[i][j] = A[p][j];
            A[p][j] = buf;
            //
            buf2 = B[p];
            B[p] = B[i];
            B[i] = buf2;
        }
    }
    else
    {
        if (A[i][0] == -1)
        {
            int p = i;
            for (int i = 0; i < (n / 2); ++i)
            for (int j = 0; j < m; ++j)
            {
                buf = A[i][j];
                A[i][j] = A[p][j];
                A[p][j] = buf;
                //
                buf2 = B[p];
                B[p] = B[i];
                B[i] = buf2;
                cout << A[i][j] << endl;
            }
        }
    }
}
 
void DisplayMatrix(double **A, double *B, int& n, int& m) // вывод матрицы на экран
{
    cout << "        _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _" << endl;
    cout << "\n" << endl;
    {
        for (int i = 0; i < n; i++)
        {
 
            for (int j = 0; j < m; j++)
 
                //  cout << setw(4) << "A[" << i << "][" << j << "] = " << A[i][j]; cout << "    B[" << i << "] = " << B[i]; //вывод 1
                //cout << endl << endl;
                cout << setw(9) << A[i][j];
            cout << setw(9) << " = ";
            cout << setw(9) << B[i]; // вывод 2
            cout << endl << endl;
 
 
 
        }
    }
    cout << "        _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _" << endl;
}
 
void Gauss(double **A, double*B, double * x, int& n, int &m)//прямой ход
{
    int f;
    double k;
    //save(A, B, n, m); //сохранение шага состояния на текущий момент.
    swap(A, B, n, m); //проверяем, есть ли в матрице строка начинающася на единицу, дабы облегчить нам решение.
    cout << "\n" << " Поменяли местами строки. " << "\n" << endl;
    DisplayMatrix(A, B, n, m);
    for (int i = 0; i < n; ++i)
    {
        for (f = i + 1; f < m; f++)
        {
        //  save(A, B, n, m); //сохранение шага состояния на текущий момент.
            k = A[f][i] / A[i][i];
            cout << "k = " << A[f][i] << " / " << A[i][i] << " = " << k << endl;
            B[f] = B[f] - k*B[i];
            DisplayMatrix(A, B, n, m);
        //  save(A, B, n, m); //сохранение шага состояния на текущий момент.
            for (int j = i; j < n; j++)
            {
                A[f][j] = A[f][j] - A[i][j] * k;
            //  save(A, B, n, m); //сохранение шага состояния на текущий момент.
                DisplayMatrix(A, B, n, m);
            }
        }
    }
    cout << "\n" << "Конечная матрица: " << "\n" << endl;
    DisplayMatrix(A, B, n, m);
    for (int i = 0; i < n; i++)
    if (A[i][i] == 0)
    {
        cout << "Система не имеет решения. " << endl;
        cout << " Нажмите любую клавишу для выхода... ";
        exit(1);
    }
 
    double s = 0;//находим x
    for (int i = 0; i<n; i++) x[i] = 0;
    for (int i = n - 1; i >= 0; i--)
    {
        s = B[i];
        for (int j = n - 1; j>i; j--) s -= x[j] * A[i][j];
        x[i] = s / A[i][i];
    }
 
    for (int i = 0; i < n; i++)
    {
        cout << " x " << i + 1 << " = ";
        cout << x[i];
        cout << " ";
        cout << endl << endl;
    }
    for (int i = 0; i < n; i++)
        delete[]A[i];
    delete[]A;
    delete[]B;
    delete[]x; //если очистим тогда, при пошаговом режими в конце не будет ответа.
}
 
int main()
{
    int n, m;
    setlocale(LC_ALL, "Russian");
    cout << " Для тестирования вы можете использовать  следующий пример: " << endl;
    cout << "\n" << " 3x + " << "2y - " << "5z = " << "-1 " << endl;
    cout << " 2x - " << "y + " << "3z = " << "13 " << endl;
    cout << " x + " << "2y - " << "z = " << "9 " << "\n" << endl;
    cout << " Правильные  ответы: x = 3, y = 5, z = 4. " << "\n" << endl;
    cout << " Размер матрицы вводить: 3х3. " << "\n" << endl;
    cout << "\n" << " Введите размерность матрицы NxM " << endl;
 
    cout << " n= ";
 
    while (true) // проверка на корректность
    {
        cin >> n;
        if (cin.good())
        {
            cin.ignore(10, '\n');
            break;
        }
        cin.clear();
        cerr << " Неправильный ввод данных " << endl;
        cin.ignore(10, '\n');
        cerr << " Введите n заного: ";
    }
    cout << " m= ";
    while (true) // проверка на корректность
    {
        cin >> m;
        if (cin.good())
        {
            cin.ignore(10, '\n');
            break;
        }
        cin.clear();
        cerr << " Неправильный ввод данных " << endl;
        cin.ignore(10, '\n');
        cerr << " Введите m заного: ";
    }
    double **A = new double *[n], *B = new double[n], *x = new double[n]; //инициализация динамических массивов
    for (int i = 0; i < n; i++)
        A[i] = new double[m];
    
 
    cout << " Матрица загружена из файла. " << endl;
    MatrixFromFile(A, B, n, m);
    cout << "\n" << " Ваша матрица: " << "\n" << endl;
    DisplayMatrix(A, B, n, m);
    Gauss(A, B, x, n, m);
    _getch();
}

среда проектирование VS2013.
C++
1
2
3
4
5
    cout << " Для тестирования вы можете использовать следующий пример: " << endl;
    cout << "\n" << " 3x + " << "2y - " << "5z = " << "-1 " << endl;
    cout << " 2x - " << "y + " << "3z = " << "13 " << endl;
    cout << " x + " << "2y - " << "z = " << "9 " << "\n" << endl;
    cout << " Правильные ответы: x = 3, y = 5, z = 4. " << "\n" << endl;
суть в чем, у меня выходит так, смотрите, пожалуйста, скриншоты:
1)Решения СЛАУ методом Гаусса по шагу
2)Решения СЛАУ методом Гаусса по шагу
3) Решения СЛАУ методом Гаусса по шагу
4)Решения СЛАУ методом Гаусса по шагу

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