30/09/2018, 17:09

Review Code về loại bỏ dòng và cột trong ma trận A và in ra ma trận B sau khi đã loại bỏ

thằng bạn nhờ mình hỏi về 1 bài, mà mình lại không học C nên mình lên đây hỏi mong ai biết trả lời giúp: Nhập một ma trận A vuông cấp n gồm các phần tử là số nguyên. Xác định ma trận B từ ma trận A bằng cách loại bỏ dòng i cột j.Nó thắc mắc là 2 cách này thì khác gì nhau ??
###cách 1:

#include <math.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>

void Nhap_mang(int a[10][10], int *pn)
{
    int n, i, j;
    printf("Nhap n: ");
    scanf("%d",&n);
    *pn = n;
    for (i = 0; i < n; i++)
        for (j = 0; j < n; j++)
        {
            printf("
a[%d][%d] = ",i+1,j+1);
            scanf("%d",&a[i][j]);
        }
}

void Xuat_mang(int a[10][10], int n)
{
    int i, j;
    for (i = 0; i < n; i++)
        for (j = 0; j < n; j++)
        {
            printf("	%d",a[i][j]);
            if (j == (n-1))
                printf("
");
        }

}

void Cat(int a[10][10], int *pn)
{
    int n, i, j, k, h, c, tam;
    printf("Ban muon cat hang nao: ");
    scanf("%d",&h);
    printf("
Ban muon cat cot nao: ");
    scanf("%d",&c);
    n = *pn;
    h--;
    c--;
    for (i = 0; i < n; i++)
        for (j = 0; j < n; j++)
            if (j == c)
            {
                for (k = c; k < n; k++)
                {
                    tam = a[i][k];
                    a[i][k] = a[i][k+1];
                    a[i][k+1] = tam;
                }
            }

    for (i = 0; i < n; i++)
        for (j = 0; j < n; j++)
            if (i == h)
            {
                for (k = h; k < n; k++)
                {
                    tam = a[k][j];
                    a[k][j] = a[k+1][j];
                    a[k+1][j] = tam;
                }
            }
    *pn = n-1;
}

int main()
{
    int n, a[10][10];
    Nhap_mang(a, &n);
    printf("
Mang A:
");
    Xuat_mang(a, n);
    Cat(a, &n);
    printf("
Mang B:
");
    Xuat_mang(a, n);
    return 0;
}

cách 2:

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

void nhapmatran (int matran[10][10], int &n)
{
    int i,j;
    printf ("nhap vao kich thuoc ma tran :");
    scanf ("%d",&n);
    for (i=0; i<n; i++)
        for (j=0; j<n; j++)
        {
            printf ("A[%d][%d]:",i+1,j+1);
            scanf("%d",&matran[i][j]);
        }
}

void xuatmatran (int matran[10][10], int n)
{
    int i,j;
    printf ("ma tran da nhap vao la 
");
    for (i=0; i<n; i++)
    {
        for (j=0; j<n; j++)
            printf ("%3d	",matran[i][j]);
        printf ("
");
    }
}

void Delete (int matran[10][10], int n,int &da, int &ca)
{
    for (int i=da-1; i<n; i++)
        for (int j=0-1; j<n; j++)
            matran[i][j]=matran[i+1][j];
    for (int i=ca-1; i<n; i++)
        for (int j=0; j<n; j++)
            matran[i][j]=matran[i][j+1];
}

int main ()
{
    int matran[10][10],n,da,ca;
    nhapmatran (matran,n);
    xuatmatran(matran,n);
lap:
    printf ("nhap dong can xoa:");
    scanf ("%d",&da);
    if(da>n||da==0)
    {
        printf ("dong can xoa khong hop le");
        goto lap;
    }
lap1:
    printf ("nhap cot can xoa:");
    scanf ("%d",&ca);
    if(ca>n||ca==0)
    {
        printf ("dong can xoa khong hop le");
        goto lap1;
    }
    Delete(matran,n,da,ca);
    da=n-1;
    ca=n-1;
    xuatmatran (matran,da);
    return 0;
}
Mai Anh Dũng viết 19:17 ngày 30/09/2018

Đạt chưa xem code, nhưng nếu cả hai cách đều chạy được thì giá nào Đạt cũng chọn cách 2. Vì code chia ra làm nhiều hàm nhỏ, một hàm chỉ có một vòng for (hoặc for lồng for).

Trong khi cách 1 sử dụng qúa nhiều vòng lặp for trong một hàm. Đạt có viết một bài về vấn đề này ở đây.

Hồi trước Đạt không nhớ đã đọc ở đâu, rất có thể là Code Complete 2, có nói rằng một hàm không nên có hai vòng for. Lý do? Bởi vì một vòng for đủ để thực hiện một công việc gì đó có ý nghĩa rồi. tại sao không tạo ra riêng một hàm chỉ để xử lý công việc của vòng for đó. Việc này sẽ giúp cho việc viết code rõ ràng hơn. Chú ý: Hai for lồng nhau tương đối ổn, Ba for trở đi là cực kỳ không ổn. Nếu tính về phần giải thuật thì số lần lặp là lập phương, chả biết nói sao, tức là O(n3). for () {…
Bài liên quan
0