01/10/2018, 00:40

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 đó.
The Wind viết 02:55 ngày 01/10/2018

Đến lạy các thanh niên :
Chẳng chịu động tay Google gì cả
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

Người bí ẩn viết 02:55 ngày 01/10/2018

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


Nhập 1 ma trận kích thước m*n với 2<=n,m<=100

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ì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ử 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
    

    Tính tổng các phần tử trên một hàng nào đó

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

    In các phần tử trên cột nào đó.

    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é.

    Bài liên quan
    0