Kỹ Thuật Lập Trình
Trịnh Tấn Đạt
Khoa CNTT - Đại Học Sài Gòn
Email:
Website: />
Nội dung
▪
Giới thiệu môn học
▪
Các nội dung
▪
Đánh giá
▪
Tài liệu tham khảo
▪
Đề tài cho đồ án môn học (option)
▪
Trao đổi và thảo luận
Giới Thiệu
▪
Tên học phần: Kỹ thuật lập trình
▪
Số tín chỉ: 4 (3,1)
▪
Số tiết (lí thuyết, thực hành): 75 (45; 30)
▪
Mơ tả học phần
o Học phần Kỹ thuật lập trình trình bày các kiến thức tiếp nối của học phần Cơ sở lập trình, bao
gồm các chương: Kỹ thuật lập trình đệ qui, Kỹ thuật lập trình con trỏ, Kỹ thuật lập trình ký tự và
chuỗi ký tự, Kỹ thuật lập trình với tập tin văn bản, một số kỹ thuật lập trình nâng cao.
o Học phần này giúp người học hồn thiện và nâng cao kiến thức về ngơn ngữ lập trình. Giúp
người học rèn luyện nhằm nâng cao tư duy về kỹ thuật lập trình.
▪
Mục tiêu: hồn thiện các kỹ năng về lập trình như: phát triển tư duy lập trình, Phân tích vấn đề bài
tốn, thiết kế chương trình, soạn thảo chương trình, hình thành phong cách lập trình hiệu quả, xử lý
lỗi chương trình, ...
Nội dung mơn học
▪
Giới thiệu và Ơn Tập
▪
Con trỏ (Pointer)
▪
Thiết kế chương trình
▪
Đệ quy (Recursion)
▪
Tập tin (FILE)
▪
Chuỗi ký tự (String)
▪
▪
Các kỹ thuật lập trình tối ưu
o Qui hoạch động
o Chia để trị
o Tìm kiếm và Quay lui
o Tham lam
Đồ án môn học (option – không bắt buộc. Sinh viên đăng ký làm sẽ được điểm cộng)
Giới Thiệu
❖ Tài liệu tham khảo:
▪
Tài liệu chính
[1] Huỳnh Minh Trí, Phan Tấn Quốc, Nguyễn Nhựt Đơng, Giáo trình kỹ thuật lập trình, NXB
Đại học Quốc Gia TPHCM, 2016.
▪
Tài liệu khác (khuyến khích đọc thêm tài liệu bằng Tiếng Anh)
[2] Phạm Văn Ất, “Kỹ thuật lập trình C - cơ sở và nâng cao”, NXB Giáo Dục, 2006.
[3] K.N.King, C Programming: A Modern Approach, 2nd Edition
[4] Brian W. Kernighan and Dennis M. Ritchie ,The C Programming Language (2nd Edition)
[5] Wikibooks.org, “C Programming”, 2012.
▪
Nguồn tham khảo khác (tử internet, tìm kiếm bằng tiếng Anh)
o />o />o Stackoverflow: />o GeeksforGeeks : />o Google, Bing, …
Đánh giá mơn học
▪
Điểm q trình: 50%
o Điểm lý thuyết:
✓
Chun cần, thảo luận : (5%)
✓
Kiểm tra giữa kỳ: (20%)
✓
Điểm đồ án mơn học (khơng bắt buộc):
• Sinh viên đăng ký và hoàn thành được thưởng tối đa 1đ.
o
✓
✓
Điểm thực hành :
Chuyên cần, thảo luận : (5%)
Kiểm tra thực hành: (20%)
Điểm thưởng
▪
Thi kết thúc học phần: 50%
✓ Tự luận, đề đóng, thời gian làm bài: 90 phút
Project mơn học (khơng bắt buộc)
▪
u cầu:
• Lý thuyết: đọc hiểu, viết theo hiểu (khơng dịch word-by-word)
• Cài đặt: code và run chương trình. (dựa vào các ví dụ)
• Viết báo cáo
❖ Số lượng thành viên 2 hoặc 3 sinh viên.
❖ Thời gian nộp: tuần 14
Project mơn học (khơng bắt buộc)
▪
Danh sách các đề tài:
Nhóm 1
Nhóm 2
1. Thuật tốn quay lui (Backtracking) và bài 1. Thuật toán Balan ngược (Reserve
toán 8 hậu, mã đi tuần
Polish Notation) và ứng dụng
2. Thuật toán nhánh cận và ứng dụng (ít nhất 3 2. Thuật tốn Dynamic Time Warping
ví dụ)
(dựa trên quy hoạch động)
3. Thuật toán tham lam và ứng dụng (ít nhất 3
3. Thuật tốn gradient descent và ứng
ví dụ)
4. Thuật tốn leo đồi (Hill Climbing) và ứng dụng
4. Ma trận thưa và Thuật toán nhân
dụng
5. Thuật toán luyện kim (Simulated (nhanh) hai ma trận thưa
Annealing) và ứng dụng
5. Sum-area Table (Integral Image) và
6. Tabu Search và ứng dụng
ứng dụng.
7. Tối
ưu
bầy
đàn
(Particle 6. 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
10. Thuật tốn tối ưu sói xám (Grey Wolf
Optimizer)
11. Thuật tốn tối ưu cá voi (Whale
Optimization Algorithm)
Nhóm 3
1. Tìm hiểu về thư viện Standard
Template Library (containers, iterators,
algorithms) trong C++ và các ví dụ
2. Tìm hiểu về C++ Exception
Handling, C++ Standard Exceptions, và
các ví dụ.
3. Tìm hiểu về C++ Namespaces, C++
Template và C++ Preprocessor, và các ví
dụ.
Từ bài tốn đến chương trình
▪
Các bài tố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 tốn
▪
Ví dụ
Bài tố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 tốn đến chương trình
Giải thuật
Thiết kế
Bài tốn thực
tế
- Mơ hình tốn
- Chọn kiểu dữ liệu,
cấu trúc dữ liệu
- Thiết kế giải thuật
- Dùng Mã giả
(Pseudocode)
- Dùng flowchart
Đánh giá
Phân tích, đánh giá
thuật tốn
-Độ phức tạp
- Cải tiến thuật tốn
Giải thuật tốt/tối ưu
Coding
Ngơn ngữ lập trình
C/C++
Java
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 tố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 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 tổng 10
số ngun tố đầu tiên.
o Viết chương trình tính xn
o Viết chương trình tính tổng k
số ngun 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 tốn để giải quyết bài tốn đó.
o Cài đặt thuật tố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
o Thỏa mãn các nhiệm vụ
o Được khách hàng chấp nhận
Khả năng nâng cấp
o Dễ dàng chỉnh sửa
Hiệu quả
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 tốn thay đổi
o Khả năng bảo trì dễ dàng
o Giá trị sử dụng lại lớn
Ổn định
Tái sử dụng
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 Nhiều chức năng tiện ích
o Ít lỗi hoặc lỗi nhẹ có thể
cho bài tốn khác
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
▪
Ngun tắc chung
Đơn giản
• Thể hiện giải thuật dễ
đọc, dễ hiểu
• Lựa chọn cấu trúc dữ liệu
sao cho việc viết giải thuật
là đơn giản nhất
• Tìm cách đơn giản hóa
các biểu thức
• Thay những biểu thức lặp
đi lặp lại bằng chương
trình con tương ứng
Trực tiếp
• Sử dụng thư viện mọi lúc
có thể.
• Tránh việc kiểm tra điều
kiện khơng cần thiết.
Rõ ràng
• Dùng khối lệnh để tránh
nhập nhằng.
• Đặt tên biến, hàm, .. sao
cho tránh được nhầm lẫn
Cấu trúc tốt
• Tơn trọng tính cấu trúc
của chương trình (chẳng
hạn dựa vào hàm/ thủ tục ).
• Viết và kiểm thử dựa
trên cấu trúc phân cấp của
chương trình.
• Viết giải thuật bằng giả
ngữ, rồi mới viết bằng 1
NNLT cụ thể
Thiết kế giải thuật
▪
Chia bài toán ra thành nhiều bài tốn nhỏ hơn
▪
Tìm giải pháp cho từng bài tố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 tố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 tốn hồ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 hồ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 tố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
{ 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 qn
• Tn thủ quy tắc đặt tên
trong tồn bộ chương trình.
• Nhất qn trong việc dùng
các biến cục bộ.
Đơn giản
• Mỗi chương trình con phải
có một nhiệm vụ rõ ràng.
• Đủ ngắn để có thể nắm bắt
được
• Số tham số của chương
trình con là tối thiểu
Rõ ràng
• Chú thích rõ ràng, ví dụ
đầu mỗi chương trình con và
trong các đoạn code quan
trọng.
Bao đóng
• Hàm chỉ nên tác động tới
duy nhất 1 giá trị -giá trị trả
về của hàm
• Khơng nên thay đổi giá trị
của biến chạy trong thân của
vịng lặp, ví dụ
for(i=1;i<=10;i++)
i++;
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