Post on 26-Jun-2015
Khoa CNTT KTLT
ThS. Nguyễn TấnTrần Minh Khang
Chương 06 - 1
Chƣơng 6MA TRẬN
ThS. Nguyễn TấnTrần Minh Khang
Chương 06 - 2
Khoa CNTT KTLT
1. HÌNH ẢNH MA TRẬN
Hình vẽ
Ma trận là một bảng gồm nhiều dòng và nhiều cột.
ThS. Nguyễn TấnTrần Minh Khang
Chương 06 - 3
Khoa CNTT KTLT
2. KHÁI NIỆM
Ma trận làcái quái gì?
Khái niệm: Ma trận là một tập hợp cácbiến có cùng kiểu dữ liệu và cùng tên.
Khoa CNTT KTLT
3. KHAI BÁO MA TRẬN
Cú phápKDL <TenBien>[SoDongToiDa][SoCotToiDa];
Ví dụ 1: int a[20][20];
Trong ví dụ trên ta nói a là ma trận cótối đa 20 dòng và tối đa 20 cột. Mỗiphần tử trong ma trận có kiểu là kiểu sốnguyên.
Ví dụ 2: float b[10][30];
Trong ví dụ trên ta nói b là ma trận cótối đa 10 dòng và tối đa 30 cột. Mỗiphần tử trong ma trận có kiểu là kiểu sốthực.
ThS. Nguyễn Tấn Trần Minh
KhangChương 06 - 4
Khoa CNTT KTLT
3. KHAI BÁO MA TRẬN
Cú phápKDL <TenBien>[SoDongToiDa][SoCotToiDa];
Ví dụ 3:
1. struct phanso
2. {
3. int tu;
4. int mau;
5. };
6. typedef struct phanso PHANSO;
7. PHANSO c[10][15];
Trong ví dụ trên ta nói c là ma trận có tối đa 10 dòng và tối đa 15 cột. Mỗi phần tử trong ma trận có kiểu là kiểuPHANSO.
ThS. Nguyễn TấnTrần Minh Khang
Chương 06 - 5
Khoa CNTT KTLT
ThS. Nguyễn TấnTrần Minh Khang
Chương 06 - 6
4. CHỈ SỐ
Qui ước: Các dòng và cột trong matrận của C được đánh chỉ số bắt buộctừ 0.
Như vậy trong ma trận có m dòng và ncột thì các dòng trong ma trận đánh sốtừ 0 cho đến m-1, các cột trong matrận đánh số từ 0 cho đến n-1.
Ví dụ 1: int a[15][20];
Trong ví dụ trên ta nói a là ma trận có tối đa 15 dòng và tối đa 20 cột. Các dòng trong ma trận được đánh chỉ sốtừ 0 cho đến 14, các cột được đánh
Khoa CNTT KTLT
ThS. Nguyễn TấnTrần Minh Khang
Chương 06 - 7
chỉ số từ 0 cho đến 19.
ThS. Nguyễn TấnTrần Minh Khang
Chương 06 - 8
Khoa CNTT KTLT
4. CHỈ SỐ
n
0
1
m …
m-2
m-1
0 1 2 … n-2 n-1
4. CHỈ SỐ
j
0
i 1
…
m—2
m-1
0 1 2 3 4 … n-2 n-1
5. KỸ THUẬT NHẬPMA
TRẬN
Vấn đề 1: Hãy định nghĩa hàm nhập ma trận các số nguyên.
Định nghĩa hàm
11. void Nhap(int a[][100], int &m,int &n)
12. {13. printf(“Nhap m: ”);14. scanf(“%d”,&m);15. printf(“Nhap n: ”);16. scanf(“%d”,&n);17. for(int i=0;i<m;i++)18. for(int j=0;j<n;j++)19. {20. printf(“Nhap a[%d][%d]: ”,i,j);21. scanf(“%d”,&a[i][j]);
22. }23. }
Khoa CNTT KTLT
5. KỸ THUẬT NHẬPMA
TRẬN
Vấn đề 2: Hãy định nghĩa hàm nhập ma trận các số thực.
Định nghĩa hàm
11. void Nhap(float a[][100], int &m,int &n)
12. {13. printf(“Nhap m: ”);14. scanf(“%d”,&m);15. printf(“Nhap n: ”);16. scanf(“%d”,&n);17. for(int i=0;i<m;i++)18. for(int j=0;j<n;j++)19. {20. printf(“Nhap a[%d][%d]: ”,i,j);21. scanf(“%f”,&a[i][j]);22. }23. }
ThS. Nguyễn TấnTrần Minh Khang
Chương 06 - 10
Khoa CNTT KTLT
5. KỸ THUẬT NHẬPMA
TRẬN
Vấn đề 3: Hãy định nghĩa hàm nhập ma trận các số nguyên dài.
Định nghĩa hàm
11. void Nhap(long a[][100], int &m,int &n)
12. {13. printf(“Nhap m: ”);14. scanf(“%d”,&m);15. printf(“Nhap n: ”);16. scanf(“%d”,&n);17. for(int i=0;i<m;i++)18. for(int j=0;j<n;j++)19. {20. printf(“Nhap a[%d][%d]: ”,i,j);21. scanf(“%ld”,&a[i][j]);22. }23. }
ThS. Nguyễn TấnTrần Minh Khang
Chương 06 - 11
Khoa CNTT KTLT
5. KỸ THUẬT NHẬPMA
TRẬN
Vấn đề 4: Hãy định nghĩa hàm nhập ma trận các số thực dài.
Định nghĩa hàm
11. void Nhap(double a[][100], int &m,int &n)
12. {13. printf(“Nhap m: ”);14. scanf(“%d”,&m);15. printf(“Nhap n: ”);16. scanf(“%d”,&n);17. for(int i=0;i<m;i++)18. for(int j=0;j<n;j++)19. {20. printf(“Nhap a[%d][%d]: ”,i,j);21. scanf(“%lf”,&a[i][j]);22. }23. }
ThS. Nguyễn TấnTrần Minh Khang
Chương 06 - 12
Khoa CNTT KTLT
5. KỸ THUẬT NHẬPMA
TRẬN
Vấn đề 5: Hãy định nghĩa hàm nhập matrận các phân số.
Định nghĩa hàm
11. struct phanso12.{13. int tu;14. int mau;15.};16.typedef struct phanso PHANSO;17.void Nhap(PHANSO &x)18.{19. printf(“Nhap tu:”);20. scanf(“%d”,&x.tu);21. printf(“Nhap mau:”);22. scanf(“%d”,&x.mau);23.}
ThS. Nguyễn TấnTrần Minh Khang
Chương 06 - 13
Khoa CNTT KTLT
5. KỸ THUẬT NHẬPMA
TRẬN
Định nghĩa hàm
11. void Nhap(PHANSO a[][100], int &m,int &n)
12.{13. printf(“Nhap m:”);14. scanf(“%d”,&m);15. printf(“Nhap n:”);16. scanf(“%d”,&n);17. for(int i=0;i<m;i++)18. for(int j=0;j<n;j++)19. {20. printf(“Nhap a[%d]][%d]:”,i,j);21. Nhap(a[i][j]);22. }
23.}
ThS. Nguyễn TấnTrần Minh Khang
Chương 06 - 14
Khoa CNTT KTLT
6. KỸ THUẬT XUẤTMA
TRẬN
Vấn đề 1: Hãy định nghĩa hàm xuất ma trận các số nguyên.
Định nghĩa hàm
1. void Xuat(int a[][100], int m,int n)
2. {
3. for(int i=0;i<m;i++)
4. {
5. for(int j=0;j<n;j++)
6. printf(“%4d”,a[i][j]);
7. printf(“\n”);
8. }
9. }ThS. Nguyễn TấnTrần Minh Khang
Chương 06 - 15
Khoa CNTT KTLT
6. KỸ THUẬT XUẤTMA
TRẬN
Vấn đề 2: Hãy định nghĩa hàm xuất ma trận các số thực.
Định nghĩa hàm
1. void Xuat(float a[][100], int m,int n)
2. {
3. for(int i=0;i<m;i++)
4. {
5. for(int j=0;j<n;j++)
6. printf(“%8.3f”,a[i][j]);
7. printf(“\n”);
8. }
9. }ThS. Nguyễn TấnTrần Minh Khang
Chương 06 - 16
Khoa CNTT KTLT
6. KỸ THUẬT XUẤTMA
TRẬN
Vấn đề 3: Hãy định nghĩa hàm xuất ma trận các số nguyên dài.
Định nghĩa hàm
1. void Xuat(long a[][100], int m,int n)
2. {
3. for(int i=0;i<m;i++)
4. {
5. for(int j=0;j<n;j++)
6. printf(“%ld”,a[i][j]);
7. printf(“\n”);
8. }
9. }ThS. Nguyễn TấnTrần Minh Khang
Chương 06 - 17
Khoa CNTT KTLT
6. KỸ THUẬT XUẤTMA
TRẬN
Vấn đề 4: Hãy định nghĩa hàm xuất ma trận các số thực dài.
Định nghĩa hàm
1. void Xuat(double a[][100], int m,int n)
2. {
3. for(int i=0;i<m;i++)
4. {
5. for(int j=0;j<n;j++)
6. printf(“%lf”,a[i][j]);
7. printf(“\n”);
8. }
9. }ThS. Nguyễn TấnTrần Minh Khang
Chương 06 - 18
Khoa CNTT KTLT
6. KỸ THUẬT XUẤTMA
TRẬN
Vấn đề 5: Hãy địnhma trận các phân số.
nghĩa hàm xuất
1.
Định nghĩa hàm
struct phanso
2. {
3. int tu;
4. int mau;
5. };
6. typedef struct phanso PHANSO;
7. void Xuat(PHANSO x)
8. {
9. printf(“%d/%d”, x.tu,x.mau);
10.}
ThS. Nguyễn TấnTrần Minh Khang
Chương 06 - 19
Khoa CNTT KTLT
6. KỸ THUẬT XUẤTMA
TRẬN
Định nghĩa hàm
1. void Xuat(PHANSO a[][100], int m,int n)
2. {
3. for(int i=0;i<m;i++)
4. {
5. for(int j=0;j<n;j++)
6. xuat(a[i][j]);
7. printf(“\n”);
8. }
9. }
ThS. Nguyễn TấnTrần Minh Khang
Chương 06 - 20
Khoa CNTT KTLT
7. KỸ THUẬT ĐẾM
TRÊN MA TRẬN
Vấn đề 1: Hãy định nghĩa hàm đếm số lượng giá trị chẵn trong ma trận cácsố nguyên.
Định nghĩa hàm
1. int DemChan(int a[][100], int m,int n)
2. {
3. int dem=0;
4. for(int i=0;i<m;i++)
5. for(int j=0;j<n;j++)
6. if(a[i][j]%2==0)
7. dem++;
8. return dem;
9. }
ThS. Nguyễn TấnTrần Minh Khang
Chương 06 - 21
Khoa CNTT KTLT
7. KỸ THUẬT ĐẾM
TRÊN MA TRẬN
Vấn đề 2: Hãy định nghĩa hàm đếm số lượng số nguyên tố trong ma trận cácsố nguyên.
Định nghĩa hàm
1. int ktnt(int k)
2. {
3. int dem=0;
4. for(int i=1;i<=k;i++)
5. if (k%i==0)
6. dem++;
7. if(dem==2)
8. return 1;
9. return 0;
10.}
ThS. Nguyễn TấnTrần Minh Khang
Chương 06 - 22
Khoa CNTT KTLT
7. KỸ THUẬT ĐẾM
TRÊN MA TRẬN
Định nghĩa hàm
1. int DemNguyenTo(int int
a[][100], m,int n)
2. {
3. int dem=0;
4. for(int i=0;i<m;i++)
5. for(int j=0;j<n;j++)
6. if(ktnt(a[i][j])==1)
7. dem++;
8. return dem;
9. }
ThS. Nguyễn TấnTrần Minh Khang
Chương 06 - 23
Khoa CNTT KTLT
8. KỸ THUẬT TÍNH TOÁN
TRÊN MA TRẬN
Vấn đề 1: Hãy định nghĩa hàm tính tổng các giá trị lẻ trong ma trận các số nguyên.
Định nghĩa hàm
1. int TongLe(int a[][100], int m,int n)
2. {
3. int s = 0;
4. for(int i=0;i<m;i++)
5. for(int j=0;j<n;j++)
6. if(a[i][j]%2!=0)
7. s=s+a[i][j];
8. return s;
9. }
ThS. Nguyễn TấnTrần Minh Khang
Chương 06 - 24
Khoa CNTT KTLT
8. KỸ THUẬT TÍNH TOÁN
TRÊN MA TRẬN
Vấn đề 2: Hãy định nghĩa hàm tính tổng các giá trị dương trong ma trận các số thực.
Định nghĩa hàm
1. float TongDuong(float a[][100], int m,int n)
2. {
3. float s = 0;
4. for(int i=0;i<m;i++)
5. for(int j=0;j<n;j++)
6. if(a[i][j]>0)
7. s=s+a[i][j];
8. return s;
9. }
ThS. Nguyễn TấnTrần Minh Khang
Chương 06 - 25
6. if(ktnt(a[i][j])==1)
7. s=s+a[i][j]
8. return s;
9. }
Khoa CNTT KTLT
8. KỸ THUẬT TÍNH TOÁN
TRÊN MA TRẬN
Vấn đề 3: Hãy định nghĩa hàm tính tổng các giá trị nguyên tố trong ma trận các số nguyên.
Định nghĩa hàm
1. int TongNguyenTo(int a[][100],
int m,int n)
2. {
3. int s = 0;
4. for(int i=0;i<m;i++)
5. for(int j=0;j<n;j++)
;
ThS. Nguyễn TấnTrần Minh Khang
Chương 06 - 26
7.
8. return lc;
9. }
Khoa CNTT KTLT
9. KỸ THUẬT ĐẶT
LÍNH CANH
Vấn đề 1: Hãy định nghĩa hàm tìm giátrị lớn nhất trong ma trận các số thực.
Định nghĩa hàm
1. float LonNhat(float a[][100],
int m,int n)
2. {
3. float lc = a[0][0];
4. for(int i=0;i<m;i++)
5. for(int j=0;j<n;j++)
6. if(a[i][j]>lc)
lc=a[i][j];
ThS. Nguyễn Tấn Trần Minh
KhangChương 06 - 27
Khoa CNTT
10. KỸ THUẬT ĐẶT CỜ HIỆU
KTLT
Vấn đề 1: Hãy định nghĩa hàm kiểmtra trong ma trận các số thực có tồn tại giá trị dương hay ko?
Định nghĩa hàm
1. int TonTaiDuong(float a[][100],
int m,int n)
2. {
3. int flag = 0;
4. for(int i=0;i<m;i++)
5. for(int j=0;j<n;j++)
6. if(a[i][j]>0)
7. flag = 1;
8. return flag;
9. }
ThS. Nguyễn Tấn Trần Minh
KhangChương 06 - 28
Khoa CNTT KTLT
ThS. Nguyễn TấnTrần Minh Khang
Chương 06 - 29
11. KỸ THUẬT SẮP XẾP
Vấn đề 1: Hãy định nghĩa hàm sắp xếp
ma trận các số thực tăng dần?
Định nghĩa hàm11. void SapTang(float a[][100],
int m,int n)12.{13. for(int i=0;i<=m*n-2;i++)14. for(int j=i+1;j<=m*n-1;j++)15. if(a[i/n][i%n]>a[j/n][j%n])16. {17. float temp=a[i/n][i%n];18. a[i/n][i%n]=a[j/n][j%n];19. a[j/n][j%n]=temp;20. }21.}
89 88 13 -7 34 12
89 88 13 -7 34 12
89 88 13 -7 34 12
89 88 13 -7 34 12
89 88 13 -7 34 12
ThS. Nguyễn TấnTrần Minh Khang
Chương 06 - 30
Khoa CNTT KTLT
11. KỸ THUẬT SẮP XẾP
6
0 1 2 3 4 5
0
1
5 2
3
4
0 1 2 3 4 5
6 7 8 9 10 11
12 13 14 15 16 17
18 19 20 21 22 23
24 25 26 27 28 29
ThS. Nguyễn TấnTrần Minh Khang
Chương 06 - 31
Khoa CNTT KTLT
11. KỸ THUẬT SẮP XẾP
6
0 1 2 3 4 5
0
1
5 2
3
4
ThS. Nguyễn TấnTrần Minh Khang
Chương 06 - 32
Khoa CNTT KTLT
12. CHƢƠNG TRÌNH
ĐẦU TIÊN
Bài toán: Viết chương trìnhthực hiện các yêu cầu sau:
Nhập ma trận các số nguyên.
Xuất ma trận
Tính tổng các số chẵn cótrong ma trận.
Khoa CNTT KTLT
12. CHƢƠNG TRÌNHĐẦU TIÊN
11. #include <stdio.h>12. #include <conio.h>13. void Nhap(int [][100],
int &,int &);14. void Xuat(int [][100],
int,int);15. int TongChan(int [][100],
int,int);16. void main()17. {18. int b[50][50];19. int k,l;20. Nhap(b,k,l);21. Xuat(b,k,l);22. int kq=TongChan(b,k,l);23. printf(“\n…: %d”, kq);24. }
ThS. Nguyễn TấnTrần Minh Khang
Chương 06 - 33
Khoa CNTT KTLT
12. CHƢƠNG TRÌNHĐẦU TIÊN
1. void Nhap(int a[][100], int &m,int &n)
2. {3. printf(“Nhap m: ”);4. scanf(“%d”,&m);5. printf(“Nhap n: ”);6. scanf(“%d”,&n);7. for(int i=0;i<m;i++)8. for(int j=0;j<n;j++)9. {10. printf(“Nhap a[%d][%d]: ”,i,j);11. scanf(“%d”,&a[i][j]);12. }13. }
ThS. Nguyễn TấnTrần Minh Khang
Chương 06 - 34
Khoa CNTT KTLT
12. CHƢƠNG TRÌNHĐẦU TIÊN
1. void Xuat(int a[][100], int m,int n)
2. {
3. for(int i=0;i<m;i++)
4. {
5. for(int j=0;j<n;j++)
6. printf(“%4d”,a[i][j]);
7. printf(“\n”);
8. }
9. }
ThS. Nguyễn TấnTrần Minh Khang
Chương 06 - 35
7.
8. return s;
9. }
Khoa CNTT KTLT
12. CHƢƠNG TRÌNHĐẦU TIÊN
1. int TongChan(int a[][100], int m,int n)
2. {
3. int s = 0;
4. for(int i=0;i<m;i++)
5. for(int j=0;j<n;j++)
6. if(a[i][j]%2==0)
s=s+a[i][j];
ThS. Nguyễn TấnTrần Minh Khang
Chương 06 - 36