PDA

Показать полную графическую версию : программа на с++


Deniskach
25-05-2011, 19:45
привет всем, есть код программы, но я не знаю что какая строка обозначает. если кто может, прокомментируйте пожалуйста каждую строку. заранее спасибо

#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
если кто может, прокомментируйте пожалуйста каждую строку »А что делает программа?

lxa85
26-05-2011, 00:36
Завтра вечером, от нечего делать, и если не опередят, распишу.
Хотя код достаточно прозрачен.
Задаются матрицы, формируется единичная матрица (по комментариям) затем над ними производятся какие-то поэлементные действия. Правда, если вглядеться, хлабудень какая-то делается.
Поддерживаю вопрос Drongo, А что делает программа? »
Без этого сложно понять, правильно работает программа или нет.

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

Drongo
26-05-2011, 17:23
программа решает задачу, в которой требуется из квадратной матрицы найти обратную. правильность вычисления проветить путем умножения (должна получится единичная матрица)
не спорю воды много, но компилятор dev-с++ 4.9.9.2 не ругается))) »Я почему спросил, что делает программа, ведь если вы автор кода, что мешает самому откомментировать код?

mrcnn
26-05-2011, 18:28
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
printf("\nElement [%d,%d]: ", i+1, j+1); »

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

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

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




© OSzone.net 2001-2012