Tải bản đầy đủ (.doc) (29 trang)

Các thao tác trên ma trận

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (528.82 KB, 29 trang )

TRƯỜNG ĐẠI HỌC ĐỒNG THÁP
KHOA SƯ PHẠM TOÁN – TIN

LÊ THẾ NAM
BÁO CÁO TỰ HỌC, TỰ NGHIÊN CỨU

CÁC THÁO TÁC TRÊN MA TRẬN

NGÀNH: SƯ PHẠM TIN HỌC
LỚP: ĐHSTIN15L2

GIẢNG VIÊN HƯỚNG DẪN: Ths. NGUYỄN THỊ THÙY LINH

Đồng Tháp, tháng 03 năm 2016


Lê Thế Nam - 0015440144
Các thao tác trên ma trận

THÔNG TIN VỀ SINH VIÊN

Lớp ĐHSTIN15L2

2


Lê Thế Nam - 0015440144
Các thao tác trên ma trận

ĐÁNH GIÁ CỦA GIẢNG VIÊN HƯỚNG DẪN


ST
T
1

NỘI DUNG ĐÁNH GIÁ

ĐIỂM TỐI
ĐA

HÌNH THỨC

2.0

1.1.Nộp bài đúng tiến độ
1.2.Bố cục rõ ràng, hợp lý
1.3.Không có lỗi chính tả, không lỗi in
ấn, văn phong rõ ràng, đẹp
1.4.Có đánh STT và tên hình/bảng
Trình bày tài liệu tham khảo đúng qui
cách
2

NỘI DUNG

4.0

2.1. Nêu được kết quả chính đạt được
của đề tài
2.2.Trình bày có hệ thống, logic ngắn
gọn, súc tích, dễ hiểu

2.3. Đầy đủ nội dung theo qui định
2.4. Nội dung chính xác
2.5. Có sáng tạo, thông minh
2.6. Khả năng ứng dụng
3

DEMO

4.0

3.1. Không có lỗi
3.2. Hiệu quả, đáp ứng yêu cầu
3.3. Logic, rõ ràng
3.4. Không sao chép mã nguồn
TỔNG ĐIỂM

Lớp ĐHSTIN15L2

10.0

3

ĐIỂM
CHẤM

NHẬN XÉT


Lê Thế Nam - 0015440144
Các thao tác trên ma trận


MỤC LỤC
CÁC THÁO TÁC TRÊN MA TRẬN.....................................................................................................1
1. MỞ ĐẦU .......................................................................................................................................5
2. NỘI DUNG ĐỀ TÀI .........................................................................................................................5
2.1. Đặt vấn đề .............................................................................................................................5
2.2. Phương pháp giải quyết vấn đề..............................................................................................6
2.3. Thiết kế và cài đặt thuật toán.................................................................................................6
2.4.Giới thiệu DEMO và hướng dẫn sử dụng...............................................................................16
3. KẾT LUẬN.....................................................................................................................................20
3.1. Kết quả đạt được..................................................................................................................20
3.2. Hạn chế.................................................................................................................................24
3.3. Hướng phát triển..................................................................................................................24

Lớp ĐHSTIN15L2

4


Lê Thế Nam - 0015440144
Các thao tác trên ma trận

1. MỞ ĐẦU
Một chương trình tốt là chương trình chạy thông, kiểm soát các lỗi tốt, phòng
ngừa, bẫy lỗi hiệu quả, dễ dàng và thân thiện với người dùng đồng thời mã nguồn
có khả năng tái sử dụng cao, …
Đó chỉ là một trong số những phần rất nhỏ mà em học được từ môn Kỹ thuật
lập trình. Để cho ra đời một chương trình, sản phẩm phần mềm cần có nhiều qui
trình và vòng đời đan xen nhau từ khâu phân tích, thiết kế chương trình, lập trình,
kiểm thử, viết tài liệu, … Trong mỗi khâu lại chia ra thành các công đoạn nhỏ đòi

hỏi lập trình viên phải tuân thủ.
Để đánh giá lại những kiến thức của bản thân được học về kỹ thuật lập trình
em quyết định chọn đề tài “các thao tác trên ma trận”, qua đề tài này em không
những được tìm hiểu sâu hơn về mặt lý thuyết mà còn được trực tiếp vận dụng
những kiến thức đã được học trên lớp, những kiến thức đọc nâng cao vào trong một
ứng dụng thực tế.

2. NỘI DUNG ĐỀ TÀI
2.1. Đặt vấn đề
Khi cần lưu trữ một số lượng lớn các phần tử có cùng kiểu dữ liệu, chẳng
hạn như cần lưu trữ 30 số nguyên được nhập từ bàn phím, ta có thể dùng 30 biến số
nguyên riêng biệt để lưu trữ. Tuy nhiên, cách trên có một số nhược điểm như sau:


Có quá nhiều biến cần khởi tạo. Để nhớ được hết các biến này là không đơn
giản, đồng thời gây khó khăn cho việc quản lý các biến.



Phải thực hiện thủ công các thao tác với biến đó. Do các biến là độc lập nên
ta không thể sử dụng các cấu trúc lặp để thao tác với nó.



Chương trình sẽ dài và việc nâng cấp cũng trở nên khó khăn.
Do đó, việc nhóm các phần tử đó lại với một cái tên duy nhất sẽ khắc phục

được những nhược điểm trên. Các phần tử vẫn hoạt động độc lập, nhưng dưới một
tên duy nhất, cùng với chỉ số (index) của nó để phân biệt với các phần tử khác.
Lớp ĐHSTIN15L2


5


Lê Thế Nam - 0015440144
Các thao tác trên ma trận
Khi mỗi phần tử của mảng có kiểu dữ liệu là một mảng khác, ta được mảng 2
chiều. Khi đó, ngoài index của các phần tử trong mảng, mỗi phần tử trong các phần
tử đó cũng có index của nó. Do đó để truy xuất đến từng phần tử nhỏ, ta sử dụng cả
2 chỉ số index để chỉ ra vị trí của nó trong mảng 2 chiều.
Thông qua đề tài các “các thao tác trên ma trận” em sẽ giới thiệu một vài
thao tác cơ bản trên mảng 2 chiều (hay còn gọi là ma trận) như: khai báo, nhập,
xuất, xóa, chèn các dòng hoặc cột, thêm dòng hoặc cột…
2.2. Phương pháp giải quyết vấn đề
- Nghiên cứu yêu cầu của bài toán.
- Tìm hiểu mảng 2 chiều: khai báo, nhập, xuất, các thao tác cơ bản khác…
- Lập ý tưởng và viết chương trình bằng ngôn ngữ lập trình C++.
- Kiểm thử chương trình và viết báo cáo.
2.3. Thiết kế và cài đặt thuật toán
2.3.1 Phân tích yêu cầu
Nhập vào ma trận số thực cấp mxn. Cài đặt các hàm thực hiện các thao tác
trên ma trận:
- Xóa dòng k ( k nhập từ bàn phím)
- Xóa cột l ( l nhập từ bàn phím)
- Xóa dòng và cột chứa phân tử nhỏ nhất
- Nhập số nguyên dương k (kk
- Nhập số nguyên dương k (k- Hoán vị các dòng sao cho tổng giá trị của từng dòng giảm từ trên xuống.
2.3.2 Mô tả bài toán

Chúng ta sẽ xây dựng chương trình đơn giản bằng C++. Mô phỏng các thao
tác xử lý cơ bản trên ma trận: xóa dòng, cột, chèn dòng, cột, hoán vị các dòng…
Lớp ĐHSTIN15L2

6


Lê Thế Nam - 0015440144
Các thao tác trên ma trận
Thao tác
Nhập ma trận

Đầu vào

Đầu ra

Nhập m,n (số dòng, cột)

Ma trạn cấp m x n

Nhập từng phần tử
Xóa dòng

Nhập dòng cần xóa k

Xuất ra ma trận xóa dòng k

Xó cột

Nhập cột cần xóa l


Xuất ra ma trận xóa cột l

Xóa dòng và
cột có phần từ
nhỏ nhất

Ma trân m x n

Xuất ma trận đã xóa dòng và cột
có phần tử nhỏ nhất

Chèn dòng

Nhập dòng muốn chèn k

Xuất ma trận chèn thêm dòng k

Chèn cột

Nhập cột muốn chèn k

Xuất ma trận chèn thêm cột k

Hoán vị

Ma trận m x n

Xuất ma trận được sắp xếp giảm
dần theo tổng từng dòng


2.3.3. Tên module, ý nghĩa, các đối số, kiểu dữ liệu, đầu vào, đầu ra, các
bước xử lý.
2.3.3.1 Khởi tạo các hàm
Tên hàm

Ý nghĩa

void NhapMT(float A[]
[max],int m,int n)

Nhập ma trận A gồm có m dòng và n cột

void XuatMT(float A[]
[max],int m,int n)

Xuất ma trận A gồm m dòng và n cột

void XoaCot(float A[][max],
int m, int &n, int l)

Xóa cột thứ l trong ma trận A

void XoaDong(float A[]
[max], int &m, int n, int
k)

Xóa dòng thứ k trong ma trận A

void XoaD_C(float A[][max],

int &m, int &n)

Tìm phần tử nhỏ nhất trên ma trận và vóa
dòng và cột chứa phần tử đó

void ChenDong(float A[]
[max],int &m,int n,int d)

Chèn thêm dòng d vào ma trận

void ChenCot(float A[]
[max],int m,int &n,int c)

Chèn thêm cột c vào ma trận

void SapXep(float A[][max],
int m, int n)

Tính tổng từng dòng và sắp sắp xếp ma trận
giảm dần theo tổng từng dòng.

Lớp ĐHSTIN15L2

7


Lê Thế Nam - 0015440144
Các thao tác trên ma trận
void menu()


Menu chương trình

int main()

Chương trình chính

2.3.3.2 Xây dựng các hàm
2.3.3.2.1. Xóa cột l trong ma trận A
Giả sử ta cần xóa cột thứ l = 3 trong ma trận, ý tưởng như sau:
- Ta sẽ dời lần lượt các phần tử ở các cột sau cột l lên phía trước.
- Xóa cột cuối cùng trong ma trận.

Lớp ĐHSTIN15L2

1

2

3

4

5

1

3

4


5

6

7

2

4

3

4

15

6

3

3

1

3

14

16


4

2

3

12

4

21

1

2

3

4

1

3

4

6

7


2

4

3

15

6

3

3

1

14

16

4

2

3

4

21


8


Lê Thế Nam - 0015440144
Các thao tác trên ma trận

for(int i=l;i<=n;i++)
for(int j=1;j<=m;j++)
A[j][i]=A[j][i+1];
n--;

2.3.3.2.2. Xóa dòng k trong ma trận A
Giả sử ta cần xóa cột thứ k = 3 trong ma trận, ý tưởng như sau:
- Ta sẽ dời lần lượt các phần tử ở các dòng dưới dòng k lên phía trên.
- Xóa cột cuối cùng trong ma trận.

Lớp ĐHSTIN15L2

1

2

3

4

5

1


3

4

5

6

7

2

4

3

4

15

6

3

3

1

3


14

16

4

2

3

12

4

21

9


Lê Thế Nam - 0015440144
Các thao tác trên ma trận
1

2

3

4

5


1

3

4

5

6

7

2

4

3

4

15

6

3

2

3


12

4

21

for(int i=k;i<=m;i++)
for(int j=1;j<=n;j++)
A[i][j]=A[i+1][j];
m--;

2.3.3.2.3. Xóa dòng và cột chứa phần tử nhỏ nhất
Ý tưởng như sau:
- Xác định vị trí phần tử nhỏ nhất trong ma trận (Giả xử dòng x=3 cột y = 2)
float Min=A[1][1];
for(int i = 1; i <= m; i++)
for(int j = 1; j <= n; j++)
if(A[i][j]x=i;
y=j;}

- Với số dòng và cột đã tìm được thì sẽ tạo được 4 vùng, chỉ có vùng phía
trên bên trái giữ nguyên còn các vùng khác di chuyển theo hướng như trên hình.
Vùng phía trên bên phải sẽ dịch sang trái 1 cột, vùng phía dưới bên trái sẽ dịch lên 1
hàng và vùng phía dưới bên phải sẽ dịch xéo lên phía trái..

Lớp ĐHSTIN15L2

10



Lê Thế Nam - 0015440144
Các thao tác trên ma trận

Lớp ĐHSTIN15L2

1

2

3

4

5

1

3

4

5

6

7

2


4

3

4

15

6

3

3

1

3

14

16

4

2

3

12


4

21

1

2

3

4

1

3

5

6

7

2

4

4

15


6

3

2

12

4

16

for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
if(i<x && j>=y)
A[i][j]=A[i][j+1];
else if(i>=x && jA[i][j]=A[i+1][j];
else if(i>=x && j>=y)
A[i][j]=A[i+1][j+1];
11
}
m--;
n--;


Lê Thế Nam - 0015440144
Các thao tác trên ma trận


2.3.3.2.4. Chèn thêm 1 dòng vào ma trân
Ý tưởng như sau:
- Nhập số dòng d cần chèn ( dòng nhập vào phải nhỏ hơn hoặc bằng dòng
hiện tại và lớn hơn 1)
- Kiểm tra 1 ≤ d ≤ m nếu không thỏa sang in ra màn hình dòng muốn chèn
không hợp lề , ngược lại tiếp tục
- Dời các phần tử từ dòng d xuống phía dưới và tăng thêm 1 dòng cuối.
for(int i=n;i>d;i--)
for(int j=0;jA[i][j]=A[i-1][j];
n++;

- Nhập và gán các phần tử vào dòng d.
for(int j=0;j{
cout<<"nhap phan tu cot "<cin>>A[d][j];
}

Lớp ĐHSTIN15L2

12


Lê Thế Nam - 0015440144
Các thao tác trên ma trận

Lớp ĐHSTIN15L2


1

2

3

4

5

1

3

4

5

6

7

2

4

3

4


15

6

3

3

1

3

14

16

4

2

3

12

4

21

1


2

3

4

5

1

3

4

5

6

7

2

4

3

4

15


6

3

5

3

4

6

9

4

3

1

3

14

16

5

2


3

12

4

21

13


Lê Thế Nam - 0015440144
Các thao tác trên ma trận

2.3.3.2.5. Chèn thêm 1 cột vào ma trân
Ý tưởng như sau:
- Nhập số dòng c cần chèn
- Kiểm tra 1 ≤ c ≤ m nếu không thỏa sang in ra màn hình dòng muốn chèn
không hợp lề , ngược lại tiếp tục
- Dời các phần tử từ cột c sang trái tăng thêm 1 cột cuối.
for(int i=0;ifor(int j=m;j>c;j--)
A[i][j]=A[i][j-1];
m++;

- Nhập và gán các phần tử vào cột c.
for(int i=0;i{
cout<<"nhap phan tu dong "<cin>>A[i][c];

}

Lớp ĐHSTIN15L2

14


Lê Thế Nam - 0015440144
Các thao tác trên ma trận
1

2

3

4

1

3

4

6

7

2

4


3

15

6

3

3

1

14

16

4

2

3

4

21

1

2


3

4

5

1

3

4

5

6

7

2

4

3

6

15

6


3

3

1

7

14

16

4

2

3

8

4

21

2.3.3.2.6. Sắp xếp ma trận giảm dần theo tổng của từng dòng
Ý tưởng như sau:
- Tính tổng từng dòng của ma trận và lưu vào mảng B có thứ tự tương ứng.
Lớp ĐHSTIN15L2


15


Lê Thế Nam - 0015440144
Các thao tác trên ma trận
int i,j,d, tong=0;
for (j= 0;jtong+=A[i][j];
b[d++]=tong;

-Sắp xếp lại mảng B và ma trận A theo chiều giảm dần của tổng được lưu ở
mảng B.
for (i=0;ifor (j=i+1; iif (b[i]>b[j]) {
int t;
t=b[i]
;
b[i]=b[j];
b[j]=t;
for (int d=0; d{
t=A[i][d];
A[i][d]=A[j][d];
A[j][d]=t;
}
}
}

2.4.Giới thiệu DEMO và hướng dẫn sử dụng

2.4.1 Nhập dữ liệu:
Chương trình yêu cầu người dùng nhập vào số dòng m và cột n của ma trận.
Giới hạn số dòng và cột tối đa là 50 và phải lớn hơn 0 (0 < m,n ≤ 50), nếu người
dùng nhập ngoài giới hạn này chương trình sẽ yêu cầu nhập lại m,n.
Lần lượt nhập từng phần tử cảu ma trận.

Lớp ĐHSTIN15L2

16


Lê Thế Nam - 0015440144
Các thao tác trên ma trận

2.4.2 Xử lý và xuất kết quả
Sau khi nhập dữ liệu hoàn thành chương trình xuất ra ma trận vè nhập và
menu chương trình yêu cầu người dùng lựa chọn thao tác muốn xử lý.
1. Xóa một dòng trên ma trận.
2. Xóa một cột trên ma trận.
3. Xóa dòng và cột chứa phần tử nhỏ nhất.
4. Chèn thêm dòng vào ma trận
5. Chèn thêm cột vào ma trận.
6. Hoán vị các dòng sao cho tổng giá trị của từng dòng giảm từ trên xuống
0. Thoát.
Người dùng chọn tao tác cần thực hiện bằng cách nhập số tương ứng với thao
tác đó và nhấn phím <Enter> để thực hiện.

Lớp ĐHSTIN15L2

17



Lê Thế Nam - 0015440144
Các thao tác trên ma trận

Ví dụ: người dùng muốn chèn thêm vào ma trận 1 dòng tại vị trí dòng thứ 2:
- Chọn 4 <Enter>
- Nhập k = 2 <Enter>
- Nhập thêm các phần tử cần chèn vào. (số phần tử bằng với số cột) <Enter>
- Chương trình xử lý và trả về kết quả và quay lại menu lựa chọn để thực
hiện thao tác tiếp theo.

Lớp ĐHSTIN15L2

18


Lê Thế Nam - 0015440144
Các thao tác trên ma trận

Lớp ĐHSTIN15L2

19


Lê Thế Nam - 0015440144
Các thao tác trên ma trận

3. KẾT LUẬN
3.1. Kết quả đạt được

3.1.1. Xóa một dòng ma trận

3.1.2. Xóa một cột ma trận

Lớp ĐHSTIN15L2

20


Lê Thế Nam - 0015440144
Các thao tác trên ma trận

3.1.3. Xóa dòng và cột chứa phần tử nhỏ nhất

3.1.4. Chèn thêm dòng vào ma trận

Lớp ĐHSTIN15L2

21


Lê Thế Nam - 0015440144
Các thao tác trên ma trận

3.1.5. Chèn thêm cột vào ma trận

Lớp ĐHSTIN15L2

22



Lê Thế Nam - 0015440144
Các thao tác trên ma trận

3.1.6 Hoán vị các dòng sao cho tổng giá trị của từng dòng giảm từ trên
xuống

Lớp ĐHSTIN15L2

23


Lê Thế Nam - 0015440144
Các thao tác trên ma trận
3.2. Hạn chế
- Khai báo mảng 2 chiều trong chương trình bằng cấp phát tĩnh nên bị giới hạn số
lượng phần tử nhất định, chiếm nhiều không gian bộ nhớ khi cấp phát cho mảng và
chương trình thực hiện tương đối chậm. Vì vậy không thể thực hiện đươc khi thao
tác với ma trận có cấp m x n rất lớn được.
3.3. Hướng phát triển
Trong giới hạn thời gian cho phép nên chưa thể tối ưu chương trình tốt hơn. Nếu có
thêm thời gian để nghiên cứu, em sẽ thực hiện chương trình với khai báo cấp phát
động cho mảng 2 chiều và dùng con trỏ để chương trình thực hiện nhanh hơn và tối
ưu hơn.

Lớp ĐHSTIN15L2

24



Lê Thế Nam - 0015440144
Các thao tác trên ma trận
TÀI LIỆU THAM KHẢO
[1] PHẠM VĂN ẤT: “Kỹ thuật lập trình C: cơ sở và nâng cao”. Nhà Xuất Bản
Khoa Học Kỹ Thuật – 1996
[2] Sử Dụng Mảng Trong C++, RYE NGUYEN • 25/09/2014 22:02:42

/>
Lớp ĐHSTIN15L2

25


Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×