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

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

Войти
Регистрация
Восстановить пароль
 
Lintu
0 / 0 / 0
Регистрация: 16.11.2012
Сообщений: 11
#1

Странный цикл. Программа вычисляет детерминант по алгоритму Барейса. - C++

16.11.2012, 02:36. Просмотров 1003. Ответов 4
Метки нет (Все метки)

Привет, форумчане! Надеюсь на вашу помощь, чтоб понять следующую странность в моей программе..
Программа вычисляет детерминант по алгоритму Барейса, простой алгоритм, почти тот же алгоритм гаусса, но без деления приводящего к накапливанию погрешности. Сразу замечу, что программа не доделана для случая нулей на диагонали, кроме самого первого элемента на диагонали. Меня смущает "тройной" цикл, приводящий матрицу к треугольному виду, этот цикл начинается с 33й строки. Дело в том, что не все элементы изменяются, а должны! Уже и отладку делала, и вручную на листочке трассировку, и все по отдельности перепроверяла, ничего.
Простейший пример, ввожу
1 2
3 4
Вывод:
1 2
0 4
Т е четверка не заменилась на -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
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
#include <iostream>
#include <conio.h>
using namespace std;
void swap(int*, int*, int); //эта функция меняет строки местами(работает)
 
 int main()
 
 {
     int i,j,k,A;
     //Вводим "хорошую" размерность и сообщаем о ней пользователю
    char a;
    cout << "Введите размерность массива: ";
    do {a = getch();} while ((a < '1')||(a > '9'));
    cout << a << "x" << a << endl;
    //Объявляем массив нужной размерности
    int n=a;
    n-=48; //У нас в n был ascii код символа цифры..
    int Mas[n][n];
    //Вводим массив с клавиатуры
    for (i=0; i<n; i++){
        for (j=0; j<n; j++)
        {cin >> Mas[i][j];}}
    //Если 1й диагональный элемент равен нулю
    if (!Mas[0][0]){
                    i=0;   //счетчик
                    j=0;   //номер строки с первым ненулевым элементом
                    do { if (Mas[i][0]) j=i; i++;} while((!Mas[i-1][0])&&(i<n));
                    
                    if (!j) {cout << "Определитель равен: 0"; getch(); return(0);};
                    swap(&Mas[0][0],&Mas[j][0],n);
                 }
    //Приводим к треугольному виду(j-идем по столбцам, i-идем по строкам, k-идем по элементам строки)
    for(j=0; j<n-1; j++){
            if (!j) A=1; else A=Mas[j-1][j-1];
            for(i=j+1; i<n; i++){
                        for(k=0; k<n; k++){
                                Mas[i][k]=(Mas[i][k]*Mas[j][j]-Mas[i-1][k]*Mas[i][j])/A;
                                          }
                                }
                        }
    
    //Выводим детерминант
    cout << Mas[n-1][n-1] << endl;
    
    
    
    
    //Выводим массив
    for (int i=0; i<n; i++){
        for (int j=0; j<n; j++)
        {cout << Mas[i][j] << "  ";}
        cout << endl;}
        
    getch();
 }
//==============================================================================
void swap(int* a, int* b, int n){
     int temp;
     for (int i=0; i<n; i++, *a++, *b++){
         temp=*a;
         *a=*b;
         *b=temp;
     }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.11.2012, 02:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Странный цикл. Программа вычисляет детерминант по алгоритму Барейса. (C++):

Странный цикл for - C++
А есть ли в природе компиляторы, которые пропускают вот такой код: array&lt;int, 3&gt; arr = {9, 8, 7}; cout &lt;&lt; &quot;Array size = &quot; &lt;&lt;...

Странный цикл for С++ - C++
Добрый день, ув. форумчане! Перехожу сейчас с Делфи на С++ и разбираюсь в сложнястях синтаксиса С++. Непонятно, что означает такая...

Странный цикл for и значение y в итоге - C++
Ребят подскажите какого буде значение переменной y после выполнения кода: int x=0,y=0; for (++x;++x;++x) y+=++x&amp;1; Пытался...

Программа проверки простоты по алгоритму - C++
Алгоритм описан ниже на фото , нужно чтоб пользователь вводил число n и программа проверяла &quot;простое&quot; или &quot;составное число&quot; и выводила...

Цикл по готовому алгоритму - MathCAD
Помогите с написанием цикла, ни как не могу разобраться с местным синтаксисом для программирования в MathCAD. В общем есть алгоритм...

Странный цикл forEach! - JavaScript
3 студента не могут понять 1 маленький код. var array = ; var counts = {}; array.forEach(function(x) { counts = (counts || 0)+1;...

4
Байт
Нарушитель
Эксперт C
16672 / 10933 / 1674
Регистрация: 24.12.2010
Сообщений: 21,305
16.11.2012, 13:11 #2
Цитата Сообщение от Lintu Посмотреть сообщение
33: for(j=0; j<n-1; j++){
А не j<n ?
В твоей редакции при n=2 цикл выполняется всего 1 раз!
0
Lintu
0 / 0 / 0
Регистрация: 16.11.2012
Сообщений: 11
16.11.2012, 13:14  [ТС] #3
Цитата Сообщение от Байт Посмотреть сообщение
А не j<n ?
Ну а что нам в последнем столбце обнулять?


Цитата Сообщение от Байт Посмотреть сообщение
В твоей редакции при n=2 цикл выполняется всего 1 раз!
Я отладкой проверяла, и второй раз цикл проходил, честное слово)
Я говорю о цикле по k
0
Байт
Нарушитель
Эксперт C
16672 / 10933 / 1674
Регистрация: 24.12.2010
Сообщений: 21,305
16.11.2012, 13:45 #4
Цитата Сообщение от Lintu Посмотреть сообщение
Ну а что нам в последнем столбце обнулять?
Твоя правда!
Но вот я руками прокрутил цикл по твоей матрице 2х2
C
1
2
3
4
5
6
7
8
9
10
11
12
    //Приводим к треугольному виду(j-идем по столбцам, i-идем по строкам, k-идем по элементам строки)
    for(j=0; j<n-1; j++) {
      if (!j) A=1;     // j=0, A=1
      else A=Mas[j-1][j-1];
      for(i=j+1; i<n; i++){  // i=1
        for(k=0; k<n; k++){
           Mas[i][k]=(Mas[i][k]*Mas[j][j]-Mas[i-1][k]*Mas[i][j])/A;
        }
        // k=0 M10 = (M10*M00 - M00*M10) = 3*1 - 1*3 = 0  M10 =0 (стал!)
        // k=1 M11 = M11*M00 - M01*M10 = 4*1 - 2*0 = 4 !!!       
      }
    }
Т.е. зачем здесь вообще фигурирует Mas[i][j] ? Немного с индексами напутала...

Добавлено через 49 секунд
Если я не ошибся опять...
1
Lintu
0 / 0 / 0
Регистрация: 16.11.2012
Сообщений: 11
16.11.2012, 13:51  [ТС] #5
Цитата Сообщение от Байт Посмотреть сообщение
Если я не ошибся опять...
Не ошибся! Точно, не учла что Mas[i][j] меняется раньше, чем еще может мне пригодится, надо будет скопировать и использовать в другой переменной. Спасибо тебе огромнющее!
0
16.11.2012, 13:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2012, 13:51
Привет! Вот еще темы с ответами:

Программа по алгоритму - Pascal ABC
Необходимо сделать программу по алгоритму который на фото. Я сам пытался сделать, но из за не хватки знаний не получается доделать

Программа по алгоритму - C++/CLI WinForms
Всем привет! Помогите пожалуйста написать программу по алгоритму. Итоговые значения высчитываются по формулам: {R}_{1}=\frac{{S}_{1}}{T} ...

Программа по генетическому алгоритму - Delphi
Вопрос по коду программы по генетическому алгоритму. Можно ли как-то увеличить количество переменных для исследуемой функции? Добавляю...

Программа, заменяющая A на B по алгоритму - PascalABC.NET
Здравствуйте! Необходимо создать не очень трудную программку, которая возможна принесет пользу не только мне :) Описание ниже: ...


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

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

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