 |
|
программа на с++
привет всем, есть код программы, но я не знаю что какая строка обозначает. если кто может, прокомментируйте пожалуйста каждую строку. заранее спасибо
Код:
#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();
}
|
Цитата:
Цитата Deniskach
если кто может, прокомментируйте пожалуйста каждую строку »
|
А что делает программа?
|
Завтра вечером, от нечего делать, и если не опередят, распишу.
Хотя код достаточно прозрачен.
Задаются матрицы, формируется единичная матрица (по комментариям) затем над ними производятся какие-то поэлементные действия. Правда, если вглядеться, хлабудень какая-то делается.
Поддерживаю вопрос Drongo,
Цитата:
Цитата Drongo
А что делает программа? »
|
Без этого сложно понять, правильно работает программа или нет.
|
программа решает задачу, в которой требуется из квадратной матрицы найти обратную. правильность вычисления проветить путем умножения (должна получится единичная матрица)
не спорю воды много, но компилятор dev-с++ 4.9.9.2 не ругается)))
большое спасибо за уделенное внимание
|
Цитата:
Цитата Deniskach
программа решает задачу, в которой требуется из квадратной матрицы найти обратную. правильность вычисления проветить путем умножения (должна получится единичная матрица)
не спорю воды много, но компилятор dev-с++ 4.9.9.2 не ругается))) »
|
Я почему спросил, что делает программа, ведь если вы автор кода, что мешает самому откомментировать код?
|
Цитата:
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); /
|
Цитата:
Цитата mrcnn
printf("\nElement [%d,%d]: ", i+1, j+1); »
|
Вообще-то, ИМХО, это для вывода привычной обычному человеку нумерации (не с нуля, как в си, а с 1). Так что ошибки здесь нет.
|
всем большое спасибо.
printf("\nElement [%d,%d]: ", i+1, j+1); Все верно, эта строка для упрощения пониманияо каком столбце и строке в массиве идет речь.
Спасибо еще раз!!!!!!!!!!!!! и много много раз еще)))
|
for (n=j; n<=3; n++) //откуда взялась константа 3?
3 взялась из старого кода {int nn=3 раньше почему то было так и без i, j. Видимо я не доглядел
//Переобразования над матрицей А:
for (n=0; n<nn; n++) //ненужный левый код
-- Эту строку я удалил.
Еще раз спасибо, особенно mrcnn!!!!!!
|
Время: 17:54.
© OSzone.net 2001-