Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   программа на с++ (http://forum.oszone.net/showthread.php?t=207563)

Deniskach 25-05-2011 19:45 1682505

программа на с++
 
привет всем, есть код программы, но я не знаю что какая строка обозначает. если кто может, прокомментируйте пожалуйста каждую строку. заранее спасибо

Код:

#include <conio.h>
#include <math.h>
#include <stdio.h>

int main(void)
{int nn,i,j;
 printf("Dimension of the matrix (<=10):");
 scanf("%d", &nn);
 double A[10][10], L[10][10];
//Поэлементный ввод матрицы:
 for (i=0; i<nn; i++)
  for (j=0; j<nn; j++)
  { printf("\nElement [%d,%d]: ", i+1, j+1);
    float k;
    scanf("%f", &k);
    A[i][j] = k;
  }

 //Создание единичной матрицы:
 for (i=0; i<nn; i++)
  for (j=0; j<nn; j++) if (i!=j) L[i][j]=0; else L[i][j]=1;

 j = 0;
 int m=0;
 int n;
 do
  { // Выбор ведущего элемента ниже элемента [j,j-1]:
    m = j;
    for (n=j+1; n<nn; n++)
      if (fabs(A[m][j])<fabs(A[n][j])) m = n;
    double prm=0;

    //Переобразования над матрицей А:
    for (n=0; n<nn; n++)
 

    prm = A[j][j];
    for (n=0; n<nn; n++)
    { A[j][n] = double (A[j][n]/prm);
      L[j][n] = double (L[j][n]/prm);
    }
    for (i=0; i<=nn; i++)
      if (i!=j)
      { prm = A[i][j];
        for (n=j; n<=3; n++) A[i][n] = A[i][n]- double (prm*A[j][n]);
        for (n=0; n<=3; n++) L[i][n] = L[i][n]- double (prm*L[j][n]);
      }
    j++;
    }
  while (j<nn);

 //Вывод на экран обратной матрицы:
 printf("\nInverse matrix:\n");
 for (i=0; i<nn; i++)
  for (j=0; j<nn; j++)
  { if (j==0) printf("\n"); else printf("\t");
    printf("%f", L[i][j]);
  }
  getch();
}


Drongo 25-05-2011 21:09 1682561

Цитата:

Цитата Deniskach
если кто может, прокомментируйте пожалуйста каждую строку »

А что делает программа?

lxa85 26-05-2011 00:36 1682689

Завтра вечером, от нечего делать, и если не опередят, распишу.
Хотя код достаточно прозрачен.
Задаются матрицы, формируется единичная матрица (по комментариям) затем над ними производятся какие-то поэлементные действия. Правда, если вглядеться, хлабудень какая-то делается.
Поддерживаю вопрос Drongo,
Цитата:

Цитата Drongo
А что делает программа? »

Без этого сложно понять, правильно работает программа или нет.

Deniskach 26-05-2011 10:07 1682810

программа решает задачу, в которой требуется из квадратной матрицы найти обратную. правильность вычисления проветить путем умножения (должна получится единичная матрица)
не спорю воды много, но компилятор dev-с++ 4.9.9.2 не ругается)))
большое спасибо за уделенное внимание

Drongo 26-05-2011 17:23 1683157

Цитата:

Цитата Deniskach
программа решает задачу, в которой требуется из квадратной матрицы найти обратную. правильность вычисления проветить путем умножения (должна получится единичная матрица)
не спорю воды много, но компилятор dev-с++ 4.9.9.2 не ругается))) »

Я почему спросил, что делает программа, ведь если вы автор кода, что мешает самому откомментировать код?

mrcnn 26-05-2011 18:28 1683204

Цитата:

printf("\nElement [%d,%d]: ", i+1, j+1);
Это ошибка - нет смысла добавлять единицы к счетчикам.

Код:

//Поэлементный ввод матрицы:
 for (i=0; i<nn; i++) // цикл по строке (столбцу)
  for (j=0; j<nn; j++) // цикл по столбцу (строке)
  { printf("\nElement [%d,%d]: ", i+1, j+1); //Ошибка.
    float k; // объявление перемнной типа float
    scanf("%f", &k); // считать с консоли число с плавающей точкой k
    A[i][j] = k; //элемент матрицы
  }

Код:

//Создание единичной матрицы:
 for (i=0; i<nn; i++)
  for (j=0; j<nn; j++)
if (i!=j)  // если элемент не на диагонали
L[i][j]=0;  то присвоить ему значение 0
else  // если элемент на главной диагонали
L[i][j]=1; //то присвоить ему значение 1

Код:

//Переобразования над матрицей А:
    for (n=0; n<nn; n++)

левый код - не нужен

Код:

j = 0;
 int m=0;
 int n;
 do // цикл по строке(столбцу)
  { // Выбор ведущего элемента ниже элемента [j,j-1]:
    m = j; // m=номер строки (столбца)
    for (n=j+1; n<nn; n++) // цикл по столбцу (строке)
      if (fabs(A[m][j])<fabs(A[n][j])) m = n; // сравнение элементов и выбор максимального. m - номер максимального элемента в столбце(строке)
    double prm=0;

    //Переобразования над матрицей А:
    for (n=0; n<nn; n++) //ненужный левый код
 

    prm = A[j][j];// элемент главной диагонали
    for (n=0; n<nn; n++) // цикл по столбцу(строке)
    { A[j][n] = double (A[j][n]/prm); // деление элементов столбца(строки) на элемент стобца(строки), находящийся на главной диагонали
      L[j][n] = double (L[j][n]/prm);
    }
    for (i=0; i<=nn; i++) // цикл по строке
      if (i!=j) //если элемент не на главной диагонали
      { prm = A[i][j]; // присвоение элемента  строки(столбца)
        for (n=j; n<=3; n++)  //откуда взялась константа 3? возможно неправильный код. Какой метод используется?
                A[i][n] = A[i][n]- double (prm*A[j][n]);
        for (n=0; n<=3; n++)
                L[i][n] = L[i][n]- double(prm*L[j][n]);
      }
    j++; //увеличили номер строки (столбца)
    }
  while (j<nn); /


Glorh 26-05-2011 18:55 1683214

Цитата:

Цитата mrcnn
printf("\nElement [%d,%d]: ", i+1, j+1); »

Вообще-то, ИМХО, это для вывода привычной обычному человеку нумерации (не с нуля, как в си, а с 1). Так что ошибки здесь нет.

Deniskach 26-05-2011 19:41 1683238

всем большое спасибо.
printf("\nElement [%d,%d]: ", i+1, j+1); Все верно, эта строка для упрощения пониманияо каком столбце и строке в массиве идет речь.
Спасибо еще раз!!!!!!!!!!!!! и много много раз еще)))

Deniskach 26-05-2011 20:34 1683254

for (n=j; n<=3; n++) //откуда взялась константа 3?
3 взялась из старого кода {int nn=3 раньше почему то было так и без i, j. Видимо я не доглядел
//Переобразования над матрицей А:
for (n=0; n<nn; n++) //ненужный левый код
-- Эту строку я удалил.
Еще раз спасибо, особенно mrcnn!!!!!!


Время: 17:54.

Время: 17:54.
© OSzone.net 2001-