Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Акелла
Сонный металюга
45 / 45 / 6
Регистрация: 10.05.2009
Сообщений: 295
#1

реализация гаусса - C++

28.11.2009, 00:06. Просмотров 1337. Ответов 28
Метки нет (Все метки)

так люди - просить написать за меня не прошу - сам сделаю... у меня вот в чем загвоздка -
решил не искать легкий путей - пользователь задает какого будет размера матрица (тк. матрица квадратная N*N - задает N) - т.е. я под это дело динамически двумерный массив и пошел дальше...

ввод тоже реализовать хочу не от легкой жизни - но вот с ним и проблема - пользователь должен вводить коэффициенты при Х построчно - ну а прога уже сама из строки с пробелами выдирать числа - и тут загвоздка - числа то она выдирает - но почему то всю матрицу забивает только последней введеной строкой... вот ту я и не могу найти ошибку в своем решении....
в данном случае это реализуется в функции enter

исходник вот (к гаусу конкретно еще не приступал - пока только дорабатываю ввод матрицы)

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
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <conio.h>
 
//-------------------------------------------------------------------------------------------------------------------
 
double *fMatrix;    //массив - сама матрица как бы=)
//-------------------------------------------------------------------------------------------------------------------
 
int enterMatrix(void);  //функция ввода матрицы (изначальной)
int matrixMemmory(int iSize);   //функция выделения памяти под матрицу динамически исходя из запроса юзера
int enter(int N);   //функция ввода чисел в матрицу
int gauss(int iSize);   //функция метода гаусса
 
//------------------------------------------------------------------------------------------------------------------------------
 
int main()
{
    int iErr; //переменая ошибки
    printf("Hellow! It's a programm for Gauss SLAU method\n\n");
    
    //вызов процедуры ввода расширенной матрицы с обработкой ошибок
    iErr = enterMatrix();
    if(iErr != 0)
    {
        printf("Error - Main: enter mstrih - falled\n");
        _getch();
        exit(1);
    }
    return 0;
}
//-------------------------------------------------------------------------------------------------------------------
 
int matrixMemmory(int iSize)    //выделяем под нашу матрицу динамически память N строк и N+1 столбов 
{                               //она ведь должна быть расширенной для гаусса
    fMatrix = new double[iSize, iSize + 1];
    if(!fMatrix)
    {
        printf("Error - Matrix Memmory: Error of allocation of memory\n");
        return(-1);
    }
    return(0);
}
 
//------------------------------------------------------------------------------------------------------------------------
 
int enter(int N)
{
    int i, j;
    char *pchTempBuf;   //временный буфер
 
    //создаем одномерныйm массив равный длинне строки матрицы
    pchTempBuf = (char *)calloc((N*N), sizeof(char));
    if(!pchTempBuf)
    {
        printf("Error - Enter: allocate memmory for TempBuf\n");
        _getch();
        exit(1);
    }
 
    //начинаем ввод коэффициентов в матрицу
    for(j=0; j < N; j++)
    {
        fgets(pchTempBuf, N*N, stdin);  //читаем с клавиатуры во временый буфер строку чтоб потом из нее выдрать коэфициенты
 
        char *end, *start = pchTempBuf;
        end = start;
        //выбираем из буфера числа, преобразуем в флоат и записываем в матрицу
        for(i=0; i < (N+1); i++)
        {
            fMatrix[j, i] = strtod(start, &end);
            start = end;
            //пропускаем символы не входящие в числа
            while( !isdigit (*start) && *start) start++;
 
        }
        
    }
        
 
    return(0);
}
 
 
 
//-----------------------------------------------------------------------------------------------------------------------------------
 
int enterMatrix(void)
{
    int iSizeCount = 0;
    int iErr; //переменая ошибки
    
    printf("Enter size of your matrix \n (The quantity the equation should be equal to quantity of unknown persons)");
    printf("\n Size of Matrix: ");
    scanf("%i",&iSizeCount);
    printf("\n");
 
    //выделяем память под матричку
    iErr = matrixMemmory(iSizeCount);
    if (iErr != 0)
    {
        printf("Error - Enter Matrix: Something with memory allocation\n");
        _getch();
        exit(1);
    }
    
    //шпаргалка как вводить матричку
    printf("We start to enter values of factors of their equations - \n i.e. we set a matrix in a kind: \n\n");
    printf("Any your equation looks like: \n\n");
    printf("\t A11*X1 + A12*X2+...+A1n*Xn = B1\n");
    printf("\t A21*X1 + A22*X2+...+A2n*Xn = B2\n");
    printf("\t --------------------------------\n");
    printf("\t Am1*X1 + Am2*X2+...+Amn*Xn = Bm\n\n");
    printf("You enter only factors at X i.e. all A and free factors, i.e. all B\n\n");
 
    //запускаем функцию ввода значений в матрицу
    iErr = enter(iSizeCount);
    if (iErr != 0)
    {
        printf("Error - Enter Matrix: Something with return from simple input\n\n");
        _getch();
        exit(1);
    }
 
    //контрольный вывод матрицы
    printf("Your matrix: \n");
 
    for(int j=0; j < iSizeCount; j++)
    {
        for(int i=0; i < (iSizeCount+1); i++)
        {
            printf("%.2f ", fMatrix[j,i]);
        }
        printf("\n");
    }
    printf("Press ENTER to continue");
    _getch();
 
    return(0);
}
Добавлено через 1 час 5 минут
ммм... ну, наши великие метры - укажите мне на мою маленькую глупость?=)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.11.2009, 00:06
Здравствуйте! Я подобрал для вас темы с ответами на вопрос реализация гаусса (C++):

Реализация кода Гаусса(почти реализован ). - C++
Добрый день. Поздравляю всех с наступающим новым годом! Понимаю, все заняты., дела, дела, дела.. Совсем недавно Я таки смог реализовать...

метод Гаусса - C++
Помогите пожалуйста написать программу на С++ Задана система линейного уравнения:MA*X=B. Для решения уравнения использовать метод Гаусса

Метод Гаусса - C++
Как решить квадратную матрицу методом Гаусса, я ее привел к треугольному виду, не могу понять как дальше быть....

метод гаусса - C++
Помогите,пожалуйста Преподаватель попросил расписать программу по блокам #include &quot;stdio.h&quot; #include &quot;conio.h&quot; #include...

Метод Гаусса - C++
В школе задали написать программу , которая решает систему уравнений методом Гаусса. Матрица квадратная (колличество строк = колличеству...

Метод Гаусса - C++
Суть в том что бы СЛАУ методом Гаусс с последовательным исключениям неизвестных.Вот система: 2.7x+3.3y+1.3z=2.1 3.5x-1.7y+2.8z=1.7 ...

28
Gravity
564 / 558 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
28.11.2009, 01:29 #2
C++
1
fMatrix[j, i] = strtod(start, &end);
Это че за паскаль в 73й строке?
0
Акелла
Сонный металюга
45 / 45 / 6
Регистрация: 10.05.2009
Сообщений: 295
28.11.2009, 01:31  [ТС] #3
хахахах=)) это не паскаль=))) это старая добрая функция - из строки в значение double.. у шилда скопипастил
0
Gravity
564 / 558 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
28.11.2009, 01:33 #4
Я про индексацию матрицы.
0
Акелла
Сонный металюга
45 / 45 / 6
Регистрация: 10.05.2009
Сообщений: 295
28.11.2009, 01:35  [ТС] #5
а я вот сам офигел когда обнаружил - это майкрософт так выпендрились - в борланде и gcc идет
матрица[][] а у этих - так (двумерная)... короче - в таком плане - работает. а если ставить классически - вижуалка ругается
0
Gravity
564 / 558 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
28.11.2009, 01:41 #6
Ну так, правильно, что ругается. Указатель на двумерный массив (матрицу) должен быть двойным, а у тебя одинарный.
0
Акелла
Сонный металюга
45 / 45 / 6
Регистрация: 10.05.2009
Сообщений: 295
28.11.2009, 01:42  [ТС] #7
если ты имеешь ввиду **матрица - пробовал. не помогает.. либо я оочень косячно пробовал.
а такая схемка - как ни странно ест.. хотя....может в ней и запарка - напиши кусочек как ты имеешь ввиду - я потестю..
0
Gravity
564 / 558 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
28.11.2009, 01:47 #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
int main()
{
    double **matrix;
    const int n = 5, m = 8;
    int i;
 
    // выделение памяти под матрицу
    matrix = new double*[n];
    for(i = 0; i < n; i++)
        matrix[i] = new double[m];
 
    // работаем дальше
    
    return 0;
}
1
Акелла
Сонный металюга
45 / 45 / 6
Регистрация: 10.05.2009
Сообщений: 295
28.11.2009, 01:59  [ТС] #9
ругаться не стал на изменения в таком случае но теперь полезла фигня с strtod(start, &end)

какое то там необработанное исключение=)) причем это не компилятор - скомпилил и запустил=) это уже после ввода матрицы=)))
0
Gravity
564 / 558 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
28.11.2009, 02:21 #10
Немного подредактированный вариант, код работает, но все равно страшен)) getch'и я у себя убрал.
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
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
 
//-------------------------------------------------------------------------------------------------------------------
 
double **fMatrix;    //массив - сама матрица как бы=)
//-------------------------------------------------------------------------------------------------------------------
 
int enterMatrix(void);  //функция ввода матрицы (изначальной)
int matrixMemmory(int iSize);   //функция выделения памяти под матрицу динамически исходя из запроса юзера
int enter(int N);       //функция ввода чисел в матрицу
int gauss(int iSize);   //функция метода гаусса
 
//------------------------------------------------------------------------------------------------------------------------------
 
int main()
{
    int iErr; //переменая ошибки
    printf("Hellow! It's a programm for Gauss SLAU method\n\n");
    
    //вызов процедуры ввода расширенной матрицы с обработкой ошибок
    iErr = enterMatrix();
    if(iErr != 0)
    {
        printf("Error - Main: enter mstrih - falled\n");
        
        exit(1);
    }
    return 0;
}
//-------------------------------------------------------------------------------------------------------------------
 
int matrixMemmory(int iSize)    //выделяем под нашу матрицу динамически память N строк и N+1 столбов 
{                                   //она ведь должна быть расширенной для гаусса
    fMatrix = new double*[iSize];
    for(int i = 0; i < iSize; i++)
        fMatrix[i] = new double[iSize+1];
        
    if(!fMatrix)
    {
        printf("Error - Matrix Memmory: Error of allocation of memory\n");
        return(-1);
    }
    return(0);
}
 
//------------------------------------------------------------------------------------------------------------------------
 
int enter(int N)
{
    int i, j;
    char *pchTempBuf;       //временный буфер
 
    //создаем одномерныйm массив равный длинне строки матрицы
    pchTempBuf = (char *)calloc((N*N), sizeof(char));
    if(!pchTempBuf)
    {
        printf("Error - Enter: allocate memmory for TempBuf\n");
        
        exit(1);
    }
 
    //начинаем ввод коэффициентов в матрицу
    for(j=0; j < N; j++)
    {
        fgets(pchTempBuf, N*N, stdin);  //читаем с клавиатуры во временый буфер строку чтоб потом из нее выдрать коэфициенты
 
        char *end, *start = pchTempBuf;
        end = start;
        //выбираем из буфера числа, преобразуем в флоат и записываем в матрицу
        for(i=0; i < (N+1); i++)
        {
            fMatrix[j][i] = strtod(start, &end);
            start = end;
            //пропускаем символы не входящие в числа
            while( !isdigit (*start) && *start) start++;
 
        }
        
    }
        
 
    return(0);
}
 
 
 
//-----------------------------------------------------------------------------------------------------------------------------------
 
int enterMatrix(void)
{
    int iSizeCount = 0;
    int iErr; //переменая ошибки
    
    printf("Enter size of your matrix \n (The quantity the equation should be equal to quantity of unknown persons)");
    printf("\n Size of Matrix: ");
    scanf("%i",&iSizeCount);
    printf("\n");
 
    //выделяем память под матричку
    iErr = matrixMemmory(iSizeCount);
    if (iErr != 0)
    {
        printf("Error - Enter Matrix: Something with memory allocation\n");
        
        exit(1);
    }
    
    //шпаргалка как вводить матричку
    printf("We start to enter values of factors of their equations - \n i.e. we set a matrix in a kind: \n\n");
    printf("Any your equation looks like: \n\n");
    printf("\t A11*X1 + A12*X2+...+A1n*Xn = B1\n");
    printf("\t A21*X1 + A22*X2+...+A2n*Xn = B2\n");
    printf("\t --------------------------------\n");
    printf("\t Am1*X1 + Am2*X2+...+Amn*Xn = Bm\n\n");
    printf("You enter only factors at X i.e. all A and free factors, i.e. all B\n\n");
 
    //запускаем функцию ввода значений в матрицу
    iErr = enter(iSizeCount);
    if (iErr != 0)
    {
        printf("Error - Enter Matrix: Something with return from simple input\n\n");
        
        exit(1);
    }
 
    //контрольный вывод матрицы
    printf("Your matrix: \n");
 
    for(int j=0; j < iSizeCount; j++)
    {
        for(int i = 0; i < iSizeCount + 1; i++)
        {
            printf("%.2f ", fMatrix[j][i]);
        }
        printf("\n");
    }
    printf("Press ENTER to continue");
    
 
    return(0);
}
0
Акелла
Сонный металюга
45 / 45 / 6
Регистрация: 10.05.2009
Сообщений: 295
28.11.2009, 02:28  [ТС] #11
я гетчи для отладки ставил.. а то проскакивал экран консоли - закрывался...
щас посмотрим - а почему страшен?
0
Gravity
564 / 558 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
28.11.2009, 02:33 #12
Цитата Сообщение от Акелла Посмотреть сообщение
почему страшен?
new из плюс-плюса, остальное из си, на чем пишем в итоге не понятно. Для фиксации ошибок выделения памяти можно сделать одну функцию и не проверять каждый раз возвращаемое значение.
0
Акелла
Сонный металюга
45 / 45 / 6
Регистрация: 10.05.2009
Сообщений: 295
28.11.2009, 02:39  [ТС] #13
объясняется оч просто=))) я начинал изучение с Си, а щас потихоньку переползаю на С++ совмещая по мере надобности=)))

а функцию одну я сделаю - я эту прогу сначала напишу - вставлю измерение времени выполнения.. замерю.. потом начну оптимизировать по всякому=))) - лаба такая=)

Добавлено через 4 минуты
отлично косячить почти перестал.. теперь только какого то фига делает "сдвиг" - т.е. значения в матричку он заносит верно но почему то не с 1-ой строки а со второй..хм....
Gravity, по доброте душевной - с этим косячком не поможешь?=) коль нет - буду завтра сам ковырять
0
Gravity
564 / 558 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
28.11.2009, 02:48 #14
Цитата Сообщение от Акелла Посмотреть сообщение
теперь только какого то фига делает "сдвиг" - т.е. значения в матричку он заносит верно но почему то не с 1-ой строки а со второй..хм....
Вот из-за этого индусского кода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        //начинаем ввод коэффициентов в матрицу
        for(j=0; j < N; j++)
        {
                fgets(pchTempBuf, N*N, stdin);  //читаем с клавиатуры во временый буфер строку чтоб потом из нее выдрать коэфициенты
 
                char *end, *start = pchTempBuf;
                end = start;
                //выбираем из буфера числа, преобразуем в флоат и записываем в матрицу
                for(i=0; i < (N+1); i++)
                {
                        fMatrix[j, i] = strtod(start, &end);
                        start = end;
                        //пропускаем символы не входящие в числа
                        while( !isdigit (*start) && *start) start++;
 
                }
                
        }
Заполняй ячейки матрицы напрямую, а не выдерай из строки.
0
Акелла
Сонный металюга
45 / 45 / 6
Регистрация: 10.05.2009
Сообщений: 295
28.11.2009, 02:49  [ТС] #15
ну пусть код даже и индийский - учитсья же надо.. да думаю ты прав - так и сделаю...
просто ввод будет более муторным тогда=)
0
28.11.2009, 02:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2009, 02:49
Привет! Вот еще темы с ответами:

Метод Гаусса - C++
Добрый вечер, можете написать программу для решения СЛАУ методом гаусса на Си, чтобы был прямой и обратный ход.

метод Гаусса - C++
дана система линейных уравнений, в графическом режиме надо написать программу. Не понимаю как, помогите. в системе 4 уравнения

Метод Гаусса в С++ - C++
Подскажите please, как запустить эту программу, через C++??? Решение системы линейных уравнений методом Гаусса. #include&lt;io.h&gt; ...

Метод Гаусса - C++
Всем привет. Ребят, что скажите по поводу такой реализации метода Гаусса: #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;math.h&gt;...


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

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

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