31/1/15

Một số bài tập cơ bản về ma trận, mảng hai chiều

Dưới đây là một số bài tập về ma trận dành cho các bạn học Nhập môn lập trình tham khảo.
Các ví dụ mình chỉ thao tác với ma trận nguyên bằng ngôn ngữ C, với ma trận thực cũng tương tự

1. Viết hàm nhập một ma trận
//Cách 1: Nhập m, n trong hàm
void InputMatrix(int a[][20], int &m, int &n)
{
   printf("Nhập số hàng m: ");
   scanf("%d", &m);
   printf("Nhập số cột n: ");
   scanf("%d", &n);
   for(int i = 0; i < m; i++)
      for(int j = 0; j < n; j++)
      {
         printf("A[%d][%d] = ", i, j);
         scanf("%d", &a[i][j]);
      }
}

//Cách 2: Nhập m, n ngoài hàm
void InputMatrix(int a[][20], int m, int n)
{
   for(int i = 0; i < m; i++)
      for(int j = 0; j < n; j++)
      {
         printf("A[%d][%d] = ", i, j);
         scanf("%d", &a[i][j]);
      }
}

2. Viết hàm xuất một ma trận
void OutputMatrix(int a[][20], int m, int n)
{
   for(int i = 0; i < m; i++)
   {
      for(int j = 0; j < n; j++)
         printf("%d\t", a[i][j]);
      printf("\n");
   }
}

3. Viết hàm tìm giá trị lớn nhất trong ma trận
int MaxOfMatrix(int a[][20], int m, int n)
{
   int max = a[0][0];
   for(int i = 0; i < m; i++)
      for(int j = 0; j < n; j++)
         if(a[i][j]>max)
            max = a[i][j];
   return max;
}


4. Viết hàm tính tổng các số chẵn trong ma trận
int SumEven(int a[][20], int m, int n)
{
   int sum = 0;
   for(int i = 0; i < m; i++)
      for(int j = 0; j < n; j++)
         if(a[i][j]%2==0)
            sum += a[i][j];
   return sum;
}

5. Viết hàm đếm số nguyên tố trong ma trận
int PrimeMatrix(int a[][20], int m, int n)
{
   int dem = 0;
   for(int i = 0; i < m; i++)
      for(int j = 0; j < n; j++)
         if(IsPrime(a[i][j])) dem++;
   return dem;
}

6. Viết hàm xóa một dòng HOẶC một cột trong ma trận
void DeleteRow(int a[][20], int &m, int n, int indexRow)
{
   for(int i=indexRow;i<m-1;i++)
      for(int j=0;j<n;j++)
         a[i][j]=a[i+1][j];
   m--;
}

void DeleteColumn(int a[][20], int m, int &n, int indexColumn)
{
   for(int i=0;i<m;i++)
      for(int j=indexColumn;j<n-1;j++)
         a[i][j]=a[i][j+1];
   n--;
}

7. Viết hàm xóa một dòng VÀ một cột trong ma trận
void DeleteRowColumn(int a[][20], int &m, int &n,
                              int indexRow, int indexColumn)
{
   for(int i=0;i<m;i++)
      for(int j=0;j<n;j++)
      {
         if(i<indexRow && j>=indexColumn)
            a[i][j]=a[i][j+1];
         else if(i>=indexRow && j<indexColumn)
            a[i][j]=a[i+1][j];
         else if(i>=indexRow && j>=indexColumn)
            a[i][j]=a[i+1][j+1];
      }
   m--;
   n--;
}

8. Viết hàm hoán vị hai cột/hai dòng trong ma trận
void swap(int &a, int &b)
{
   int temp = a;
   a = b;
   b = temp;
}

void swapRow(int a[][20], int m, int n, int row1, int row2)
{
   if((row1>=0 && row1<m)&&(row2>=0 && row2<m))
      for(int j=0;j<n;j++)
         swap(a[row1][j],a[row2][j]);
}

void swapColumn(int a[][20], int m, int n, int column1, int column2)
{
   if((column1>=0 && column1<n)&&(column2>=0 && column2<n))
      for(int i=0;i<m;i++)
         swap(a[i][column1],a[i][column2]);
}

9. Viết hàm tính tổng các phần tử trên biên ma trận
int Sum(int a[][20], int m, int n)
{
   int sum = 0;
   for(int i = 0; i < m; i++)
   {
      sum += a[i][0];
      sum += a[i][n-1];
   }
   for(int j = 0; j < n; j++)
   {
      sum += a[0][i];
      sum += a[n-1][i];
   }
   return sum;
}

10. Viết hàm tìm và xuất vị trí xuất hiện của phần tử lớn nhất trong ma trận
void IndexOfMax(int a[][20], int m, int n)
{
   int iMax = 0, jMax = 0;
   for(int i = 0; i < m; i++)
      for(int j = 0; j < n; j++)
         if(a[i][j]>a[iMax][jMax])
         {
            iMax = i;
            jMax = j;
         }
}

Các ví dụ với ma trận vuông

Viết hàm tính tổng các phần tử trên đường chéo chính
int Sum(int a[][20], int n)
{
   int sum = 0;
   for(int i = 0; i < n; i++)
      sum += a[i][i];
   return sum;
}

Viết hàm tìm phần tử lớn nhất, nhỏ nhất trên đường chéo chính
//Tìm max
int Max(int a[][20], int n)
{
   int max = a[0][0];
   for(int i = 1; i < n; i++)
      if(a[i][i] > max)
         max = a[i][i];
   return max;
}

//Tìm min
int Min(int a[][20], int n)
{
   int min = a[0][0];
   for(int i = 1; i < n; i++)
      if(a[i][i] < min)
         min = a[i][i];
   return min;
}

Viết hàm tính tổng các phần tử trên đường chéo phụ
int Sum(int a[][20], int n)
{
   int sum = 0;
   for(int i = 0; i < n; i++)
      sum += a[i][n-1-i];
   return sum;
}

//Cách khác
int Sum(int a[][20], int n)
{
   int sum = 0;
   for(int i = 0, j = n-1; i < n; i++, j--)
      sum += a[i][j];
   return sum;
}

Viết hàm kiểm tra đường chéo chính có tăng dần từ trên xuống dưới
int IsIncreasingDiagonal(int a[][20], int n)
{
   for(int i = 0; i < n-1; i++)
      if(a[i][i]>a[i+1][i+1])
         return 0;
   return 1;
}

Viết hàm kiểm tra ma trận có phải là ma trận đối xứng
Ma trận đối xứng là ma trận có các phần tử đối xứng nhau qua đường chéo chính.
int IsSymmetric(int a[][20], int n)
{
   for(int i = 0; i < n; i++)
      for(int j = 0; j < i; j++)
         if(a[i][j] != a[j][i])
            return 0;
   return 1;
}

Viết hàm chuyển vị ma trận
void swap(int &a, int &b)
{
   int temp = a;
   a = b;
   b = temp;
}
void Transpose(int a[][20], int n)
{
   for(int i = 0; i < n; i++)
      for(int j = 0; j < i; j++)
         swap(a[i][j], a[j][i]);
}

14 nhận xét:

  1. cái code bài 8 mình chạy được nhưng sao nó vẫn giữ nguyên, k có hoán vị bạn ơi.

    Trả lờiXóa
    Trả lời
    1. Nặc danh17:16 26/11/16

      for(j=0;j<n;j++)
      {
      tg=a[h2][j];
      a[h2][j]=a[h3][j];
      a[h3][j]=tg;
      }

      Xóa
    2. cái bài 8 trên kia bị sai, hàm void không co giá trị trả về , nên lời gọi hàm sẻ không ra được kết quả đâu. và dòng lệnh bạn viêt củng sai. a[2][j] và a[3][j]

      Xóa
  2. tich hang k HÀNG K NHẬP TỪ BÀN PHÍM

    Trả lờiXóa
  3. In giá trị mảng với các phần tử ở vị trí biên thì làm sao đây mn

    Trả lờiXóa
  4. chuyển ma traan đường chéo chính thành mảng 2 chiều làm thế naof ạ

    Trả lờiXóa
  5. Help me:
    Tạo ma trận 10x10 (Mảng hai chiều)
    - Tạo 100 giá trị ngẫu nhiên nằm ngoài phạm vi 1..10, lưu vào ma trận.
    - Đếm số lượng phân tử có giá trị nhỏ hơn 6.
    - Tính tổng các phân tử của mỗi hàng, mỗi cột, và đường chéo chính.

    Trả lờiXóa
  6. bai tim max dap an sai add oi!

    Trả lờiXóa
  7. help me:
    TÍNH BÌNH PHƯƠNG CÁC PHẦN TỬ TRONG MẢNG 2 CHIỀU

    Trả lờiXóa
  8. Cho minh hoi bai toan tim duong di ngan nhat trong ma trân vuong thi dung gi a

    Trả lờiXóa
  9. #include
    #include
    #include
    void nhapmang (int a[][10], int n, int m){
    printf("so hang cua ma tran la: ");
    scanf("%d", &m);
    printf("so cot cau ma tran la: ");
    scanf("%d", &n);
    int i,j;
    for(i=0;i<m;i++)
    for(j=0;j<n;j++){
    printf("a[%d][%d]=",i,j);
    scanf("%d",&a[i][j]);
    }
    }
    void xuatmang(int a[][10], int n, int m) {
    int i,j;
    for(i=0;i<m;i++)
    for(j=0;j<n;j++){
    printf("%4d",a[i][j]);
    printf("\n");
    }
    }
    int DemSoChan(int a[][10], int n, int m){
    int dem = 0;
    int i,j;
    for(int i = 0; i < n; i++)
    for(j=0;j<m;j++){
    if(a[i][j]%2==0) {
    dem +=a[i][j];
    }
    }
    return dem;
    }
    int main(){
    int n;
    int m;
    int a[10][10];
    int x;
    nhapmang(a, n, m);
    xuatmang(a, n, m);
    int SoChan = DemSoChan(a, n, m);
    printf("\nSo luong so chan la %.d ", SoChan);
    }

    *** cho em hỏi sao em tính tổng số chắn nó lại ra o ạ

    Trả lờiXóa
  10. cho mình hỏi là để Kiểm tra xem tổng các phần tử trong tam giác dưới và tổng các phần tử trong tam giác trên có bằng nhau không thì mình dùng hàm gì v ạ

    Trả lờiXóa
  11. Nặc danh15:42 28/8/23

    #include
    #include
    void check(int a[][50], int n, int m){
    int i,j;
    for(i=0;i<n;i++){
    for(j=0;j<m;j++){
    printf(" hang thu %d va cot thu %d la : ",i+1,j+1);
    scanf("%d",&a[i][j]);
    }
    }
    }
    void checks(int a[][50],int *n,int m, int xoa){
    int i,j;
    for(i=xoa;i<*n-1;i++){
    for(j=0;j<m;j++){
    a[i][j]=a[i+1][j];
    }
    }
    (*n)--;
    }
    int main(){
    // xoa dong hoac cot trong mang
    int n,m;
    printf(" nhap vao so hang cua mang : ");
    scanf("%d",&n);
    printf(" nhap vao so cot trong mang : ");
    scanf("%d",&m);
    int a[n][m];
    check(a,n,m);
    // bat dau tinh toan
    int dem ;
    printf(" nhap vao hang can xoa : ");
    scanf("%d",&dem);
    checks(a,&n,m,dem);
    int i,j;
    for(i=0;i<n;i++){
    for(j=0;j<m;j++){

    printf(" %d ",a[i][j]);
    }
    printf(" \n ");
    }


    } tại sao mình xóa hàng với cột nó ra hàng 1 đúng nhưng sau đó lại ra số ảo vậy

    Trả lờiXóa