You are on page 1of 26

Kỹ Thuật Lập Trình

Project môn học (không bắt buộc)


▪ Danh sách các đề tài:

Nhóm 1 Nhóm 2 Nhóm 3

1. Thuật toán quay lui (Backtracking) và bài 12. Thuật toán Balan ngược (Reserve 18. Tìm hiểu về thư viện Standard
toán 8 hậu, mã đi tuần Polish Notation) và ứng dụng Template Library (containers,
2. Thuật toán nhánh cận và ứng dụng (ít nhất 3 13. Thuật toán Dynamic Time Warping iterators, algorithms) trong C++ và
ví dụ) (dựa trên quy hoạch động) các ví dụ
3. Thuật toán tham lam và ứng dụng (ít nhất 3
ví dụ)
14. Thuật toán gradient descent và ứng 19. Tìm hiểu về C++ Exception
4. Thuật toán leo đồi (Hill Climbing) và ứng dụng Handling, C++ Standard
dụng 15. Ma trận thưa và Thuật toán nhân Exceptions, và các ví dụ.
5. Thuật toán luyện kim (Simulated (nhanh) hai ma trận thưa 20. Tìm hiểu về C++ Namespaces,
Annealing) và ứng dụng 16. Sum-area Table (Integral Image) và C++ Template và C++ Preprocessor,
6. Tabu Search và ứng dụng ứng dụng. và các ví dụ.
7. Tối ưu bầy đàn (Particle 17. Các thuật toán nhân ma trận
Swarm Optimization) và ứng dụng
8. Giải thuật đàn kiến (Ant colony
optimization) và ứng dụng
9. Giải thuật di truyền (Genetic Algorithm) và
ứng dụng và ứng dụng
10. Thuật toán tối ưu sói xám (Grey Wolf
Optimizer) và ứng dụng
11. Thuật toán tối ưu cá voi (Whale
Optimization Algorithm) và ứng dụng
Từ bài toán đến chương trình
▪ Các bài toán thực tế thường rất phức tạp
Phải xác định được
o Các dữ liệu liên quan đến bài toán
o Các thao tác cần thiết để giải quyết bài toán
▪ Ví dụ
Bài toán quản lý sinh viên đăng ký học phần
Cần quản lý những thông tin nào?
• Thông tin về sinh viên: tên, ngày sinh, MSSV, Khoa, …

Cần thực hiện những thao tác nào?


• Tạo ra tài khoản sinh viên.
• Cập nhật một số thông tin về sinh viên.
• Thêm, xóa , sửa đăng ký học phần.

Ai được phép thực hiện thao tác nào?


Từ bài toán đến chương trình
Giải thuật

Thiết kế - Dùng Mã giả Đánh giá Giải thuật tốt/tối ưu Coding


Bài toán thực (Pseudocode)
tế - Dùng flowchart

- Mô hình toán Phân tích, đánh giá Ngôn ngữ lập trình
- Chọn kiểu dữ liệu, thuật toán C/C++
cấu trúc dữ liệu -Độ phức tạp Java
- Thiết kế giải thuật - Cải tiến thuật toán Python

Khái niệm Kỹ thuật lập trình
▪ Kỹ thuật lập trình: là kỹ thuật giải quyết một bài toán trên máy tính dựa trên nền
tảng một phương pháp luận và một hoặc nhiều ngôn ngữ lập trình phù hợp với yêu
cầu.

Tư tưởng thiết kế + Cấu trúc dữ liệu + Giải thuật + Ngôn ngữ lập trình
Khái niệm Kỹ thuật lập trình
▪ Thế nào là lập trình

o Viết chương trình tính 23 o Viết chương trình tính xn


o Viết chương trình tính tổng 10 o Viết chương trình tính tổng k
số nguyên tố đầu tiên. số nguyên tố đầu tiên.
Khái niệm Kỹ thuật lập trình
▪ Khái niệm lập trình
Với mỗi bài toán (vấn đề) đặt ra, cần:
o Thiết kế thuật toán để giải quyết bài toán đó.
o Cài đặt thuật toán bằng một chương trình máy tính.
Khái niệm Kỹ thuật lập trình
▪ Thế nào là lập trình tốt

Đúng / Chính xác Khả năng nâng cấp


o Thỏa mãn các nhiệm vụ o Dễ dàng chỉnh sửa Hiệu quả
o Được khách hàng chấp nhận o Dễ dàng nâng cấp trong điều o Thời gian lập trình ngắn
kiện bài toán thay đổi o Khả năng bảo trì dễ dàng
Ổn định Tái sử dụng o Giá trị sử dụng lại lớn
o Ổn định o Tái sử dụng hoặc kế thừa o Sử dụng đơn giản, thân thiện
o Ít lỗi hoặc lỗi nhẹ có thể cho bài toán khác o Nhiều chức năng tiện ích
chấp nhận được
Tương thích Hiệu suất
o Thích ứng tốt các môi o Chương trình nhỏ gọn, ít bộ
trường khác nhau nhớ
o Tốc độ nhanh, sử dụng ít
CPU
Khái niệm Kỹ thuật lập trình
▪ Làm thế nào để lập trình tốt?
o Tư duy và phương pháp lập trình
o Hiểu sâu về máy tính
o Nắm vững ngôn ngữ
o Đam mê
o Luyện tập
Thiết kế chương trình
▪ Thế nào là chương trình tốt?
o Cấu trúc rõ ràng
o Chương trình có tính logic + các biểu thức được diễn đạt dễ hiểu
o Tên dùng trong chương trình có tính chất miêu tả
o Chú thích hợp lý
o Tôn trọng chiến lược divide/conquer (chia để trị)
▪ Làm thế nào để tạo ra chương trình tốt
o Thiết kế top-down
o Tinh chỉnh từng bước
Thiết kế chương trình
▪ Nguyên tắc chung
Đơn giản Trực tiếp Rõ ràng Cấu trúc tốt
• Thể hiện giải thuật dễ • Sử dụng thư viện mọi lúc • Dùng khối lệnh để tránh • Tôn trọng tính cấu trúc
đọc, dễ hiểu có thể. nhập nhằng. của chương trình (chẳng
• Lựa chọn cấu trúc dữ liệu • Tránh việc kiểm tra điều • Đặt tên biến, hàm, .. sao hạn dựa vào hàm/ thủ tục ).
sao cho việc viết giải thuật kiện không cần thiết. cho tránh được nhầm lẫn • Viết và kiểm thử dựa
là đơn giản nhất trên cấu trúc phân cấp của
• Tìm cách đơn giản hóa chương trình.
các biểu thức • Viết giải thuật bằng giả
• Thay những biểu thức lặp ngữ, rồi mới viết bằng 1
đi lặp lại bằng chương NNLT cụ thể
trình con tương ứng
Thiết kế giải thuật
▪ Chia bài toán ra thành nhiều bài toán nhỏ hơn
▪ Tìm giải pháp cho từng bài toán nhỏ
▪ Gộp các giải pháp cho các bài toán nhỏ thành giải pháp tổng thể cho bài toán ban
đầu
▪ Có 02 cách thiết kế:
o Thiết kế kiểu bottom-up
o Thiết kế kiểu top-down
Thiết kế giải thuật
▪ Thiết kế từ dưới lên (bottom-up):
o Là phương pháp thiết kế đi từ việc thiết kế chi tiết nhỏ sau đó kết hợp lại thành
bài toán hoàn chỉnh.
o Ví dụ: thiết kế chi tiết một phần chương trình, thiết kế chi thiết phần khác, …
lặp lại quá trình cho đến hết.
o Là cách thiết kế đơn giản, dễ thực hiện, không đòi hỏi kỹ năng cao của người
thiết kế. Tuy nhiên, khi gặp hệ thống phức tạp, cách tiếp cận này sẽ không hiệu
quả.
Thiết kế giải thuật
▪ Thiết kế từ trên xuống (top-down):
o Là phương pháp lý tưởng nhất trong thiết kế. Ý tưởng là đi từ thiết kế toàn bộ
sản phẩm một cách hệ thống, tổng thể sau đó chia nhỏ/ phân rã xuống các bài
toán nhỏ hơn để giải quyết, tinh chỉnh cho đến khi hoàn thiện.
o Ví dụ: thiết kế top-down trong lập trình
• Phác họa hàm main (viết bằng mã giả - pseudocode)
• Tinh chỉnh từng lệnh mã giả
✓ Lệnh đơn giản - > thay bằng code
✓ Lệnh phức tạp -> dùng lợi gọi hàm/chương trình con
• Lặp lại (trong hầu hết các trường hợp) ở mức sâu hơn, cụ thể hơn, cho đến khi các hàm được
định nghĩa xong.
• Chương trình có cấu trúc phân cấp.
▪ Ví dụ: thiết kế giải thuật cho bài toán sau:
Phong cách lập trình
▪ Programming style

#include "Hash.h” // Initialize a empty dictionary with size void initDict(Dict &d, int size) { int i; d.size=size; d.n=0;
d.table = new Node[d.size]; assert(d.table != NULL); for(i = 0; i < d.size; i++) d.table[i] = NULL; } // Create a
new empty dictionary with INITIAL_SIZE void createDict(Dict &d) { return initDict(d,INITIAL_SIZE); } // Delete a
dictionary void deleteDict(Dict &d) { int i; Node e; Node q; for (i=0; i<d.size; i++) { for
(e=d.table[i];e!=NULL;e=q) { q=e->next; delete(e->word); delete(e->mean); delete e; }
} delete (d.table);}
Phong cách lập trình
▪ Tại sao cần phong cách lập trình tốt?
o Lỗi thường xảy ra do sự nhầm lẫn của lập trình viên.
• Biến i được dùng làm gì?
• Hàm f được gọi như thếnào?
o Mã nguồn tốt thường là mã nguồn dễ đọc.
Phong cách lập trình
▪ Làm thế nào để mã nguồn dễ đọc?
o Cấu trúc chương trình rõ ràng, dễ hiểu
o Chọn tên phù hợp, gợi nhớ
o Viết chú thích rõ ràng
o Sử dụng module (thiết kế chương trình con/hàm)
Phong cách lập trình
▪ Một số quy tắc

Nhất quán Đơn giản Rõ ràng Bao đóng


• Tuân thủ quy tắc đặt tên • Mỗi chương trình con phải • Chú thích rõ ràng, ví dụ • Hàm chỉ nên tác động tới
trong toàn bộ chương trình. có một nhiệm vụ rõ ràng. đầu mỗi chương trình con và duy nhất 1 giá trị -giá trị trả
• Nhất quán trong việc dùng • Đủ ngắn để có thể nắm bắt trong các đoạn code quan về của hàm
các biến cục bộ. được trọng. • Không nên thay đổi giá trị
• Số tham số của chương của biến chạy trong thân của
Pascal case; Camel trình con là tối thiểu vòng lặp, ví dụ
case; Snake case; Kebab case. for(i=1;i<=10;i++)
i++;
fbien i_bien
Phong cách lập trình
❖ Cấu trúc viết mã nguồn:
▪ Khoảng trắng (spacing): sử dụng khoảng trắng hoặc ký tự xuống dòng hợp lý để
code dễ đọc.
Ví dụ: for (j = 1; j <= 20; j++) s = s+j ; // Code không tốt

for (j = 1; j <= 20; j++)


s = s+j ; // Code tốt
Phong cách lập trình
❖ Cấu trúc viết mã nguồn:
▪ Canh lề hợp lý để tránh nhầm lẫn
if (a != 0)
if (b > 0)
cout<<"a != 0 va b > 0";
else
cout<< "a != 0 va b <= 0";

// Cách viết khác (canh lề) dễ phân biệt hơn


if (a !=0)
{
if (b > 0)
cout<<"a != 0 va b > 0";
else
cout<< "a != 0 va b <= 0";
}
Phong cách lập trình
❖ Cấu trúc viết mã nguồn:
▪ Cách đoạn để dễ đọc các phần của code
#include <iostream>
using namespace std;
int main()
{
int i, n, tong;

cout<<"Nhap vao so n: ";


cin>>n;

tong = 0;
for(i = 0; i<=n; i++)
{
if (i % 2 != 0) //neu i la so le
tong = tong + i; //hoac tong += i;
}

cout<<"tong la:"<<< tong;

return 0;
}
Phong cách lập trình
❖ Cấu trúc viết mã nguồn:
▪ Viết biểu thức ở dạng đơn giản nhất, dễ đọc, dễ hiểu.
▪ Dùng cặp dâu ngoặc đơn ‘(’ , ‘)’ để tránh nhầm lẫn.
▪ Đơn giản hóa các biểu thức phức tạp.
▪ Ví dụ:

if (!(i>=k) && !(i<=j)) // code không tốt

if (i<k && i>j) // code không tốt

if ((i<k) && (i>j)) // code tốt


Phong cách lập trình
❖ Cấu trúc viết mã nguồn:
▪ Đặt tên:
o Tuân thủ quy tắc đặt tên cho biến, hằng, hàm, …
o Dùng tên gợi nhớ, có tính miêu tả cho các biến và hàm. Ví dụ: tinh_tong(), i_num, …
▪ Viết chú thích để chương trình dễ đọc, dễ hiểu code.
//Insert a node with given data into the Set in sorted order
void insertNode(Set &A, char dataC)
{
Node p,beforep; // beforep is a node before node p
p=new tagNode;
beforep=new tagNode;

// if Set A is empty, insert node to Head


if (isEmptySet(A))
{
insertNode2Head(A,dataC);
}
else
{
if (isElementOfSet(A,dataC)==1) // if given data was an element of Set, we stop
{
return;
}
//…
}
// …
Phong cách lập trình
❖ Cấu trúc viết mã nguồn:
▪ Chú thích cho hàm: Mô tả những gì cần thiết để gọi hàm một cách chính xác:
o Mô tả hàm làm gì, chứ không phải làm như thế nào.
o Bản thân code phải rõ ràng, dễ hiểu để biết cách nó làm việc…
o Nếu không, hãy viết chú thích bên trong định nghĩa hàm.
▪ Mô tả đầu vào: Tham số truyền vào, …
▪ Mô tả đầu ra: giá trị trả về, tham số truyền ra, …
Phong cách lập trình
❖ Cấu trúc viết mã nguồn:

// Chú tích không tốt // Chú thích tốt


/* Hàm nhận vào 02 số nguyên a /*
và b. Gán temp bằng a, gắn a Hàm hoán vị 02 số nguyên
bằng b, gắn b bằng temp*/ Hàm nhận vào 2 số nguyên (truyền tham
chiếu)
void hoanvi(int & a, int &b) Đổi chỗ giá trị giữa 2 số đó.
{ */
int temp;
temp = a; void hoanvi(int &a, int &b)
a = b; {
b = temp; int temp;
} temp = a;
a = b;
b = temp;
}
Giải thích hàm làm như thế nào?
Giải thích hàm làm gì?

You might also like