1. Trang chủ
  2. » Cao đẳng - Đại học

LẬP TRÌNH C++ CƠ BẢN ĐẾN NÂNG CAO

273 20 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 273
Dung lượng 4,13 MB

Nội dung

GIÁO TRÌNH LẬP TRÌNH NÂNG CAO Nguyễn Văn Vinh, Phạm Hồng Thái, Trần Quốc Long Khoa Công nghệ Thông tin - Trường Đại học Công nghệ - ĐHQG Hà Nội MỤC LỤC Mở đầu 1.1 Giải tốn lập trình 1.1.1 Thuật toán 1.1.2 Thiết kế chương trình 1.1.3 Chu kỳ phát triển phần mềm 1.2 Tiêu chuẩn đánh giá chương trình tốt 1.3 Ngơn ngữ lập trình chương trình dịch 1.4 Mơi trường lập trình bậc cao 1.5 Lịch sử C C++ 1.6 Chương trình C++: In dịng văn Một số khái niệm C++ 2.1 11 Khai báo biến sử dụng biến 11 2.1.1 Biến 11 2.1.2 Tên hay định danh 12 2.1.3 Câu lệnh gán 14 Vào liệu 15 2.2.1 Xuất liệu với cout 15 2.2.2 Chỉ thị biên dịch không gian tên 17 2.2.3 Các chuỗi Escape 18 2.2.4 Nhập liệu với cin 18 Kiểu liệu biểu thức 20 2.3.1 Kiểu int kiểu double 20 2.3.2 Các kiểu số khác 22 2.3.3 Kiểu C++11 22 2.3.4 Kiểu char 24 2.3.5 Tương thích kiểu liệu 25 2.3.6 Toán từ số học biểu thức 26 2.4 Luồng điều khiển 28 2.5 Phong cách lập trình 31 2.2 2.3 ii MỤC LỤC 2.6 Biên dịch chương trình với GNU/C++ Kiểm thử gỡ rối chương trình 3.1 3.2 3.3 32 37 Kỹ thuật kiểm thử 37 3.1.1 Kiểm thử viết mã nguồn 38 Kỹ thuật gỡ rối chương trình 39 3.2.1 Khái niệm vế gỡ rối chương trình 39 3.2.2 Phân loại lỗi 39 3.2.3 Một số kỹ thuật gỡ rối 40 3.2.4 Giải pháp vấn đề liên quan đến C/C++ 42 Lập trình khơng lỗi 44 Hàm 47 4.1 Thiết kế từ xuống (top-down) 47 4.2 Hàm 48 4.2.1 Ý nghĩa hàm 48 4.2.2 Cấu trúc chung hàm 48 4.2.3 Khai báo hàm 51 Cách sử dụng hàm 52 4.3.1 Lời gọi hàm 52 4.3.2 Hàm với đối mặc định 54 Biến toàn cục biến địa phương 55 4.4.1 Biến địa phương (biến hàm, khối lệnh) 55 4.4.2 Biến toàn cục (biến tất hàm) 56 4.4.3 Mức ưu tiên biến toàn cục địa phương 56 Tham đối chế truyền giá trị cho tham đối 60 4.5.1 Truyền theo tham trị 60 4.5.2 Biến tham chiếu 61 4.5.3 Truyền theo tham chiếu 63 4.5.4 Hai cách truyền giá trị cho hàm từ khóa const 64 4.6 Ngăn xếp gọi hàm mẫu tin kích hoạt 64 4.7 Chồng hàm khuôn mẫu hàm 68 4.7.1 Chồng hàm (hàm trùng tên) 68 4.7.2 Khuôn mẫu hàm 70 Lập trình với hàm đệ quy 72 4.8.1 Khái niệm đệ qui 72 4.8.2 Lớp toán giải đệ qui 74 4.8.3 Cấu trúc chung hàm đệ qui 75 4.3 4.4 4.5 4.8 MỤC LỤC iii Mảng 83 5.1 Lập trình thao tác với mảng chiều 83 5.1.1 Ý nghĩa mảng 83 5.1.2 Thao tác với mảng chiều 84 5.1.3 Mảng hàm 88 5.1.4 Tìm kiếm xếp 93 Lập trình thao tác với mảng nhiều chiều 98 5.2.1 Mảng chiều 98 5.2.2 Thao tác với mảng hai chiều 99 5.2 5.3 Lập trình thao tác với xâu kí tự 105 5.3.1 Khai báo 106 5.3.2 Thao tác với xâu kí tự 106 5.3.3 Phương thức nhập xâu (#include ) 107 5.3.4 Một số hàm làm việc với xâu kí tự (#include ) 108 5.3.5 Các hàm chuyển đổi xâu dạng số thành số (#include ) 112 5.3.6 Một số ví dụ làm việc với xâu 113 Các kiểu liệu trừu tượng 6.1 6.2 6.3 119 Kiểu liệu trừu tượng cấu trúc (struct) 119 6.1.1 Khai báo, khởi tạo 119 6.1.2 Hàm cấu trúc 122 6.1.3 Bài toán Quản lý sinh viên (QLSV) 127 Kiểu liệu trừu tượng lớp (class) 134 6.2.1 Khai báo lớp 135 6.2.2 Sử dụng lớp 136 6.2.3 Bài toán Quản lý sinh viên 143 6.2.4 Khởi tạo (giá trị ban đầu) cho đối tượng 146 6.2.5 Hủy đối tượng 152 6.2.6 Hàm bạn (friend function) 152 6.2.7 Tạo phép toán cho lớp (hay tạo chồng phép tốn - Operator Overloading) 156 Dạng khn mẫu hàm lớp 159 6.3.1 Khai báo kiểu mẫu 159 6.3.2 Sử dụng kiểu mẫu 160 6.3.3 Một số dạng mở rộng khai báo mẫu 162 Con trỏ nhớ 167 7.1 Khái niệm trỏ 167 7.2 Biến trỏ 167 7.3 Cấp phát nhớ động 171 iv MỤC LỤC 7.4 Con trỏ mảng động 172 7.4.1 Biến mảng biến trỏ 172 7.4.2 Biến mảng động 174 7.5 Truyền tham số hàm trỏ 176 7.6 Con trỏ hàm 177 7.7 Lập trình với danh sách liên kết 178 7.7.1 Nút danh sách liên kết 180 7.7.2 Danh sách liên kết lớp 192 Vào liệu 197 8.1 Dòng vào file 197 8.2 Vào file 198 8.2.1 Mở file 198 8.2.2 Đóng file 199 8.3 Vào với file văn 199 8.4 Vào với file nhị phân 201 8.5 Truy cập ngẫu nhiên 202 Xử lý ngoại lệ 9.1 9.2 205 Các vấn đề xử lý ngoại lệ 205 9.1.1 Ví dụ xử lý ngoại lệ 205 9.1.2 Định nghĩa lớp ngoại lệ 207 9.1.3 Ném bắt nhiều ngoại lệ 208 9.1.4 Ném ngoại lệ từ hàm 209 9.1.5 Mô tả ngoại lệ 211 Kỹ thuật lập trình cho xử lý ngoại lệ 211 9.2.1 Ném ngoại lệ đâu 211 9.2.2 Cây phả hệ ngoại lệ STL 212 9.2.3 Kiểm tra nhớ 213 10 Tiền xử lý lập trình nhiều file 215 10.1 Các thị tiền xử lý 215 10.1.1 Chỉ thị bao hàm tệp #include 215 10.1.2 Chỉ thị macro #define 216 10.1.3 Các thị biên dịch có điều kiện #if, #ifdef, #ifndef 217 10.2 Lập trình nhiều file 219 10.2.1 Tổ chức chương trình 219 10.2.2 Viết kiểm tra file include 220 10.2.3 Biên dịch chương trình có nhiều file 220 MỤC LỤC 11 Lập trình với thư viện chuẩn STL v 225 11.1 Giới thiệu thư viện chuẩn STL 225 11.2 Khái niệm trỏ duyệt 225 11.2.1 Các thao tác với trỏ duyệt 226 11.2.2 Các loại trỏ duyệt 228 11.3 Khái niệm vật chứa 230 11.3.1 Các vật chứa dạng dãy 231 11.3.2 Ngăn xếp hàng đợi 236 11.3.3 Tập hợp ánh xạ 239 11.3.4 Hàm băm, tập hợp ánh xạ không thứ tự (C++11) 242 11.4 Các thuật toán mẫu 244 11.4.1 Thời gian chạy ký hiệu “O-lớn” 244 11.4.2 Các thuật tốn khơng thay đổi vật chứa 245 11.4.3 Các thuật toán thay đổi vật chứa 248 11.4.4 Các thuật toán tập hợp 250 11.5 Một số thư viện chuẩn khác STL 250 11.5.1 Xử lý xâu với 251 11.5.2 Con trỏ thông minh quản lý nhớ với (C++11) 254 11.5.3 Tính tốn thời gian với (C++11) 255 11.5.4 Lập trình song song với (C++11) 256 A Bảng từ khóa ngơn ngữ C++ 261 B Thứ tự ưu tiên phép toán 263 C Phong cách lập trình 265 D Hàm inline 269 Tài liệu tham khảo 271 vi MỤC LỤC Lời giới thiệu Lập trình cách thức diễn tả thuật tốn (chương trình) giải vấn đề cho máy tính hiểu thi hành thuật tốn Nằm bắt hiểu rõ kỹ thuật lập trình giúp viết chương trình hiệu phát sinh lỗi Hơn nữa, thuật toán tốn hiểu cặn kẽ thơng qua chương trình thể thuật tốn máy tính Giáo trình Lập trình nâng cao cung cấp nội dung nâng cao kỹ thuật lập trình cho sinh viên đại học chuyên ngành CNTT u thích lập trình Giáo trình giới thiệu kiến thức ngơn ngữ C++ sử dụng ngơn ngữ lập trình để minh họa ví dụ kỹ thuật lập trình Giáo trình thích hợp cho có kiến thức lập trình Cách tiếp cận viết giáo trình trình bày kỹ thuật lập trình để giải tốn khơng sâu giới thiệu ngơn ngữ lập trình Hơn giáo trình thiết kế dành cho bạn sinh viên có kiến thức lập trình, ví dụ học qua mơn học nhập mơn lập trình Do đó, giáo trình đề cập kiến thức ngôn ngữ C++ để minh họa kỹ thuật lập trình Nội dung giáo trình đề cập kỹ thuật lập trình đến nâng cao giúp sinh viên lập trình giải toán cách hiệu giảm thiểu mắc lỗi chương trình Các chương giáo trình bao gồm sau: Chương giới thiệu bước giải giải tốn lập trình ngơn ngữ lập trình bậc cao C++ Chương trình bày khái niệm C++ Kiểm thử gỡ rối kỹ thuật quan trọng trình lập trình Vì vậy, vấn đề đề cập chương giáo trình Chương 4, đề cập đến lập trình sử dụng hàm mảng C++ Chương giới thiệu kiểu liệu trừu tượng Chương trình bày trỏ, nhớ kỹ thuật lập trình dựa vào trỏ Chương 8, trình bày thao tác vào liệu cách xử lý ngoại lệ C++ Nhằm cung cấp kỹ thuật lập trình để phát triển dự án lớn phức tạp, chương 10 cung cấp kiến thức tiền xử lý lập trình nhiều file Chương cuối trình bày thư viện chuẩn tiếng STL C++ cách thức lập trình sử dụng thư viện Ngồi cịn có phụ lục cuối giáo trình: bảng từ khóa C++, thứ tự ưu tiên phép tốn, phong cách lập trình Các tác giả chân thành cảm ơn TS Trần Thi Minh Châu, TS Lê Quang Minh, ThS Trần Hồng Việt, ThS Phạm Nghĩa Luân, ThS Nguyễn Quang Huy đồng nghiệp sinh viên khoa CNTT, Trường Đại học Công nghệ đọc thảo đóng góp ý kiến q báu nội dung hình thức trình bày Đây lần xuất nên chắn giảo trình cịn nhiều khiếm khuyết, chúng tơi mong nhận ý kiến góp ý để giáo trình hồn thiện Nhóm tác giả Chương Mở đầu Trong chương này, mô tả thành phần máy tính kỹ thuật thiết kế viết chương trình máy tính Tiếp theo, chúng tơi minh họa chương trình đơn giản ngơn ngữ C++ mô tả chúng hoạt động 1.1 Giải tốn lập trình Trong phần này, mô tả số nguyên lý chung để sử dụng thiết kế viết chương trình máy tính Đây ngun lý tổng qt ta sử dụng cho ngơn ngữ lập trình không ngôn ngữ C++ 1.1.1 Thuật tốn Khi học ngơn ngữ lập trình đầu tiên, thường dễ nhận cơng việc khó khăn giải tốn máy tính chuyển ý tưởng thành ngôn ngữ cụ thể để đưa vào máy tính Phần khó khăn giải tốn máy tính tìm giải pháp Sau tìm giải pháp, công việc thường lệ chuyển giải pháp tốn thành ngơn ngữ yêu cầu, C++ số ngơn ngữ lập trình khác Vì vậy, điều hữu ích tạm thời bỏ qua ngơn ngữ lập trình thay vào tập trung xây dựng bước giải pháp viết chúng ngôn ngữ tự nhiên (tiếng Việt, tiếng Anh, …) Dãy bước giải pháp hiểu thuật toán Dãy thị xác mà đưa giải pháp gọi thuật tốn Thuật tốn biểu diễn dạng ngôn ngữ tự nhiên ngôn ngữ lập trình C++ Một chương trình máy tính đơn giản thuật tốn biểu diễn ngơn ngữ mà máy tính hiểu thi hành Vì vậy, khái niệm thuật tốn tổng qt so với khái niệm chương trình Tuy nhiên, nói dãy thị thuật tốn, thường hiểu thị biểu diễn dạng ngơn ngữ tự nhiên (mã giả), cịn chúng biểu diễn dạng ngơn ngữ lập trình thường gọi chương trình Ví dụ giúp ta hiểu rõ khái niệm Hình 1.1 mơ tả thuật tốn ngơn ngữ tự nhiên Thuật tốn xác định số lần tên xuất danh sách tên Mở đầu Thuật toán xác định số lần tên xuất danh sách tên cho trước Lấy danh sách tên Lấy tên cần tính Thiết lập SOLANTEN Thực với tên danh sách tên So sánh tên với tên cần tính, tên SOLANTEN tăng thêm Thơng báo số lần tên cần tính SOLANTEN Hình 1.1: Thuật tốn Hình 1.1: Thuật tốn 1.1.2 1.1.2 kế Thiết kế chương trình Thiết chương trình Thiết kế chương trình thường nhiệm vụ khó Khơng có tập đầy đủ qui Thiết kế chương trình thường nhiệm vụ khó Khơng có tập đầy đủ qui tắc, thuật tắc, thuật tốn để nói với viết chương trình Tuy nhiên, tốn để nói với viết chương trình Tuy nhiên, có q trình có q trình thiết kế chương trình tương đối tổng qt mơ tả thiết kế chương trình tương đối tổng qt mơ tả hình 1.2 Tồn việc thiết kế chương trình hình 1.2 Tồn việc thiết kế chương trình chia làm hai pha: pha giải chia làm haibài pha: giải thực bàiKết toán pha Kếttoán quảlàcủa pha giải quyết toánpha pha quảvàcủa phathực giải thuật toán toán thuậtcủa toán ngữ Để tự có nhiên Để trình có chương tốnbài biểutốn diễnbiểu dướidiễn dạngdưới ngơndạng ngữ ngơn tự nhiên chương trình ngơn ngữ lậpngơn trình thuật tốn đổi ngơnngơn ngữ ngữ lập trình Q trình xây ngữ lậpC++, trình C++, thuật tốnchuyển chuyển đổi lập trình dựng chươngQuá trình từ xây thuật tốn gọi làtrình pha từ thực trình dựng chương thuật toán gọi pha thực Bước định nghĩa toán , chắn toán mà chương trình cần giải Chúng Bước định nghĩa toán , chắn toán mà chương trình cần giải ta cần mơ tả đầy đủ xác Chúng ta cần định nghĩa tốn dạng tin học Xác định Chúng ta cần mơ tả đầy đủ xác Chúng ta cần định nghĩa toán rõ ràng buộc,dạng liệu đầuXác vào định đầu ràng tốn nhưvào kiểu liệu cầnbàixử lý Ví dụ, tin học rõ buộc, liệu đầu đầu chương trình kếnhư tốn ngân chúng khơng lãi suất tốn kiểu hàng, liệu cần xử lý.taVíphải dụ, biết chương chương trìnhmà kếcịn tốnlãi suất cộng dồn từ ngân hànghàng, năm,chúng hàng ta tháng, hàng ngàychỉ hay biết khơng lãi suất mà cịn lãi suất cộng dồn Pha thực hiệnnăm, khơng phải bước Có chi tiết quan tâm đơi từ hàng hàng tháng, hàngđơn ngàygiản hay khơng có số chi tiết tối ưu thực tinh tế đơn giản so với pha đầu Pha thực bước đơn giản Có chi tiết quan tiên Khi thành thạo với ngôn ngữ C++ ngơn ngữ lập trình khác, việc chuyển tâm đơi có số chi tiết tối ưu thực tinh tế đổi từ thuậtđơn tốngiản sang chương ngơn lập ta trình trởthạo thành so vớitrình pha Khingữ chúng thành với cơng ngơnviệc ngữ bình C++ thường Như đềhoặc cập bất hình 1.2, thửkhác, xảy cảchuyển 2đổi pha Trướctốn khisang chương trình viết, ngơn ngữ kiểm lập trình việc từ thuật chương thuật toán cần kiểm thuậttrở toán chưa hiệu quả, thiết kế thuật tốn lại Kiểm thử trìnhđược ngơnthử ngữKhi lập trình thành cơng việc bìnhcần thường thủ cơng bước thực thi hành thuật toán làm Chương trình C++ Như đề cập hình 1.2, kiểm thử xảy pha Trước chương kiểm thử cách dịch chạy với số liệu đầu vào Trình biên dịch cho trình viết, thuật toán cần kiểm thử Khi thuật toán chưa hiệu quả, cần thông báo lỗi với số loại lỗi cụ thể thiết kế thuật tốn lại Kiểm thử thủ công bước thực thi hành thuật 1.1.3 Chu kỳ phát triển phần mềm Thiết kế hệ thống phần mềm lớn trình biên dịch hệ điều hành thường chia quy trình phát triển phần mềm thành sáu pha biết chu kỳ phát triển phần mềm Sáu pha sau: Phân tích đặc tả tốn (định nghĩa toán) Thiết kế phần mềm (thiết kế thuật tốn đối tượng) tốn làm Chương trình C++ kiểm thử cách dịch chạy với số liệu đầu vào Trình biên dịch cho thơng báo 1.2 Tiêu chuẩn đánh giá chương trình tốt lỗi với số loại lỗi cụ thể Pha giải toán Bắt đầu Pha thực thi Định nghĩa toán Thiết kế thuật toán Dịch sang C++ Kiểm thử thủ cơng Kiểm thử Chương trình Hình 1.2: Quá trình thiết kế chương trình Hình 1.2: Quá trình thiết kế chương trình Lập trình Kiểm1.1.3 thử Chu kỳ phát triển phần mềm Bảo trì nâng phần hệ thống Thiết kế hệcấp thống mềmphần lớn mềm trình biên dịch hệ điều hành thường chia qui trình Hủy khơng dùng nữaphát triển phần mềm thành sáu pha biết chu kỳ phát triển phần mềm Sáu pha sau: Phân tích đặc tả tốn (định nghĩa tốn) 1.2 Tiêu1 chuẩn đánh giá chương trình tốt Thiết kế phần mềm (thiết kế thuật toán đối tượng) trìnhchương trình tốt có lẽ chủ đề tranh luận chưa nguội từ Như nàoLập mơt người bắt đầu4.lậpKiểm trìnhthử cho máy tính Có thể nói, viết chương trình tốt nghệ thuật Bảo trì nâng thống trình phần tốt mềm qua kinh nghiệm chúngcấp tơi,của mộthệchương thường có đặc điểm sau: Hủy không dùng Dễ đọc: Mã nguồn chương trình tốt phải giúp lập trình viên (cả người viết chương trình, người nhóm, người bảo trì chương trình) đọc chúng cách dễ dàng Luồng điều khiển chương trình phải rõ ràng, khơng làm khó cho người đọc Nói mội cách khác, chương trình tốt có khả giao tiếp với người đọc chúng Dễ kiểm tra: Các mơ-đun, hàm chương trình viết cho chúng dễ dàng đặt vào kiểm tra đơn vị chương trình (unit test) Dễ bảo trì: Khi sửa lỗi cải tiến chương trình, thường cần tác động vào vài phận mã nguồn 254 11.5.2 Lập trình với thư viện chuẩn STL Con trỏ thơng minh quản lý nhớ với (C++11) Có lẽ lập trình viên C C++ phải đau đầu với lỗi rỏ rỉ nhớ quên khơng giải phóng nhớ cấp phát động malloc new sử dụng trỏ Với C++11, vấn đề phần giải với trỏ thông minh Khi cấp phát nhớ, trỏ thông minh khơng khác trỏ bình thường Do đó, gần đoạn mã sử dụng trỏ bình thường thay trỏ thơng minh Tuy nhiên, trỏ thông minh tự động giải phóng nhớ đối tượng cấp phát vào thời điểm “thích hợp” Khi khai báo trỏ thơng minh, ta cần khai báo kiểu liệu mà chúng trỏ đến dạng tham số kiểu template Để sử dụng trỏ thông minh, cần sử dụng câu lệnh #include Bộ nhớ dùng chung với shared_ptr Khi nhiều trỏ thường trỏ đến đến đối tượng cấp phát động Nếu ta dùng lệnh delete với trỏ, lập tức, phần nhớ trỏ lại trỏ đến trở nên không hợp lệ Với C++11, trỏ thông minh shared_ptr giải vấn đề Ta có nhiều trỏ trỏ đến đối tượng Khi đó, trỏ lưu giữ biến đếm tăng có thêm trỏ giảm trỏ bị hủy Khi biến đếm 0, nhớ tương ứng giải phóng Một điểm yếu shared_ptr trỏ trỏ đến đối tượng theo vòng trịn chúng khơng bị giải phóng Để giải vấn đề này, C++11 sử dụng trỏ thông minh weak_ptr Chúng không vào chi tiết trỏ cho phép quản lý nhớ “lỏng lẻo” nhờ vấn đề vịng trịn nêu khơng cịn Đồng thời, với weak_ptr , ta ln kiểm tra xem nhớ trỏ trỏ đến có cịn hợp lệ hay không Một số lưu ý dùng trỏ thông minh Các trỏ thông minh chất đối tượng C++ Để sử dụng chúng hiệu quả, cần tuân thủ số quy tắc sau: • Nên tạo shared_ptr cấp phát nhớ sử dụng trỏ để tạo trỏ share_ptr weak_ptr khác • Khơng sử dụng trỏ thông thường trỏ đến đối tượng với trỏ thơng minh • Khơng sử dụng new để cấp phát nhớ, thay vào đó, dùng hàm mẫu std::make_shared() Ví dụ Quan sát thơng báo ví dụ sau để thấy hoạt động trỏ thông minh Để dịch chương trình này, bạn cần khai báo sử dụng chuẩn C++11 với trình biên dịch Nếu bạn dùng GNU C++ Compiler (g++), thêm -std=c++11 vào dòng lệnh biên dịch # include # include using namespace std; 10 11 12 13 class Thing { int value ; public : Thing (int v = 0) : value (v) { cout

Ngày đăng: 26/03/2022, 15:11

TỪ KHÓA LIÊN QUAN

w