Thứ Năm, 14 tháng 1, 2016

TÍNH ĐỊNH THỨC HOÀN CHỈNH(CODE C)

#include
#include

int main()
{
    int i,j,k,n, sign = 1;
    double det = 1; double temp;
    double a[10][10],b[10][10];
// Nhap cap cua ma tran:
    printf("\nCap cua ma tran vuon, n = "); scanf("%d",&n);

// Nhap ma tran a:
    for (i = 0; i < n; i++)
        for (j = 0; j < n; j++)
            {
                printf("a[%d][%d] = ", i, j);
                scanf("%lf",&a[i][j]);
            }

// Tinh dinh thuc cua a
    for (i = 0; i < n-1; i++)
        {
            if (a[i][i] == 0) // N?u g?p ph?n t? trên du?ng chéo chính b?ng 0 thì tìm hàng khác d? d?i
                {
                    k = i+1;
                    while (k < n && a[k][i] == 0) k++;
                    if (k==n) { printf("\ndet(a) = 0"); break;} // Không timg th?y, t?c det(a) = 0
                    for (j = i; j < n; j++)// Ð?i hàng i v?i hàng k
                        {
                            temp = a[i][j];
                            a[i][j] = a[k][j];
                            a[k][j] = temp;
                        }
                    sign = -sign; // Ð?nh th?c d?i d?u dó
                }
            for (j = i+1; j < n; j++)// Bi?n d?i d? các ph?n t? cùng c?t ? hàng du?i b?ng 0 dó
                {
                    temp = -a[j][i]/a[i][i];
                    for (k = i+1; k < n; k++)   a[j][k] += temp*a[i][k]; // Nhân hàng i v?i (-a[j][i]/a[i][i]) r?i c?ng vào hàng j
                }
            det *= a[i][i]; // Tính d?n det(a)
        }

    det *= a[n-1][n-1]; // Nhân v?i ph?n t? cu?i chéo chính n?a là xong
    printf("\ndet(a) = %lf\n",det);

//Tinh ma tran nguoc
if (det != 0)
{
    for (i = 0; i < n; i++) // T?o ra b là ma tr?n don v? dó
        for (j = 0; j < n; j++)
        if (i==j) b[i][j] = 1; else b[i][j] = 0;

    for (i = 0; i < n; i++) // X? lý t? hàng d?u d?n hàng cu?i
        {
            if (a[i][i] == 0) // N?u g?p ph?n t? trên du?ng chéo chính b?ng 0 thì d?i hàng
                {
                    k = i+1;
                    while (k < n && a[k][i] == 0) k++;
                    for (j = 0; j < n; j++) // Ð?i hàng dó c?a a dó, c? v?i ma tr?n b n?a
                        {
                            temp = a[i][j];
                            a[i][j] = a[k][j];
                            a[k][j] = temp;
                            temp = b[i][j];
                            b[i][j] = b[k][j];
                            b[k][j] = temp;
                        }
                }

            temp = a[i][i];
            for (j = i; j < n; j++) a[i][j] /= temp;
            for (j = 0; j < n; j++) b[i][j] /= temp;

            for (j = i+1; j < n; j++)
                {
                    temp = -a[j][i];
                    for (k = i; k < n; k++) a[j][k] += temp*a[i][k];
                    for (k = 0; k < n; k++) b[j][k] += temp*b[i][k];
                }
        }// K?t thúc quá trình Gauss

    for (i = n-1; i > 0; i--) // B?t d?u quá trình Jordan
        for (j = i-1; j >=0; j--)
            {
                temp = -a[j][i];
                for (k = n-1; k >= i; k--)  a[j][k] += temp*a[i][k];
                for (k = 0; k < n; k++) b[j][k] += temp*b[i][k];
            }

    for (i = 0; i < n; i++)// In ra ma tr?n b, bây gi? là ma tr?n nghich d?o c?a a
        {
            for (j = 0; j < n; j++) printf("%8.3lf\t", b[i][j]);
            printf("\n");
        }
}
else printf("\nKhong co ma tran nghich dao\n");
    getch();
}

0 nhận xét: