1. Trang chủ
  2. » Giáo Dục - Đào Tạo

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

28 4 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Lập Trình Cấu Trúc
Định dạng
Số trang 28
Dung lượng 600,69 KB

Nội dung

Thuậttoánƒ Khái niệm thuật tốnƒ Ngơn ngữ mơ tả thuật tốn Trang 2 2KHÁ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

Trang 1

ƒ Khái niệm thuật toán

ƒ Ngôn ngữ mô tả thuật toán

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

Trang 2

KHÁI NIỆM THUẬT TOÁN

ƒ Thuật toá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

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

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

Trang 3

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

ƒ Thuật toá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

ƒ Lựa chọn thuật toán nào cho bài toá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 toán sử dụng tiết kiệm tài nguyên máy tính (dung lượng không gian nhớ, thời gian)

Trang 4

ƒ Ngôn ngữ dùng để mô tả thuật toán

? Tại sao phải dùng ngôn ngữ diễn đạt thuật toán

? Đặc điểm của ngôn ngữ diễn đạt thuật toá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 toán

Thuật toán: <Tên thuật toán>

Vào (Input): <Dữ liệu vào của thuật toán, mô tả rõ kiểu dữ liệu>

Ra (Output): <Các dữ liệu ra - Kết quả>

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

• Thuật toán: Euclid

• Vào: m,n nguyên 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 toá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

Trang 5

ƒ Sơ đồ khối (Flow Chart )

ƒ Thuật toán Euclid

Trang 6

ƒ Ngôn ngữ Tựa Pascal

• Khai báo: Program < Tên chương trình>

• Giá trị logic: true, false

• Phép toán logic: and, or, not

ƒ Các câu lệnh

– 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

Trang 7

• 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;

– 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ự>)

Trang 8

? Đá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 toá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.

Trang 9

ƒ Độ 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.

0 1

0 1

0

1 1

a a

a x

x

a x

a a x

a x

a x a x f

n n n

n n

n n

n n n n

+ + +

+ + +

+ + +

• Độ 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

Trang 10

Begin

K := K + i * j ; End;

Trang 12

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

ƒ 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ủamảng được duyệt) Việc tính toán rất phức tạp dựa vào xácsuấ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 toán lại thể hiện thông qua độ phức tạp trung bình.

Trang 13

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

• 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 đốitượng trong thực tế và phù hợp với cách tổ chức thông tin trênmáy tính

• Kiểu số nguyên, 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

Trang 14

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 toá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 toán

ƒ Mô hình dữ liệu

• Là mô hình toá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 toá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

Trang 15

ƒ Kiểu dữ liệu cơ sở

• Kí tự (char, unsigned char)

• Số nguyên (int, unsigned int, long (int), unsigned long (int))

ƒ Kiểu cấu trúc (struct)

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

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ủabiến con trỏ

• Biến thông thường chứa một giá trị cụ thể (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)

Con trỏ countPtr trỏ đến biến count, giá trị

count

7

count countPtr

Trang 16

mảng, xâu, bộ nhớ

bộ nhớ.

ƒ Đị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ủamột biến cùng kiểu dữ liệu

Trang 17

ƒ &Tenbien (trả về địa chỉ của tenbien)

• Phép gán trả về địa chỉ của biến dữ liệu

ƒ 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

Trang 18

13 printf( "The address of a is %p"

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

15

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

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

• 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.

Trang 19

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 */

Error executing cl.exe.

FIG07_13.exe - 1 error(s), 0 warning(s)

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

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

10 /* ptr is a constant pointer to a constant integer ptr always

11 points to the same location; the integer at that location

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

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

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

Trang 20

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)

Thuật toá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

Bài toán

Trang 21

T F

if statement (single selection)

T F

if…else statement (double selection)

T F

đa lựa chọn

(multiple selection)

T F

T F

.

Trang 22

ƒ Nguyên lý chủ đạo trong công nghệ phần mềm

ƒ Phân rã bài toán thành những bài toán nhỏ hơn để triển khai và đảm bảo tính đúng đắn của chương trình

ƒ Nguyên lý cơ bản của lập trình cấu trúc bao gồm:

• Phát triển chương trình từ trên xuống (Top−downdevelopment)

• Thiết kế môđun (Modular design)

ƒ Phương pháp đi từ trên xuống:

• Đi từ cái chung đến cái riêng, từ kết luận đến chi tiết, từ tổngthể đến đơn vị

ƒ Mô đun hóa:

• Nhóm các câu lệnh lại với nhau tạo ra những môđun có quan

hệ với nhau Nói cách khác: chương trình được phân táchthành các phần chức năng quan hệ logic với nhau

ƒ Ưu điểm: Dễ viết ( write ), duyệt lỗi ( debug ), và dễ hiểu chương trình hơn.

Trang 23

ƒ Triển khai chương trình trong ngôn ngữ C:

#include < > /* 1 Các hàm thư viện */

/* 4. Khai báo nguyên mẫu các hàm */

function prototype

/* 5 Khai báo các biến toàn cục */

int main (void) /* 6 “Chương trình chính” */

{ Khai báo các biến;

8 int minimum( const int grades[][ EXAMS ], int pupils, int tests );

9 int maximum( const int grades[][ EXAMS ], int pupils, int tests );

10 double average( const int setOfGrades[], int tests );

11 void printArray( const int grades[][ EXAMS ], int pupils, int tests );

Trang 24

24 /* output array studentGrades */

25 printf( "The array is:\n" );

26 printArray( studentGrades, STUDENTS, EXAMS );

27

28 /* determine smallest and largest grade values */

29 printf( "\n\nLowest grade: %d\nHighest grade: %d\n" ,

30 minimum( studentGrades, STUDENTS, EXAMS ),

31 maximum( studentGrades, STUDENTS, EXAMS ) );

32

33 /* calculate average grade for each student */

34 for ( student = 0 ; student <= STUDENTS - 1 ; student++ ) {

35 printf( "The average grade for student %d is %.2f\n" ,

36 student, average( studentGrades[ student ], EXAMS ) );

43 /* Find the minimum grade */

44 int minimum( const int grades[][ EXAMS ], int pupils, int tests )

50 /* loop through rows of grades */

51 for ( i = 0 ; i < pupils; i++ ) {

68 /* Find the maximum grade */

69 int maximum( const int grades[][ EXAMS ], int pupils, int tests )

Trang 25

75 /* loop through rows of grades */

76 for ( i = 0 ; i < pupils; i++ ) {

77

78 /* loop through columns of grades */ 79 for ( j = 0 ; j < tests; j++ ) { 80

81 if ( grades[ i ][ j ] > highGrade ) { 82 highGrade = grades[ i ][ j ]; 83 } /* end if */ 84

85 } /* end inner for */ 86

87 } /* end outer for */ 88

89 return highGrade; /* return maximum grade */ 90

91 } /* end function maximum */ 92

93 /* Determine the average grade for a particular student */ 94 double average( const int setOfGrades[], int tests )

95 {

96 int i; /* counter */

97 int total = 0 ; /* sum of test grades */

98

99 / * t o t a l a l l g r a d e s f o r o n e s t u d e n t * /

100 f o r ( i = 0 ; i < t e s t s ; i + + ) {

101 t o t a l + = s e t O f G r a d e s [ i ] ;

102 } / * e n d f o r * /

103

104 r e t u r n ( d o u b l e ) t o t a l / t e s t s ; / * a v e r a g e * /

105

106 } / * e n d f u n c t i o n a v e r a g e * /

107

108 / * P r i n t t h e a r r a y * /

109 v o i d p r i n t A r r a y ( c o n s t i n t g r a d e s [ ] [ E X A M S ] , i n t p u p i l s , i n t t e s t s )

110 {

111 i n t i ; / * c o u n t e r * /

112 i n t j ; / * c o u n t e r * /

113

114 / * o u t p u t c o l u m n h e a d s * /

115 p r i n t f ( " [ 0 ] [ 1 ] [ 2 ] [ 3 ] " ) ;

116

117 / * o u t p u t g r a d e s i n t a b u l a r f o r m a t * /

118 f o r ( i = 0 ; i < p u p i l s ; i + + ) {

119

120 / * o u t p u t l a b e l f o r r o w * /

Trang 26

The array is:

The average grade for student 0 is 76.00

The average grade for student 1 is 87.50

The average grade for student 2 is 81.75

123 /* output grades for one student */

130 } /* end function printArray */

ƒ Quy tắc cấu trúc: Có thể viết bất kỳ chương trình nào chỉ với 3 cấu trúc điều khiển cơ bản:

• Tuần tự (Sequential)

• Lựa chọn (hay Rẽ nhánh) (Selecttion)

• Lặp (Repetition)

Trang 27

• Mô tả đối tượng gồm các thuộc tính thuộc hai nhóm:

– Nhóm tính chất thứ nhất: khuôn dạng, sự tổ chức, kiến trúc (ví dụ: tên gọi, kích thước, mầu sắc, …

– Nhóm tính chất thứ 2: sự vận động, sự tương tác với các đối tượng khác (ví dụ: cách tạo lập, hủy bỏ, sự cập nhật (thay đổi kích thước, mầu sắc, ), hình thức tổ hợp với các đối tượng khác

• Trong OOP sử dụng các khái niệm cơ bản: đối tượng(object), lớp (class), tính kế thừa (inheritance), phương thức (methods), and tính đa hình (polymorphism)

ƒ Mã nguồn cho lập trình cấu trúc

varC varD functionC { }

Trang 28

ƒ Lập trình cấu trúc bắt buộc lập trình viên tiếp cận lập trình bắt đầu từ cách nhìn bài toán ở mức khái niệm, thiết kế chương trình trước khi tiến hành mã hóa (viết code)

ƒ Lập trình cấu trúc giúp xóa bỏ mã rối (spaghetti code)

và đảm bảo tính đúng đắn của chương trình.

Ngày đăng: 25/01/2024, 18:22

w