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("\na[%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("\t%d",a[i][j]);
            if (j == (n-1))
                printf("\n");
        }

}

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("\nBan 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("\nMang A:\n");
    Xuat_mang(a, n);
    Cat(a, &n);
    printf("\nMang B:\n");
    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 \n");
    for (i=0; i<n; i++)
    {
        for (j=0; j<n; j++)
            printf ("%3d\t",matran[i][j]);
        printf ("\n");
    }
}

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;
}
1 Like

Đạ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.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?