Đảm bảo các quy tắc trong chương trình ..... Giới thiệu sơ qua về bài toán Thư viện ma trận cho phép tổng hợp lại các bài toán con của ma trận để truy xu ất, ứng dụng vào thực hiện chư
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
Viện Toán ứng dụng và tin học
Gi ảng viên hướng dẫn: Th ầy Vũ Thành Nam
B ộ môn:
Vi ện:
K ỹ thuật lập trình Toán ứng dụng và tin học
H ọ và tên:
MSSV:
Dương Thu Trang
20200625
HÀ N ỘI, 8/2022
Trang 2M ỤC LỤC
Chương 1: Mô tả cấu trúc chương trình 2
1.Gi ới thiệu sơ qua về bài toán 2
2.Cách thức thực hiện 2
3.Mã nguồn 3
Chương 2: Kỹ thuật lập trình để có chương trình tốt 7
1.Phân tích yêu cầu của đề tài 7
2.Thiết kế 7
3 Đảm bảo các quy tắc trong chương trình 7
4.Kỹ thuật làm việc với biến 7
Chương 3: Các tình huống kiểm thử 8
1.L ập trình phòng ngừa 8
2.Kiểm thử 11
Chương 4:Tổng kết 15
Trang 3CHƯƠNG 1: MÔ TẢ CẤU TRÚC CHƯƠNG TRÌNH
1 Giới thiệu sơ qua về bài toán
Thư viện ma trận cho phép tổng hợp lại các bài toán con của ma trận để truy
xu ất, ứng dụng vào thực hiện chương trình một cách nhanh chóng, tiện lợi hơn Trong bài báo cáo môn Kỹ thuật lập trình, em xin trình bày 3 bài toán cơ bản sau: Cộng 2 ma trận, Trừ hai ma trận, Nhân hai ma trận Đồng thời cập nhật thêm một số tính năng giúp chương trình hoạt động hiệu quả hơn với người dùng
2 Cách thức thực hiện
• Ngôn ngữ lập trình lựa chọn: C#
• Chủ đề lựa chọn: Chủ đề 1 ( Xây dựng thư viện về ma trận )
• Kỹ thuật lập trình sử dụng: Lập trình hướng cấu trúc
• Input dữ liệu: nhập từ bàn phím
• Output dữ liệu: hiển thị trên màn hình
3 Mã nguồn của chương trình ( đã kèm chú thích)
4 using System;
5
6 //Dương Thu Trang 20200625
7 namespace thư_viện
8 {
9 class Matran
10 {
11 // Cac thuoc tinh
12 private int So_Hang;
13 private int So_Cot;
14 private int[,] MT;
15 // Phuong thuc khoi tao
16 public Matran(int sh, int sc)
17 {
18 this.So_Hang = sh;
Trang 419 this.So_Cot = sc;
20 this.MT = new int[sh, sc];
21 }
22 // Phuong thuc Nhap ma tran
23 public void NhapMT()
24 {
25 Console.Write("\n\t Nhap so hang cua ma tran: ");
26 this.So_Hang = int.Parse(Console.ReadLine());
27 Console.Write("\n\t Nhap so cot cua ma tran: ");
28 this.So_Cot = int.Parse(Console.ReadLine());
29 for (int i = 1; i <= this.So_Hang; i++)
30 for (int j = 1; j <= this.So_Cot; j++)
31 {
32 Console.Write("\n\t - Nhap phan tu thu A[" + i + "," +
j + "]: ");
33 this.MT[i, j] = int.Parse(Console.ReadLine());
34 }
35 }
36 // Tim kiem phan tu ma tran
37 public int Tim_Kiem(int x)
38 {
39 for (int i = 1; i <= this.So_Hang; i++)
40 for (int j = 1; j <= this.So_Cot; j++)
41 if (this.MT[i, j] == x)
42 { return i;}
43
44 return 0;
45 }
46 // Cap nhat phan tu
47 public void CapNhat(int m, int n, int pos)
48 {
49 this.MT[m, n] = pos;
50 }
51 // Cong 2 ma tran
52 public Matran Cong2MT(Matran a, Matran b)
53 {
54 Matran c = new Matran(this.So_Hang, this.So_Cot);
55 if (a.So_Hang == b.So_Hang && a.So_Cot == b.So_Cot)
56 {
57 for (int i = 0; i < this.So_Hang; i++)
58 {
59 for (int j = 0; j < this.So_Cot; j++)
60 {
61 c.MT[i, j] = a.MT[i, j] + b.MT[i, j];
62 }
63 }
64 }
65 else
66 {
67 Console.WriteLine("\n\t Khong cong duoc !!! \n");
68 }
69 return c;
70 }
71 // Tru 2 ma tran
72 public Matran Hieu2MT(Matran a, Matran b)
73 {
74 Matran c = new Matran(this.So_Hang, this.So_Cot);
75 if (a.So_Hang == b.So_Hang && a.So_Cot == b.So_Cot)
76 {
77 for (int i = 0; i < this.So_Hang; i++)
78 {
79 for (int j = 0; j < this.So_Cot; j++)
80 {
81 c.MT[i, j] = a.MT[i, j] - b.MT[i, j];
82 }
Trang 583 }
84 }
85 else
86 {
87 Console.WriteLine("\n\t Khong tru duoc !!!");
88 }
89 return c;
90 }
91 // Tich 2 ma tran
92 public Matran Tich2MT(Matran a, Matran b)
93 {
94 Matran c = new Matran(this.So_Hang, this.So_Cot);
95 if (a.So_Cot != b.So_Hang)
96 {
97 Console.Write("\n\t ERROR: Khong thuc hien dc phep
nhan !!!");
98 }
99 else
100 {
101 for (int i = 0; i < this.So_Hang; i++)
102 for (int j = 0; j < this.So_Cot; j++)
103 {
104 c.MT[i, j] = 0;
105 for (int k = 0; k < b.So_Hang; k++)
106 {
107 c.MT[i, j] += a.MT[i, k] * b.MT[k, j];
108 }
109 }
110 }
111 return c;
112 }
113 // Xuat Ma tran
114 public void XuatMT()
115 {
116 Console.WriteLine("\t Ma tran: \n");
117 for (int i = 1; i <= this.So_Hang; i++)
118 {
119 for (int j = 1; j <= this.So_Cot; j++)
120 {
121 Console.Write("\t" + this.MT[i, j] + " ");
122 }
123 Console.WriteLine();
124 }
125 }
126 public void Menu(out byte chon)
127 {
128 Console.Clear();
129 Console.WriteLine("\n\t|| BAI TOAN MA TRAN || ");
130 Console.WriteLine( "\t|| -||");
131 Console.WriteLine("\t|| 1 Nhap Ma Tran ||");
132 Console.WriteLine("\t|| 2 Cap nhap phan tu Ma Tran
||");
133 Console.WriteLine("\t|| 3 Tong hai Ma tran ||");
134 Console.WriteLine("\t|| 4 Hieu hai Ma tran ||");
135 Console.WriteLine("\t|| 5 Tich hai Ma Tran ||");
136 Console.WriteLine("\t|| 6 Xuat Ma Tran ||");
137 Console.WriteLine("\t|| 0 Quay ve Menu chinh ||");
138
Console.WriteLine("\t|| ||\n");
139 Console.Write("\n\tNHAP LUA CHON: ");
140 chon = byte.Parse(Console.ReadLine());
141 Console.ReadKey();
142 }
143 // Main
Trang 6144 static public void Main()
145 {
146 Matran M1 = new Matran(50, 50);
147 Matran M2 = new Matran(50, 50);
148 Matran M3 = new Matran(50, 50);
149 byte chon;
150 int pos;
151 int h, c, n;
152 //int[,] a;
153 do
154 {
155 var output = new Matran(50, 50);
156 output Menu(out chon);
157 switch (chon)
158 {
159 case 1:
160 M1.NhapMT();
161 break;
162 case 2:
163 Console.Write("\n\t Nhap vi tri phan tu can cap nhat \n");
164 Console.Write("\t\tHang: ");
165 h = int.Parse(Console.ReadLine());
166 Console.Write("\n\t\t Cot: ");
167 c = int.Parse(Console.ReadLine());
168 Console.Write("\n\t\t Gia tri: ");
169 n = int.Parse(Console.ReadLine());
170 if (M1.Tim_Kiem(n) == -1)
171 {
172 Console.Write("\n\t KET QUA TIM KIEM KHONG HOP LE !!!");
173 }
174 else
175 {
176 Console.Write("\n\t Nhap gia tri moi:
");
177 pos = int.Parse(Console.ReadLine());
178 M1.CapNhat(h, c, pos);
179 }
180 Console.ReadLine();
181 break;
182 case 3:
183 Console.WriteLine("\n\t Nhap ma tran 1: ");
184 M1.NhapMT();
185 Console.WriteLine("\n\t Nhap ma tran thu 2:
");
186 M2.NhapMT();
187 Console.WriteLine("\t Tong hai ma tran la:
");
188 M3.Cong2MT(M1, M2);
189 M3.XuatMT();
190 Console.ReadLine();
191 break;
192 case 4:
193 Console.WriteLine("\n\t Nhap ma tran thu 1:
");
194 M1.NhapMT();
195 Console.WriteLine("\n\t Nhap ma tran thu 2:
");
196 M2.NhapMT();
197 Console.WriteLine("\t Hieu hai ma tran la:
");
198 M3.Hieu2MT(M1, M2);
199 M3.XuatMT();
200 Console.ReadLine();
Trang 7201 break;
202 case 5:
203 Console.WriteLine("\n\t Nhap ma tran thu 1:
");
204 M1.NhapMT();
205 Console.WriteLine("\n\t Nhap ma tran thu 2:
");
206 M2.NhapMT();
207 Console.WriteLine("\n\t Tich 2 Ma tran la:
");
208 M3.Tich2MT(M1, M2);
209 M3.XuatMT();
210 Console.ReadLine();
211 break;
212 case 6:
213 M1.XuatMT();
214 Console.ReadLine();
215 break;
216 case 0:
217 Console.Clear();
218 break;
219 default:
220 Console.Write("\n KHONG CO LUA CHON
NAY !!!");
221 break;
222 }
223 } while (chon != 0);
224
225 }
226 }
227 }
Trang 8CHƯƠNG 2: KỸ THUẬT LẬP TRÌNH ĐỂ CÓ
CHƯƠNG TRÌNH TỐT
1 Phân tích yêu cầu của đề bài
- Đã xác định được các thủ tục cần có, xác định input,output phù hợp
- Chia các thủ tục rõ ràng, rành mạch dễ hiểu
2 Thiết kế:
- Thiết kế top-down, dễ tìm kiếm, các thủ tục được phân tách riêng thành các hàm, dễ sửa lỗi
- Các biểu thức được viết ngắn gọn, diễn đạt theo cách thông thường
- Cấu trúc mã nguồn sử dụng hàm trắng phù hợp, căn lề hợp lý, trình bày toán
tử rõ ràng
3 Đảm bảo các quy tắc trong chương trình:
- Nhất quán:
• Nhất quán trong cách đặt tên, tên có nội dung mô tả
• Nhất quán trong việc dùng các biến cục bộ và toàn cục
- Khúc chiết:
• Mỗi chương trình con có nhiệm vụ rõ ràng
• Chương trình con đủ ngắn
- Rõ ràng : Có chú thích nhất quán, rõ ràng ở từng thủ tục
- Bao đóng: Đảm bảo không thay đổi giá trị của biến chạy trong thân vòng lặp, hàm trả về duy nhất 1 giá trị của hàm
4 Kỹ thuật làm việc với biến: Khai báo, đặt tên, sử dụng kiểu dữ liệu, khởi tạo, biến trung gian
Trang 9CHƯƠNG 3: CÁC TÌNH HUỐNG KIỂM THỬ
I L ập trình phòng ngừa:
1 Đổi nhập ma trận từ bàn phím sang nhập từ file txt, cài thêm exception
K ết quả thu được: Warning Dòng lệnh StreamReader có thể trả về statement trống
X ử lý lỗi:
Cách 1: Cải tiến đoạn code Cài đặt kiểm tra file input, nếu có lỗi dừng chương trình, hiển thị thông báo lỗi trên màn hình
Trang 10Cách 2:trả về dạng nhập từ bàn phím ban đầu
2 L ỗi không biên dịch được: sai sót do thiếu hàm Main static
Trang 11X ử lý: chỉnh sửa hàm Main thành static
3 Ki ểm thử đoạn code phòng ngừa ngoại lệ
Trang 12II Ki ểm thử
1. Kiểm thử lệnh:
- Đảm bảo mỗi lệnh đều được thực thi một lần trong chương trình
- Không bị thừa code
Nhập ma trận
Trang 13Xuất ma trận
Cập nhật phần tử ma trận
Trang 14Tổng 2 ma trận
Tích 2 ma tr ận
Hiệu 2 ma trận
2.Ki ểm thử giá trị biên
-Với phép cộng trừ ma trận, phải đảm bảo ma trận A và ma trận B cùng dạng, nếu 2 ma trận không cùng dạng, dừng chương trình, hiển thị thông báo trên màn hình, trả về lỗi như sau:
Trang 16CHƯƠNG 4: TỔNG KẾT
Bài báo cáo của em đã vận dụng các kiến thức học được từ học phần Kỹ thuật lập trình,
k ết hợp với thực hành cá nhân để ứng dụng hiểu sâu hơn về môn học
Tự đánh giá bài tập:
- Ưu điểm:
• Thực hiện được project cá nhân, áp dụng các kỹ thuật lập trình được dạy
• Thực hành kiểm thử, gỡ lỗi, tự cải tiến được đoạn code cần dùng
- Nhược điểm:
• Chưa tối ưu hoá được chức năng người dùng ( ví dụ nhập từ file, lưu kết quả ra file)
• Chưa tối ưu hoá được bài làm do trình độ có hạn
Đồng thời, thông qua học phần này và sự hướng dẫn của thầy, em cũng đã nắm rõ hơn
và định hướng phát triển công việc cho bản thân: đó là phát triển theo hướng BA, đi từ thực hành làm project, bao gồm hiểu cả kiểm thử,gỡ lỗi- đã có trong học phần này
Em xin trân trọng cảm ơn!