KỸ THUẬT LẬP TRÌNH
Bài 1. Tổng quan
Nội dung
Về học phần
Kỹ thuật lập trình và khái niệm liên quan
Các mẫu hình/nguyên lý (paradigm) lập trình
Chu trình phát triển phần mềm
Về học phần
Thông tin học phần
MI3310
Tên: Kỹ thuật lập trình - Programming Techniques
Khối lượng: 2 tín chỉ 2-0-1-4
Học phần liên quan
• HP tiên quyết
• HP học trước: Tin học đại cương
• HP song hành
Mô tả
• Cung cấp kiến thức kỹ năng viết chương trình máy tính
• Trình bày được các nguyên lý lập trình
• Sử dụng được kỹ thuật tổ chức chương trình, giải thuật và cấu trúc dữ
liệu, kỹ thuật vào ra
Kết quả mong muốn
• M1: Hiểu các nguyên lý, phương pháp và kỹ thuật lập trình máy tính
• M2: Kỹ năng cài đặt/hiện thực chương trình với ngôn ngữ lập trình (như
C/C++/C#), kỹ năng sử dụng các cấu trúc dữ liệu, lệnh
• M3: Khả năng phát triển tư duy và kỹ thuật lập trình với nhiều ngôn ngữ
khác, khả năng giải quyết các vấn đề thực tế
Tài liệu tham khảo
• Phạm Văn Ất (2015), Kỹ thuật lập trình C cơ bản và nâng cao, NXB Giao thông
vận tải.
• Lê Hoài Bắc, Nguyễn Thanh Nghị (2005), Kỹ năng lập trình, NXB Khoa học và
Kỹ thuật.
• Đỗ Xuân Lôi, Cấu trúc dữ liệu và giải thuật, NXB Đại học Quốc gia Hà Nội
• Bjarne Stroustrup (2014). Programming: Principles and Practice Using C++
(2nd Edition). Addison-Wesley Professional
• Stephen R. Davis , C# For Dummies
Đánh giá
• Điểm quá trình
• Điểm cuối kỳ
• Điểm thưởng/phạt:
• Dự lớp theo quy chế
• Mức độ hoàn thành bài tập
• Phát biểu/Thảo luận/Bài trên lớp
Trong khóa học
• Ngôn ngữ thể hiện: C#
• Công cụ lập trình: VS
1. Kỹ thuật lập trình và khái niệm liên
quan
Kỹ thuật lập trình
Kỹ thuật lập trình là kỹ thuật thực thi một giải pháp phần mềm
(cấu trúc dữ liệu + giải thuật) dựa trên nền tảng một phương
pháp luận (methodology) và một hoặc nhiều ngôn ngữ lập trình
phù hợp với yêu cầu đặc thù của ứng dụng
Kỹ thuật lập trình
Kỹ thuật lập trình:
• Tư tưởng thiết kế + Kỹ thuật mã hóa
• Cấu trúc dữ liệu + Giải thuật + Ngôn ngữ lập trình
Kỹ thuật lập trình ≠ Phương pháp Phân tích & thiết kế(A&D)
Thế nào là lập trình
viết Chương trình in 100 viết Chương trình in n số
số nguyên tố đầu tiên nguyên tố đầu tiên
viết Chương trình tính viết Chương trình tính giai
100! thừa
Khái niệm lập trình
Với mỗi bài toán, làm thế nào để:
• Thiết kế giải thuật nhằm giải quyết bài toán đó
• Cài đặt giải thuật bằng một chương trình máy tính
Lập trình tốt
Đúng
(chinh Ổn định
xác)
Khả
Tái sử
năng
dụng
nâng cấp
Lập trình tốt
Tương Hiệu
thích quả
Hiệu
suất
Làm thế nào để lập trình tốt !
Phát biểu bài toán/vấn đề
Tư duy và phương pháp lập trình
Hiểu sâu về máy tính
Nắm vững ngôn ngữ, nền tảng
Rèn luyện kỹ năng
2. Tổng quan về lập trình
Máy tính
Các thành phần của máy tính
Chương trình máy tính
Chương trình máy tính (computer program):
Tập hợp các lệnh chỉ dẫn cho máy tính thực hiện nhiệm vụ
Ngôn ngữ lập trình (programming language):
Dùng để viết các lệnh, chỉ thị
Hoạt động của chương trình máy tính
Chu trình thực thi chương trình
Chương trình đc nạp vào bộ nhớ chinh
tập các lệnh được nạp vào bộ nhớ
Các lệnh được thực thi
con trỏ lệnh IP
Luồng điều khiển - thứ tự thực hiện các
nhóm lệnh
Hoạt động của chương trình máy tính
Mức thấp: Chu trình thực thi lệnh
BXL nhận lệnh từ bộ nhớ chính
• PC (Programm Counter) thanh ghi lưu địa chỉ lệnh
• Lệnh được nạp vào thanh ghi lệnh IR (Instruction Register)
• Giá trị PC tăng lên => trỏ tới lệnh tiếp theo
Thực thi lệnh
Chương trình máy tính được tạo ra thế nào ?
Ngôn ngữ lập trình
Chương trình dịch
Công cụ lập trình
Ngôn ngữ lập trình
Ngôn ngữ lập trình là một hệ thống các ký hiệu dùng để liên lạc,
trao đổi với máy tính nhằm thực thi một nhiệm vụ tính toán
Các ngôn ngữ lập trình:
Ngôn ngữ lập trình
Các thành phần của một ngôn ngữ lập trình
• Cú pháp (syntax): mã lệnh hợp lệ
• Ngữ nghĩa (semantic): luật xác định ý nghĩa các lệnh, để ghép các ký hiệu
thành lệnh, lệnh thành chương trình
Các thế hệ ngôn ngữ lập trình
Ngôn ngữ máy
Hợp ngữ - Assembly
Ngôn ngữ bậc cao
Ngôn ngữ máy - mã máy
Máy tính điện tử: nhận các tín hiệu điện tử 0/1 - nhị phân - bit
Chương trình ở dạng nhị phân như trên - mã máy (machine
code)
Vấn đề ?
Hợp ngữ
Assembly
Là bước đầu tiên của việc
xây dựng cơ chế viết
chương trình tiện lợi hơn
thông qua các ký hiệu gợi
nhớ, từ khóa và cả mã máy
Để thực thi => cần chuyển
thành mã máy
Ngôn ngữ lập trình bậc cao
Thay vì dựa trên phần cứng
(machine-oriented) cần tìm
cơ chế hướng vấn đề
(problem-oriented) để tạo
chương trình
Gần gũi với ngôn ngữ tự
nhiên hơn, thường sử dụng
các từ khóa giống tiếng Anh
Sự phát triển của ngôn ngữ lập trình
1940s: Ngôn ngữ máy 1980s: tái sử dụng, giảm sự
• machincode phức tạp
1950s: khai thác sức • object oriented, functional
• Assembly programming
1960s: Tăng khả năng tính 1990s: khai thác tài nguyên
toán • parallel
• Cobol, Lisp 2000s: mô hình tính toán mới
1970s: tăng tính đúng đắn của • bio-computing, service-based
chương trình, giảm phụ thuộc
vào máy
• structures programming: pascal,
algol,C
Phân loại ngôn ngữ theo mức độ trừu tượng
Bậc thấp
• phụ thuộc phần cứng
• chỉ chạy trên 1 loại máy tính
Bậc cao
• độc lập phần cứng
• gần với ngôn ngữ tự nhiên
Từ lập trình đến thực thi
Lập trình
Mã nguồn
Biên dịch/Thông dịch
Thực thi
Biên dịch
compiler
Chương trình thực hiện biên
dịch chương trình nguồn
thành mã máy trước khi thực
hiện
Thông dịch
Chương trình thực hiện dịch
và thực hiện từng dòng lệnh
của chương trình cùng lúc
Dịch từ ngôn ngữ này sang
ngôn ngữ khác, không tạo ra
chương trình dạng mã máy
3. Các nguyên lý/hình mẫu lập trình
programming paradigm
Nguyên lý lập trình
programming paradigm
Nhiều tiếp cận, nguyên lý lập trình:
Imperative: lập trình mệnh lệnh
Declarative: lập trình tường thuật
Functional: lập trình hàm
Object-Oriented: hướng đối tượng
Visual: lập trình trực quan
Event: hướng sự kiện
Lập trình mệnh lệnh - imperative
Người lập trình viết các chỉ thị/mệnh lệnh - máy tính thực hiện
các chỉ thị
Thường sử dụng các từ tiếng anh biểu diễn các chỉ thị - ngôn
ngữ lập trình bậc cao 3GL
VD các ngôn ngữ Basic, Pascal, C, C++, C#, Java,
Lập trình mệnh lệnh - imperative (*)
Các thành phần của ngôn ngữ lập trình mệnh lệnh:
• Các lệnh khai báo biến - declarative statement
• Các lệnh gán - assignment statement
• Các lệnh điều khiển - flow control statement
• Các thủ tục - procedure
Lập trình hướng chức năng, lập trình hàm
Dựa trên lý thuyết hàm
Ngôn ngữ mô tả các cấu trúc dữ liệu và các hàm định nghĩa trên
các kiểu dữ liệu đó
Lập trình hướng chức năng, lập trình hàm
Các thành phần
• Tập hợp các cấu trúc dữ liệu
• Các hàm trên các cấu trúc
• Các hàm cơ sở
• Các toán tử
Lập trình hướng đối tượng
Ý tưởng: mô hình các thực thể và tương tác trong thế giới thức
Trung tâm là đối tượng
• Dữ liệu và thao tác trên dữ liệu được bao gói (encapsulation) trong đối
tượng
• Che dấu thông tin nội bộ (private) tránh tác động không mong muốn từ
bên ngoài
Lập trình hướng đối tượng
Các đối tượng tương tác với nhau => thực hiện các chức năng
chương trình
Lớp đối tượng: bản mô tả các đối tượng cùng kiểu
• đối tượng: thể hiện instance
• Lập trình: trên các lớp đối tượng
• Kế thừa - tái sử dụng
Lập trình hướng đối tượng
Một số ngôn ngữ lập trình hướng đối tượng
• C++
• Java
Lập trình trực quan và phát triển ứng dụng
nhanh RAD
Declarative Lập trình tường thuật
Là hình mẫu lập trình trong đó mô tả logic tính toán mà không
mô tả luồng điều khiển - không đưa ra các lệnh/chỉ thị cụ thể
cho máy tính
VD: ngôn ngữ truy vấn dữ liệu, lập trình hàm, biểu thức chính
quy, ...
4. Chu trình phát triển phần mềm
Các giai đoạn/bước xây
dựng phần mềm, lập
trình
SDLC: software
development life cycle
Có nhiều quy trình phát
triển phần mềm khác
nhau
B1: Phân tích yêu cầu
Phân tích
• Tìm hiểu hệ thống hiện hành
• Phỏng vấn người dung
• Mục tiêu: hệ thống hiện tại có chức năng gì, các vấn đề tồn tại
B1: Phân tích yêu cầu
Các tác vụ
• Tìm hiểu nghiệp vụ, phỏng vấn người dung
• Thiết lập các yêu cầu
• Xác định input, output, xử lý processing, các dữ liệu
• Chú ý: có nhiều phương pháp, kỹ thuật phân tích, vd UML use case, ...
B2: Thiết kế
Thiết kế Sơ đồ phân cấp chức năng (hierarchy chart)
Còn gọi là sơ đồ cấu trúc
Trực quan hóa các module chương trình
B2: Thiết kế
Thiết kế hướng đối tượng
Xác định các đối tượng, quan hệ giữa các
đối tượng
B2: Thiết kế
Giải thuật
Các cấu trúc cơ bản
• Tuần tự: lệnh gán, vào ra
• Chọn/Rẽ nhánh
• Lặp
B2: Thiết kế
Mô tả giải thuật:
• biểu đồ-trực quan
• văn bản, ..
Gate: Đánh giá thiết kế (validate)
B3: Cài đặt lập trình
Viết mã nguồn chương trình (coding): chuyển từ thiết kế thành
chương trình
• Cú pháp (Syntax): Quy tắc xác định cách viết các lệnh
• Chú thích (Comments): tài liệu chương trình (tài liệu trong)
B4: Kiểm thử - Test
Mục đích:
Tài liệu
5. Các nguyên lý lập trình cấu trúc
Nguyên lý lập trình cấu trúc
Các nền tảng tư tưởng lập trình
Các nguyên lý cơ bản:
• Nguyên lý lệnh có cấu trúc
• Nguyên lý tối thiểu
• Nguyên lý địa phương
• Nguyên lý an toàn
• Nguyên lý nhất quán
• Nguyên lý top-down
• Nguyên lý bottom-up
Lệnh có cấu trúc
• các lệnh và cấu trúc điều khiển
• cấu trúc tuần tự
• cấu trúc lặp
• cấu trúc rẽ nhánh
Nguyên lý tối thiểu
• Bắt đầu từ các nguyên tắc và công cụ tối thiểu
• Một số công cụ tối thiếu
• tập phép toán: số học, logic, so sánh
• tập lệnh vào ra cơ bản
• thao tác trên dữ liệu có cấu trúc: string, struct/record, file, ...
Nguyên lý địa phương
• Các biến địa phương trùng tên biến toàn cục => trong thủ tục - biến địa
phương
• Tham số truyền theo giá trị => là biến địa phương
• Trong thủ tục cần biến tạm thao tác => dùng biến địa phương thay vì biến
toàn cục
Nguyên lý nhất quán
• dữ liệu nào => thao tác tương ứng
nguyên lý an toàn
• Lỗi nặng nhất nằm ở mức cao nhất/bước sớm nhất (vd thiết kế)
• Lỗi nặng nhất nằm ở code chịu tải (được thực thi) nhiều nhất
• Phát hiện lỗi - cần phải phát hiện ở bước nào đó, phát hiện sớm nhất -
trước khi lỗi làm ảnh hưởng
phương pháp top-down
• Phân tích từ trên xuống, từ tổng quát tới chi tiết, từ trừu tượng tới cụ thể
• thường áp dụng khi thiết kế
phương pháp bottom-up
• Đi từ cụ thể tới tổng quát
• thường áp dụng khi cài đặt hệ thống
Kỹ thuật lập trình
6. Hình mẫu/mô thức lập trình hướng
đối tượng - Tổng quan
1. Lập trình cấu trúc và hướng đối tượng
Lập trình cấu trúc
• Chương trình tạo nên từ các thành phần thủ tục/hàm/chương trình con
• Dữ liệu và cách xử lý (các thủ tục) tách rời
• Các chương trình con:
• Độc lập
• Trao đổi qua tham số, các biến toàn cục
• Ưu điểm: Chương trình có cấu trúc rõ ràng, dễ theo dõi, dễ sửa lỗi và có
thể làm việc theo nhóm
• Nhược điểm: Các hàm cần trao đổi dữ liệu với nhau và có thể phải sử
dụng biến toàn cục Có thể xảy ra hiệu ứng phụ (side effect)
1. Về lập trình hướng đối tượng
Phát triển ngôn ngữ lập trình: trừu tượng hóa
• Để lập trình: cần cơ chế mô tả đối tượng thế giới thực
VD:
• Assembly: trừu tượng hóa chỉ thị cơ bản (ADD ...)
• Ngôn ngữ cấu trúc: trừu tượng hóa điều khiển và chức năng
Lập trình hướng đối tượng:
• Mô hình hóa dựa trên thế giới thực
vd sinh viên, giảng viên, lớp
• Đối tượng là trung tâm
1. Về lập trình hướng đối tượng
Lập trình hướng đối tượng
• Bài toán được chia thành các thực thể - lớp đối tượng
• Thực thi chương trình: các đối tượng tương tác với nhau (qua truyền
thông điệp - message passing)
2. Khái niệm cơ bản
Đối tượng
Đối tượng
Đối tượng
• Mỗi đối tượng có
• các thông tin, dữ liệu, trạng thái
• oto: màu sắc, tốc độ, mác
• các hành động
• tang ga, phanh, rẽ trái
Đối tượng
Đối tượng
Mô hình hóa vào trong lập trình:
• Đóng gói thành trạng thái (state) và hành vi (behavior).
• Trạng thái được biểu diễn bởi các thuộc tính (attributes) và các mối quan
hệ (relationships).
• Hành vi được biểu diễn bởi các thao tác (operations) hay phương thức
(methods)
2. Khái niệm cơ bản
Lớp đối tượng - class
• Là mô tả các đối tượng cùng kiểu (vd các sinh viên) - mô hình hóa thực
thể trong thế giới thực
• Lớp đối tượng: chỉ là bản mô tả
• Lớp đối tượng - mô tả về đối tượng gồm
• Các thuộc tính, tính chất đặc trưng của lớp (attribute, properties)
• Các hành vi có thể thực hiện - phương thức (method)
Ngoài ra: operator, ...
Lớp >< Đối tượng
• Đối tượng là một thể hiện cụ thế của lớp - instance; vd sinh viên A
• Thực thi chương trình: các đối tượng được tạo, sử dụng, hủy bỏ
2. Khái niệm cơ bản
Tính đóng gói - public class PdfVerifier
{
//danh sách các cert của các CA tin cậy
encapsulation private List<[Link].X509.X509Certificate>
_storeTrustedCA = null;
• Dữ liệu (thuộc tính) và //danh sách CRL để kiểm tra thu hồi
private List<[Link].X509.X509Crl> _CRLs =
thao tác (phương null;
thức) được đóng gói public void
vào lớp đối tượng SetTrustedCAs(List<[Link].X509.X509Certificate>
trustedCA)
• Nhờ đó: bảo vệ dữ liệu {
if(_storeTrustedCA != null)
khỏi truy cập, xử lý trái _storeTrustedCA.Clear();
_storeTrustedCA = new
phép từ bên ngoài List<X509Certificate>(trustedCA);
}
}
2. Khái niệm cơ bản
Tính kế thừa - inheritance
• Lớp đối tượng cha
• Lớp đối tượng con:
• thừa kế lớp cha (các thuộc tính, các phương thức)
• có thể thay đổi, bổ sung
2. Khái niệm cơ bản
Tính đa hình - polymorphism
• Các đối tượng khác nhau có phương thức cùng tên nhưng thực hiện khác
nhau
Ngôn ngữ lập trình hướng đối tượng
• Có hỗ trợ mô thức/hình mẫu lập trình hướng đối tượng
• Ví dụ
• Smalltalk
• C++
• Java
• C#
• ...
2. Khái niệm cơ bản
Vòng đời của đối tượng
(Lớp đối tượng - chỉ là mô tả)
• Khai báo: đối tượng truy xuất qua tên
vd: Car mycar;
• Khởi tạo đối tượng: toán tử new
mycar = new Car();
• Truy xuất/sử dụng đối tượng:
• cú pháp: <tên đối tượng>.<prop, method>
[Link] = 4500;
PdfVerifier pdfVerifier = new PdfVerifier();
• Giải phóng đối tượng [Link](_Logger);
[Link]([Link]);