Tải bản đầy đủ (.pdf) (223 trang)

Giáo án - Bài giảng: PHƯƠNG PHÁP LẬP TRÌNH CÁC NGÔN NGỮ MÁY

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 (2.78 MB, 223 trang )

PHƯƠNG PHÁP LẬP TRÌNH
(30 tiết LT)


Nội dung
• Chương 1. Mở đầu
• Chương 2. Lập trình hàm
• Chương 3. Lập trình cấu trúc
• Chương 4. Lập trình hướng đối tượng

• Chương 5. Lập trình hướng đối tượng trong một số ngơn ngữ
• Chương 6. Các phương pháp lập trình trong F#


Chương 1. Mở đầu


Một số khái niệm











Mơ hình tính tốn (computational model) là một tập của các giá trị và
tốn tử.


Sự tính tính (computation) là việc áp dụng một chuổi các toán tử trên
một giá trị để có một giá trị khác.
Chương trình (program) là việc chỉ định một sự tính tốn.
Ngơn ngữ lập trình (programming language) là k{ hiệu để viết các
chương trình.
Cú pháp (syntax) của một ngơn ngữ lập trình xác định cấu trúc hoặc
dạng của chương trình.
Ngữ nghĩa (semantics) của một ngơn ngữ lập trình mơ tả quan hệ giữa
một chuowng trình và mơ hình tính tốn.
Tính hữu dụng (Pragmatics) của một ngơn ngữ lập trình mơ tả các mức
độ thành cơng mà một ngơn ngữ lập trình đáp ứng các mục tiêu của mơ
hình tính tốn và tiện ích của nó đối với các lập trình viên.
Một chương trình (program) có thẻ xem như là một hàm:
Output = Program(Input)
Program = Mơ hình của một miền bài tốn
Thực hiện một chương trình = Sự mơ phỏng của miền bài tốn


Dữ liệu
• Dữ liệu (Data): Trong mọi trường hợp các đối tượng dữ lêệu
được xem như là trung tâm của các chương trình.
• Các giá trị của dữ liệu được phân thành 2 nhóm riêng biệt: giá
trị đơn (primitive) và hỗn hợp (compound).

• Các giá trị đơn (primitive values) thường là các giá trị số, logic,
ký tự.. Liên hợp với các giá trị đơn thường là các toán tử (như
các tốn tử số học, tốn tử logic..)
• Các giá trị hỗ hợp (composite values) thường là các mảng
(arrays), các bản ghi (records), các giá trị định nghĩa đệ quy
(recursively defined values). Liên hợp với các giá trị hỗn hợp

thường là các toán tử khởi tạo giá trị, các toán tử truy xuất mỗi
thành phần của giá trị.


Các loại giá trị dữ liệu
• Các giá trị Boolean (biểu diễn giá trị logic, nói chỉ sử
dụng 1 bit dữ liệu)
• Các giá trị nguyên (Integer) (miền giá trị phụ thuộc
vào số byte được sử dụng để lưu trữ).
• Các số tự nhiên (Natural number).
• Các số hữu tỷ (Rational number) (được biễu diễn bởi
cặp số nguyên)
• Các giá trị thực (Real number)
• Các giá trị ký tự (Character)
• Các giá trị liệt kê (Enumeration)
• Các kiểu dữ liệu trừu tượng (Abstract data types)
(thường sử dụng kiểu con trỏ để tham chiếu)


Một vài mơ hình tính tốn
Mơ hình hàm (Functional Model)
• Mơ hình hàm bao gồm một tập các giá trị, các hàm và các tốn
tử trên hàm.
• Một chương trình là một tập các định nghĩa của các hàm
• Sự tính tốn là sự ứng dụng của hàm (giá trị của biểu thức)

Lập trình hàm


Ví dụ: Cơng thức cho độ lệch chuẩn là:




sd ( x)   x / N    xi / N 
i 1
 i 1

N

N

2

2
i

Người ta áp dụng hai hàm bậc cao là map và fold. Hàm map áp dụng
một hàm cho mỗi phần tử trong danh sách và hàm fold làm giảm một
danh sách bằng cách áp dụng một hàm cho phần tử đầu tiên của
danh sách, kết quả của hàm là phần còn lại của danh sách. Chương
trình hàm viết như sau:
sd(xs) = sqrt(v)
where
n = length( xs )
v = fold( plus, map(sqr, xs ))/n - sqr( fold(plus, xs)/n)


Mơ hình Logic (Logic Model)
• Bao gồm một tập các giá trị, các định nghĩa về quan hệ và các
luật suy diễn.

• Chương trình logic bao gồm các định nghĩa về các quan hệ và
một sự tính tốn là một phép thử.
• Ví dụ 1: Chu vi của đường trịn:
circle(R, C) if Pi = 3.14 and C = 2 * pi * R.
Biểu diễn quan hệ giữa R và C
Ví dụ 2:
human(Socrates)
human(Penelope)
mortal(X) if human(X)
Để xác định xem Socrates hoặc Penelope có mortal, người ta
xác định: ¬mortal(Y)


Cách suy diễn:

1a. human(Socrates)

Sự kiện (Fact)

1b. human(Penelope)

Sự kiện (Fact)

2. mortal(X) if human(X)

Luật (Rule)

3. ¬mortal(Y)

Giả sử (Assumption)


4a. X = Y

Từ 2 và 3

4b. ¬human(Y)
5a. Y = Socrates

Từ 1 và 4

5b. Y = Penelope
6. Mâu thuẩn

5a, 4b, và 1a; 5b, 4b và 1b

Lập trình logic:
Các giá trị (values)
Các quan hệ (relations)
Suy luận logic (logical
inference)

Program = Tập các định nghĩa quan hệ
Computation = thiết lập phép thử (suy luận từ
các định nghĩa)


Mơ hình mệnh lệnh (Imperative Model)


Mơ hình mệnh lệnh bao gồm một tập các giá trị chứa trạng thái và tốn tử ấn định

để thay đổi trạng thái đó. Trạng thái là tập các cặp (tên – giá trị) (name-value) của
các hằng và biến.



Chương trình là chuổi các ấn định và sự tính tốn là chuổi các trạng thái. Mỗi bước
trang tính tốn là kết quả của một tốn tử được ấn định.
Chuổi trạng thái:
S0-O0  S1 - ...  Sn-1 -On-1  Sn



Lập trình mệnh lệnh
Các ơ nhớ (memory cells)
Các giá trị (values)
Các lệnh (commands)

Program = Chuổi tuần tự các lệnh
Computation = Chuổi các thay đổi về trạng thái




Ví dụ: Tính chu vi đường trịn:
constant pi = 3.14
input (R)
C := 2 * pi * R
Output (C)




Việc tính tốn yêu cầu xác định giá trị của R và pi từ một trạng thái và sau đó thay
đổi trạng thái C với một giá trị mới.
constant pi = 3.14
R _|_, C = _|_, pi=3.14
input (R)
R x, C = _|_, pi=3.14
C := 2 * pi * R
R x, C = 2 × x × pi, pi=3.14
Output (C)
R x, C = 2 × x × pi, pi=3.14
( _|_ ký hiệu giá trị chưa được định nghĩa)



Mơ hình mệnh lệnh thường được gọi là mơ hình thủ tục (procedural model) vì các
nhóm tốn tử được trừu tượng hoá thành các thủ tục.


Mẫu hình lập trình
• Một mẫu hình lập trình (programming paradigm) là một kiểu
lập trình mà nó là kiểu có tính mẫu hình trong tiến hành về
cơng nghệ phần mềm.
Chẳng hạn: Lập trình hàm, lập trình logic, Lập trình cấu trúc
Lập trình hướng đối tượng
• Một mẫu hình lập trình cung cấp và xác định quan điểm mà
người lập trình về sự thực thi của chương trình.
Ví dụ: trong lập trình hướng đối tượng, các lập trình viên có thể xem một
chương trình như là một tập họp của các đối tượng có tính tương tác,
trong khi đó, trong lập trình hàm, một chương trình có thể được xem như

là một chuỗi các đánh giá của các hàm vơ hướng.

• Các nhóm khác nhau trong cơng nghệ phần mềm đề xướng
các phương pháp khác nhau, các ngơn ngữ lập trình khác
nhau (tức là các mẫu hình lập trình khác nhau).


• Một số ngôn ngữ được thiết kế để hỗ trợ một mẫu hình đặc thù
Ví dụ:
- Haskell: hỗ trợ lập trình hàm.
- Pascal: hỗ trợ lập trình cấu trúc
- Java: hỗ trợ lập trình hướng đối tượng
- Số ngơn ngữ khác lại hỗ trợ nhiều mẫu hình (Python,Common, Lisp).

• Quan hệ giữa các mẫu hình lập trình và các ngơn ngữ lập trình có
thể phức tạp vì một ngơn ngữ có thể hỗ trợ nhiều mẫu hình lập
trình.
Ví dụ: C++ được thiết kế để hỗ trợ các phần tử của lập trình thủ tục, lập trình
hướng đối tượng.

• Mặc dù vậy, những người thiết kế và những người lập trình quyết
định làm thế nào để xây dựng một chương trình dùng các phần tử
của mẫu hình.
Ví dụ: Người ta có thể viết một chương trình hồn tồn theo kiểu lập trình thủ
tục trong C++, cũng có thể viết chương trình hồn tồn hướng đối tượng, hay
viết chương trình có các phần tử của cả hai mẫu hình.


Nhìn lại một số ngơn ngữ lập trình đã học







Assembler
Turbo–pascal
C/C++
Java
.NET


Chương 2
Lập trình hàm


1. Lập trình hàm
• Mơ hình tính tốn dựa trên các khái niệm tốn học của hàm
• Mỗi hàm có thể không đối số hoặc nhiều đối số. Kết quả của
hàm là một giá trị xác định hoặc dự báo.
• Ngơn ngữ lập trình hàm: FP, Haskell, Gopher…


2. Định nghĩa của hàm



Số tự nhiên: Tốn học: 1,2…
Khoa học tính tốn: 0,1,2…
Ví dụ về một hàm đơn giản: Hàm tính giai thừa:

fact(n) = 1 x 2 x 3… x n với fact(0) =1



Có thể được viết theo các dạng:



Dễ thấy rằng, định nghĩa sau là tương đương với 2 định nghĩa trước (có thể chứng
minh bằng quy nạp)


3. Nhìn qua dạng thức định nghĩa hàm trong
lập trình hàm:
• Xét hàm fact(n) với định nghĩa tốn học:


Cách 1: Đ/n thông qua biểu thức
fact1 :: Int -> Int
fact1 n = if n==0 then 1 else n* fact1 (n-1)
-Dòng 1: Xác định kiểu cho hàm fact1 theo cú pháp object :: type
fact1 được định nghĩa như là một hàm (ký hiệu ->) với một tham
số có kiểu Int (thứ nhất) và kiểu trả lại của hàm là Int (thứ hai)
(Gopher không định nghĩa tập tự nhiên nên tạm sử dụng kiểu Int)
-Dòng 2: Khai báo nội dung của hàm fact1, nó có dạng:
fname params = body
Trong đó: fname: Tên của hàm
params: các tham số của hàm (có thể khơng có)
body : một biểu thức xác định giá trị của hàm.
ví dụ trên là biểu thức if – then - else



Cách 2: Lập các trường hợp

• Lập các trường hợp cho việc kiểm tra các phương trình điều kiện. Nếu
trường hợp nào đúng thì thực hiện việc lấy giá trị theo trường hợp đó.
• Khi thực hiện, hàm sẽ được duyệt từ trên xuống dưới các trường hợp
để kiểm tra điều kiện
• Có thể thay otherwise bằng điều kiện n>=1 để khẳng định chỉ xét trong
phạm vi số tự nhiên


Cách 3: Đối sánh mẫu

• Được gọi là cách đối sánh mẫu (pattern matching). Gopher sẽ đối sánh
giá trị của tham số với mẫu giá trị sau fact3 để xác định giá trị cần tìm
• Hàm sẽ được duyệt từ trên xuống dưới để tìm mẫu đúng
• Xác định chỉ xét trong phạm vi số tự nhiên


Cách 4: Sử dụng hàm thư viện

- 1..n được gọi là biểu thức danh sách (list). Nó phát sinh các số
nguyên từ 1 đến n.
- Hàm product là hàm nhân. Nó thực hiện việc nhân tất cả các
phần tử trong danh sách [1..n]

Đánh giá: Nhiều người cho rằng fact5 và fact6 là tốt hơn các
cách xây dựng khác.



4. Lập trình hàm bằng Gopher
Khởi động Gopher
Gopher <options> <file>
File nguồn:
- Là file script có phần mở rộng là .hs, .has, .gs, .gof chứa các định nghĩa về
hàm, toán tử, kiểu…
- file với phần mở rộng .prelude (hoặc .pre) là file thư viện chứa các hàm,
toán tử, kiểu được định nghĩa sẵn
Chú thích trong file nguồn:
{- và -} hoặc - -


Ví dụ về file nguồn facts.gs cho gopher


×