Open alexey-malov opened 9 years ago
Чтобы постоянно не писать double matrix[3][3] можно сделать typedef: typedef double Matrix3x3[3][3]; аналогично объявить Matrix2x2
Массив можно вернуть по значению, а также передать по значению в функцию (если надо), если обернуть его в структуру:
struct Matrix3x3
{
double items[3][3];
};
// Multiply matrix by number
void NumMultMatrix(double const inputMatrix[3][3], double number, double resultMatrix[3][3])
Лучше дать имя вроде: MultMatrixByScalar
double matrixDet = Determinant(matrix);
if (matrixDet == 0)
Числа с плавающей запятой лучше сравнивать приблизительно - разность между ними не должна превышать некого значения epsilon. Можно взять DBL_EPSILON за основу (float.h)
exit-ов быть не должно
Лучше ввести доп. функцию, выполняющую считывание матрицы из файла с указанным именем Функцию main хотелось бы видеть примерно такой:
if (!CheckArgs(argc))
{
return 2;
}
Matrix3x3 mat;
if (ReadMatrixFromFile(argv[1], mat))
{
Matrix3x3 result;
if (InvertMatrix(mat, result))
{
PrintMatrix(result);
return 0;
}
else
{
printf("Matrix is Singular");
return 1;
}
}
else
{
printf("Failed to read matrix from file");
}
Либо при использовании исключений:
try
{
CheckArguments(argc);
Matrix3x3 matrix = ReadMatrixFromFile(argv[1]);
PrintMatrix(InvertMatrix(matrix));
}
catch (const exception& e)
{
cout << "Error: " << e.what() << "\n";
return 1;
}
return 0;
double matrixDet = Determinant(matrix);
if (matrixDet < DBL_EPSILON)
проверять следует абсолютное значение. Отрицательное значение детерминанта - нормальное состояние
Матрицы следует передавать по константной ссылке, а не просто по константному значению. В этом случае матрица при входе в функцию копироваться не будет
Это править не обязательно:
bool InvertMatrix(Matrix3x3 const matrix, Matrix3x3 &invertedMatrix)
При помощи boost (http://boost.org) можно использовать опциональное значение
#include <boost/optional.hpp>
boost::optional<Matrix3x3> InvertMatrix(Matrix3x3 const& matrix)
{
if (/*determinant is close to zero*/)
{
return boost::none;
}
else
{
return MultMatriByScalar(GetMinorMatrix(matrix), 1.0 / determinant);
}
}
...
int main()
{
auto invertedMatrix = InvertMatrix(matrix);
if (invertedMatrix) // либо invertedMatrix.is_initialized(); вроде
{
PrintMatrix(*invertedMatrix); // либо PrintMatrix(invertedMatrix.get());
}
}
100*0,75 = 75
Лучше внешний цикл снабдить {}, заключающими внутренний