Bài tập C về ma trận

Mong mọi người bớt chút thời gian giúp e về bài tập này
Viết các hàm sau :

  • Nhập 1 ma trận kích thước m*n với 2<=n,m<=100
  • Hiện ma trận kích thước n*m ra màn hình
  • Tính TBC đường chéo chính
  • Tìm ra hàng có tổng giá trị lớn nhất trong ma trận
  • Tính tổng các phần tử trên một hàng nào đó
  • In các phần tử trên cột nào đó.

Đến lạy các thanh niên :
Chẳng chịu động tay Google gì cả :weary:
Mình vừa Google thì ra đc đoạn mã này … Có thể nó sẽ có ích :

[code]#include<stdio.h>
#include<conio.h>
#define MAX 100

void nhap(int a[][MAX],int m,int n)
{
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
printf(" nhap a[%d][%d]:",i,j);
scanf("%d",&a[i][j]);
}
}

void inmatran(int a[][MAX],int m, int n)
{
printf(" ma tran vua nhap la:");
for(int i=1;i<=m;i++)
{
printf("\n");
for(int j=1;j<=n;j++)
printf("%3d",a[i][j]);
}
}

void max_min(int a[][MAX],int m,int n)//tim gia tri lon nhat , nho nhat , vi tri lon nhat,nho nhat
{
int hmax,cmax,hmin,cmin;
int max,min;

hmax = cmax = hmin = cmin = 1; 
max=min=a[1][1]; 
 
for(int i=1;i<=m;i++) 
for(int j=1;j<=n;j++) 
{ 
        if(a[i][j]>max ) 
        { 
                 max=a[i][j];  
                 hmax=i; 
                 cmax=j; 
        } 
        if(a[i][j] < min) 
        { 
                 min=a[i][j];  
                 hmin=i; 
                 cmin=j; 
        } 
 } 
 printf("\ngia tri lonnhat la :%d" ,max ); 
 printf("\tvi tri : hang %d cot %d",hmax,cmax); 
  
 printf("\ngia tri nho nhat la :%d" ,min ); 
 printf("\tvi tri : hang %d cot %d",hmin,cmin); 

}

int tonghang(int a[][MAX],int i,int m) //tinh tong cua hang i
{
int S=0;
for(int j=1;j<=m;j++)
S = S + a[i][j];
return S;
}

int hang_lonnhat(int a[][MAX],int m,int n) //tim hang co tong lon nhat
{
int max=tonghang(a,1,m);//khoi tao max bang tong cua hang 1
int h=1;
for(int i=1;i<=m;i++)
if(max < tonghang(a,i,m))
{
max = tonghang(a,i,m);
h = i;
}
return h;
}

int main()
{
int m,n;
int a[100][100];

 printf("nhap so hang  m :"); 
 scanf("%d",&m); 
 printf("nhap so cot:"); 
 scanf("%d",&n); 
  
 nhap(a,m,n); 
 inmatran(a,m,n); 
 max_min(a,m,n); 
 printf("\n\nhang co tong lon nhat la hang thu : %d",hang_lonnhat(a,m,n)); 
 getch(); 
 return 0; 

} [/code]

Mã nguồn đc chia sẽ bởi : VSupport

Link gốc : http://vforum.vn/diendan/showthread.php?74133-Giup-em-lam-bai-tap-C-C-Nhap-mot-ma-tran-kich-thuoc-n-m-voi-2-n-m-100

Câu hỏi đầu tiên của mình là bạn học mảng 2 chiều chưa ?


Cái này đơn giản. Có 2 cách:

  • Nhập ma trận bằng cấp phát tĩnh
  • ``` [số dòng][số cột]; ``` VD: ``` double arr[2][3]; // khai báo mảng 2 chiều arr thuộc kiểu double có 2 dòng, mỗi dòng gồm 3 phần tử ``` Sau đó tiến hành nhập bằng 2 vòng lặp lồng nhau: ``` for (int i = 0; i < ; ++i) { for (int j = 0; j < ; ++j) { printf("Nhap arr[%d][%d] = ", , ); scanf("%d", &arr[][]); } } ``` hoặc có thể nhập bằng 1 vòng lặp lồng nhau: ``` for (int i = 0; i < *; ++i) { printf("Nhap arr[%d][%d] = ", i / , i % ); scanf("%d", &arr[i / ][i % ]); } ```
  • Nhập ma trận bằng cấp phát động (con trỏ):
  • ``` int row, column; // khai báo biến lưu giá trị của chỉ số dòng, cột std::cin >> row >> column; // cho người dùng nhập giá trị cho biến dòng, cột int **arr = (int **)calloc(row, sizeof(int *)); // khai báo con trỏ cấp 2 for (int i = 0; i < row; ++i) { arr[i] = (int *)calloc(column, sizeof(int)); } ``` Sau đó tiến hành nhập như nhập ma trận cấp phát tĩnh. [quote="Minh_Xit, post:1, topic:37877"] Hiện ma trận kích thước n*m ra màn hình [/quote]

    Cái này cũng có 2 cách:

  • Dùng 2 vòng lặp lồng nhau
  • ``` for (int i = 0; i < ; ++i) { for (int j = 0; j < ; ++j) { printf("%4d", arr[][]); } printf("\n"); } ``` hoặc dùng 1 vòng lặp: ``` for (int i = 0; i < *; ++i) { printf("%4d", a[i / ][i % ]); if ((i % ) + 1 == ) printf("\n"); // mục đích là để xuống dòng. } ``` [quote="Minh_Xit, post:1, topic:37877"] Tính TBC đường chéo chính [/quote]

    Mình nhớ không lầm đường chéo chính là đường chéo từ trái qua phải và trên xuống dưới thì phải.
    Nếu thế thì công việc quá đơn giản, bạn chỉ ++ cho đến khi nào không còn ++ được nữa thì thôi:

    int sum = 0;
    int _row = 0, _column = 0;
    while (_row < row && _column < column)
    {
           sum += arr[_row++][_column++]; // cái này bạn phải vẽ ma trận ra mới hiểu
    }
    // in ra biến sum
    

    Tương tự mấy đường chéo phụ, … cũng làm như thế.

    Tính tổng các phần tử trong 1 hàng của ma trận, lưu vào 1 mảng nào đó. Sau đó tìm Maximum Value trong cái mảng đó thôi. Hoặc làm như sau:

    int Maximum_value;
    for (int i = 0; i < <chỉ số dòng>; ++i)
    {
           int sum = 0;
           for (int j = 0; j < <chỉ số cột>; ++j)
           {
                  sum += arr[<chỉ số dòng>][<chỉ số cột>];
           }
           if (sum > Maximum_value)
                  Maximum_value = i; // trả về chỉ số dòng có tổng lớn nhất
    }
    // in ra chỉ số hàng có tổng lớn nhất
    

    Cái này tự làm đi. Vét cạn rồi tính tổng thôi.

    Tương tự.

    Tham khảo:
    Khái niệm mảng 2 chiều
    Các thao tác với mảng 2 chiều

    P/S: Sau khi hiểu xong mảng 2 chiều rồi nhớ tìm hiểu thêm mảng răng cưa cho vui nhé.

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