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

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

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

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

28.11.2009, 00:06. Просмотров 1283. Ответов 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 минут
ммм... ну, наши великие метры - укажите мне на мою маленькую глупость?=)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.11.2009, 00:06     реализация гаусса
Посмотрите здесь:

Метод Гаусса в С++ C++
Метод Гаусса C++
C++ Метод Гаусса
C++ Реализация кода Гаусса(почти реализован ).
Метод Гаусса C++
C++ метод гаусса
C++ Метод Гаусса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Gravity
557 / 551 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
28.11.2009, 01:29     реализация гаусса #2
C++
1
fMatrix[j, i] = strtod(start, &end);
Это че за паскаль в 73й строке?
Акелла
Сонный металюга
45 / 45 / 6
Регистрация: 10.05.2009
Сообщений: 295
28.11.2009, 01:31  [ТС]     реализация гаусса #3
хахахах=)) это не паскаль=))) это старая добрая функция - из строки в значение double.. у шилда скопипастил
Gravity
557 / 551 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
28.11.2009, 01:33     реализация гаусса #4
Я про индексацию матрицы.
Акелла
Сонный металюга
45 / 45 / 6
Регистрация: 10.05.2009
Сообщений: 295
28.11.2009, 01:35  [ТС]     реализация гаусса #5
а я вот сам офигел когда обнаружил - это майкрософт так выпендрились - в борланде и gcc идет
матрица[][] а у этих - так (двумерная)... короче - в таком плане - работает. а если ставить классически - вижуалка ругается
Gravity
557 / 551 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
28.11.2009, 01:41     реализация гаусса #6
Ну так, правильно, что ругается. Указатель на двумерный массив (матрицу) должен быть двойным, а у тебя одинарный.
Акелла
Сонный металюга
45 / 45 / 6
Регистрация: 10.05.2009
Сообщений: 295
28.11.2009, 01:42  [ТС]     реализация гаусса #7
если ты имеешь ввиду **матрица - пробовал. не помогает.. либо я оочень косячно пробовал.
а такая схемка - как ни странно ест.. хотя....может в ней и запарка - напиши кусочек как ты имеешь ввиду - я потестю..
Gravity
557 / 551 / 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;
}
Акелла
Сонный металюга
45 / 45 / 6
Регистрация: 10.05.2009
Сообщений: 295
28.11.2009, 01:59  [ТС]     реализация гаусса #9
ругаться не стал на изменения в таком случае но теперь полезла фигня с strtod(start, &end)

какое то там необработанное исключение=)) причем это не компилятор - скомпилил и запустил=) это уже после ввода матрицы=)))
Gravity
557 / 551 / 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);
}
Акелла
Сонный металюга
45 / 45 / 6
Регистрация: 10.05.2009
Сообщений: 295
28.11.2009, 02:28  [ТС]     реализация гаусса #11
я гетчи для отладки ставил.. а то проскакивал экран консоли - закрывался...
щас посмотрим - а почему страшен?
Gravity
557 / 551 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
28.11.2009, 02:33     реализация гаусса #12
Цитата Сообщение от Акелла Посмотреть сообщение
почему страшен?
new из плюс-плюса, остальное из си, на чем пишем в итоге не понятно. Для фиксации ошибок выделения памяти можно сделать одну функцию и не проверять каждый раз возвращаемое значение.
Акелла
Сонный металюга
45 / 45 / 6
Регистрация: 10.05.2009
Сообщений: 295
28.11.2009, 02:39  [ТС]     реализация гаусса #13
объясняется оч просто=))) я начинал изучение с Си, а щас потихоньку переползаю на С++ совмещая по мере надобности=)))

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

Добавлено через 4 минуты
отлично косячить почти перестал.. теперь только какого то фига делает "сдвиг" - т.е. значения в матричку он заносит верно но почему то не с 1-ой строки а со второй..хм....
Gravity, по доброте душевной - с этим косячком не поможешь?=) коль нет - буду завтра сам ковырять
Gravity
557 / 551 / 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++;
 
                }
                
        }
Заполняй ячейки матрицы напрямую, а не выдерай из строки.
Акелла
Сонный металюга
45 / 45 / 6
Регистрация: 10.05.2009
Сообщений: 295
28.11.2009, 02:49  [ТС]     реализация гаусса #15
ну пусть код даже и индийский - учитсья же надо.. да думаю ты прав - так и сделаю...
просто ввод будет более муторным тогда=)
Gravity
557 / 551 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
28.11.2009, 02:56     реализация гаусса #16
Цитата Сообщение от Акелла Посмотреть сообщение
учитсья же надо..
Не спорю
Ввод как раз наборот сократится до вызова scanf (или std::cin).
Акелла
Сонный металюга
45 / 45 / 6
Регистрация: 10.05.2009
Сообщений: 295
28.11.2009, 03:08  [ТС]     реализация гаусса #17
нет я имел ввиду что не ввод сократиться в плане кода а в плане для юзера.. хотя кстати - я тот свой индуский код оставлю для препода - типо прога до и прога после - этот пункт отмечу ка..эм.. оптимизация алгоритмическая - т.е. выбран менее трудоемкий алгоритм

незря же я его выдумывал стока=)

Добавлено через 10 минут
так... сразу - вопрос такой - если применять scanf к такому массиву - его задавтаь как
C++
1
scanf("%f", &matrix);
?

или надо 2 имперсанта ставить?
Gravity
557 / 551 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
28.11.2009, 03:12     реализация гаусса #18
C
1
scanf("%lf", &matrix[i][j]);
Акелла
Сонный металюга
45 / 45 / 6
Регистрация: 10.05.2009
Сообщений: 295
28.11.2009, 03:15  [ТС]     реализация гаусса #19
то ли я реально индус по натуре... то ли руки не туда пришили.. то ли спать пора идти а не кодить до утра... вот смотри - ввод идет:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
for(j=0; j < N; j++)
    {
        printf("Enter elements of %i line\n", j+1);
 
        for(i=0; i < (N); i++)
        {
            printf("\tA[%i][%i]= ", j+1, i+1);
            scanf("%f", &fMatrix[j][i]);
 
        }
        printf("\tB[%i]= ", j+1);
        scanf("%f", &fMatrix[j][i]);
    }
все эти +1 в принтф - для красоты отображения...

вот вывод:
C++
1
2
3
4
5
6
7
8
9
10
11
//контрольный вывод матрицы
    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");
    }
ввожу размер 3, матрица
1 2 3 4
1 2 3 4
1 2 3 4

а получаю такую ахинею... шо ппц
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2009, 03:21     реализация гаусса
Еще ссылки по теме:

C++ Метод Гаусса
Метод Гаусса C++
Метод Гаусса C++
фильтр Гаусса C++
C++ Метод Гаусса

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

Или воспользуйтесь поиском по форуму:
Gravity
557 / 551 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
28.11.2009, 03:21     реализация гаусса #20
%f это для float, для double %lf.
Yandex
Объявления
28.11.2009, 03:21     реализация гаусса
Ответ Создать тему
Опции темы

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