Thái Nguyên, tháng 03 năm 2022 KHOA CÔNG NGHỆ THÔNG TIN ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG BÁO CÁO THỰC TẬP CƠ SƠ Đề tài Tìm hiểu về ngôn ngữ lập trình C++, và ứng dụng giải các bài toán sắp xếp GVHD Đoàn Thị Bích Ngọc Sinh viên thực hiện Bế Thanh Tùng Lớp CNTT K18A MSV DTC19H4802010083 NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN Thái Nguyên, ngày tháng năm 2022 LỜI CẢM ƠN Lời đầu tiên, em xin chân thành cảm ơn quý thầy, cô giáo trường ĐH Công Nghệ Thông Tin và Truyền Thông Thái Ng.
ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG KHOA CÔNG NGHỆ THÔNG TIN BÁO CÁO THỰC TẬP CƠ SƠ Đề tài: Tìm hiểu ngơn ngữ lập trình C++, ứng dụng giải toán xếp GVHD: Đồn Thị Bích Ngọc Sinh viên thực hiện: Bế Thanh Tùng Lớp: CNTT K18A MSV: DTC19H4802010083 Thái Nguyên, tháng 03 năm 2022 NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN *******^^****** Thái Nguyên, ngày tháng năm 2022 LỜI CẢM ƠN Lời đầu tiên, em xin chân thành cảm ơn quý thầy, cô giáo trường ĐH Công Nghệ Thông Tin Truyền Thông Thái Nguyên dạy dỗ truyền đạt nhiều kiến thức bổ ích suốt thời em học tập trường Đây điều kiện lớn để em thực thực tập sở Đặc biệt, em xin chân thành gửi lời cảm ơn sâu sắc đến Đồn Thị Bích Ngọc tận tình hướng dẫn giúp đỡ em suốt thời gian làm thực tập Với trình độ kiến thức hạn chế nên thực tập em khơng tránh khỏi sai sót, em hy vọng q thầy bạn bè góp ý, sửa lỗi để vấn đề triển khai hoàn hảo Em xin chân thành cảm ơn! Thái Nguyên, tháng năm 2022 Sinh viên thực Bế Thanh Tùng Mục lục CHƯƠNG : CƠ SỞ LÝ THUYẾT 1.1 GIỚI THIỆU VỀ NGƠN NGỮ C++ C++ ngơn ngữ lập trình hướng đối tượng mở rộng từ ngơn ngữ C Do vậy, C++ có ưu điểm kế thừa điểm mạnh truyền thống ngôn ngữ C uyển chuyển, tương thích với thiết bị phần cứng Hiện nay, C++ ngôn ngữ lập trình phổ biến, giảng dạy trường đại học nước giới đặc biệt sử dụng rộng rãi cho nhu cầu phát triển công nghiệp phần mềm Tài liệu nhằm giới thiệu cho sinh viên ngôn ngữ lập trình C++, mà cịn mong muốn qua sinh viên hiểu tư tưởng phương pháp lập trình hướng đối tượng nói chung Nội dung tài liệu bao gồm hai phần chính: • Phần thứ lập trình nâng cao với C++, bao gồm lập trình C++ với trỏ mảng, kiểu liệu có cấu trúc thao tác vào tệp • Phần thứ hai lập trình hướng đối tượng với C++, bao gồm định nghĩa thao tác lớp đối tượng, tính kế thừa tương ứng bội C++, cách sử dụng số lớp thư viện C++ 1.1.1 Lập trình tuyến tính Đặc trưng lập trình tuyến tính tư theo lối Chương trình thực theo thứ tự từ đầu đến cuối, lệnh lệnh kết thúc chương trình Đặc trưng Lập trình tuyến tính có hai đặc trưng: • Đơn giản: chương trình tiến hành đơn giản theo lối tuần tự, khơng phức tạp • Đơn luồng: có luồng công việc nhất, công việc thực luồng Tính chất • Ưu điểm: Do tính đơn giản, lập trình tuyến tính ứng dụng cho chương trình đơn giản có ưu điểm dễ hiểu • Nhược điểm: Với ứng dụng phức tạp, người ta dùng lập trình tuyến tính để giải Ngày nay, lập trình tuyến tính tồn phạm vi modul nhỏ phương pháp lập trình khác Ví dụ chương trình lập trình cấu trúc, lệnh thực theo từ đầu đến cuối chương trình 1.1.2 Lập trình hướng cấu trúc 1.1.2.1 Khái niệm Lập trình hướng cấu trúc hay cịn gọi lập trình hướng thủ tục (Procedure Oriented Programming POP): kỹ thuật lập trình truyền thống, chương trình chia thành hàm (chương trình con) Mỗi chương trình cịn chia nhiều chương trình khác để đơn giản hóa cơng việc chúng (Q trình làm mịn) Ví dụ chương trình nhập hiển thị thông tin người dùng chia thành hai chương trình chương trình nhập xuất, việc nhập thơng tin phức tạp chương trình nhập thơng tin chia nhiều chương trình khác Các ngơn ngữ lập trình hướng cấu trúc: Pascal, C 1.1.2.2 Đặc điểm, Tính chất Chương trình = Cấu trúc liệu + Giải thuật • Cấu trúc liệu: cách mô tả, tổ chức liệu • Giải thuật: thuật tốn, bước giải toán Để liên kết hàm với ta thường dùng biến toàn cục trỏ Các tính chất lập trình hướng cấu trúc là: • Tập chung vào cơng việc cần thực (thuật tốn) • Chương trình lớn chia thành chương trình con, chương trình gọi tới nhiều lần theo thứ tự • Phần lớn hàm sử dụng liệu chung • Dữ liêu hệ thống chuyển động từ hàm sang hàm khác • Hàm biến đổi liệu từ dạng sang dạng khác • Sử dụng cách tiếp cận top-down thiết kế chương trình 1.1.2.3 Ưu nhược điểm Ưu điểm: Tư giải thuật rõ ràng Đơn giản, dễ hiểu Nhược điểm: Trong lập trình hướng cấu trúc ta thường quan tâm đến việc phát triển hàm mà quan tâm tới liệu thứ mà chúng dùng để xử lý cơng việc (Điều khiến cho liệu khó kiểm sốt) Khơng hỗ trợ sử dụng lại mã nguồn: cấu trúc liệu phù hợp với số giải thuật, thay đổi cấu trúc liệu giải thuật phải thay đổi theo Khơng phù hợp với tốn lớn có nhiều module 1.1.2.4 Lập trình hướng đối tượng Lập trình hướng đối tượng Trong lập trình hướng đối tượng: • Người ta coi thực thể chương trình đối tượng sau trừu tượng hố đối tượng thành lớp đối tượng • Dữ liệu tổ chức thành thuộc tính lớp Nguời ta ngăn chặn việc thay đổi tuỳ tiện liệu chương trình cách giới hạn truy nhập cho phép truy nhập liệu thông qua đối tượng, thông qua phương thức mà đối tượng cung cấp • Quan hệ đối tượng quan hệ ngang hàng quan hệ kế thừa: Nếu lớp B kế thừa từ lớp A A gọi lớp sở B gọi lớp dẫn xuất Ngơn ngữ lập trình hướng đối tượng phổ biến Java, C++, C# Mặc dù C++ có đặc trưng lập trình hướng đối tượng khơng phải ngơn ngữ lập trình hướng đối tượng Đặc trưng Lập trình hướng đối tượng có hai đặc trưng bản: • Đóng gói liệu: liệu tổ chức thành thuộc tính lớp đối tượng Việc truy nhập đến liệu phải thông qua phương thức đối tượng lớp • Sử dụng lại mã nguồn: việc sử dụng lại mã nguồn thể thông qua chế kế thừa Cơ chế cho phép lớp đối tượng kế thừa từ lớp đối tượng khác Khi đó, lớp dẫn xuất, sử dụng phương thức (mã nguồn) lớp sở mà không cần phải định nghĩa lại Ưu điểm Lập trình hướng đối tượng có số ưu điểm bật: • Khơng cịn nguy liệu bị thay đổi tự chương trình Vì liệu đóng gói vào đối tượng Nếu muốn truy nhập vào liệu phải thông qua phương thức cho phép đối tượng • Khi thay đổi cấu trúc liệu đối tượng, không cần thay đổi mã nguồn đối tượng khác, mà cần thay đổi số thành phần đối tượng dẫn xuất Điều hạn chế ảnh hưởng xấu việc thay đổi liệu đến đối tượng khác chương trình • Có thể sử dụng lại mã nguồn, tiết kiệm tài ngun, chi phí thời gian Vì ngun tắc kế thừa cho phép lớp dẫn xuất sử dụng phương thức từ lớp sở phương thức nó, mà khơng cần thiết phải định nghĩa lại • Phù hợp với dự án phần mềm lớn, phức tạp 1.1.2.5 Một số khái niệm Trong mục này, làm quen với số khái niệm lập trình hướng đối tượng Bao gồm: • Khái niệm đối tượng (object) • Khái niệm đóng gói liệu (encapsulation) • Khái niệm kế thừa (inheritance) • Khái niệm đa hình (polymorphism) Đối tượng (Object) Trong lập trình hướng đối tượng, đối tượng coi đơn vị nhỏ Các diệu cách xử lí thành phần đối tượng mà không coi thực thể Một đối tượng chứa liệu riêng nó, đồng thời có phương thức (hành động) thao tác liệu đó: Đối tượng = liệu + phương thức Lớp (Class) Khi có nhiều đối tượng giống mặt liệu phương thức, chúng nhóm lại với gọi chung lớp: • Lớp trừu tượng hố đối tượng • Đối tượng thể lớp Đóng gói liệu (Encapsulation) • Các liệu đóng gói vào đối tượng Mỗi liệu có phạm vi truy nhập riêng • Khơng thể truy nhập đến liệu cách tự lập trình cấu trúc • Muốn truy nhập đến liệu bảo vệ, phải thông qua đối tượng, nghĩa phải sử dụng phương thức mà đối tượng cung cấp truy nhập đến liệu đối tượng Kế thừa (Inheritance) Tính kế thừa lập trình hướng đối tượng cho phép lớp kế thừa từ số lớp tồn Khi đó, lớp sử dụng liệu phương thức lớp sở Đa hình (Polymorphsim) Đa hình khái niệm ln kèm với kế thừa Do tính kế thừa, lớp sử dụng lại phương thức lớp khác Tuy nhiên, cần thiết, lớp dẫn xuất định nghĩa lại số phương thức lớp sở Đó nạp chồng phương thức kế thừa Nhờ nạp chồng phương thức này, ta cần gọi tên phương thức bị nạp chồng từ đối tượng mà khơng cần quan tâm đối tượng lớp Chương trình tự động kiểm tra xem đối tượng thuộc kiểu lớp sở hay thuộc lớp dẫn xuất, sau gọi phương thức tương ứng với lớp Đó tính đa hình 1.3.3 Lập trình hướng đối tượng C++ Vì C++ ngơn ngữ lập trình mở rộng từ ngơn ngữ lập trình cấu trúc C nên C++ xem ngơn ngữ lập trình nửa hướng đối tượng, nửa hướng cấu trúc Những đặc trưng hướng đối tượng C++ • Cho phép định nghĩa lớp đối tượng • Cho phép đóng gói liệu vào lớp đối tượng Cho phép định nghĩa phạm vi truy nhập liệu lớp từ khoá phạm vi: public, protected, private • Cho phép kế thừa lớp với kiểu kế thừa khác tuỳ vào từ khố dẫn xuất • Cho phép lớp dẫn xuất sử dụng phương thức lớp sở (trong phạm vi quy định) • Cho phép định nghĩa chồng phương thức lớp dẫn xuất Những hạn chế hướng đối tượng C++ Những hạn chế C++ phát triển từ ngơn ngữ lập trình cấu trúc C • Cho phép định nghĩa sử dụng biến liệu tự • Cho phép định nghĩa sử dụng hàm tự • Ngay liệu đóng gói vào lớp, liệu truy nhập trực tiếp liệu tự hàm bạn, lớp bạn (friend) C++ 1.2 CON TRỎ VÀ MẢNG 1.2.1 Khai niệm, khai báo trỏ Con trỏ biến đặc biệt chứa địa biến khác Con trỏ có kiểu liệu với kiểu liệu biến mà trỏ tới Cú pháp khai báo trỏ sau: *; Trong đó: • Kiểu liệu: Có thể kiểu liệu C++, kiểu liệu có cấu trúc, kiểu đối tượng người dùng tự định nghĩa • Tên trỏ: Tuân theo qui tắc đặt tên biến C++: 1.2.2 Con trỏ cấu trúc mảng cấu trúc Con trỏ cấu trúc trỏ trỏ đến địa biến có kiểu cấu trúc Cách khai báo sử dụng trỏ cấu trúc thực trỏ thông thường Khai báo trỏ cấu trúc Con trỏ cấu trúc khai báo theo cú pháp: *; Khai báo mảng tĩnh cấu trúc theo cú pháp: []; 1.3 Kiểu liệu cấu trúc 1.3.1 Một số kiểu liệu trừu tượng Ngăn xếp Ngăn xếp (stack) kiểu danh sách cho phép thêm bớt phần tử đầu danh sách, gọi đỉnh ngăn xếp Ngăn xếp hoạt động theo nguyên lí: phần tử đưa vào sau, lấy trước Định nghĩa cấu trúc ngăn xếp Vì ta cần quan tâm đến hai thuộc tính ngăn xếp là: - Danh sách phần tử ngăn xếp - Vị trí đỉnh ngăn xếp nên ta định nghĩa cấu trúc ngăn xếp sau (các phần tử ngăn xếp có kiểu int): typedef SIZE 100; typedef struct { int top; // Vị trí đỉnh int nodes[SIZE]; // Danh sách phần tử } Stack; Các thao tác ngăn xếp 10 2.1.2 Sắp xếp chọn (Selection Sort) Sắp xếp chọn hay selection sort thuật tốn thứ hai mà giới thiệu đến bạn, ý tưởng thuật toán sau: duyệt từ đầu đến phần tử kề cuối danh sách, duyệt tìm phần tử nhỏ từ vị trí kế phần tử duyệt đến hết, sau đổi vị trí phần tử nhỏ với phần tử duyệt tiếp tục Cho mảng A có n phần tử chưa xếp Cụ thể bước giải thuật áp dụng mảng A sau: Gán i = Gán j = i + = A[i] Nếu j < n: o Nếu A[j] < A[min] = j o j=j+1 o Quay lại bước 31 Đổi chỗ A[min] A[i] Nếu i < n – 1: o o Đúng i = i + quay lại bước Sai dừng lại Sơ đồ thuật tốn: 32 Ý tưởng bước giải cụ thể có, sử dụng thuật tốn C++: Đối với thuật toán xếp chọn, sử dụng vòng lặp lồng vào nhau, độ phức tạp thời gian trung bình thuật tốn O(n2) Thuật tốn xếp chọn cài đặt thuật tốn xếp khơng ổn định, cịn có phiên khác cải tiến thuật toán xếp chọn ổn định 33 2.1.3 Sắp xếp chèn (Insertion Sort) Sắp xếp chèn hay insertion sort thuật toán mà giới thiệu, ý tưởng thuật tốn sau: ta có mảng ban đầu gồm phần tử A[0] xem xếp, ta duyệt từ phần tử đến n – 1, tìm cách chèn phần tử vào vị trí thích hợp mảng ban đầu xếp Giả sử cho mảng A có n phần tử chưa xếp Các bước thực thuật toán áp dụng mảng A sau: Gán i = Gán x = A[i] pos = i – Nếu pos >= A[pos] > x: o A[pos + 1] = A[pos] o pos = pos – o Quay lại bước A[pos + 1] = x Nếu i < n: o Đúng i = i + quay lại bước o Sai dừng lại 34 Sơ đồ thuật toán xếp chèn: 35 2.1.4 Thuật toán xếp nhanh (quick sort): Sắp xếp trộn (merge sort) thuật toán dựa kỹ thuật chia để trị, ý tưởng thuật tốn sau: chia đơi mảng thành hai mảng con, xếp hai mảng trộn lại theo thứ tự, mảng xếp cách tương tự Giả sử left vị trí đầu right cuối mảng xét, cụ thể bước thuật toán sau: Nếu mảng cịn chia đơi (tức left < right) Tìm vị trí mảng Sắp xếp mảng thứ (từ vị trí left đến mid) Sắp xếp mảng thứ (từ vị trí mid + đến right) Trộn hai mảng xếp với 36 Sắp xếp nhanh (Quick Sort) Sắp xếp nhanh (quick sort) hay xếp phân đoạn (Partition) là thuật toán xếp dựa kỹ thuật chia để trị, cụ thể ý tưởng là: chọn điểm làm chốt (gọi pivot), xếp phần tử bên trái chốt nhỏ chốt phần tử bên phải lớn chốt, sau xong ta dãy bên trái bên phải, áp dụng tương tự cách xếp cho dãy vừa tìm dãy phần tử Cụ thể áp dụng thuật toán cho mảng sau: Chọn phần tử làm chốt Sắp xếp phần tử bên trái nhỏ chốt Sắp xếp phần tử bên phải nhỏ chốt Sắp xếp hai mảng bên trái bên phải pivot Phần tử chọn làm chốt quan trọng, định thời gian thực thi thuật toán Phần tử chọn làm chốt tối ưu phần tử trung vị, phần tử làm cho số phần tử nhỏ dãy sấp xỉ số phần tử lớn dãy Tuy nhiên, việc tìm phần tử tốn kém, phải có thuật tốn tìm riêng, từ làm giảm hiệu suất thuật tốn tìm kiếm nhanh, đó, để đơn giản, người ta thường sử dụng phần tử làm chốt 37 Sơ đồ thuật toán xếp nhanh: 38 2.2.3 Một số thuật toán xếp khác Selection Sort – Sắp xếp chọn Insertion Sort – Sắp xếp chèn Binary Insersion Sort – Chèn nhị phân Interchange Sort – Đổi chỗ trực tiếp Bubble Sort – Sắp xếp bọt Shaker Sort Shell Sort Heap Sort – Sắp xếp vun đống Quick Sort – Sắp xếp nhanh 10 Merge Sort – Sắp xếp trộn 11 Counting Sort – Sắp xếp đếm 12 Radix Sort – Sắp xếp số 39 Chương III : CÀI ĐẶT Demo thuật toán (Bubble Sort) 3.1 Code Kết Quả : 40 Demo: Sắp xếp chọn (Selection Sort) Kết quả: 41 Demo Sắp Xếp Chèn: Kết quả: 42 Demo Sắp xếp trộn: Kết quả: 43 Demo Sắp Xếp Nhanh: Kết quả: 44 TÀI LIỆU THAM KHẢO 45 ... SỞ LÝ THUYẾT 1.1 GIỚI THIỆU VỀ NGƠN NGỮ C++ C++ ngơn ngữ lập trình hướng đối tượng mở rộng từ ngôn ngữ C Do vậy, C++ có ưu điểm kế thừa điểm mạnh truyền thống ngôn ngữ C uyển chuyển, tương thích... đối tượng C++ Vì C++ ngơn ngữ lập trình mở rộng từ ngơn ngữ lập trình cấu trúc C nên C++ xem ngơn ngữ lập trình nửa hướng đối tượng, nửa hướng cấu trúc Những đặc trưng hướng đối tượng C++ • Cho... A A gọi lớp sở B gọi lớp dẫn xuất Ngôn ngữ lập trình hướng đối tượng phổ biến Java, C++, C# Mặc dù C++ có đặc trưng lập trình hướng đối tượng khơng phải ngơn ngữ lập trình hướng đối tượng Đặc