1. Trang chủ
  2. » Công Nghệ Thông Tin

Giáo trình Cấu trúc dữ liệu và giải thuật Nghề: Công nghệ thông tin (Cao đẳng) CĐ Kỹ Thuật Công Nghệ Bà Rịa Vũng Tàu

81 91 2

Đ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 81
Dung lượng 1,15 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

(NB) Giáo trình Cấu trúc dữ liệu và giải thuật nhằm cung cấp cho sinh viên các thuật toán tổng quát, danh sách liên kết, và các giải thuật sắp xếp, tìm kiếm. Từ đó sinh viên sẽ từng bước cải tiến thuật toán để xây dựng được những chương trình hiệu quả và có tính ứng dụng cao. Mục đích của giáo trình là trang bị cho học viên những kiến thức và kỹ năng phân tích xây dựng được thuật toán kết hợp với giải thuật.

Trang 1

ỦY BAN NHÂN DÂN TỈNH BR – VT

TRƯỜNG CAO ĐẲNG NGHỀ

GIÁO TRÌNH

MÔ ĐUN CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

NGHỀ CÔNG NGHỆ THÔNG TIN TRÌNH ĐỘ CAO ĐẲNG

Ban hành kèm theo Quyết định số: 01/QĐ-CĐN ngày 04 tháng 01 năm 2016

của Hiệu trưởng trường Cao đẳng nghề tỉnh Bà Rịa – Vũng Tàu

Bà Rịa – Vũng Tàu, năm 2016

Trang 2

TUYÊN BỐ BẢN QUYỀN

Tài liệu này thuộc loại sách giáo trình nên các nguồn thông tin có thể đượcphép dùng nguyên bản hoặc trích dùng cho các mục đích về đào tạo và thamkhảo

Mọi mục đích khác mang tính lệch lạc hoặc sử dụng với mục đích kinhdoanh thiếu lành mạnh sẽ bị nghiêm cấm

Trang 3

LỜI GIỚI THIỆU

Giáo trình cấu trúc dữ liệu và giải thuật dùng cho học sinh hệ Cao Đẳng

và Trung cấp của nghề lập trình máy tính và hệ cao đẳng chuyên ngành côngnghệ thông tin ứng dụng phần mềm trong trường Cao đẳng nghề Tỉnh BR – VT.Nhằm cung cấp cho sinh viên các thuật toán tổng quát, danh sách liên kết, và cácgiải thuật sắp xếp, tìm kiếm Từ đó sinh viên sẽ từng bước cải tiến thuật toán đểxây dựng được những chương trình hiệu quả và có tính ứng dụng cao Mục đíchcủa giáo trình là trang bị cho học viên những kiến thức và kỹ năng phân tíchxây dựng được thuật toán kết hợp với giải thuật

Để có thể nắm bắt các kiến thức học sinh cần được trang bị các kiến thức

về môn lập trình căn bản Ngôn ngữ lập trình được chọn để minh họa các kiếnthức trên là Dev C++

Trong qua trình biên soạn giáo trình, chắn chắn rằng trong giáo trình sẽ cònnhiều khiếm khuyết, tác giả mong muốn nhận được các ý kiến quí báu đóng gópcủa đồng nghiệp cũng như bạn đọc để giáo trình này có thể hoàn thiện hơn nữa

về mặt nội dung cũng như hình thức trong lần tái bản sau

Bà Rịa – Vũng Tàu, ngày 02 tháng 01 năm 2016

Biên soạn

Nguyễn Thị Mai

Trang 4

MỤC LỤC

TRANG

BÀI 1 GIỚI THIỆU CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1

1 Mối liên hệ giải thuật và cấu trúc dữ liệu 1

1.1 Giải thuật 1

1.2 Dữ liệu 1

1.3 Mối quan hệ giữa cấu trúc dữ liệu và giải thuật 2

2 Kiểu dữ liệu, mô hình dữ liệu, kiểu dữ liệu trừu tượng 2

2.1.Khái niệm về kiểu dữ liệu 2

2.2 Mô hình kiểu dữ liệu 2

2.3 Kiểu dữ liệu trừu tượng 3

3 Thiết kế và phân tích giải thuật 4

3.1 Thiết kế thuật toán 4

3.2 Phân tích tính đúng đắn của giải thuật 4

3.3 Phân tích tính đơn giản 4

4 Một số ví dụ về thiết kế và phân tích giải thuật 5

BÀI 2 LÀM VIỆC VỚI CON TRỎ 7

1 Biến con trỏ 7

1.1 Khái niệm con trỏ ( pointer ) 7

1.3 Gán địa chỉ của biến cho biến con trỏ 8

1.4 Cấp phát vùng nhớ cho biến con trỏ 8

1.5 Giải phóng vùng nhớ cho biến con trỏ 9

1.6 Một số phép toán trên con trỏ 9

2 Con trỏ và mảng một chiều 10

3 Con trỏ và mảng nhiều chiều 12 BÀI 3 LÀM VIỆC VỚI KIỂU CẤU TRÚC 14

1 Khái niệm cấu trúc 14 2 Khai báo kiểu cấu trúc 14

3 Truy nhập đến các thành phần trong biến cấu trúc 17

4 Nhập dữ liệu cho biến cấu trúc 17

Trang 5

BÀI 4 LÀM VIỆC VỚI KIỂU TẬP TIN 21

1 Khái niệm về tập tin 21

2 Các kiểu vào ra với tệp: 22

2.1 Khai báo biến tập tin 22

2.2 Mở tập tin 22

2.3 Đóng tập tin 24

2.4 Kiểm tra đến cuối tập tin hay chưa? 24

2.5 Di chuyển con trỏ tập tin về đầu tập tin .24

3 Các thao tác trên tệp: 24

3.1 Ghi dữ liệu lên tập tin văn bản 24

3.2 Đọc dữ liệu từ tập tin văn bản 26

BÀI 5 THÊM PHẦN TỬ TRONG DANH SÁCH ĐẶC 29

1 Định nghĩa 29

2 Khởi tạo danh sách 29

3 Thêm một phần tử vào danh sách 30

3.1.Thêm vào đầu danh sách: 30

3.2.Thêm vào cuối danh sách: 30

3.3 Thêm vào vị trí bất kỳ trong danh sách: 30

BÀI 6 XÓA PHẦN TỬ TRONG DANH SÁCH ĐẶC 32

1 Xóa phần tử đầu 32

2 Xóa phần tử cuối 32

3 Xóa phần tử tại vị trí bất kỳ trong danh sách: 32

BÀI 7 LÀM VIỆC VỚI DANH SÁCH LIÊN KẾT 34

1 Định nghĩa: 34

2 Khai báo một nút 35

3 Khai báo một danh sách 35

4 Khởi tạo một nút mới 35

5 Khởi tạo một danh sách 36

6 Nhập một danh sách 36

7 Xuất một danh sách 37

Trang 6

BÀI 8 CHÈN PHẦN TỬ TRONG DANH SÁCH LIÊN KẾT 38

1 Chèn một nút vào đầu danh sách 38

2 Chèn một nút vào cuối danh sách 39

3 Chèn một nút vào vị trí bất kỳ 39

BÀI 9 XÓA PHẦN TỬ TRONG DANH SÁCH LIÊN KẾT 41

1 Xóa nút đầu danh sách 41

2 Xóa nút cuối danh sách 41

3 Hủy danh sách 42

BÀI 10 LÀM VIỆC VỚI NGĂN XẾP 44

1 Biểu diễn Stack dùng mảng 45

1.1 Khởi tạo stack 45

1.2 Kiểm tra stack rỗng 45

1.3 Kiểm tra stack đầy 45

1.4 Lấy một phần tử ra khỏi ngăn xếp 46

1.5 Thêm một phần tử vào ngăn xếp .46

1.6 Xem phần tử ở đỉnh stack 46

2 Biểu diễn Stack dùng danh sách liên kết đơn 47

2.1 Khởi tạo stack 47

2.2 Kiểm tra stack rỗng 47

2.3 Lấy một phần tử ra khỏi ngăn xếp 47

2.4 Thêm một phần tử vào ngăn xếp 48

2.5 Xóa phần tử ở ngăn xếp 48

2.6 Xem phần tử ở đỉnh ngăn xếp 48

BÀI 11 LÀM VIỆC VỚI HÀNG ĐỢI(QUEUE) 50

1 Biểu diễn hàng đợi dùng mảng: 51

1.1 Khởi tạo hàng đợi 51

1.2 Kiểm tra hàng đợi rỗng 51

1.3 Kiểm tra hàng đợi đầy 51

1.4 Lấy một phần tử ra khỏi hàng đợi 52

1.5 Thêm một phần tử vào cuối hàng đợi 52

Trang 7

1.6 Xem phần tử ở đầu hàng đợi 52

2 Biểu diễn hàng đợi dùng danh sách liên kết 53

2.1.Khởi tạo hàng đợi 53

2.2 Kiểm tra hàng đợi rỗng 53

2.3 Thêm phần tử vào cuối Queue 54

2.4 Lấy phần tử ở ở đầu Queue 54

2.5 Xem phần tử ở đầu Queue 55

2.6 Xóa phần tử ở đầu Queue 55

BÀI 12 SỬ DỤNG CÁC PHƯƠNG PHÁP SẮP XẾP 57

1 Định nghĩa bài toán sắp xếp: 57

2 Phương pháp sắp xếp chọn trực tiếp(selection sort) 57

2.1.Ý tưởng 57

2.2 Các bước tiến hành 58

2.3 Giải thuật: 58

3 Phương pháp sắp xếp nổi bọt 59

3.1 Ý tưởng: 59

3.2 Các bước tiến hành: 60

3.3 Giải thuật: 60

4 Phương pháp đổi chỗ trực tiếp 61

4.1 Ý tưởng giải thuật: 61

4.2 Các bước tiến hành 61

4.3 Giải thuật: 61

5 Phương pháp chèn trực tiếp( insertion sort) 63

5.1 Ý tưởng 63

5.2 Các bước tiến hành 64

5.3 Giải thuật: 64

BÀI 13 SỬ DỤNG CÁC PHƯƠNG PHÁP TÌM KIẾM 67

1 Phương pháp tìm kiếm tuyến tính 67

1.1 Ý tưởng 67

1.2 Các bước tiến hành 67

Trang 8

1.3 Giải thuật: 67

2 Phương pháp tìm kiếm nhị phân 68

2.1 Ý tưởng 68

2.3 Giải thuật: 69

TÀI LIỆU CẦN THAM KHẢO: 71

Trang 9

CHƯƠNG TRÌNH MÔ ĐUN CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Mã số mô đun: MĐ15

VỊ TRÍ, TÍNH CHẤT CỦA MÔ ĐUN:

-Vị trí: Mô đun này được học sau mô đun Tin học văn phòng, Lập trình căn bản,

cơ sở dữ liệu

-Tính chất: Mô đun này yêu cầu phải có tư duy logic và các kiến thức về lậptrình căn bản

MỤC TIÊU MÔ ĐUN:

- Trình bày được các kiểu dữ liệu

- Phân tích và xây dựng được thuật toán

- Phân tích được các loại dữ liệu, giải thuật và kết hợp được dữ liệu và giải thuật

- Thực hiện được các thao tác trên các kiểu dữ liệu

-Cài đặt được các thuật toán sắp xếp và tìm kiếm

- Cài đặt được các thuật toán trên các cấu trúc dữ liệu: mảng, danh sách, danh sách liên kết đơn

- Có tinh thần trách nhiệm, ý thức tổ chức kỷ luật, tác phong công nghiệp, tinh

thần hợp tác trong công việc

- Có ý chủ động, độc lập trong công việc, tự học cập nhật kiến thức, nâng cao trình độ chuyên môn

NỘI DUNG CỦA MÔ ĐUN:

STT Tên các bài trong mô đun Thời gian Hình thức giảng dạy

1 Giới thiệu cấu trúc dữ liệu và giải thuật 3 Tích hợp

Trang 10

5 Thêm phần tử trong danh sách đặc 5 Tích hợp

8 Chèn phần tử trong danh sách liên kết 5 Tích hợp

9 Xóa phần tử trong danh sách liên kết 5 Tích hợp

Trang 11

BÀI 1 GIỚI THIỆU CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Giới thiệu:

Giải thuật là cách phân tích 1 vấn đề, từ thực tiễn cho tới chương trình,cách thiết kế một giải pháp cho vấn đề theo cách giải quyết bằng máy tính Tiếptheo, các phương pháp phân tích, đánh giá độ phức tạp và thời gian thực hiệngiải thuật Qua bài học này sẽ giới thiệu một cách thật cụ thể về cấu trúc dữ liệu

và giải thuật

Mục tiêu:

- Trình bày được kiến thức cở bản về cấu trúc dữ liệu, giải thuật, kiểu dữ liệu,

mô hình dữ liệu

- Phân tích được giải thuật

- Sử dụng được các phương pháp phân tích, thiết kế giải thuật

- Rèn luyện tính cẩn thận, kiên trì, sáng tạo

- Bảo đảm an toàn và vệ sinh cho người và thiết bị trong phòng máy

Nội dung

1 Mối liên hệ giải thuật và cấu trúc dữ liệu.

1.1 Giải thuật

Giải thuật là các bước cần tác động theo một thứ tự nhất định nào đó trên

cơ sở bổ dữ liệu vào để đạt dữ liệu ra đúng với chân lý của nó

Dữ liệu raGiải thuật

Dữ liệu vàoInput

Dữ liệu raOut put

Trang 12

Việc xây dựng cấu trúc dữ liệu quyết định rất lớn đến chất lượng cũng như côngsức của người lập trình trong việc thiết kế, cài đặt chương trình.

1.3 Mối quan hệ giữa cấu trúc dữ liệu và giải thuật

Mối quan hệ giữa cấu trúc dữ liệu và Giải thuật có thể minh họa bằng đẳng thức:Cấu trúc dữ liệu + Giải thuật = Chương trình

Như vậy, khi đã có cấu trúc dữ liệu tốt, nắm vững giải thuật thực hiện thì việcthể hiện chương trình bằng một ngôn ngữ cụ thể chỉ là vấn đề thời gian Khi cócấu trúc dữ liệu mà chưa tìm ra thuật giải thì không thể có chương trình vàngược lại không thể có giải thuật khi chưa có cấu trúc dữ liệu Một chương trìnhmáy tính chỉ có thể được hoàn thiện khi có đầy đủ cả Cấu trúc dữ liệu để lưu trữ

dữ liệu và Giải thuật xử lý dữ liệu theo yêu cầu của bài toán đặt ra

2 Kiểu dữ liệu, mô hình dữ liệu, kiểu dữ liệu trừu tượng

2.1.Khái niệm về kiểu dữ liệu

Kiểu dữ liệu T có thể xem như là sự kết hợp của 2 thành phần:

- Miền giá trị mà kiểu dữ liệu T có thể lưu trữ: V,

- Tập hợp các phép toán để thao tác dữ liệu: O

T = <V, O>

Mỗi kiểu dữ liệu thường được đại diện bởi một tên (định danh) Mỗi phần tử dữ liệu cókiểu T sẽ có giá trị trong miền V và có thể được thực hiện các phép toán thuộc tập hợpcác phép toán trong O

Để lưu trữ các phần tử dữ liệu này thường phải tốn một số byte(s) trong bộ nhớ, sốbyte(s) này gọi là kích thước của kiểu dữ liệu

2.2 Mô hình kiểu dữ liệu

Hầu hết các ngôn ngữ lập trình đều có cung cấp các kiểu dữ liệu cơ sở Tùy vào mỗi

ngôn ngữ mà các kiểu dữ liệu cơ sở có thể có các tên gọi khác nhau song chung quy

lại có những loại kiểu dữ liệu cơ sở như sau:

- Kiểu số nguyên: Có thể có dấu hoặc không có dấu và thường có các kích

thước sau:

Trang 13

+ Kiểu số nguyên 1 byte

+ Kiểu số nguyên 2 bytes

+ Kiểu số nguyên 4 bytes

Kiểu số nguyên thường được thực hiện với các phép toán: O = {+, -, *, /, DIV, MOD, <,>, <=, >=, =, …}

- Kiểu số thực: Thường có các kích thước sau:

- Kiểu chuỗi ký tự: Có kích thước tùy thuộc vào từng ngôn ngữ lập trình

Kiểu chuỗi ký tự thường được thực hiện với các phép toán: O = {+, &, <, >, <=,

>=, =,Length, Trunc, …}

- Kiểu luận lý: Thường có kích thước 1 byte

Kiểu luận lý thường được thực hiện với các phép toán: O = {NOT, AND, OR, XOR, <, >,<=, >=, =, …}

2.3 Kiểu dữ liệu trừu tượng

Kiểu dữ liệu trừu tượng là một mô hình toán học cùng với một tập hợpcác phép toán trên nó Có thể nói kiểu dữ liệu trừu tượng là một kiểu dữ liệu dochúng ta định nghĩa ở mức khái niệm (conceptual), nó chưa được cài đặt cụ thểbằng một ngôn ngữ lập trình

Khi cài đặt một kiểu dữ liệu trừu tượng trên một ngôn ngữ lập trình cụ thể,chúng ta phải thực hiện hai nhiệm vụ:

Trang 14

- Biểu diễn kiểu dữ liệu trừu tượng bằng một cấu trúc dữ liệu hoặc một kiểu dữliệu trừu tượng khác đã được cài đặt.

- Viết các chương trình con thực hiện các phép toán trên kiểu dữ liệu trừu tượng

mà ta thường gọi là cài đặt các phép toán

3 Thiết kế và phân tích giải thuật

3.1 Thiết kế thuật toán.

Người ta thường dùng phương pháp chia nhỏ bài toán hay chiến thuật chia để trị

để thiết kế giải thuật

Nếu gọi bài toán là một modul chính thì ta chia modul chính thành các modul con rồi lại chia các modul con thành các modul con nhỏ hơn cho đến khi ta đượccác modul đã biết cách giải rồi -> Chiến thuật chia để trị

3.2 Phân tích tính đúng đắn của giải thuật

Ta phải chứng minh giải thuật là đúng

Người ta thường làm : Cho chương trình chạy thử với một bộ dữ liệu đã biết kết quả

Nếu kết quả chương trình khác với kết quả đã biết thì chắc chắn chương trình sai; nếu bằng thì cũng chưa có kết luận, do đó đây chỉ là phương pháp tìm ra cái sai mà chưa chứng minh cái đúng

- Cho chạy chương trình rồi xem kết quả có phù hợp với thực tế không, nếu phù hợp thì hi vọng đúng, còn không thì chắc chắn sai

- Để chứng minh tính chính xác thì phải dùng toán học – hay dùng qui nạp (rất khó)

3.3 Phân tích tính đơn giản

Tùy thuộc bài toán được dùng thường xuyên hay không, nếu chương trình chỉ dùng một ít lần rồi bỏ đi thì ta ưu tiên tính đơn giản

Bài toán được sử dụng thường xuyên thì ta ưu tiên tính hiệu quả của thuật toánTính hiệu quả thể hiện về hai mặt

- Không gian (Chương trình bé chiếm ít bộ nhớ)

- Thời gian (Chương trình chạy nhanh)

Trang 15

4 Một số ví dụ về thiết kế và phân tích giải thuật

- Ví dụ 1: Tìm số lớn nhất trong một dãy các số từ a1 ,…, a n

Input : Số nguyên dương N và dãy a1, a2, , , aN

Output : Tìm Max là giá trị lớn nhất của dãy đã cho

Khởi tạo Max=a1 Với mỗi i, nếu ai > Max thì thay giá trị Max= ai

Phân tích giải thuật như sau:

B1 Nhập N và dãy a1, , aN

B2 Đặt Max = a1, i = 2

B3 Nếu i > N thì đến B5

B4 Nếu ai > Max thì Max = ai

Đặt i=i+1 rồi quay b.3

B5 Đưa ra Max rồi kết thúc

-Ví dụ 2: Thiết kế và phân tích giải thuật giải phương trình bậc 2.

Input: Các hệ số a,b,c

Ouput: Nghiệm của phương trình

Yêu cầu phải có công thức tính Delta = b2 – 4ac

Phân tích giải thuật như sau:

Trang 16

B1 Nhập vào các hệ số a,b,c

B2 Tính Delta = b2 – 4ac

B3

- Nếu Delta > 0 nhảy đến B4

- Nếu Delta = 0 nhảy đến B4

- Nếu Delta < 0 nhảy đến B4

B4 Đưa ra số nghiệm của phương trình

Câu hỏi, bài tập:

Thiết kế và phân tích giải thuật các bài toán sau:

1.1: Giải phương trình bậc nhất

1.2: Tìm giá trị lớn nhất và nhỏ nhất của hai số a,b

1.3: Tính tổng : s=1+2+3+…+ n

Yêu cầu đánh giá

- Phân tích được giải thuật của các bài toán

- Sử dụng được các phương pháp phân tích, thiết kế giải thuật

Trang 17

BÀI 2 LÀM VIỆC VỚI CON TRỎ Giới thiệu:

Con trỏ là đặc trưng và là một trong những sức mạnh lớn nhất trong lậptrình C++ Vì thế việc tìm hiểu và vận dụng con trỏ là điều không thể thiếu đốivới một lập trình viên Bài viết này sẽ giúp cho người đọc có cái nhìn sâu sắchơn về con trỏ trong lập trình C Qua đó sẽ giúp các bạn sử dụng con trỏ mộtcách linh hoạt, tránh được những sai sót và làm việc một cách hiệu quả

Mục tiêu:

- Trình bày được khái niệm con trỏ

- Nêu được các thao tác trên con trỏ

- Thực hiện được khai báo biến con trỏ

- Trình bày và vận dụng các phép toán trên biến con trỏ vào các bài toán

- Trình bày và vận dụng được con trỏ vào mảng một chiều và mảng nhiều chiều

- Rèn luyện tính cẩn thận, kiên trì, sáng tạo, độc lập và hoạt động nhóm

- Bảo đảm an toàn và vệ sinh cho người và thiết bị trong phòng máy

Nội dung :

1 Biến con trỏ

1.1 Khái niệm con trỏ ( pointer )

Con trỏ là biến dùng để chứa địa chỉ của biến khác hoặc có thể là một hàm Do có nhiều loại địa chỉ nên cũng có nhiều loại biến con trỏ Con trỏ kiểu int dùng để chứa địa chỉ của kiểu int Con trỏ kiểu float dùng để chứa địa chỉ kiểu float

- Muốn sử dụng được pointer, trước tiên phải có được địa chỉ của biến mà ta cầnquan tâm bằng phép toán lấy địa chỉ & Kết quả của phép lấy địa chỉ & sẽ là 1 phần tử hằng

1.2 Khai báo một biến con trỏ:

 Cú pháp: <Kiểu> * <Tên con trỏ>

 Ý nghĩa: Khai báo một biến có tên là Tên con trỏ dùng để chứa địa chỉ của các biến có

Trang 18

1.3 Gán địa chỉ của biến cho biến con trỏ

Toán tử & dùng để định vị con trỏ đến địa chỉ của một biến đang làm việc

 Cú pháp: <Tên biến con trỏ>=&<Tên biến>

- Giải thích: Ta gán địa chỉ của biến Tên biến cho con trỏ Tên biến con trỏ

- Ví dụ: Gán địa chỉ của biến a cho con trỏ pa, gán địa chỉ của biến b cho con trỏ

pb

pa=&a; pb=&b;

- Lưu ý: Khi gán địa chỉ của biến tĩnh cho con trỏ cần phải lưu ý kiểu dữ liệu

của chúng Ví dụ sau đây không đúng do không tương thích kiểu:

1.4 Cấp phát vùng nhớ cho biến con trỏ

Trước khi sử dụng biến con trỏ, ta nên cấp phát vùng nhớ cho biến con trỏ

Trang 19

này quản lý địa chỉ Việc cấp phát được thực hiện nhờ các hàm malloc(), calloc() trong thư viện alloc.h

 Cú pháp các hàm:

void *malloc(size_t size): Cấp phát vùng nhớ có kích thước là size

void *calloc(size_t nitems, size_t size): Cấp phát vùng nhớ có kích thước là

1.5 Giải phóng vùng nhớ cho biến con trỏ

Một vùng nhớ đã cấp phát cho biến con trỏ, khi không còn sử dụng nữa,

ta sẽ thu hồi lại vùng nhớ này nhờ hàm free()

 Cú pháp: void free(void *block)

 Ý nghĩa: Giải phóng vùng nhớ được quản lý bởi con trỏ block

 Ví dụ: Ở ví dụ trên, sau khi thực hiện xong, ta giải phóng vùng nhớ cho 2 biến con trỏ pa & pb:

free(pa);

free(pb);

1.6 Một số phép toán trên con trỏ

 Phép gán con trỏ: Hai con trỏ cùng kiểu có thể gán cho nhau

Ví dụ:

int a, *p, *a ; float *f;

a = 5 ; p = &a ; q = p ; /* đúng */

f = p ; /* sai do khác kiểu */

Ta cũng có thể ép kiểu con trỏ theo cú pháp:

(<Kiểu kết quả>*)<Tên con trỏ>

Chẳng hạn, ví dụ trên được viết lại:

Trang 20

int a, *p, *a ; float *f;

a = 5 ; p = &a ; q = p ; /* đúng */

f = (float*)p; /* Đúng nhờ ép kiểu*/

 Cộng, trừ con trỏ với một số nguyên

Ta có thể cộng (+), trừ (-) 1 con trỏ với 1 số nguyên N nào đó; kết quả trả về là 1con trỏ Con trỏ này chỉ đến vùng nhớ cách vùng nhớ của con trỏ hiện tại N phần tử

- Ví dụ: Cho đoạn chương trình sau:

- Ví dụ 1 : int A[5] ; * p ;

P = A ;

+ Mảng bố trí 5 ô nhớ liên tiếp ( mỗi ô chiếm 2 byte )

+ Tên mảng là 1 hằng địa chỉ ( không thay đổi được ), chính là địa chỉ của phần

tử đầu tiên => A tương đương với &A[0]

(A + i ) tương đương với &A[i]

*(A + i ) tương đương với A[i]

p = A => p = &A[0] ( p trỏ tới phần tử A[0])

*(p + i ) tương đương với A[i]

=>bốn cách viết như sau là tương đương : A[i], * ( A + i ), * ( p + i ), p[i]

Trang 21

- Ví dụ 2 : Nhập 5 số nguyên vào 1 mảng gồm 5 phần tử ( a[5]) sau đó sắp xếp

printf(" a[%d] = " , i ) ; scanf( " %d ", p + i );

}/* sapxep tăng dan */

for ( i = 0 ; i < n-1 ; i ++ ) for ( j = i + 1 ; j<n ; j++)

if (*(a + i)> * ( a + j ) )

{

t = * ( a + i ) ; *(a + i ) = * ( a + j) ;

*(a + j ) = t ;}

printf(" mang sau khi sap xep");

for ( i = 0; i < n ; i ++ ) printf("%5d",a[i]);

s= 0 ; for ( i=0 ; i < n ; ++i )

s= s+ a[ i];

printf ("\n Tong = %5d ", s );

Trang 22

getch ( );

}

3 Con trỏ và mảng nhiều chiều

Ta có thể sử dụng con trỏ thay cho mảng nhiều chiều như sau:

Giả sử ta có mảng 2 chiều và biến con trỏ như sau:

int a[n][m];

int *contro_int;

Thực hiện phép gán contro_int=a;

Khi đó phần tử:

a[0][0] được quản lý bởi contro_int;

a[0][1] được quản lý bởi contro_int+1;

a[0][2] được quản lý bởi contro_int+2;

a[1][0] được quản lý bởi contro_int+m;

a[1][1] được quản lý bởi contro_int+m+1;

a[n][m] được quản lý bởi contro_int+n*m;

Tương tự như thế đối với mảng nhiều hơn 2 chiều

Câu hỏi, bài tập

2.1 Kết quả của đoạn chương trình sau là gì?

Trang 23

2.2 Giả sử có các khai báo biến và các phép gán như sau :

2.3 Lập trình thực hiện các công việc sau :

- Nhập vào mảng một chiều một dãy số nguyên a1,a2,a3…an

- Tính trung bình của các nguyên tử đã nhập vào

- Tìm và in giá trị lớn nhất, nhỏ nhất của mảng

- Xuất ra dãy các số chăn, số lẻ

Yêu cầu đánh giá

- Biết được khai báo biến con trỏ và các phép toán trên con trỏ

- Áp dụng các phép toán trên biến con trỏ vào các bài toán

- Áp dụng được con trỏ vào mảng một chiều và mảng nhiều chiều

- Viết được chương trình và chạy, kiểm tra được kết quả

Trang 24

BÀI 3 LÀM VIỆC VỚI KIỂU CẤU TRÚC Giới thiệu:

Bên cạnh những kiểu dữ liệu có sẵn như char, int, float,… C cũng cho phép chúng ta tự định nghĩa kiểu dữ liệu để phù hợp với mục đích cũng như tạo

mã nguồn tối ưu nhất Bài viết này sẽ tiếp tục trình bày về kiểu dữ liệu người dùng tự định nghĩa là struct

Mục tiêu:

- Trình bày được khái niệm biến cấu trúc

- Khai báo được biến kiểu cấu trúc

- Truy cập được đến các thành phần của cấu trúc

- Nhập dữ liệu được cho biến cấu trúc

- Vận dụng kiểu cấu trúc làm các bài toán trong lập trình

- Rèn luyện tính cẩn thận, kiên trì, sáng tạo, độc lập và hoạt động nhóm

- Bảo đảm an toàn và vệ sinh cho người và thiết bị trong phòng máy

Nội dung chính:

1 Khái niệm cấu trúc

-Kiểu cấu trúc (Structure) là kiểu dữ liệu bao gồm nhiều thành phần có thể thuộcnhiều kiểu dữ liệu khác nhau Các thành phần được truy cập qua tên

- Sự khác biệt giữa kiểu cấu trúc và kiểu mảng là: các phần tử của mảng là cùng kiểu còn các phần tử của kiểu cấu trúc có thể có kiểu khác nhau

2 Khai báo kiểu cấu trúc.

- struct là từ khóa đứng trước một khai báo cấu trúc,

- Tên_cấu_trúc là một tên hợp lệ được dùng làm tên cấu trúc;

- danh sách các biến cấu trúc: liệt kê các biến có kiểu cấu trúc vừa khai báo,

Trang 25

- Khai báo các thành phần: là một danh sách các khai báo tên và kiểu dữ liệucủa các thành phần tạo nên cấu trúc này

khai báo một kiểu cấu trúc có tên là hoc_sinh gồm hai thành phần:

+ Họ tên học sinh (ho_ten)

+ Ðiểm thi (diem) của học sinh

+ Kèm theo khai báo kiểu cấu trúc, chúng ta định nghĩa hai biến: hs là một biếnđơn, còn dshs là một mảng có các thành phần là cấu trúc hoc_sinh

Cú pháp

Ngôn ngũ C cho phép ta đặt lại tên kiểu cho riêng mình bằng câu lệnh như sau:

 Đặt tên kiểu dữ liệu bằng typedef

- Cú pháp:

typedef struct [kiểu_đã_có ] [tên_kiểu_mới];

Trong đó :

+ Kiểu_đã_có là kiểu dữ liệu mà ta muốn đổi tên

+ Tên_kiểu_mới là tên mới mà ta muốn đặt

Trang 26

printf("Nhap tu so: "); scanf("%d",&ps.Tu);

printf("Nhap mau so: "); scanf("%d",&ps.Mau);

printf("So phan tu: "); scanf("%d",&n);

for (int i = 0; i < n; i++)

Trang 27

4 Nhập dữ liệu cho biến cấu trúc

- Ví dụ: Lập chương trình nhập vào họ tên của học sinh, điểm toán, lý Tính

trung bình chung của các điểm nhập vào

Trang 28

printf(" nhap ho va ten");scanf("%s",&dshs[i].hoten);

printf(" nhap diem toan");scanf("%f",&dshs[i].toan);

printf(" nhap diem ly ");scanf("%f",&dshs[i].ly);

dshs[i].diem=dshs[i].toan+dshs[i].ly;

} printf(" danh sach hoc sinh vua nhap");

printf(" hoten diem toan diemly diem ");

printf(" nhap hoaten");fflush(stdin);gets(dshs[i].hoten);

Trang 29

printf(" nhap diem toan");scanf("%f",&dshs[i].toan);printf(" nhap diem ly ");scanf("%f",&dshs[i].ly);

dshs[i].diem=dshs[i].toan+dshs[i].ly;

} printf(" danh sach hoc sinh vua nhap");

printf(" hoten diem toan diemly diem ");

Câu hỏi, bài tập

3.1 Trình bày định nghĩa và cách khai báo biến cấu trúc

3.2 Lập chương trình nhập một bản ghi gồm họ tên, tuổi

- In kết quả vừa nhập ra màn hình

- Sắp xếp mảng theo thứ tự tăng dần của tuổi

3.3 Viết chương trình nhập một bản ghi bao gồm các thành phần sau: họ tên, năm sinh, quê quán, hệ số lương, lương, thưởng, phụ cấp, tạm ứng, còn nhận Trong đó các thành phần được tính như sau:

Lương = hệ số lương * 650Thưởng = 10% lươngPhụ cấp = 15% lươngTạm ứng = 25% lươngCòn nhận = lương +thương +phụ cấp – tạm ứng3.4 Viết chương trình tạo một danh sách bao gồm: họ tên, năm sinh, quê quán, điểm tóan, điểm lý, điểm hóa, tổng điểm, xếp lọai Trong đó: tổng điểm = điểm tóan+ điểm lý+điểm hóa

xếp lọai : = Giỏi nếu tổng điểm >=27

Trang 30

= Khá nếu tổng điểm <27 và >=21

= Trung bình nếu tổng điểm <21

3.5.Viết chương trình quản lý hàng hóa 1 cửa hàng gồm : mã mặt hàng, tên mặt hàng, số lượng, đơn giá, thành tiền Nhập vào danh sách n mặt hàng

Biết : Thành tiền = số lượng * đơn giá

- In các mặt hàng vừa nhập

- Sắp xếp danh sách theo thứ tự giảm dần của thành tiền

Yêu cầu đánh giá

- Trình bày được khái niệm biến cấu trúc

- Khai báo được biến kiểu cấu trúc

- Truy cập được đến các thành phần của cấu trúc

- Nhập dữ liệu được cho biến cấu trúc

- Viết được chương trình và chạy, kiểm tra được kết quả

Trang 31

BÀI 4 LÀM VIỆC VỚI KIỂU TẬP TIN Giới thiêu:

File là một khái niệm mà các nhà lập trình bắt gặp rất nhiều trong quátrình làm việc Vì thế, có kiến thức về file được xem là một trong những yêu cầuthiết yếu trong việc lập trình Bài viết này xin được giới thiệu về file, cũng nhưmột số định dạng file thông dụng

Mục tiêu:

- Trình bày được khái niệm với tập tin

- Trình bày và thực hiện được các kiểu vào ra với tập tin

- Thực hiện được các thao tác trên tập tin

- Sử dụng kiểu dữ liệu tập tin để đọc và ghi tệp văn bản

- Rèn luyện tính cẩn thận, kiên trì, sáng tạo, độc lập và hoạt động nhóm

- Bảo đảm an toàn và vệ sinh cho người và thiết bị trong phòng máy

Nội dung

1 Khái niệm về tập tin

Là một loại dữ liệu có thể ghi lên đĩa để dùng nhiều lần.Trong C chỉ có một loại File, nhưng cấu trúc của mỗi File có thể khác nhau Cấu trúc này được hình thành khi ta ghi dữ liệu lên File, nó phụ thuộc vào hàm mà ta dùng để ghi

dữ liệu lên đĩa

Có 3 loại dữ liệu kiểu tập tin:

- Tập tin văn bản (Text File): là loại tập tin dùng để ghi các ký tự lên đĩa, các ký

tự này được lưu trữ dưới dạng mã Ascii

- Tập tin định kiểu (Typed File): là loại tập tin bao gồm nhiều phần tử có cùngkiểu: char, int, long, cấu trúc… và được lưu trữ trên đĩa dưới dạng một chuỗi cácbyte liên tục

- Tập tin không định kiểu (Untyped File): là loại tập tin mà dữ liệu của chúng gồm các cấu trúc dữ liệu mà người ta không quan tâm đến nội dung hoặc kiểu của nó,chỉ lưu ý đến các yếu tố vật lý của tập tin như độ lớn và các yếu tố tác

Trang 32

động lên tập tin mà thôi.

 Biến tập tin: là một biến thuộc kiểu dữ liệu tập tin dùng để đại diện cho mộ ttập tin Dữ liệu chứa trong một tập tin được truy xuất qua các thao tác với thông

số là biến tập tin đại diện cho tập tin đó

 Con trỏ tập tin: Khi một tập tin được mở ra để làm việc, tại mỗi thời điểm,

sẽ có một vị trí của tập tin mà tại đó việc đọc/ghi thông tin sẽ xảy ra Người ta hình dung có một con trỏ đang chỉ đến vị trí đó và đặt tên nó là con trỏ tập tin.Sau khi đọc/ghi xong dữ liệu, con trỏ sẽ chuyển dịch thêm một phần tử về phía cuối tập tin Sau phần tử dữ liệu cuối cùng của tập tin là dấu kết thúc tập tin EOF (End Of File)

2 Các kiểu vào ra với tệp:

Muốn thao tác trên tập tin, ta phải lần lượt làm theo các bước:

- Khai báo biến tập tin

2.1 Khai báo biến tập tin

 Cú pháp: FILE <Danh sách các biến con trỏ>

Các biến trong danh sách phải là các con trỏ và được phân cách bởi dấu phẩy(,)

Trang 33

+ Type: chuỗi xác định cách thức mà tập tin sẽ mở Các giá trị có thể của Mode:

wb Tạo ra tập tin nhị phân để ghi

ab Nối vào tập tin nhị phân

r+, r+t Mở một tập tin văn bản để đọc/ghi Tập tin phải có trên đĩa nếu

không sẽ có lỗi

w+, w+t Tạo ra tập tin văn bản để đọc ghi Nếu tập tin đã có trên đĩa sẽ

bị xóa

a+, a+t Mở tập tin để đọc/ghi bổ sung theo kiểu văn bản Nếu tập tin

chưa có thì tạo mới

r+b Mở ra tập tin nhị phân để đọc/ghi

w+b Tạo ra tập tin nhị phân để đọc/ghi

a+b Nối vào hay tạo mới tập tin nhị phân

- Hàm fopen trả về một con trỏ tập tin Chương trình của ta không thể thay đổi giá trị của con trỏ này Nếu có một lỗi xuất hiện trong khi mở tập tin thì hàm nàytrả về con trỏ NULL

Ví dụ: Mở một tập tin tên TEST.txt để ghi

Trang 34

Nếu mở tập tin để ghi, nếu tập tin đã tồn tại rồi thì tập tin sẽ bị xóa và một tập tin mới được tạo ra Nếu ta muốn ghi nối dữ liệu, ta phải sử dụng chế độ “a” Khi mở với chế độ đọc, tập tin phải tồn tại rồi, nếu không một lỗi sẽ xuất hiện.

2.3 Đóng tập tin

Hàm fclose() được dùng để đóng tập tin được mở bởi hàm fopen() Hàm này sẽ ghi dữ liệu còn lại trong vùng đệm vào tập tin và đóng lại tập tin

Cú pháp: int fclose(FILE *f)

Trong đó f là con trỏ tập tin được mở bởi hàm fopen() Giá trị trả về của hàm là

0 báo rằng việc đóng tập tin thành công Hàm trả về EOF nếu có xuất hiện lỗi

- Ngoài ra, ta còn có thể sử dụng hàm fcloseall() để đóng tất cả các tập tin lại

2.5 Di chuyển con trỏ tập tin về đầu tập tin - Hàm rewind()

Khi ta đang thao tác một tập tin đang mở, con trỏ tập tin luôn di chuyển về phía cuối tập tin Muốn cho con trỏ quay về đầu tập tin như khi mở nó, ta sử dụng

- Cú pháp: int putc(int c, FILE *f)

Trong đó, tham số c chứa mã Ascii của một ký tự nào đó Mã này được ghi lên tập tin liên kết với con trỏ f Hàm này trả về EOF nếu gặp lỗi

Trang 35

3.1.2 Hàm fputs()

- Hàm này dùng để ghi một chuỗi ký tự chứa trong vùng đệm lên tập tin văn

bản

- Cú pháp: int puts(const char *buffer, FILE *f)

Trong đó, buffer là con trỏ có kiểu char chỉ đến vị trí đầu tiên của chuỗi ký tự

được ghi vào Hàm này trả về giá trị 0 nếu buffer chứa chuỗi rỗng và trả về EOFnếu gặp lỗi

3.1.3 Hàm fprintf()

- Hàm này dùng để ghi dữ liệu có định dạng lên tập tin văn bản

- Cú pháp: fprintf(FILE *f, const char *format, varexpr)

Trong đó:format: chuỗi định dạng (giống với cácđịnh dạng của hàm printf()),

varexpr: danh sách các biểu thức, mỗi biểu thức cách nhau dấu phẩy (,)

Bảng 4.2: Các ký hiệu để ghi tập tin

%[.số chữ số thập phân] f Ghi số thực có <số chữ số thập phân> theo quy tắc làm

tròn số

%e hoặc %E hoặc %g

hoặc %G

Ghi số thực dạng khoa học (nhân 10 mũ x)

- Ví dụ: Viết chương trình ghi chuỗi ký tự lên tập tin văn bản D:\\Baihat.txt

Trang 36

f=fopen("D:\\Baihat.txt","r+");

if (f!=NULL)

{

fputs("Em oi Ha Noi pho.\n",f);

fputs("Ta con em, mui hoang lan; ta con em, mui hoa sua.",f);

- Cú pháp: char *fgets(char *buffer, int n, FILE *f)

- Hàm này được dùng để đọc một chuỗi ký tự từ tập tin văn bản đang được mở

ra và liên kết với con trỏ f cho đến khi đọc đủ n ký tự hoặc gặp ký tự xuống dòng ‘\n’ (ký tự này cũng được đưa vào chuỗi kết quả) hay gặp ký tự kết thúc EOF (ký tự này không được đưa vào chuỗi kết quả)

Trong đó:

- buffer (vùng đệm): con trỏ có kiểu char chỉ đến cùng nhớ đủ lớn chứa các ký

tự nhận được

- n: giá trị nguyên chỉ độ dài lớn nhất của chuỗi ký tự nhận được

- f: con trỏ liên kết với một tập tin nào đó

- Ký tự NULL (‘\0’) tự động được thêm vào cuối chuỗi kết quả lưu trong vùng đêm

Trang 37

- Hàm trả về địa chỉ đầu tiên của vùng đệm khi không gặp lỗi và chưa gặp ký tự kết thúc EOF Ngược lại, hàm trả về giá trị NULL.

3.2.3 Hàm fscanf()

- Hàm này dùng để đọc dữ liệu từ tập tin văn bản vào danh sách các biến theo định dạng

- Cú pháp:fscanf(FILE *f, const char *format, varlist)

Trong đó: format: chuỗi định dạng (giống hàm scanf()); varlist: danh sách các biến mỗi biến cách nhau dấu phẩy (,)

- Ví dụ : Viết chương trình chép tập tin D:\Baihat.txt ở trên sang tập tin D:\

fputc(ch,f2);

ch=fgetc(f1);

}fcloseall();

}

getch();

return 0;

Trang 38

- Tìm kiếm một phần tử trong dãy

- Ghi các phần tử vừa nhập vào tệp văn bản với tên mang.txt

Câu 4.2.Mỗi sinh viên cần quản lý ít nhất 2 thông tin: mã sinh viên và họ tên

Viết chương trình cho phép lựa chọn các chức năng: nhập danh sách sinh viên từbàn phím rồi ghi lên tập tin SinhVien.dat, đọc dữ liệu từ tập tin SinhVien.dat rồi hiển thị danh sách lên màn hình, tìm kiếm họ tên của một sinh viên nào đó dựa vào mã sinh viên nhập từ bàn phím

Yêu cầu đánh giá

- Trình bày và thực hiện được các kiểu vào ra với tập tin

- Thực hiện được các thao tác trên tập tin

- Sử dụng kiểu dữ liệu tập tin để đọc và ghi tệp văn bản

- Viết được chương trình và chạy, kiểm tra được kết quả

Trang 39

BÀI 5 THÊM PHẦN TỬ TRONG DANH SÁCH ĐẶC Giới thiệu:

Danh sách đặc hay còn gọi là danh sách mảng các phần tử sẽ sắp xếp cóthứ tự trong danh sách và có chiều dài cố định Được sử dụng trong các bài toánthêm phần tử, sắp xếp phần tử, vị trí xuất hiện của phần tử, xóa phần tử Dùngngôn ngữ C/C++ để cài đặt Qua bài học này sẽ giới thiệu cho người học về cáchthêm phần tử

Mục tiêu:

- Nêu được khái niệm về danh sách và các thao tác trên danh sách

- Định nghĩa được danh sách đặc

- Thực hiện được các thao tác thêm phần tử đầu, cuối, vị trí bất kỳ vào danh sách đặc

- Rèn luyện tính cẩn thận, kiên trì, sáng tạo, độc lập và hoạt động nhóm

- Bảo đảm an toàn và vệ sinh cho người và thiết bị trong phòng máy

Nội dung :

1 Định nghĩa

Danh sách đặc là danh sách mà không gian bộ nhớ lưu trữ các phần tửđược đặt liên tiếp nhau trong bộ nhớ

- Danh sách đặc được hiểu giống như mảng

- Do chiều dài của danh sách luôn luôn biến động cho nên chúng ta cũng cầnquản lý chiều dài thực của danh sách thông qua một biến nguyên

2 Khởi tạo danh sách

Trang 40

DS.n=0;

}

3 Thêm một phần tử vào danh sách

3.1.Thêm vào đầu danh sách:

void ThemDau(DanhSach &DS,int phantu)

3.2.Thêm vào cuối danh sách:

void ThemCuoi(DanhSach &DS,int phantu)

{

DS.PhanTu[DS.n]=phantu;

DS.n++;

}

3.3 Thêm vào vị trí bất kỳ trong danh sách:

3.3.1 Thêm vào vị trí k trong danh sách

void ThemK(DanhSach &DS,int phantu,int k)

3.3.2 Thêm vào vị trí thích hợp trong danh sách:

void Them(DanhSach &DS,int phantu)

{

Ngày đăng: 26/06/2020, 12:50

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w