LẬP TRÌNH CÓ CẤU TRÚC

112 45 0
LẬP TRÌNH CÓ CẤU TRÚ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

MỤC LỤC CHƯƠNG 1: TỔNG QUAN VỀ PHƯƠNG PHÁP LẬP TRÌNH CĨ CẤU TRÚC 1.1 SƠ LƯỢC VỀ LỊCH SỬ LẬP TRÌNH CĨ CẤU TRÚC 1.2 CẤU TRÚC LỆNH, LỆNH CÓ CẤU TRÚC, CẤU TRÚC DỮ LIỆU 1.2.1 Cấu trúc lệnh (cấu trúc điều khiển) .5 1.2.2 Lệnh có cấu trúc 1.2.3 Cấu trúc liệu .7 1.3 NGUYÊN LÝ TỐI THIỂU 1.3.1 Tập phép toán 1.3.2 Tập lệnh vào 12 1.3.3 Thao tác kiểu liệu có cấu trúc 12 1.4 NGUYÊN LÝ ĐỊA PHƯƠNG .14 1.5 NGUYÊN LÝ NHẤT QUÁN 16 1.6 NGUYÊN LÝ AN TOÀN 17 1.7 PHƯƠNG PHÁP TOP-DOWN 20 1.8 PHƯƠNG PHÁP BOTTOM-UP 24 CHƯƠNG 2: NGUYÊN TẮC LẬP TRÌNH, GỠ RỐI VÀ CẢI TIẾN HIỆU SUẤT CHƯƠNG TRÌNH .29 2.1 Phong cách lập trình .29 2.2 Các nguyên tắc lập trình 29 2.3 Các chuẩn lập trình .35 2.4 Gỡ rối chương trình 36 2.4.1 Ý đồ thiết kế sai 36 2.4.2 Phân tích yêu cầu không đầy đủ lệnh lạc (xảy giai đoạn 1)37 2.4.3 Hiểu sai chức 37 2.4.4 Lỗi đối tượng chịu tải .38 2.4.5 Lỗi lây lan 39 2.4.6 Lỗi cú pháp 39 2.4.7 Hiệu ứng phụ (Side Effect) 40 2.5 Cải tiến hiệu xuất chương trình 41 2.5.1 Tốc độ xử lý 41 CHƯƠNG 3: DỮ LIỆU KIỂU CẤU TRÚC VÀ SẮP XẾP 52 3.1 Dữ liệu kiểu cấu trúc .52 3.1.1 Kiểu cấu trúc 52 3.1.2 Con trỏ kiểu cấu trúc 59 3.1.3 Mảng cấu trúc .62 3.1.4 Các cấu trúc tự trỏ danh sách liên kết .76 3.2 Thuật toán xếp 85 3.2.1 Đặt vấn đề 85 3.2.2 Các giải thuật xếp .86 3.2.3 Các giải thuật xếp nhanh 95 Bài tập chương 99 CHƯƠNG 4: ĐỆ QUY VÀ TÌM KIẾM .103 4.1 Thuật toán đệ qui 103 4.1.1 Định nghĩa đệ qui .103 4.1.2 Giải thuật đệ qui .104 4.1.3 Một số ví dụ minh họa .105 4.2 Tìm kiếm (Searching) 107 4.2.1 Tìm kiếm (Sequential Searching) 108 4.2.2 Tìm kiếm nhị phân (Binary Searching) .109 Tài liêụ tham khảo: 113 CHƯƠNG 1: TỔNG QUAN VỀ PHƯƠNG PHÁP LẬP TRÌNH CĨ CẤU TRÚC Nội dung chương tập trung làm sáng tỏ nguyên lý, phương pháp lập trình có cấu trúc Nắm ngun lý không giúp người học tiếp cận ngôn ngữ lập trình nhanh chóng, hiệu mà cịn giúp họ cách tư duy, tạo phong cách lập trình xây dựng hệ thống ứng dụng Các nguyên lý giới thiệu bao gồm:  Nguyên lý lệnh- lệnh có cấu trúc- cấu trúc liệu  Nguyên lý tối thiểu  Nguyên lý địa phương  Nguyên lý an toàn  Nguyên lý quán  Nguyên lý top- down  Nguyên lý bottton- up 1.1 SƠ LƯỢC VỀ LỊCH SỬ LẬP TRÌNH CĨ CẤU TRÚC Lập trình cơng việc nặng nhọc khoa học máy tính Có thể nói, suất xây dựng sản phẩm phần mềm thấp so với hoạt động trí tuệ khác Một sản phẩm phần mềm thiết kế cài đặt vịng tháng với lao động Nhưng để kiểm tra tìm lỗi tiếp tục hồn thiện sản phẩm phải thêm chừng năm Đây tượng phổ biến tin học năm 1960 xây dựng sản phẩm phần mềm kỹ thuật lập trình tuyến tính Để khắc phục tình trạng lỗi sản phẩm, người ta che chắn mành che mang tính chất thương mại gọi Version Thực chất, Version việc thay sản phẩm cũ cách sửa đổi công bố dạng Version mới, giống như: MS-DOS 4.0 tồn thời gian vài tháng thay đổi thành MS-DOS 5.0, MS-DOS 5.5, MS-DOS 6.0 Đây sản phẩm ta tưởng mà cịn tồn lỗi khơng thể bỏ qua được, MS-DOS 6.0 khắc phục hạn chế MSDOS 3.3 ban đầu Trong thời kỳ đầu tin học, lập trình viên xây dựng chương trình ngơn ngữ lập trình bậc thấp, q trình nạp theo dõi hoạt động chương trình cách trực tiếp chế độ trực tuyến (on-line) Việc tìm sửa lỗi (debbugging) ngày thực Do vậy, trước năm 1960, người ta coi việc lập trình giống hoạt động nghệ thuật nhuộm màu sắc cá nhân khoa học Một số người nắm vài ngôn ngữ lập trình, số mẹo vặt tận dụng cấu hình vật lý cụ thể hệ thống máy tính, tạo nên số sản phẩm lạ phần mềm coi chuyên gia nắm bắt bí ẩn nghệ thuật lập trình Các hệ thống máy tính giai đoạn có cấu hình yếu, nhớ nhỏ, tốc độ thiết bị vào thấp làm chậm trình nạp thực chương trình Chương trình xây dựng kỹ thuật lập trình tuyến tính mà bật ngơn ngữ lập trình Assembler Fortran Với phương pháp lập trình tuyến tính, lập trình viên phép thể chương trình hai cấu trúc lệnh, cấu trúc lệnh (sequential) nhảy không điều kiện (goto) Hệ thống thư viện vào nghèo nàn làm cho việc lập trình trở nên khó khăn, chi phí cho sản phẩm phần mềm lớn, độ tin cậy sản phẩm phần mềm không cao dẫn tới hàng loạt dự án tin học bị thất bại, đặc biệt hệ thống tin học có tầm cỡ lớn Năm 1973, Hoare khẳng định, nguyên nhân thất bại mà người Mỹ gặp phải phóng vệ tinh nhân tạo phía Vệ nữ (Sao Kim) lỗi chương trình điều khiển viết Fortran Thay viết: DO 50 I = 12, 523 (Thực số 50 với I 12, 13, , 523) Lập trình viên (hoặc thao tác viên đục bìa) viết thành: DO 50 I = 12.523 (Dấu phảy thay dấu chấm) Gặp câu lệnh này, chương trình dịch Fortran hiểu gán giá trị thực 12.523 cho biến DO 50 I làm cho kết chương trình sai Để giải vướng mắc kỹ thuật lập trình, nhà tin học lý thuyết sâu vào nghiên cứu tìm hiểu chất ngơn ngữ, thuật tốn hoạt động lập trình, nâng nội dung kỹ thuật lập trình lên thành nguyên lý khoa học ngày Kết bật giai đoạn Knuth xuất tập sách mang tên “Nghệ thuật lập trình” giới thiệu tỉ mỉ sở lý thuyết đảm bảo toán học thuật toán xử lý liệu nửa số, xếp tìm kiếm Năm 1968, Dijkstra cơng bố thư “Về nguy hại toán tử goto” Trong cơng trình này, Dijkstra khẳng định, có số lỗi goto gây nên xác định điểm bắt đầu lỗi Dijkstra khẳng định thêm: “Tay nghề lập trình viên tỉ lệ nghịch với số lượng toán tử goto mà sử dụng chương trình”, đồng thời kêu gọi huỷ bỏ triệt để tốn tử goto ngơn ngữ lập trình ngoại trừ ngơn ngữ lập trình bậc thấp Dijkstra cịn đưa khẳng định, động thái chương trình đánh giá tường minh qua cấu trúc lặp, rẽ nhánh, gọi đệ qui sở lập trình cấu trúc ngày Những kết Dijikstra công bố tạo nên cách mạng kỹ thuật lập trình, Knuth liệt kê số trường hợp có lợi goto vịng lặp kết thúc chừng, bắt lỗi , Dijkstra, Hoare, Knuth tiếp tục phát triển tư tưởng coi chương trình máy tính với lập trình viên đối tượng nghiên cứu kỹ thuật lập trình phương pháp làm chủ phức tạp hoạt động lập trình Năm 1969, Hoare phát biểu tiên đề phục vụ cho việc chứng minh tính đắn chương trình, phát tính bất biến vịng lặp cách coi chương trình vừa mã hố thuật tốn đồng thời chứng minh tính đắn chương trình Sau Dahl, Hoare, Dijiksta phát triển thành ngơn ngữ lập trình cấu trúc Năm 1978, Brian Barninghan Denit Ritche thiết kế ngôn ngữ lập trình C với tối thiểu cấu trúc lệnh hàm phù hợp với tư tâm lý của người lập trình Đồng thời, hai tác giả phát hành phiên hệ điều hành UNIX viết chủ yếu ngôn ngữ C, khẳng định thêm uy C lập trình hệ thống Khi làm quen với ngơn ngữ lập trình đó, khơng thiết phải lệ thuộc q nhiều vào hệ thống thư viện hàm ngôn ngữ, mà điều quan trọng trước toán cụ thể, sử dụng ngơn ngữ để giải nào, phương án tốt lập trình hệ thống thư viện hàm riêng Do vậy, ngơn ngữ lập trình, cần nắm vững số công cụ tối thiểu sau: 1.2 CẤU TRÚC LỆNH, LỆNH CÓ CẤU TRÚC, CẤU TRÚC DỮ LIỆU 1.2.1 Cấu trúc lệnh (cấu trúc điều khiển) Mỗi chương trình máy tính chất mã hoá thuật toán Thuật toán coi dãy hữu hạn thao tác sơ cấp tập đối tượng vào (Input) nhằm thu kết (output) Các thao tác ngơn ngữ lập trình cụ thể điều khiển lệnh hay cấu trúc điều khiển, đối tượng chịu thao tác mơ tả biểu diễn thông qua cấu trúc liệu Trong ngơn ngữ lập trình cấu trúc, cấu trúc lệnh sau sử dụng để xây dựng chương trình Dĩ nhiên, không bàn tới cấu trúc nhảy không điều kiện goto ngôn ngữ lập trình cấu trúc trang bị cấu trúc lệnh goto Hình 1.1: Cấu trúc cấu trúc rẽ nhánh dạng đầy đủ Hình 1.2 Các cấu trúc lặp A, B : ký hiệu cho câu lệnh đơn lệnh hợp thành Mỗi lệnh đơn lẻ gọi lệnh đơn, lệnh hợp thành lệnh hay cấu trúc lệnh ghép lại với theo qui định ngôn ngữ, Pascal tập lệnh hay cấu trúc lệnh bao thân begin end; C tập lệnh hay cấu trúc lệnh bao hai ký hiệu { } E, E1, E2, E3 biểu thức số học logic Một số ngôn ngữ lập trình coi giá trị biểu thức logic (TRUE) sai (FALSE), số ngôn ngữ lập trình khác C coi giá trị biểu thức logic có giá trị khác 0, ngược lại biểu thức logic có giá trị sai Cần lưu ý rằng, chương trình thể cấu trúc điều khiển lệnh : tuần tự, tuyển chọn if else, switch case default, lặp với điều kiện trước while , lặp với điều kiện sau while, vòng lặp for chuyển chương trình, sử dụng tối thiểu hai cấu trúc lệnh lặp với điều kiện trước while Phương pháp lập trình cịn gọi phương pháp lập trình hạn chế 1.2.2 Lệnh có cấu trúc Lệnh có cấu trúc lệnh cho phép chứa cấu trúc điều khiển Khi tìm hiểu cấu trúc điều khiển cần xác định rõ vị trí phép đặt cấu trúc điều khiển nó, phần cấu trúc điều khiển Điều tưởng tầm thường có ý nghĩa quan trọng xây dựng kiểm tra lỗi xảy chương trình Ngun tắc viết chương trình theo cấu trúc: Cấu trúc phải viết lọt cấu trúc cha, điểm vào điểm cấu trúc phải nằm hàng dọc Ví dụ sau minh họa cho nguyên tắc viết chương trình: if (E) while (E1) A; Else Do B; while(E2); Trong ví dụ trên, while (E1) A; cấu trúc nằm thân cấu trúc cha if (E) ; B while(E2); cấu trúc thân else Do vậy, câu lệnh while(E1); while(E2) có cấp với nên phải nằm cột, tương tự với A, B if với else 1.2.3 Cấu trúc liệu Các ngôn ngữ lập trình cấu trúc nói chung giống cấu trúc lệnh cấu trúc liệu Điểm khác ngơn ngữ lập trình cấu trúc phương pháp đặt tên, cách khai báo, cú pháp câu lệnh tập phép toán phép thực cấu trúc liệu cụ thể Nắm bắt nguyên tắc này, dễ dàng chuyển đổi cách thể chương trình từ ngơn ngữ lập trình sang ngơn ngữ lập trình khác cánh nhanh chóng mà khơng tốn q nhiều thời gian cho việc học tập ngơn ngữ lập trình Thông thường, cấu trúc liệu phân thành hai loại: cấu trúc liệu có kiểu (Base type) cấu trúc liệu có kiểu người dùng định nghĩa (User type) hay gọi kiểu liệu có cấu trúc Kiểu liệu bao gồm: Kiểu kí tự (char), kiểu số nguyên có dấu (signed int), kiểu số ngun khơng dấu (unsigned int), kiểu số nguyên dài có dấu (signed long), kiểu số nguyên dài không dấu (unsigned long ), kiểu số thực (float) kiểu số thực có độ xác gấp đôi (double) Kiểu liệu người dùng định nghĩa bao gồm kiểu xâu kí tự (string), kiểu mảng (array), kiểu tập hợp (union), kiểu cấu trúc (struct), kiểu file, kiểu trỏ (pointer) kiểu liệu định nghĩa hoàn toàn kiểu danh sách móc nối (link list), kiểu (tree) Kích cỡ kiểu đồng nghĩa với miền xác định kiểu với biểu diễn nhị phân nó, phụ thuộc vào hệ thống máy tính cụ thể Để xác định kích cỡ kiểu nên dùng tốn tử sizeof( type) Chương trình sau liệt kê kích cỡ kiểu Ví dụ Kiểm tra kích cỡ kiểu #include #include #include #include void main(void) { printf(“\n Kích cỡ kiểu kí tự:%d”, sizeof(char)); printf(“\n Kích cỡ kiểu kí tự khơng dấu:%d”, sizeof(unsigned char)); printf(“\n Kích cỡ kiểu số ngun khơng dấu:%d”, sizeof(unsigned int)); printf(“\n Kích cỡ kiểu số ngun có dấu:%d”, sizeof(signed int)); printf(“\n Kích cỡ kiểu số ngun dài khơng dấu:%d”, sizeof(unsigned long )); printf(“\n Kích cỡ kiểu số nguyên dài có dấu:%d”, sizeof(signed long )); printf(“\n Kích cỡ kiểu số thực có độ xác đơn:%d”, sizeof(float )); printf(“\n Kích cỡ kiểu số thực có độ xác kép:%d”, sizeof(double )); getch(); } Kích cỡ kiểu liệu người dùng định nghĩa tổng kích cỡ kiểu thành viên Chúng ta dùng tốn tử sizeof(tên kiểu) để xác định độ lớn tính theo byte kiểu liệu Một điểm đặc biệt ý lập trình cấu trúc liệu cấu trúc liệu phải kèm theo phép tốn đó, biến gọi thuộc kiểu liệu nhận giá trị từ miền xác định kiểu phép tốn kiểu liệu 1.3 NGUN LÝ TỐI THIỂU Hãy tập nguyên tắc tối thiểu phương tiện cấu trúc lệnh, kiểu liệu phép toán thực viết chương trình Sau nắm cơng cụ tiến hành mở rộng sang hệ thống thư viện tiện ích ngơn ngữ Khi làm quen với ngơn ngữ lập trình đó, không thiết phải lệ thuộc nhiều vào hệ thống thư viện hàm ngôn ngữ, mà điều quan trọng trước toán cụ thể, sử dụng ngơn ngữ để giải nào, phương án tốt lập trình hệ thống thư viện hàm riêng mình, ngơn ngữ lập trình phải nắm vững số công cụ tối thiểu sau: 1.3.1 Tập phép toán Tập phép toán số học: + (cộng); - (trừ); * (nhân); % (lấy phần dư); / (chia) Tập phép toán số học mở rộng: ++a  a=a+1 // tăng giá trị biến a lên đơn vị a  a=a-1 // giảm giá trị biến nguyên a đơn vị a+=n  a=a+n // tăng giá trị biến nguyên a lên n đơn vị a-=n  a=a-n // giảm giá trị biến nguyên a n đơn vị a%=na=a%n // lấy giá trị biến nguyên a môdul với n a/=n  a=a/n // lấy giá trị biến nguyên a chia cho n a*=n  a=a*n // lấy giá trị biến a chia cho n >> : Phép dịch phải (dịch sang phải n bít có giá trị 0) Tập phép toán so sánh: >, =, b) { } // a lớn b if ( a=b) { } // a lớn b if ( a0) 105 { chuyen(sodia-1, CotNguon, CotTG, CotDich); printf(" Chuyen dia %d Tu %c -> %c\n",sodia,CotNguon,CotDich); chuyen(sodia-1, CotTG, CotDich, CotNguon); } } int main() { char CotNguon,CotDich,CotTG; int n; printf("\n Hay nhap so dia: "); scanf("%d",&n); chuyen(n,'A','B','C'); getch(); } Kết thực ví dụ 4.22 cho hình 4.3 Hình 4.3 - Kết thực toán tháp Hà nội với n=4 4.2 Tìm kiếm (Searching) Tìm kiếm tốn tin học Có thể nói, tương tác người hệ thống máy tính chất tìm kiếm thu thập thơng tin Ẩn sau q trình tìm kiếm việc xếp đối tượng theo trật tự để q trình tìm kiếm diễn nhanh nhất, xác hiệu ý nghĩa trình xếp Nội dung chương tập chung vào giải thuật xếp tìm kiếm đây:  Tìm kiếm (Sequential), tìm kiếm nhị phân (Binary Search) & tìm kiếm nhị phân (Binary Search) 106 Tìm kiếm cơng việc quan trọng hệ thống tin học có liên quan mật thiết với trình xếp liệu Bài tốn tìm kiếm tổng qt phát biểu sau: “Cho bảng gồm n ghi R1, R2, , Rn Với ghi Ri tương ứng với khoá ki (trường thứ i record) Hãy tìm ghi có giá trị khố X cho trước” Nếu tìm ghi có giá trị khóa X phép tìm kiếm thoả (successful) Nếu khơng có giá trị khóa X q trình tìm kiếm khơng thoả (unsuccessful) Sau q trình tìm kiếm, xuất yêu cầu bổ xung thêm ghi có giá trị khóa X giải thuật gọi giải thuật tìm kiếm bổ sung 4.2.1 Tìm kiếm (Sequential Searching) Tìm kiếm kỹ thuật tìm kiếm cổ điển danh sách chưa xếp Nội dung phương pháp tìm kiếm duyệt từ ghi thứ ghi cuối cùng, so sánh giá trị khoá với giá trị X cần tìm Trong q trình duyệt, có ghi trùng với giá trị X đưa vị trí ghi dãy, duyệt tới cuối dãy mà khơng có ghi có giá trị khố trùng với X q trình tìm kiếm trả lại giá trị -1 (-1 hiểu giá trị khố X khơng thuộc dãy) Chương trình cài đặt phương pháp tìm kiếm thực sau: #include #include #include #include #include int Sequential(int *, int, int); void Init(int *, int); void Init(int *A, int n){ int i; printf("\n Tao lap day so:"); for (i=0; i

Ngày đăng: 10/06/2020, 20:36

Mục lục

    2.1.1 Không gian bộ nhớ

    Bài tập Đệ quy

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

Tài liệu liên quan