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

LẬP TRÌNH CẤU TRÚC (structured programming)

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 (600.69 KB, 28 trang )

LẬP TRÌNH CẤU TRÚC
(structured programming)
programming)

NỘI DUNG:
1.

Thuật tốn

2.

Kiểu dữ liệu, Cấu trúc dữ liệu, Mơ hình dữ liệu

3.

Cấu trúc lệnh

4.

Khái niệm và nguyên lý cơ bản của lập trình cấu trúc

5.

So sánh với lập trình hướng đối tượng

0

1. Thuật tốn
ƒ

Khái niệm thuật tốn



ƒ

Ngơn ngữ mơ tả thuật tốn

ƒ

Độ phức tạp thuật toán

1


KHÁI NIỆM THUẬT TỐN
Thuật tốn (giải thuật) là một quy tắc để với những dữ
liệu ban đầu đã cho, tìm được lời giải sau một khoảng
thời gian hữu hạn

ƒ

Bài toán

Thuật tốn

Dữ liệu vào

Máy tính

Kết quả ra

2


CÁC ĐẶC TRƯNG CỦA THUẬT TỐN
ƒ

Tính kết thúc (tính dừng)

ƒ

Tính xác định

ƒ

Tính phổ dụng

ƒ

Tính hiệu quả


Thực hiện nhanh



Tiêu phí ít tài ngun máy tính (bộ nhớ)

3


CÁC ĐẶC TRƯNG CỦA THUẬT TỐN
ƒ


Thuật tốn tìm UCLN của hai số nguyên dương
1. Nhập vào hai số nguyên dương a, b
2. So sánh hai số, chọn số nhỏ nhất gắn cho UCLN
3. Nếu một trong hai số a, b khơng chia hết cho UCLN thì thực
hiện bước 4, ngược lại thì thực hiện bước 5
4. Giảm UCLN một đơn vị và quay lại bước 3
5. In UCLN. Kết thúc
?

Các đặc trưng của thuật toán trên

4

TIÊU CHUẨN ĐÁNH GIÁ THUẬT TỐN
ƒ

Lựa chọn thuật tốn nào cho bài tốn?

ƒ

Tiêu chuẩn 1: Thuật toán đơn giản, dễ hiểu, dễ cài đặt

ƒ

Tiêu chuẩn 2: Thuật tốn sử dụng tiết kiệm tài ngun
máy tính (dung lượng không gian nhớ, thời gian)

5



NGƠN NGỮ THUẬT TỐN
ƒ

Ngơn ngữ dùng để mơ tả thuật tốn
? Tại sao phải dùng ngơn ngữ diễn đạt thuật tốn
? Đặc điểm của ngơn ngữ diễn đạt thuật tốn



Ngơn ngữ liệt kê từng bước (Ngơn ngữ tự nhiên)

• Sơ đồ khối (flow chart)
• Ngơn ngữ “giả code” (pseudo−code): Tựa Pascal, tựa C, …
– Các bước trong chương trình nên được đánh số thứ tự
– Có thể bỏ qua phần khai báo dữ liệu, thay vào đó là đặc tả cấu trúc dữ liệu
trước khi viết giải thuật
ƒ

Mô tả thuật tốn
• Thuật tốn:

<Tên thuật tốn>

• Vào (Input):

<Dữ liệu vào của thuật tốn, mơ tả rõ kiểu dữ liệu>

• Ra (Output):


<Các dữ liệu ra - Kết quả>
6

NGƠN NGỮ THUẬT TỐN
ƒ

Ngơn ngữ liệt kê từng bước


Thuật tốn:

Euclid



Vào:

m,n ngun dương (m > n)



Ra:

gcd là ước chung lớn nhất của m và n

r: số nguyên dương
Bước 1. Nhập vào m, n
Bước 2. Nếu m, n >0 thì chuyển sang bước 3, ngược lại thì thông báo “Dữ liệu
vào không hợp lệ” và kết thúc thuật tốn
Bước 3. Nếu m > n thì chuyển sang bước 4. Ngược lại, hoán chuyển giá trị của

m, n
Bước 4. Nếu n ≠ 0 thì chuyển sang bước 5. Ngược lại, gcd = m, in giá trị của
gcd và kết thúc.
Bước 5. Tính r là phần dư của phép chia m cho n
Bước 6. Gán giá trị của n cho m và của r cho n. Quay lại bước 4.
7


NGƠN NGỮ THUẬT TỐN
ƒ

Sơ đồ khối (Flow Chart )
Lệnh

Nút thao tác

(Nú
(Nút vào/ra dữ
dữ liệ
liệu)
Chỉ
Chỉ hướ
hướng truyề
truyền thông tin

Điề
Điều kiệ
kiện

Nút điề

điều kiệ
kiện

Nút bắt đấu, nút kết thú
thúc

...

8

NGƠN NGỮ THUẬT TỐN
ƒ

Thuật tốn Euclid

9


NGƠN NGỮ THUẬT TỐN
ƒ

Ngơn ngữ Tựa Pascal
• Khai báo:

Program < Tên chương trình>
Begin …….
End.

• Chú thích {….}
• Phép tốn số học: +, - *, /, ↑(luỹ thừa)

• Phép tốn so sánh: >, >=, <, <=, =, ≠
• Giá trị logic: true, false
• Phép tốn logic: and, or, not

10

NGƠN NGỮ THUẬT TỐN
ƒ

Các câu lệnh
• Câu lệnh gán

V := E;

– V: biến, E: biểu thức
– Phép gán chung: V1 := V2 := E;

• Câu lệnh điều kiện

if B then S1 [else S2];

• Câu lệnh tuyển

Case
B1: S1;
B2: S2;
….
Bn: Sn;
else Sn+1
end case;

11


NGƠN NGỮ THUẬT TỐN
• Câu lệnh lặp
– Số lần lặp biết trước

for i := m to n do ….
for i := n down to m do….

– Số lần lặp không biết trước

while B do S;
repeat S until B;

(B: biểu thức logic; S: dãy lệnh)

• Câu lệnh chuyển
go to n; (n:số hiệu của một bước trong chương trình)

• Câu lệnh vào ra
read(<danh sách biến>);
write(<danh sách biểu thức>)
12

NGƠN NGỮ THUẬT TỐN
• Chương trình con
– Hàm
function <tên hàm>(<danh sách tham số>): <kiểu dữ liệu>
S

return <biểu thức>
– Thủ tục

Procedure: khơng có kết quả ra

– Sử dụng Var đặt trước tham số cần giữ lại sự thay đổi giá trị sau
khi kết thúc thực hiện hàm/thủ tục
– Lời gọi Hàm

Tên_hàm(<danh sách tham số thực sự>)

– Lời gọi thủ tục Call <Tên thủ tục>(<danh sách tham số thực sự>)

13


ƒ

Ngơn ngữ Tựa C

14

ĐỘ PHỨC TẠP THUẬT TỐN
ƒ

Giải thuật nào hiệu quả nhất cho một bài tốn?
• Độ phức tạp thời gian
• Độ phức tạp khơng gian

?


Đánh giá giải thuật khi chạy chương trình ???

ƒ

Các yếu tố ảnh hưởng đến thời gian thực hiện thuật tốn
• Mơi trường phần cứng: tốc độ xử lý, bộ nhớ,…
• Mơi trường phần mềm: kiểu lệnh, ngơn ngữ, trình biên dịch
• Kích thước dữ liệu vào

ƒ

Đánh giá độ phức tạp thời gian T(n) bằng tổng số phép
tính cần phải thực hiện.
15


ĐỘ PHỨC TẠP THUẬT TỐN
ƒ

Độ tăng của hàm
• Cho hai hàm f(x), g(x) xác định từ tập các số nguyên dương hoặc tập
số thực vào tập số thực. Ta nói f(x) là O(g(x)) nếu tồn tại hai hằng số
C và k sao cho: |f(x)| ≤ C.|g(x)|, với mọi x > k.

ƒ

Ví dụ 1
• f(x) = an xn +…. +a0, với ai là các số thực. Khi đó f(x) = O(xn).



với x > 1 ta có

f ( x ) ≤ a n x n + a n −1 x n −1 + ... + a 0
≤ x n ( an +

a n −1

+ ... +

a0

x
xn
≤ x n ( a n + a n −1 + .... + a 0 )

• Đặt C = |an| + |an−1| + … + |a0| và k = 1, suy ra f(x) = O(xn).
ƒ

Ví dụ 2.
• f(x) = 1+ 2+ 3 + … + n = n(n+1)/2 nên là O(n2).
16

ĐỘ PHỨC TẠP THUẬT TOÁN
ƒ

Các thuật ngữ thường dùng
• Độ phức tạp O(1) gọi là độ phức tạp hằng số
• Độ phức tạp O(log(n)) gọi là độ phức tạp logarit
• Độ phức tạp O(n) gọi là độ phức tạp tuyến tính

• Độ phức tạp O(nlogn) gọi là độ phức tạp nlogn
• Độ phức tạp O(nk) gọi là độ phức tạp đa thức
• Độ phức tạp O(bn) , b>1, gọi là độ phức tạp hàm mũ
• Độ phức tạp O(n!) gọi là độ phức tạp giai thừa

17


ĐỘ PHỨC TẠP THUẬT TỐN
ƒ

Ví dụ 1
K:=0;
For i:=1 to n do
Begin
K:=K+i;
End;

ƒ

Ví dụ 2
K:=0;
For i:=1 to n do
For j:= 1 to n do
Begin
K := K + i * j ;
End;
18

ĐỘ PHỨC TẠP THUẬT TỐN

ƒ

Ví dụ 3
i :=1; K:=0;
while i <= n do
begin
K:= K+ i*i;
i := i * 2;
end;

ƒ

Số phép toán cần thực hiện:
(1 so sánh + 2 nhân + 1 cộng) * (1 + |log2n|) = 4 + 4 |log2n| là
O(log2n).
19


ĐỘ PHỨC TẠP THUẬT TỐN
Ví dụ 4

ƒ

Searching(A[]: array of integer, n: integer, K: integer): Boolean
Begin
i := 1; found := false;
while (i <=n and !found) do
begin
if A[i] = K then found:=true;
else i := i+1;

end;
return found;
end;
20

ĐỘ PHỨC TẠP THUẬT TOÁN
ƒ

Độ phức tạp xấu nhất

ƒ

Độ phức tạp trường hợp tốt nhất

ƒ

Độ phức tạp trung bình

21


ĐỘ PHỨC TẠP THUẬT TOÁN
ƒ

Độ phức tạp trường hợp xấu nhất của A là số lớn nhất
các phép toán cơ bản được thực hiện trong A trên bất
kỳ dữ liệu vào có kích cỡ xác định.

ƒ


Độ phức tạp trường hợp tốt nhất của A là số bé nhất
các phép toán cơ bản được thực hiện trong A trên bất
kỳ dữ liệu vào có kích cỡ xác định.

ƒ

Độ phức tạp trung bình của A là giá trị trung bình của
số các phép toán cơ bản được thực hiện trong A trên
bất kỳ dữ liệu vào có kích thước xác định.

22

ĐỘ PHỨC TẠP THUẬT TỐN
ƒ

Ví dụ hàm Searching ở trên:
• Độ phức tạp trong trường hợp xấu nhất là O(n)
• Độ phức tạp trong trường hợp tốt nhất là:O(1) khi K chính là
phần tử đầu tiên của mảng.
• Độ phức tạp trung bình là: cỡ n/2 (khoảng ½ các phần tử của
mảng được duyệt). Việc tính tốn rất phức tạp dựa vào xác
suất K xuất hiện trong A.

ƒ

Thường đánh giá thuật toán theo độ phức tạp thời gian
xấu nhất. Hiệu quả sử dụng của thuật tốn lại thể hiện
thơng qua độ phức tạp trung bình.

23



2. Kiểu dữ liệu, Cấu trúc dữ liệu, Mơ hình dữ liệu
ƒ

Kiểu dữ liệu trong ngôn ngữ bậc cao

ƒ

Cấu trúc dữ liệu

ƒ

Mối liên hệ giữa thuật toán và cấu trúc dữ liệu

ƒ

Mơ hình dữ liệu

ƒ

Kiểu dữ liệu trong ngơn ngữ C

24

KIỂU DỮ LIỆU VÀ CẤU TRÚC DỮ LIỆU
ƒ

Kiểu dữ liệu:
• Trong ngơn ngữ bậc cao

• Là sự trừu tượng hóa các thuộc tính bản chất của các đối
tượng trong thực tế và phù hợp với cách tổ chức thông tin trên
máy tính
• Kiểu số ngun, số thực, kí tự,…
• Kiểu dữ liệu T = <V, O>, V là tập các giá trị hợp lệ của T và O
là tập các phép toán trên kiểu T.

25


KIỂU DỮ LIỆU VÀ CẤU TRÚC DỮ LIỆU
ƒ

Cấu trúc dữ liệu:
• Là các lưu trữ dữ liệu trên máy tính sao cho việc sử dụng
dữ liệu đó được hiệu quả. Đó chính là tổ chức các khái
niệm tốn học và logic về dữ liệu.
• Kiểu dữ liệu có cấu trúc được kết hợp nên từ các kiểu dữ liệu
cơ sở
• Ví dụ: Kiểu mảng, xâu kí tự, Bản ghi, File,…

ƒ

Mối liên hệ giữa cấu trúc dữ liệu và Thuật toán

Chương trình = Cấu trúc dữ liệu + Thuật tốn
26

KIỂU DỮ LIỆU VÀ CẤU TRÚC DỮ LIỆU
ƒ


Mơ hình dữ liệu
• Là mơ hình tốn học, có thể biểu diễn được trên máy tính, để
biểu diễn các đối tượng của bài tốn và mối liên hệ giữa các
đối tượng
• Mơ hình dữ liệu muốn cài đặt được trên máy tính phải có cách
tổ chức dữ liệu phù hợp.
• Ví dụ: Danh sách, Cây, Đồ thị, Quan hệ,. …

ƒ

Các tiêu chuẩn chọn cấu trúc dữ liệu
• Phản ánh đúng thực tế: quan trọng nhất, đảm bảo tính đúng
đắn của phương án giải quyết
• Các thao tác phù hợp
• Tiết kiệm tài nguyên hệ thống
27


KIỂU DỮ LIỆU TRONG C
ƒ

Kiểu dữ liệu cơ sở
• Kí tự (char, unsigned char)
• Số nguyên (int, unsigned int, long (int), unsigned long (int))
• Số thực, độ chính xác đơn (float)
• Số thực, độ chính xác kép (double)
– Lưu ý: Kích thước và phạm vi biểu diễn của các kiểu dữ liệu

ƒ


Kiểu con trỏ

ƒ

Kiểu enum

ƒ

Kiểu mảng (array)

ƒ

Kiểu cấu trúc (struct)
9 Kiểm tra kích thước của kiểu dữ liệu: dùng tốn tử sizeof(),
dụ: sizeof(int),…


28

KIỂU CON TRỎ
ƒ

Biến con trỏ (Pointer)
• Địa chỉ bộ nhớ của biến được gán cho con trỏ là giá trị của
biến con trỏ.
• Biến thơng thường chứa một giá trị cụ thể (count = 7).
count
7


• Các con trỏ chứa địa chỉ của biến: biến được trỏ chứa giá trị cụ
thể (tham chiếu gián tiếp)
countPtr

count
7

Con trỏ countPtr trỏ đến biến count, giá trị
của biến con trỏ countPtr là địa chỉ của
biến count, giá trị của biến count là 7.
29


Biến con trỏ trong ngơn ngữ C
ƒ

Con trỏ - Pointer
• Sức mạnh của ngơn ngữ lập trình C
• Tạo ra khả năng mềm dẻo khi lập trình
• Thuận lợi truyền tham số cho hàm (tham biến), xử lý
mảng, xâu, bộ nhớ
• Con trỏ có quan hệ mật thiết giữa arrays và strings
• Lưu ý, thận trọng trong cách sử dụng: can thiệp vào
bộ nhớ.
30

Biến con trỏ trong ngôn ngữ C
ƒ

Định nghĩa và khởi tạo biến con trỏ

• * được sử dụng định nghĩa biến pointer
int *myPtr;

• Định nghĩa biến con trỏ, trỏ tới vùng nhớ kiểu int
• Định nghĩa nhiều con trỏ yêu cầu sử dụng * trước mỗi biến con
trỏ
int *myPtr1, *myPtr2;

• Có thể định nghĩa con trỏ kiểu dữ liệu bất kỳ
• Khởi tạo con trỏ là 0, NULL (con trỏ rỗng) hoặc một địa chỉ của
một biến cùng kiểu dữ liệu

31


Biến con trỏ trong ngôn ngữ C
ƒ

&Tenbien (trả về địa chỉ của tenbien)
• Phép gán trả về địa chỉ của biến dữ liệu
int y = 5;
int *yPtr;
yPtr = &y;

/* yPtr lấy địa chỉcủa y */

yPtr “trỏ tới” y

yPtr


y
5

y

yptr
500000

600000

600000

5

địa chỉ của y
là giá trị của
yptr
32

Biến con trỏ trong ngôn ngữ C
ƒ

Sử dụng dấu * để tham chiếu giá trị trong vùng nhớ trỏ bởi
con trỏ

• *yptr trả về giá trị của biến y (bởi vì yptr trỏ tới y)
• Dấu * có thể sử dụng trong lệnh gán làm thay đổi giá trị
của biến dữ liệu.
*yptr = 7; /* thay đổi y bằng 7 */
ƒ


* và & quan hệ đối ngược nhau
- *p là dữ liệu được chứa trong vùng nhớ có địa chỉ là p
- &x là địa chỉ của biến x
int x; int *xptr; xptr = &x;
Khi đó, *xptr = x; &*xptr = *&xptr

33


The address of a is 0012FF7C
The value of aPtr is 0012FF7C
1

/* Fig. 7.4: fig07_04.c

2
3

Using the & and * operators */

The value of a is 7
The value of *aPtr is 7

#include <stdio.h>

Showing that * and & are complements of each other.
&*aPtr = 0012FF7C
*&aPtr = 0012FF7C


4
5

int main()

6

{

7

int a;

/* a is an integer */

8

int *aPtr;

/* aPtr is a pointer to an integer */

9
10

a = 7;

11

aPtr = &a;


/* aPtr set to address of a */

12
13

printf( "The address of a is %p"

14

"\nThe value of aPtr is %p", &a, aPtr );

15
16

Địa chỉ của biến a là giá trị của
con trỏ aPtr

printf( "\n\nThe value of a is %d"

17

"\nThe value of *aPtr is %d", a, *aPtr );

18
19

printf( "\n\nShowing that * and & are complements of "

20


"each other\n&*aPtr = %p"

21

"\n*&aPtr = %p\n", &*aPtr, *&aPtr );

22
23

return 0; /* indicates successful termination */

* aPtr là giá trị

của biến
Quan hệ giữa *

và & là bổ sung

24
25 } /* end main */

Biến con trỏ trong ngơn ngữ C
ƒ

Con trỏ hằng (const pointers)
• Trỏ tới vùng nhớ cố định
• Phải được khởi tạo khi định nghĩa
• int *const myPtr = &x;
– Kiểu int *const – con trỏ hằng trỏ đến vùng nhớ kiểu int


• const int *myPtr = &x;
– Con trỏ thông thường trỏ đến const int

• const int *const Ptr = &x;
– con trỏ const trỏ đến một vùng nhớ const int
– x có thể thay đổi, nhưng *Ptr thì khơng.

35


Con trỏ hằng
1

/* Fig. 7.13: fig07_13.c

2

Attempting to modify a constant pointer to non-constant data */

3

#include <stdio.h>

4
5

int main()

6


{

Thay đổi *ptr được phép – x
không phải là hằng.

7

int x; /* define x */

8

int y; /* define y */

9
10

/* ptr is a constant pointer to an integer that can be modified

11

through ptr, but ptr always points to the same memory location */

12

int * const ptr = &x;

13
14

*ptr = 7; /* allowed: *ptr is not const */


15

ptr = &y; /* error: ptr is const; cannot assign new address */

16
17

return 0; /* indicates successful

Thay đổi ptr là lỗi – ptr là
con
trỏ hằng.
termination */

18
19 } /* end main */

Compiling...
FIG07_13.c
D:\books\2003\chtp4\Examples\ch07\FIG07_13.c(15) : error C2166: l-value
specifies­ const object
Error executing cl.exe.
FIG07_13.exe - 1 error(s), 0 warning(s)

Ví dụ: những tình huống sử dụng con trỏ hằng,
được phép và không được phép
1

/* Fig. 7.14: fig07_14.c


2
3

Attempting to modify a constant pointer to constant data. */
#include <stdio.h>

4
5

int main()

6

{

7

int x = 5; /* initialize x */

8

int y;

/* define y */

9
10
11
12

13

/* ptr is a constant pointer to a constant integer. ptr always
points to the same location; the integer at that location
cannot be modified */
const int *const ptr = &x;

14
15

printf( "%d\n", *ptr );

16
17

*ptr = 7; /* error: *ptr is const; cannot assign new value */

18

ptr = &y; /* error: ptr is const; cannot assign new address */

19
20

return 0; /* indicates successful termination */

21
22 } /* end main */



Compiling...
FIG07_14.c
D:\books\2003\chtp4\Examples\ch07\FIG07_14.c(17) : error C2166: l-value
specifies­ const object
D:\books\2003\chtp4\Examples\ch07\FIG07_14.c(18) : error C2166: l-value
specifies­ const object
Error executing cl.exe.
FIG07_12.exe - 2 error(s), 0 warning(s)

3. Cấu trúc lệnh.
Bài tốn

Thuật tốn

Chương trình
− Các thao tác được điều khiển bởi các lệnh
− Các đối tượng chịu thao tác được mô tả thông qua các Cấu trúc dữ liệu

39



×