Giáo trình kỹ thuật lập trình C

109 1.2K 5
Giáo trình kỹ thuật lập trình C

Đ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

Giáo trình kỹ thuật lập trình C

www.updatesofts.com ngocha85: Giáo trình Cơ s d li u TRƯỜNG ĐẠI HỌC ĐÀ LẠT GIÁO TRÌNH KỸ THUẬT LẬP TRÌNH NÂNG CAO TRẦN HOÀNG THỌ 2002 Kỹ thuật lập trình nâng cao -2- MỤC LỤC LỜI NÓI ĐẦU PHAÀN I CHƯƠNG I I MỞ ĐẦU Mô tả đệ quy Các loại đệ quy II MÔ TẢ ĐỆ QUY CÁC CẤU TRÚC DỮ LIEÄU III MÔ TẢ ĐỆ QUY GIẢI THUẬT Giải thuật đệ quy Chương trình đệ quy Mã hóa giải thuật đệ qui ngôn ngữ lập trình 11 Moät số dạng giải thuật đệ quy đơn giản thường gặp 13 CHƯƠNG II 16 I CÁC NỘI DUNG CẦN LÀM ĐỂ TÌM GIẢI THUẬT ĐỆ QUY CHO MỘT BÀI TOÁN 16 Thông số hoá toán 16 Phát trường hợp suy biến (neo) tìm giải thuật cho trường hợp này.16 Phân rã toán tổng quát theo phương thức đệ quy 16 II MỘT SỐ BÀI TOÁN GIẢI BẰNG GIẢI THUẬT ĐỆ QUY ĐIỂN HÌNH 17 Bài toán tháp Hà Nội 17 Bài toán chia thưởng 19 Bài toán tìm tất hoán vị dãy phần tử 21 Bài toán xếp mảng phương pháp trộn (Sort-Merge) 24 Bài toán tìm nghiệm xấp xỉ phương trình f(x)=0 25 CHƯƠNG III 28 I CƠ CHẾ THỰC HIỆN GIẢI THUẬT ĐỆ QUY 28 II TỔNG QUAN VỀ VẤN ĐỀ KHỬû ĐỆ QUY 32 III CÁC TRƯỜNG HP KHỬ ĐỆ QUY ĐƠN GIẢN 33 Các trường hợp khử đệ quy vòng lặp 33 Khử đệ quy hàm đệ quy arsac 41 Khử đệ quy số dạng thủ tục đệ quy thường gặp 45 Phaàn II 52 CHƯƠNG IV 52 I CÁC GIAI ĐOẠN TRONG CUỘC SỐNG CỦA MỘT PHẦN MỀM 52 1) Đặc tả toán 52 2) Xây dựng hệ thống 52 3) Sử dụng bảo trì hệ thống 53 II ĐẶC TẢ 53 Đặc tả toán 53 Đặc tả chương trình (ĐTCT) 54 Đặc tả đoạn chương trình 55 III NGÔN NGỮ LẬP TRÌNH 57 CHƯƠNG V 59 I CÁC KHÁI NIỆM VỀ TÍNH ĐÚNG 59 II HEÄ LUAÄT HOARE (HOARES INFERENCE RULES) 59 Các luật hệ (Consequence rules) 60 Trần Hoàng Thọ Khoa Toán - Tin Kỹ thuật lập trình nâng cao -3- Tiên đề gán (The Assignement Axiom) 61 Các luật cấu trúc điều khiển 61 III KIỂM CHỨNG ĐOẠN CHƯƠNG TRÌNH KHÔNG CÓ VÒNG LẶP 64 IV KIỂM CHỨNG ĐOẠN CHƯƠNG TRÌNH CÓ VÒNG LẶP 68 Bất biến 68 Lý luận quy nạp chứng minh quy nạp 70 Kiểm chứng chương trình có vòng lặp while 71 CHƯƠNG VI 76 I CÁC KHÁI NIỆM 76 Đặt vấn đề 76 Định nghóa WP(S,Q) 76 Hệ định nghóa 76 Các ví dụ 77 II TÍNH CHẤT CỦA WP 77 III CÁC PHÉP BIẾN ĐỔI TÂN TỪ 78 Toán tử gán (tiên đề gán) 78 Toán tử 78 Toán tử điều kiện 79 Toán tử lặp 80 IV LƯC ĐỒ KIỂM CHỨNG HP LÝ VÀ CÁC ĐIỀU KIỆN CẦN KIỂM CHỨNG 84 Lược đồ kiểm chứng 84 Kiểm chứng tính 85 Tập tối tiểu điều kiện cần kiểm chứng 93 PHU LUÏC 96 I LOGIC TOAÙN 96 II LOGIC MỆNH ĐỀ 96 Phaân tích 96 Các liên từ logic 97 Ýnghóa liên từ Logic Bảng chân trị 97 Lý luận 98 Tương đương (Equivalence) 99 Tính thay thế, tính truyền tính đối xứng 100 Bài toán suy diễn logic 100 Các luật suy diễn (rules of inference) 102 III LOGIC TÂN TỪ 103 Khái niệm 103 Các lượng từ logic 105 Tập hợp tân t 107 Các lượng từ số học 107 Trần Hoàng Thọ Khoa Toán - Tin Kỹ thuật lập trình nâng cao -4- LỜI NÓI ĐẦU Giáo trình viết theo nội dung môn học “ Kỹ thuật lập trình nâng cao” với mục đích làm tài liệu tham khảo cho môn học Giáo trình gồm phần phụ lục : Phần I Đệ quy Trình bày chủ đề đệ quy lập trình bao gồm nội dung sau : - Khái niệm đệ quy vai trò lập trình - Cách xây dựng giải thuật cho toán phương pháp đệ quy - Cơ chế thực giải thuật đệ quy - Khử đệ quy Phần II Kiểm chứng chương trình Trình bày chủ đề kiểm chứng tính chương trình bao gồm nội dung sau: - Vai trò vấn đề kiểm chứng lập trình - Các phương pháp dùng để kiểm chứng tính - Hệ luật Hoare áp dụng vào kiểm chứng tính có điều kiện - Hệ luật Dijkstra áp dụng vào kiểm chứng tính đầy đủ - Dạng tổng quát toán kiểm chứng phương pháp kiểm chứng Các lược đồ kiểm chứng tập tối thiểu điều kiện cần kiểm chứng Phụ lục Các kiến thức chung logic Trình bày kiến thức ban đầu logic mệnh đề logic tân từ Phụ lục cung cấp một tài liệu cô đọng kiến thức logic áp dụng trực tiếp phần I phần II ( phần nôi dung giáo trình nhập môn toán) người học cần dành thời gian thích hợp ôn lại để theo kịp hướng tiếp cận giáo trình Cùng với trình bày lý thuyết tổng quát, tác gỉa đưa vào số thỏa đáng ví dụ chọn lọc nhằm giúp người học nắm bắt chất khái niệm, phương pháp làm quen với cách sử dụng kết qủa Khi học trước tìm cách giải tập thầy gíao cung cấp bạn cố gắng đọc hiểu hết ví dụ minh họa Vì nhiều lẽ chắn giáo trình nhiều khiếm khuyết Rất mong tất người sử dụng chân thành góp ý Tác giả chân thành cảm ơn đồng nghiệp khoa Toán_Tin đóng góp nhiều ý kiến quý báu cho việc hình thành cấu trúc chi tiết cho nội dung giáo trình, chân thành cảm ơn thạc sỹ Võ Tiến đóng góp nhiều ý kiến quý báu cấu trúc giáo trình, giúp chỉnh lý nhiều khiếm khuyết thảo ĐaLat ngày 01 tháng 12 năm 2002 TRẦN HOÀNG THỌ Trần Hoàng Thọ Khoa Toán - Tin Kỹ thuật lập trình nâng cao -5- PHẦN I ĐỆ QUY CHƯƠNG I KHÁI NIỆM ĐỆ QUY I MỞ ĐẦU Mô tả đệ quy Trong nhiều tình việc mô tả toán, giải thuật, kiện, vật trình, cấu trúc, đơn giản hiệu ta nhìn góc độ mang tính đệ qui Mô tả mang tính đệ qui đối tượng mô tả theo cách phân tích đối tượng thành nhiều thành phần mà số thành phần có thành phần mang tính chất đối tượng mô tả Tức mô tả đối tượng qua Các ví dụ : - Mô tả đệ quy tập số tự nhiên N : + Số số tự nhiên ( ∈ N) + Số tự nhiên số tự nhiên cộng ( n ∈ N ⇒ ( n +1 ) ∈ N ) - Moâ tả đệ quy cấu trúc xâu (list) kiểu T : + Cấu trúc rỗng xâu kiểu T + Ghép nối thành phần kiểu T(nút kiểu T ) với xâu kiểu T ta có xâu kiểu T - Mô tả đệ quy gia phả : Gia phả người bao gồm mgười gia phả cha gia phả mẹ - Mô tả đê quy thủ tục chọn hoa hậu : + Chọn hoa hậu khu vực + Chọn hoa hậu hoa hậu - Mô tả đệ quy thủ tục tăng dãy a[m:n] ( dãy a[m], a[m+1], , a[n] ) phương pháp Sort_Merge (SM) : SM (a[m:n]) ≡ Merge ( SM(a[m : (n+m) div 2]) , SM (a[(n+m) div +1 : n] ) Với : SM (a[x : x]) thao tác rỗng (không làm ) Merge (a[x : y] , a[(y+1) : z]) thủ tục trộn dãy tăng a [x : y] , a[(y+1) : z] để dãy a[x : z] tăng - Đinh nghóa đệ quy hàm giai thừa FAC( n) = n ! 0!=1 n!=n*(n-1)! Trần Hoàng Thọ Khoa Toán - Tin Kỹ thuật lập trình nâng cao -6- Phương pháp đệ quy mạnh chổ cho phép mô tả tập lớn đối tượng số mệnh đề mô tả giải thuật phức tạp số thao tác (một chương trình đệ quy) Một mô tả đệ quy đầy đủ gồm phần : - Phần neo : mô tả trường hợp suy biến đối tượng (giải thuật) qua cấu trúc (thao tác) cụ thể xác định ví dụ: số tự nhiên, cấu trúc rỗng xâu kiểu T, ! = , SM (a[x:x]) thao tác rỗng - Phần quy nạp: mô tả đối tượng (giải thuật) trường hợp phổ biến thông qua đối tượng (giải thuật ) cách trực tiếp gián tiếp Ví duï : n! = n * (n – 1) ! SM (a[m:n]) ≡ Merge (SM (a[m:( m+n) div 2] , SM (a[(m+n) div +1 : n]) ) Neáu mô tả phần neo đối tượng mô tả có cấu trúc lớn vô hạn, giải thuật mô tả trở thành cấu trúc lặp vô tận Các loại đệ quy Người ta phân đệ quy thành loại : Đệ quy trực tiếp, đệ quy gián tiếp - Đệ quy trực tiếp loại đệ quy mà đối tượng mô tả trực tiếp qua : A mô tả qua A, B, C, B, C, không chứa A (các ví dụ trên) - Đệ quy gián tiếp loại đệ quy mà đối tượng mô tả gián tiếp qua : A mô tả qua A1 ,A2 , , An Trong có Ai mô tả qua A Ví dụ 1: Mô tả dạng tổng quát chương trình viết NNLT Pascal : Một Chương trình Pascal gồm : a) Đầu chương trình (head) gồm: Program Tên ; b) Thân chương trình (blok) gồm : b1) Khai báo unit, định nghóa hằng, nhãn, kiểu liệu, khái báo biến b2) Định nghóa chương trình gồm : b2.1) Đầu chương trình : Procedure Tên thủ tục ( danh sách thông số hình thức ) ; Function Tên hàm ( danh sách thông số hình thức ) : Kiểu ; b2.2) Thân chương trình ( Blok ) b2.3) Dấu ‘ ; ‘ b3) Phần lệnh : lệnh ghép dạng : Begin S1 ; S2 ; ; Sn End ; c) Daáu kết thúc chương trình : ‘.’ Ví dụ : Mô tả hai dãy số {Xn},{Yn} theo luật đệ quy hổ tương sau : X0 = ; Xn = Xn-1 + Yn-1 ; Y0 = ; Yn =n2 Xn-1 + Yn-1 ; Trần Hoàng Thọ Khoa Toán - Tin Kỹ thuật lập trình nâng cao -7- II MÔ TẢ ĐỆ QUY CÁC CẤU TRÚC DỮ LIỆU Trong toán học , lập trình người ta thường sử dụng đệ quy để mô tả cấu trúc phức tạp, có tính đệ quy Bởi mô tả đệ quy không cách mô tả ngắn gọn cấu trúc phức tạp mà tạo khả để xây dựng thao tác xử lý cấu trúc phức tạp giải thuật đệ qui Một cấu trúc liệu có tính đệ quy thường gồm số thành phần liệu kiểu ghép nối theo phương thức Ví dụ 1: Mô tả đệ quy nhi phân : Cây nhi phân kiểu T : + Hoặc cấu trúc rỗng (phần neo) + Hoặc nút kiểu T (nút gốc) nhị phân kiểu T rời (cây nhị phân phải, nhị phân trái) kết hợp với Ví dụ 2: Mô tả đệ quy mảng nhiều chiều : + Mảng chiều dãy có thứ tự thành phần kiểu + Mảng n chiều mảng chiều mà thành phần có kiểu mảng n-1 chiều III MÔ TẢ ĐỆ QUY GIẢI THUẬT Giải thuật đệ quy Giải thuật đệ quy giải thuật có chứa thao tác gọi đến Giải thuật đệ quy cho phép mô tả dãy lớn thao tác số thao tác có chứa thao tác gọi lại giải thuật (gọi đệ quy) Một cách tổng quát giải thuật đệ quy biểu diễn P gồm mệnh đề S (không chứa yếu tố đệ quy ) vaø P : P ≡ P[ S , P ] Thực thi giải thuật đệ quy dẫn tới tiến trình gọi đê quy không kết thúc khả gặp trường hợp neo, quan tâm đến điều kiện dừng giải thuật đệ quy đặt Để kiểm soát qúa trình gọi đệ quy giải thuật đệ quy P người ta thường gắn thao tác gọi P với việc kiểm tra điều kiện B xác định biến đổi qua lần gọi P , qúa trình gọi P sẻ dừng B không thỏa Mô hình tổng quát giải thuật đệ quy với quan tâm đến dừng sẻ : P ≡ if B then P[ S , P ] hoaëc P ≡ P[ S , if B then P ] Thông thường với giải thuật đệ quy P , để đảm bảo P sẻ dừng sau n lần gọi ta chọn B ( n >0 ) Mô hình giải thuật đệ quy có dạng : P(n) ≡ If ( n > ) then P[ S , P(n - 1)] ; hoaëc P(n) ≡ P[ S , if (n >0) then P(n - 1) ] ; Trần Hoàng Thọ Khoa Toán - Tin Kỹ thuật lập trình nâng cao -8- Trong ứng dụng thực tế số lần gọi đệ quy (độ sâu đệ quy) phải hữu hạn mà phải đủ nhỏ Bởi lần gọi đệ quy cần vùng nhớ vùng nhớ cũ phải trì Chương trình đệ quy a) Các hàm đệ quy Định nghóa hàm số đệ quy thường gặp toán học, điển hình hàm nguyên mô tả dãy số hồi quy Ví dụ Dãy giai thừa : { n! } ≡ ,1 , , , 24 , 120 , 720 , 5040 , Ký hiệu FAC(n ) = n ! Ta coù : + FAC(0 ) = ; ( ! = ) + FAC(n ) = n * FAC(n - ) ; ( n ! = n * (n - ) ! ) với n >= Giải thuật đệ quy tính FAC(n ) laø : FAC(n ) ≡ if (n = ) then return ; else return (n * FAC(n - )) ; Ví dụ Dãy số Fibonaci(FIBO) : { FIBO (n) } ≡ ,1 , , , , , 13 , 21 , 34 , 55 , 89 , 144 , 233 , 377 , + FIBO(0 ) = FIBO (1 ) = ; + FIBO(n ) = FIBO (n - ) + FIBO ( n - ) ; với n > = Giải thuật đệ quy tính FIBO ( n ) : FIBO(n) ≡ if ((n = ) or ( n = )) then return ; else return ( FIBO (n - 1) + FIBO (n - 2)) ; Ví dụ Dãy tổ hợp : 1 1 3 1 Cn = với n > = m Cn = với m > n > m m m Cn = Cn−−11 + Cn−1 m Giaûi thuật đệ quy tính Cn với n > m > laø : if ( m = ) then return ; else if (m > n ) then return ; m m else return ( Cn−−1 + Cn−1 ) ; Nhận xét : Một định nghóa hàm đệ quy gồm : Trần Hoàng Thọ Khoa Toán - Tin Kỹ thuật lập trình nâng cao -9- + Một số trường hợp suy biến mà gía trị hàm biết trước tính cách đơn giản (không đệ quy ) Nhö : m FAC(0 ) = , FIBO(0) = FIBO(1) = , Cn = , Cn = với m > n > + Trường hợp tổng quát việc tính hàm sẻ đươc đưa tính hàm giá trị “ bé hơn” (gần với giá trị neo) đối số Như : FAC(n ) = n * FAC(n - ) ; FIBO(n) = FIBO(n -1) + FIBO( n - ) Trong tập biến hàm có nhóm mà độ lớn định độ phức tạp việc tính gía trị hàm Nhóm biến gọi nhóm biến điều khiển Gía trị biên nhóm biến điều khiển ứng với trường hợp suy biến Gía trị nhóm biến điều khiển sẻ thay đổi qua lần gọi đệ quy với xu hướng tiến đến gía trị biên ( tương ứng với trường hợp suy biến hàm ) b) Các thủ tục đệ quy Thủ tục đệ quy thủ tục có chứa lệnh gọi đến Thủ tục đệ quy thường sử dụng để mô tả thao tác cấu trúc liệu có tính đệ quy Ví dụ : Xem dãy n phần tử a[1:n] kết hợp dãy a[1:n-1] a[n] Do đo ù: - Thủ tục tìm max dãy a[1:n] ( thủ tục TMax) thực theo luật đệ qui : + Tìm max dãy a[1:n] (gọi đệ quy Tmax(a[1:n-1] ) ) + Tìm max số : Tmax(a[1:n-1]) a[n] (giải thuật không đệ quy) Tức : TMax(a[1:n]) = max(TMax(a[1:n-l]) , a[n] ) với TMax(a[m:m] = a[m] ; ( trường hợp neo ) max(x,y) = x > y ? x : y ; ( giải thuật tính max số : if (x>y) then max(x ,y) = x else max(x ,y) = y ) - Thủ tục tính tổng phần tử ( thủ tục TSUM ) thực theo luật đệ quy : + Tìm tổng dãy a[1:n] (gọi đệ quy TSUM(a[1:n-1]) ) + Tìm tổng số : TSUM(a[1:n-1]) a[n] (giải thuật không đệ quy) Tức : TSUM(a[1:n]) = a[n] + TSUM(a[1:n-1] với TSUM(a[m:m]) = a[m] Ví dụ : Xem dãy a[m : n] kết nối hai dãy: dãy a[m:((m+n) div 2)] dãy a[(((m+n) div 2)+1) :n] Trần Hoàng Thọ Khoa Toán - Tin Kỹ thuật lập trình nâng cao - 94 - (P2) Nếu đkckc tập hợp V(P,S,Q) S đcđk dựa đkđ P đkc Q Tức : { P } S {Q } có điều kiện Tính chất (P1) chứng minh quy nạp kích thước S, kích thước S có cách đếm cho lần xuất ký hiệu ':=', ';', 'if', 'while' S Tính chất (P2) hệ trực tiếp (P1) Chú ý pre(S,Q) khác với wp(S,Q) có lệnh while Điều xác nhận trường hợp tổng quát, khả tạo lập công thức đóng cho đkđ yếu lệnh while nhấn mạnh tầm quan trọng việc ghi nhận tính chất bất biến sưu liệu chương trình Ví dụ : Với đặc tả gồm : Dẫy lệnh S : S ≡ tg := tg + a[k] ; k := k+1 ; ñkc Q ≡ I(k, tg) ≡ (tg = S(i :

Ngày đăng: 16/08/2012, 15:19

Hình ảnh liên quan

Định nghĩa hàm số bằng đệ quy thường gặp trong toán học, điển hình là các hàm nguyên mô tả các dãy số hồi quy  - Giáo trình kỹ thuật lập trình C

nh.

nghĩa hàm số bằng đệ quy thường gặp trong toán học, điển hình là các hàm nguyên mô tả các dãy số hồi quy Xem tại trang 9 của tài liệu.
Mô hình stac kS và tác dụng các thao tác trên nó. - Giáo trình kỹ thuật lập trình C

h.

ình stac kS và tác dụng các thao tác trên nó Xem tại trang 33 của tài liệu.
Trình tự thực hiện P(X) được diễn tả bằng mô hình sau:                                                                        P(X)       - Giáo trình kỹ thuật lập trình C

r.

ình tự thực hiện P(X) được diễn tả bằng mô hình sau: P(X) Xem tại trang 47 của tài liệu.
Để có thể thực hiện chứng minh hình thức về tính đúng của các đoạn chương trình, ta cần có những tiền  đề mô tả tác động của các thao tác xử lý cơ bản (lệnh cơ  bản ) của ngôn ngữ dùng viết chương trình ( ở đây là ngôn ngữ cốt lõi đã được giới  thiệu ơ û  - Giáo trình kỹ thuật lập trình C

c.

ó thể thực hiện chứng minh hình thức về tính đúng của các đoạn chương trình, ta cần có những tiền đề mô tả tác động của các thao tác xử lý cơ bản (lệnh cơ bản ) của ngôn ngữ dùng viết chương trình ( ở đây là ngôn ngữ cốt lõi đã được giới thiệu ơ û Xem tại trang 61 của tài liệu.
Hãy quan sá t2 dãy các hình sau:    - Giáo trình kỹ thuật lập trình C

y.

quan sá t2 dãy các hình sau: Xem tại trang 70 của tài liệu.
3. Ýnghĩa của các liên từ Logic. Bảng chân trị. - Giáo trình kỹ thuật lập trình C

3..

Ýnghĩa của các liên từ Logic. Bảng chân trị Xem tại trang 98 của tài liệu.
Bảng chân trị : - Giáo trình kỹ thuật lập trình C

Bảng ch.

ân trị : Xem tại trang 100 của tài liệu.
Ta có thể chứng minh một sự tương đương bằng cách lập bảng chân trị.     Ví dụ:    chứng minh  : p  and  q      ≡   not( not p  or  not q ) - Giáo trình kỹ thuật lập trình C

a.

có thể chứng minh một sự tương đương bằng cách lập bảng chân trị. Ví dụ: chứng minh : p and q ≡ not( not p or not q ) Xem tại trang 100 của tài liệu.
Ta mô hình hóa bài toán như sau: - Giáo trình kỹ thuật lập trình C

a.

mô hình hóa bài toán như sau: Xem tại trang 102 của tài liệu.
Với các bài toán chỉ liên quan đến ít mệnh đề như trong ví dụ trên, cách dùng bảng chân trị đơn giản hơn  - Giáo trình kỹ thuật lập trình C

i.

các bài toán chỉ liên quan đến ít mệnh đề như trong ví dụ trên, cách dùng bảng chân trị đơn giản hơn Xem tại trang 103 của tài liệu.

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan