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

Странное поведение функции - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Напишите рекурсивную функцию, которая возводит число в степень путем многократного умножения числа на самое себя http://www.cyberforum.ru/cpp-beginners/thread1074262.html
Доброе время суток! Напишите рекурсивную функцию, которая возводит число в степень путем многократного умножения числа на самое себя, т.е. если число равно два, а степень 4, то функция должна возвратить значение 16. C ув. Andyshon98!
C++ Обратная польская запись.написал программу по алгоритму.Нужно кое-что изменить Преподаватель дал мне "алгоритм" и сказал написать программу по этому алгоритму. "Алгоритм":Нам понадобится стек для переменных типа char, т.к. исходное выражение мы получаем в виде строки. Рассматриваем поочередно каждый символ: 1. Если этот символ - число (или переменная), то просто помещаем его в выходную строку. 2. Если символ - знак операции (+, -, *, / ), то проверяем приоритет данной... http://www.cyberforum.ru/cpp-beginners/thread1074256.html
найдите сумму элементов одномерного массива,расположенных после минимального значения C++
найдите сумму элементов одномерного массива,расположенных после минимального значения
C++ Указатель на имя файла как аргумент функции. Как реализовать?
Доброго времени суток всем! Прошу помощи! Написал программу, есть пару моментов, сложных для меня. Необходимо написать две функции, одну из которых я уже написал, но кое-чего не хватает (см. ниже) 1.void WriteComplex(char * fname, Complex * buffer, int count); – функция записывает count элементов типа Complex из массива buffer в файл с именем fname; - это я реализовал, единственное не...
C++ Описать структуру с именем OBMEN, содержащую следующие поля: http://www.cyberforum.ru/cpp-beginners/thread1074242.html
Описать структуру с именем OBMEN, содержащую следующие поля: -количество комнат; -этаж; -площадь; -адрес. Написать программу, которая обеспечивает: -начальное формирование базы данных; -вывод записей в упорядоченном по площади виде; -поиск в картотеке подходящего варианта: при равенстве количества комнат и этажа и различии площадей в пределах 10% соответствующая карточка выводится на...
C++ Составить программу, которая в зависимости от порядкового номера месяца выводит на экран количество дней в этом месяце Помогите, пожалуйста, решить задачу в С++. Составить программу, которая в зависимости от порядкового номера месяца выводит на экран количество дней в этом месяце (учесть високосный год или нет, проверить правильность ввода данных, если номер месяца введён неверно, завершить программу). подробнее

Показать сообщение отдельно
Beta1
0 / 0 / 0
Регистрация: 09.04.2013
Сообщений: 5
17.01.2014, 19:26     Странное поведение функции
Здравствуйте!
Я взялась за реализацию метода Крылова для нахождения коэффициентов характеристического полинома.
Написала программу, но беда: в функции VectorMultyplier() происходит странная штука.
Эта функция, как видно, использует написанную прежде void MatrixDegree(int degree), где вычисляется матрица RezA[i][j] (- степень d исходной матрицы A). Однако через пару строк, в цикле for(int j=0; j<N; j++) для d=4 элемент RezA[0][0] обнуляется.
Получается, что при вводе вектора (0.1, 0.4, 0.5, 0) сначала значения RezA при d=4:

2262 3979 3701 3844
3979 7106 6607 6804
3701 6607 6338 6300
3844 6804 6300 6553

а потом:

0 3979 3701 3844
3979 7106 6607 6804
3701 6607 6338 6300
3844 6804 6300 6553.

Подскажите, пожалуйста, в чем проблема? Заранее прошу прощения за нубовский код.

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
#include <iostream>
#include <iomanip>
#include <locale.h>
using namespace std;
 
const int N=4;
const int A[N][N] = {{2,1,3,2}, 
                     {1,5,4,3},
                     {3,4,1,5},
                     {2,3,5,3}};
double RezA[N][N];
double Y[N][N+1], Arr[N][N+1], x[N];
int i, j, k;
 
void VectorMultyplier();
void MatrixDegree(int degree);
void ArrLoad();
void Gauss();
 
int main () {
    setlocale(LC_ALL, "Russian");
    int point=0;
    do {
        //system("cls");
        cout << "Введите элементы вектора Y0:\n"; //Ввод вектора
        for(i=0; i<N; i++) {
            cout << "Y0["<<i<<"]="; cin >> Y[0][i];
        }
        VectorMultyplier();
        ArrLoad();
        Gauss();
        cout << "\n";
        system("pause");
        point ++;
    } while(point!=0);
    return 0;
}
 
void MatrixDegree(int degree) {
    double tmp;
    double A2[N][N];
 
    for(i=0; i<N; i++)
            for(j=0; j<N; j++) RezA[i][j]=A[i][j];
 
    for(int deg=1; deg<degree; deg++) {
        for(i=0; i<N; i++)
            for(j=0; j<N; j++) A2[i][j]=RezA[i][j];
 
        for(i=0; i<N; i++) {
            for(j=0; j<N; j++) {
                tmp=0.0;
                for(k=0; k<N; k++) {
                    tmp+=A[i][k]*A2[k][j];
                }
                RezA[i][j]=tmp;
            }
        }
    }
    for(i=0; i<N; i++) {
        for(j=0; j<N; j++)
            cout << RezA[i][j] << "  ";
        cout << "\n";
    }
}
 
void VectorMultyplier() {
        for(int d=1; d<N+1; d++) {
        MatrixDegree(d);
        
/*  for(i=0; i<N; i++) {
        for(j=0; j<N; j++)
            cout << RezA[i][j] << "  ";
        cout << "\n";
    }
*/
        for(int i=0; i<N; i++) {
            Y[d][i]=0; 
            for(int j=0; j<N; j++){
                //cout << RezA[i][j] << "  ";
                Y[d][i]=Y[d][i]+RezA[i][j]*Y[0][j];
            } //cout << "\n";
        }
    }
}
 
void ArrLoad() {
    int i, j, k=3;  
    for(i=0; i<N; i++)
        for(j=0; j<N; j++) {
            Arr[i][j]=Y[k-j][i];
            Arr[i][4]=-Y[4][i];
        }
}
 
void Gauss() {
    cout << "Исходная матрица для вычислений методом Гаусса: \n";
    for(i=0; i<N; i++) {
        for(j=0; j<N+1; j++)
            printf("%10.4f ", Arr[i][j]);
        cout <<"\n";
    }
    cout <<"\n";
    for(int n=1; n<=N-1; n++){
        for (i=n; i<N; i++) {
            for (j=n; j<N+1; j++){
                Arr[i][j]=Arr[i][j]-Arr[n-1][j]*Arr[i][n-1]/Arr[n-1][n-1];
            }
        Arr[i][n-1]=0;
        }
        cout << "Матрица на следующем шаге преобразований: \n";
        for(i=0; i<N; i++) {
            for(j=0; j<N+1; j++)
            printf("%10.4f ", Arr[i][j]);
            cout <<"\n";
        }
        cout << "\n";
    }
         /*Вычисление корней*/
         for (i=N-1; i>=0; i--){
             x[i]=Arr[i][N];
         for (j=i+1; j<N; j++){
             x[i]=x[i]-Arr[i][j]*x[j];
         }
             x[i]=x[i]/Arr[i][i];}    
         cout << "\n";
         cout << "Таким образом, коэффициенты характеристического полинома: \n";
         for(i=0; i<N; i++) cout << x[i] << "   ";
/*       for ( i = 0; i < N; i++ ) {
            cout << "x["<<i+1<<"]="<<x[i];
            cout << "\n";
         }
*/
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 10:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru