1. Trang chủ
  2. » Giáo án - Bài giảng

Các kĩ thuật lập trình

208 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

Định dạng
Số trang 208
Dung lượng 1,82 MB

Nội dung

HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG  KHOA CÔNG NGHỆ THÔNG TIN BÀI GIẢNG PT IT CÁC KĨ THUẬT LẬP TRÌNH NGUYỄN DUY PHƯƠNG HàNội 2017 LỜI NĨI ĐẦU Sự phát triển công nghệ thông tin năm vừa qua làm thay đổi mặt kinh tế xã hội tồn cầu, cơng nghệ phần mềm trở thành ngành công nghiệp quan trọng đầy tiềm Với hội tụ công nghệ viễn thông công nghệ thông tin, tỷ trọng giá trị phần mềm chiếm cao hệ thống viễn thơng nhƣ thiết bị đầu cuối Chính lý đó, việc nghiên cứu, tìm hiểu, tiến tới phát triển nhƣ làm chủ hệ thống phần mềm kỹ sƣ điện tử viễn thông cần thiết Mơn học Kỹ thuật lập trình môn học sở bắt buộc sinh viên chuyên ngành điện tử viễn thông công nghệ thơng tin Học viện cơng nghệ Bƣu Viễn thơng Cuốn giáo trình “Kỹ thuật lập trình”, đƣợc hình thành sở kinh nghiệm đƣợc đúc rút từ giảng môn học Kỹ thuật lập trình cho sinh viên ngành nói năm học vừa qua với mục đích cung cấp cho sinh viên kiến thức nhất, có tính hệ thống liên quan tới môn học IT Khi học mơn Kỹ thuật lập trình, sinh viên cần học qua môn “Tin học sở” cần bạn có đủ kiến thức sở cần thiết để tiếp thu kiến thức Kỹ thuật lập trình PT Thơng qua giáo trình này, muốn giới thiệu với bạn đọc kỹ lập trình cấu trúc thơng qua số thuật tốn quan trọng, bao gồm: Đại cƣơng lập trình cấu trúc; Con trỏ mảng; Duyệt đệ qui; Ngăn xếp, hàng đợi danh sách móc nối; Cây; Đồ thị cuối Sắp xếp tìm kiếm Phần phụ lục tập tổng hợp lại kiến thức đƣợc đề cập giáo trình đƣợc thể chƣơng trình Tuy ý cẩn trọng q trình biên soạn, nhƣng giáo trình chắn khơng tránh khỏi thiếu sót hạn chế Chúng tơi xin chân thành mong bạn đọc đóng góp ý kiến để giáo trình ngày hồn thiện Mọi đóng góp ý kiến xin gửi Khoa Cơng nghệ thơng tin – Học viện Cơng nghệ Bƣu Viễn thông Hà Nội, ngày 14 tháng 12 năm 2016 Các tác giả MỤC LỤC CHƢƠNG MỞ ĐẦU IT 1.1 Sơ lƣợc lịch sử lập trình cấu trúc 1.2 Cấu trúc lệnh - Lệnh có cấu trúc- Cấu trúc liệu 1.2.1 Cấu trúc lệnh (cấu trúc điều khiển) 1.2.2 Lệnh có cấu trúc 1.2.3 Cấu trúc liệu 1.3 Nguyên lý tối thiểu 10 1.3.1 Tập phép toán 10 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 13 1.4 Nguyên lý địa phƣơng 15 1.5 Nguyên lý quán 16 1.6 Nguyên lý an toàn 18 1.6 Phƣơng pháp Top-Down 19 1.7 Phƣơng pháp Bottom - Up 24 BÀI TẬP CHƢƠNG 28 CHƢƠNG MẢNG VÀ CON TRỎ 28 PT 2.1 Cấu trúc lƣu trữ mảng 29 2.1.1 Khái niệm mảng 29 2.1.2 Cấu trúc lƣu trữ mảng chiều 29 2.1.3 Cấu trúc lƣu trữ mảng nhiều chiều 31 2.2 Các thao tác mảng 32 2.3 Mảng đối hàm 34 2.4 Xâu kí tự (string) 36 2.5 Con trỏ (Pointer) 37 2.5.1 Các phép toán trỏ 38 2.5.2 Con trỏ đối hàm 39 2.5.3 Con trỏ mảng 40 BÀI TẬP CHƢƠNG 46 CHƢƠNG DUYỆT VÀ ĐỆ QUI .53 3.1 Định nghĩa đệ qui 54 3.2 Giải thuật đệ qui 55 3.3 Thuật toán sinh 56 3.3.1 Bài toán liệt kê tập tập n phần tử 57 3.3.2 Bài toán liệt kê tập m phần tử tập n phần tử 59 3.3.3 Bài toán liệt kê hoán vị tập n phần tử 61 3.3.4 Bài toán chia số tự nhiên n thành tổng số nhỏ 63 3.4 Thuật toán quay lui (Back track) 65 3.4.1 Thuật toán quay lui liệt kê xâu nhị phân độ dài n 67 3.4.2 Thuật toán quay lui liệt kê tập m phần tử tập n phần tử 68 3.4.3 Thuật toán quay lui liệt kê hoán vị tập n phần tử 69 3.4.4 Bài toán Xếp Hậu 71 BÀI TẬP CHƢƠNG 74 CHƢƠNG NGĂN XẾP, HÀNG ĐỢI, DANH SÁCH LIÊN KẾT 78 IT 4.1 Kiểu liệu ngăn xếp ứng dụng 78 4.1.1 Định nghĩa khai báo 78 4.1.2 Các thao tác với stack 79 4.1.3 ứng dụng stack 80 4.2 Hàng đợi (Queue) 85 4.2.1 Giới thiệu hàng đợi 85 4.2.2 ứng dụng hàng đợi 86 4.3 Danh sách liên kết đơn 91 4.3.1 Giới thiệu định nghĩa 91 4.3.2 Các thao tác danh sách móc nối 92 4.3.3 ứng dụng danh sách liên kết đơn 97 4.4 Danh sách liên kết kép 103 PT BÀI TẬP CHƢƠNG .117 CHƢƠNG CÂY NHỊ PHÂN 121 5.1 Định nghĩa khái niệm 121 5.2 Cây nhị phân 121 5.3 Biểu diễn nhị phân 123 5.3.1 Biểu diễn nhị phân danh sách tuyến tính 123 5.3.2 Biểu diễn nhị phân danh sách móc nối 123 5.4 Các thao tác nhị phân 124 5.4.1 Định nghĩa nhị phân danh sách tuyến tính 124 5.4.2 Định nghĩa nhị phân theo danh sách liên kết: 124 5.4.3 Các thao tác nhị phân 124 5.5 Ba phép duyệt nhị phân (Traversing Binary Tree) 128 5.5.1 Duyệt theo thứ tự trƣớc (Preorder Travesal) 129 5.5.2 Duyệt theo thứ tự (Inorder Travesal) 129 5.5.3 Duyệt theo thứ tự sau (Postorder Travesal) 130 5.6 Cài đặt nhị phân danh sách tuyến tính 130 5.7 Cài đặt nhị phân hoàn toàn cân bằng link list 136 5.8 Cài đặt nhị phân tìm kiếm link list 142 BÀI TẬP CHƢƠNG .151 CHƢƠNG ĐỒ THỊ (Graph) 153 PT IT 6.1 Những khái niệm đồ thị 153 6.1.1 Các loại đồ thị 153 6.1.2 Các thuật ngữ 156 6.1.3 Đƣờng đi, chu trình, đồ thị liên thơng 157 6.2 Biểu diễn đồ thị máy tính 158 6.2.1 Ma trận kề, ma trận trọng số 158 6.2.2 Danh sách cạnh (cung ) 160 2.3 Danh sách kề 160 6.3 Các thuật tốn tìm kiếm đồ thị 161 6.3.1 Thuật tốn tìm kiếm theo chiều sâu 161 6.3.2 Thuật tốn tìm kiếm theo chiều rộng (Breadth First Search) 163 6.3.3 Kiểm tra tính liên thơng đồ thị 166 6.3.4 Tìm đƣờng hai đỉnh đồ thị 169 6.4 Đƣờng chu trình Euler 171 6.5 Đƣờng chu trình Hamilton 179 6.6 Cây bao trùm 183 6.6.1 Tìm bao trùm đồ thị 184 6.6.2 Tìm bao trùm ngắn 187 6.6.3 Thuật toán Kruskal 190 6.6.4 Thuật toán Prim 193 6.7 Bài tốn tìm đƣờng ngắn 196 6.7.1 Thuật toán gán nhãn 196 6.7 Thuật toán Dijkstra 197 6.7.3 Thuật toán Floy 200 BÀI TẬP CHƢƠNG .204 CHƢƠNG MỞ ĐẦU 1.1 Sơ lƣợc lịch sử lập trình cấu trúc IT 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 đƣợc 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 đƣợc 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ƣới 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 nhƣ 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ế MS-DOS 3.3 ban đầu PT 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) nhƣ ngày thực đƣợc Do vậy, trƣớc năm 1960, ngƣời ta coi việc lập trình giống nhƣ 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 đƣợc 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ố lạ phần mềm đƣợc coi chuyên gia nắm bắt đƣợc 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 đƣợc 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 đƣợc 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 DO50I làm cho kết chƣơng trình sai IT Để 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 đƣợc đ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 đƣa khẳng định, động thái chƣơng trình đƣợc đá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 PT Những kết đƣợc 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 nhƣ 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ã hoá thuật toá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 Để triển khai nguyên lý lập trình cấu trúc, L Wirth thiết kế cài đặt ngôn ngữ ALGOL W biến thể ALGOL 60 Sau này, L Wirth tiếp tục hoàn thiện để trở thành ngơn ngữ lập trình Pascal Đây ngơn ngữ lập trình giản dị, sáng sủa cú pháp, dễ minh họa vấn đề phức tạp lập trình đại đƣợc coi chuẩn mực giảng dạy lập trình 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 1.2 Cấu trúc lệnh - Lệnh có cấu trúc- Cấu trúc 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 đƣợc coi dãy hữu hạn thao tác sơ cấp tập đối tƣợng vào (Input) nhằm thu đƣợc kết (output) Các thao tác ngơn ngữ lập trình cụ thể đƣợc điều khiển lệnh hay cấu trúc điều khiển, cịn đối tƣợng chịu thao tác đƣợ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 đƣợc 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 Cấu trúc câu A; lệnh GOTO Cấu trúc rẽ nhánh dạng đầy đủ If (E) A; S Else B; A E Đ IT Nếu biểu thức E có giá trị (khác 0) thực A; Nếu E sai thực B; Cấu trúc lặp với điều kiện sau PT Cấu trúc lặp với điều kiện trƣớc While (E) A; A B B; B Sau thực lệnh A thực lệnh B S E A; while (E); Đ A S E Thực A E đúng; A Trong biểu thức E cịn có giá trị thực A; Cấu trúc lặp FOR For (E1; E2;E3) A; E1 E3 S E2 Đ A Thực E1; kiểm tra E2 E2 có giá trị thực A; Quá trình đƣợc lặp lại việc thực E3 kiểm tra E2; Đ A, B : ký hiệu cho câu lệnh đơn lệnh hợp thành Mỗi lệnh đơn lẻ đƣợc gọi lệnh đơn, lệnh hợp thành lệnh hay cấu trúc lệnh đƣợc ghép lại với theo qui định ngôn ngữ, Pascal tập lệnh hay cấu trúc lệnh đƣợc bao thân begin end; C tập lệnh hay cấu trúc lệnh đƣợc 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 nhƣ 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 đƣợc 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 đƣợc 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 Phuơng pháp lập trình cịn đƣợc gọi phƣơng pháp lập trình hạn chế 1.2.2 Lệnh có cấu trúc PT IT 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í đƣợc phép đặt cấu trúc điều khiển nó, nhƣ phần cấu trúc điều khiển Điều tƣởng nhƣ tầm thƣờng nhƣng có ý nghĩa quan trọng xây dựng kiểm tra lỗi xảy chƣơng trình Nguyên tắc viết chƣơng trình theo cấu trúc: Cấu trúc phải đƣợc 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 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ự nhƣ 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 đƣợc phép thực cấu trúc liệu cụ thể Nắm bắt đƣợc 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 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 đƣợc 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 cịn 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ố nguyên không dấu (unsigned int), kiểu số nguyên dài có dấu (signed long), kiểu số ngun 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) IT 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 đƣợc định nghĩa hồn tồn nhƣ 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 PT Ví dụ 1.1 kiểm tra kích cỡ kiểu #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ố nguyên dài không dấu:%d”, sizeof(unsigned long )); printf(“\n Kích cỡ kiểu số ngun 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 đƣợc gọi thuộc kiểu liệu printf("\n"); } void main(void){ clrscr(); Init(); Krusal();Result(); getch(); } 6.6.4 Thuật toán Prim Thuật toán Kruskal làm việc hiệu đồ thị có số cạnh khoảng m=n(n-1)/2 Trong tình nhƣ vậy, thuật tốn Prim tỏ hiệu Thuật tốn Prim cịn đƣợc mang tên ngƣời láng giềng gần Trong thuật toán này, bắt đầu đỉnh tuỳ ý s đồ thị, nối s với đỉnh y cho trọng số cạnh c[s, y] nhỏ Tiếp theo, từ đỉnh s y tìm cạnh có độ dài nhỏ nhất, điều dẫn đến đỉnh thứ ba z ta thu đƣợc phận gồm đỉnh cạnh Quá trình đƣợc tiếp tục ta nhận đƣợc gồm n-1 cạnh, bao trùm nhỏ cần tìm PT IT Trong trình thực thuật tốn, bƣớc, ta nhanh chóng chọn đỉnh cạnh cần bổ sung vào khung, đỉnh đồ thị đƣợc đƣợc gán nhãn Nhãn đỉnh v gồm hai phần, [d[v], near[v]] Trong đó, phần thứ d[v] dùng để ghi nhận độ dài cạnh nhỏ số cạnh nối đỉnh v với đỉnh khung xây dựng Phần thứ hai, near[v] ghi nhận đỉnh khung gần v Thuật toán Prim đƣợc mô tả thông qua thủ tục sau: Procedure Prim; Begin (*bƣớc khởi tạo*) Chọn s đỉnh đồ thị; VH := { s }; T := ; d[s] := 0; near[s] := s; For v V\VH Begin D[v] := C[s, v]; near[v] := s; End; (* Bƣớc lặp *) Stop := False; While not stop Begin Tìm u V\VH thoả mãn : d[u] = { d[v] với uV\VH}; VH = VH {u}; T = T  {u, near[u] }; If | VH | = n then Begin H = (VH, T) khung nhỏ đồ thị; Stop := TRUE; End Else For v  V\VH 193 If d[v] > C[u, v] then Begin D[v] := C[u, v]; Near[v] := u; End; End; End; PT IT Chƣơng trình cài đặt thuật tốn Prim tìm bao trùm nhỏ đƣợc thực nhƣ sau: #include #include #include #include #include #define TRUE #define FALSE #define MAX 10000 int a[100][100]; int n,m, i,sc,w; int chuaxet[100]; int cbt[100][3]; FILE *f; void nhap(void){ int p,i,j,k; for(i=1; i

Ngày đăng: 19/03/2021, 16:52

w