Phần I – Trong thời gian 1 giờ 30 phút đầu: 16.1 Hàm Như chúng ta đã biết, một hàm là một khối các lệnh thực hiện một tác vụ xác định. Trong bài này, chúng ta tập trung vào cách tạo và sử dụng hàm.
Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only Bài 19 Các Kiểu liệu Nâng cao Sắp xếp Mục tiêu: Kết thúc học này, bạn có thể: Deleted: Giải thích Tìm hiểu cấu trúc (structure) công dụng chúng Định nghĩa cấu trúc Khai báo biến kiểu cấu trúc Deleted: Giải thích Tìm hiểu cách truy cập vào phần tử cấu trúc Deleted: Giải thích Tìm hiểu cách khởi tạo cấu trúc Deleted: Giải thích Tìm hiểu cách sử dụng cấu trúc với câu lệnh gán Tìm hiểu cách truyền tham số kiểu cấu trúc Deleted: Giải thích cách truyền cấu trúc vào hàm đối số Sử dụng mảng cấu trúc Deleted: Giải thích Tìm hiểu cách khởi tạo mảng cấu trúc Deleted: đối Deleted: kiểu Tìm hiểu trỏ đến cấu trúc Deleted: vào hàm Tìm hiểu cách truyền đối số kiểu trỏ cấu trúc vào hàm Deleted: Tìm hiểu từ khóa typedef Deleted: Giải thích Tìm hiểu hai thuật toán xếp mảng Insertion sort Bubble sort Deleted: Deleted: Deleted: Giải thích Giới thiệu Deleted: Giải thích Các chương trình ứng dụng thực tế đòi hỏi lưu trữ kiểu liệu khác Tuy nhiên, kiểu liệu C mà học khơng đủ trường hợp Vì vậy, C cho phép tạo kiểu liệu người dùng định nghĩa Một kiểu cấu trúc (structure) Một cấu trúc tập biến nhóm lại với có tên Một kiểu liệu đặt tên cách sử dụng từ khóa typedef Deleted: Deleted: đối số Deleted: Giải thích Deleted: Giải thích Deleted: việc xếp mảng với Các ứng dụng thường lưu trữ số lượng liệu lớn Trong trường hợp này, việc định vị mục liệu tốn nhiều thời gian Sắp xếp giá trị theo trật tự làm cho cơng việc tìm kiếm nhanh chóng dễ dàng Trong chương này, xem số giải thuật dùng để xếp mảng 19.1 Cấu trúc Deleted: bối cảnh giới thực Deleted: Có thể kiểu liệu định nghĩa trước C tỏ không đủ trường hợp Deleted: tùy ý Biến sử dụng để lưu giữ mẫu liệu thời điểm mảng sử dụng để lưu giữ số mẫudữ liệu có kiểu Tuy nhiên, chương trình u cầu xử lý mục liệu có kiểu khác đơn vị chung Ở trường hợp này, biến mảng khơng thích hợp để sử dụng Ví dụ, chương trình viết để lưu trữ liệu danh mục sách Chương trình địi hỏi phải nhập lưu trữ tên sách (một mảng chuỗi), tên tác giả (một mảng chuỗi khác), lần xuất (một số nguyên), giá sách (một số thực) Một mảng đa chiều sử dụng để làm điều này, phần tử mảng phải có kiểu Trong trường hợp này, việc sử dụng cấu trúc làm cho việc trở nên đơn giản Deleted: nhóm Deleted: gom Deleted: Deleted: Deleted: Các b Deleted: Deleted: Deleted: Deleted: Deleted: Đây lúc mà Các Kiểu liệu Nâng cao Sắp xếp 259 Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only Một cấu trúc bao gồm số mẫu liệu, khơng cần phải kiểu, nhóm lại với Trong ví dụ trên, cấu trúc bao gồm tên sách, tên tác giả, lần xuất bản, giá sách Cấu trúc lưu giữ mẫu liệu Deleted: mục Hình 19.1 Minh họa khác biệt biến, mảng cấu trúc Deleted: m Biến I L L U S I O N S Mảng I L L U S I O N S B A C H Cấu trúc Deleted: mục Tên sách Tên tác giả Lần xuất Hình 19.1 Sự khác biến, mảng cấu trúc 19.1.1 Định nghĩa cấu trúc Việc định nghĩa cấu trúc tạo kiểu liệu cho phép người dùng sử dụng chúng để khai báo biến kiểu cấu trúc Các biến cấu trúc gọi phần tử hay thành phần cấu trúc Một cách tổng quát, phần tử cấu trúc quan hệ với cách logic chúng liên quan đến thực thể Ví dụ, danh mục sách biễu diễn sau: struct cat { char bk_name [25]; char author [20]; int edn; float price; }; Deleted: Một định nghĩa cấu trúc hình thành khn mẫu để tạo biến cấu trúc Các biến cấu trúc gọi phần tử cấu trúc hay thành viên cấu trúc Deleted: Câu lệnh định nghĩa kiểu liệu có tên struct cat Mỗi biến kiểu bao gồm bốn phần tử - bk_name, author, edn, price Câu lệnh không khai báo biến chương trình khơng để dành vùng nhớ nhớ Nó định nghĩa cấu trúc cat Từ khóa struct báo cho trình biên dịch biết structure định nghĩa Nhãn cat tên biến, khơng phải ta khai báo biến Nó tên kiểu Các phần tử cấu trúc định nghĩa dấu móc, kết thúc toàn câu lệnh dấu chấm phẩy Deleted: gọi Deleted: Deleted: Một Deleted: k 19.1.2 Khai báo biến kiểu cấu trúc Khi cấu trúc định nghĩa, khai báo nhiều biến kiểu Ví dụ: 260 Deleted: Một cấu trúc định nghĩa khn mẫu biến cấu trúc Các biến cấu trúc gọi phần tử cấu trúc hay thành phần cấu trúc Lập trình C Deleted: hay nhiều biến kiểu khai báo Deleted: Điều thực sau Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only struct cat books1; Câu lệnh dành đủ vùng nhớ để lưu giữ tất mục cấu trúc Khai báo thực chức tương tự khai báo biến: int xyz float ans Nó báo với trình biên dịch dành vùng lưu trữ cho biến với kiểu gán tên cho biến Cũng với int, float kiểu liệu khác, ta có số biến có kiểu cấu trúc cho Trong chương trình, khai báo hai biến books1 books2 có kiểu cấu trúc cat Điều thực theo nhiều cách struct cat { char bk_name[25]; char author[20]; int edn; float price; } books1, books2; struct cat books1, books2; struct cat books1; struct cat books2; Các khai báo dành vùng nhớ cho hai biến books1 books2 Deleted: Các phần tử cấu trúc truy cập thơng qua việc sử dụng tốn tử chấm (.), tốn tử cịn gọi tốn tử thành viên membership Cú pháp tổng quát dùng để truy cập phần tử cấu trúc là: structure_name.element_name Ví dụ mã lệnh sau truy cập đến trường bk_name biến kiểu cấu trúc books1 khai báo Deleted: , Deleted: liên hệ Deleted: bên books1.bk_name Để đọc vào tên sách, câu lệnh là: scanf(“%s”, books1.bk_name); Để in tên sách, câu lệnh là: printf(“The name of the book is %s”, books1.bk_name); 19.1.3 Khởi tạo biến cấu trúc Deleted: Giống biến mảng, biến kiểu cấu trúc khởi tạo thời điểm khai báo Hình thức tương tự cách khởi tạo mảng Xét cấu trúc sau dùng để lưu số thứ tự tên nhân viên: struct employee Các Kiểu liệu Nâng cao Sắp xếp 261 Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only { int no; char name[20]; }; Các biến emp1 emp2 có kiểu employee khai báo khởi tạo sau: struct employee emp1 = {346, “Abraham”}; struct employee emp2 = {347, “John”}; Ở đây, sau khai báo kiểu cấu trúc, hai biến cấu trúc emp1 emp2 khai báo khởi tạo Việc khai báo khởi tạo chúng thực lúc câu lệnh Việc khởi tạo cấu trúc tương tự khởi tạo mảng – kiểu biến, tên biến, toán tử gán, cuối danh sách giá trị đặt cặp móc phân cách dấu phẩy 19.1.4 Thực câu lệnh gán với biến cấu trúc Deleted: thường lệ Deleted: Sự Deleted: xảy Deleted: Deleted: dòng Có thể gán giá trị biến cấu trúc cho biến khác kiểu cách sử dụng câu lệnh gán đơn giản Chẳng hạn, books1 books2 biến cấu trúc có kiểu, câu lệnh sau hợp lệ books2 = books1; Cũng có trường hợp khơng thể dùng câu lệnh gán trực tiếp, sử dụng hàm tạo sẵn memcpy() Nguyên mẫu hàm là: Deleted: Sự Deleted: Deleted: theo sau dấu móc chứa danh sách giá trị, phân cách dấu phẩy.¶ Deleted: Câu lệnh gán sử dụng cấu trúc Deleted: , nơi mà Deleted: sẳn memcpy (char * destn, char &source, int nbytes); Hàm thực chép nbytes lưu trữ địa source đến vùng nhớ khác có địa destn Hàm địi hỏi người sử dụng phải kích cỡ cấu trúc (nbytes), kích cỡ đạt cách sử dụng toán tử sizeof() Sử dụng hàm memcpy(), chép nội dung books1 sang books2 sau: Deleted: mô tả memcpy (&books2, &books1, sizeof(struct cat)); 19.1.5 Cấu trúc lồng cấu trúc Một cấu trúc lồng cấu trúc khác Tuy nhiên, cấu trúc lồng Rất nhiều trường hợp thực tế địi hỏi có cấu trúc nằm cấu trúc khác Xét ví dụ, để lưu trữ thơng tin người mượn sách chi tiết sách mượn ta sử dụng cấu trúc sau: Deleted: mẫu tin Deleted: phải lưu trữ Cấu trúc sau sử dụng: struct issue { char borrower [20]; char dt_of_issue[8]; struct cat books; }issl; Câu lệnh khai báo books thành phần cấu trúc issue Bản thân thành phần cấu trúc kiểu struct cat Biến cấu trúc khởi tạo sau: Deleted: có kiểu cấu trúc Deleted: C struct issue issl = {“Jane”, “04/22/03”, {“Illusions”, “Richard Bach”, 2, 150.00}}; Các dấu ngoặc lồng sử dụng để khởi tạo cấu trúc nằm cấu trúc 262 Lập trình C Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only Đối với biến cấu trúc có thành phần cấu trúc khác, việc truy cập thành phần biến hoàn toàn tương tự biến cấu trúc thông thường Chẳng hạn, để truy cập vào tên người mượn ta dùng lệnh là: Deleted: Để truy cập vào phần tử cấu trúc, hình thức tương tự cách sử dụng với cấu trúc bình thường, chẳng hạn để truy cập vào tên người mượn, mã lệnh là: issl.borrower Tuy nhiên, để truy cập thành phần author biến cấu trúc cat mà biến cấu trúc lại thành phần biến cấu trúc issl ta sử dụng lệnh sau: Deleted: Tuy nhiên để truy cập vào phần tử cấu trúc cat, phần cấu trúc issue, biểu thức sau sử dụng: issl.books.author Deleted: Biểu thức liên hệ đến phần tử author cấu trúc books cấu trúc issl Mức độ lồng cấu trúc bị giới hạn dung lượng thời nhớ Có thể có cấu trúc lồng cấu trúc lồng cấu trúc khác v.v… Tên biến thường đặt theo cách thức gợi nhớ nội dung thơng tin mà lưu trữ Ví dụ như: Deleted: có Deleted: Các tên biến sử dụng thường tự mơ tả hình dạng company.division.employee.salary Cũng cần nhớ cấu trúc lồng cấu trúc khác, phải khai báo trước cấu trúc khác sử dụng 19.1.6 Truyền tham số kiểu cấu trúc Deleted: cấu trúc đối số hàm Kiểu tham số hàm cấu trúc Đây phương tiện hữu dụng ta muốn truyền nhóm thành phần liệu có quan hệ logic với thơng qua biến thay phải truyền thành phần Tuy nhiên, cấu trúc sử dụng tham số, cần phải lưu ý kiểu tham số thực phải trùng với kiểu tham số hình thức Deleted: Một biến cấu trúc truyền vào hàm đối số Chẳng hạn như, cấu trúc khai báo để lưu trữ tên, mã số khách hàng số tiền gửi gốc vào tài khoản khách hàng Dữ liệu nhập hàm main(), việc toán số tiền lãi phải trả thực cách gọi hàm intcal() có tham số kiểu cấu trúc Đoạn lệnh sau: Deleted: Đây phương tiện hữu dụng sử dụng để truyền nhóm mục liệu có liên quan logic với thay phải truyền mục Deleted: đối số Deleted: đối số Deleted: cấu trúc truyền vào hàm intcal()-hàm tính tốn số tiền lãi phải trả Ví dụ 1: #include struct strucintcal /* Defines the structure */ { char name[20]; int numb; float amt; }; void main() { struct strucintcal xyz; /* Declares a variable */ void intcal(struct strucintcal); clrscr(); /* Accepts data into the structure */ Các Kiểu liệu Nâng cao Sắp xếp 263 Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only printf("\nEnter Customer name: "); gets(xyz.name); printf("\nEnter Customer number: "); scanf("%d", &xyz.numb); printf("\nEnter Principal amount: "); scanf("%f", &xyz.amt); intcal(xyz); /* Passes the structure to a function */ getch(); } void intcal(struct strucintcal abc) { float si, rate = 5.5, yrs = 2.5; /* Computes the interest */ si = (abc.amt * rate * yrs) / 100; printf ("\nThe customer name is %s", abc.name); printf("\nThe customer number is %d", abc.numb); printf("\nThe amount is %f", abc.amt); printf("\nThe interest is %f", si); return; } Kết chương trình minh họa sau: Deleted: Một kết xuất mẫu chương trình sau: Enter Customer name: Jane Enter Customer number: 6001 Enter Principal Amount: 30000 The customer name is Jane The customer number is 6001 The amount is 30000.000000 The interest is 4125.000000 Deleted: ¶ Có thể định nghĩa cấu trúc mà khơng có nhãn Điều hữu dụng biến khai báo lúc với định nghĩa cấu trúc Nhãn không cần thiết trường hợp 19.1.7 Mảng cấu trúc Một cách sử dụng thông thường cấu trúc mảng cấu trúc Để khai báo mảng cấu trúc, cấu trúc định nghĩa trước, sau biến mảng có kiểu khai báo Ví dụ như, để khai báo mảng cấu trúc có kiểu cat, câu lệnh là: struct cat books[50]; Giống tất biến, mảng cấu trúc bắt đầu số Tên mảng số nằm cặp dấu ngoặc vuông theo sau tên mảng đại diện cho phần tử mảng Sau lệnh khai báo trên, phần tử cấu trúc theo định nghĩa Vì tất qui tắc dùng để truy xuất đến phần tử cấu trúc áp dụng phần tử mảng Sau mảng cấu trúc books khai báo, 264 Lập trình C Deleted: Tên mảng theo sau số nằm dấu móc vng đại diện cho phần tử mảng Deleted: luật dùng để liên hệ đến trường (hay phần tử) cấu trúc áp dụng sau Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only books[4].author tương ứng thành phần author phần tử thứ tư mảng books Deleted: liên hệ đến biến Deleted: Các Kiểu liệu Nâng cao Sắp xếp 265 Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only 19.1.8 Khởi tạo mảng cấu trúc Deleted: Một mảng kiểu khởi tạo cách liệt kê danh sách giá trị phần tử cặp dấu móc Luật phần tử mảng cấu trúc Vì phần tử mảng cấu trúc, mà giá trị khởi tạo cấu trúc đặt cặp dấu móc, nên ta phải sử dụng cặp dấu móc lồng khởi tạo mảng cấu trúc Xét ví dụ sau: Deleted: Deleted: chí Deleted: Một khởi tạo hiệu chứa dấu móc lồng struct unit { char ch; int i; }; struct unit series[3] = { {‘a’, 100}, {‘b’, 200}, {‘c’, 300}, }; Đoạn lệnh khai báo series mảng cấu trúc gồm phần tử, phần tử có kiểu unit Khi khởi tạo, phần tử cấu trúc nên giá trị đặt cặp dấu móc, tồn giá trị phần tử đóng dấu móc biết khởi tạo mảng Deleted: khởi tạo Deleted: Deleted: Vì Deleted: Deleted: danh sách 266 Lập trình C Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only 19.1.9 Con trỏ cấu trúc Deleted: đến C hỗ trợ trỏ cấu trúc, có số khía cạnh đặc biệt trỏ cấu trúc Giống kiểu trỏ khác, trỏ cấu trúc khai báo cách đặt dấu * trước tên biến cấu trúc Ví dụ, câu lệnh sau khai báo trỏ ptr_bk kiểu cấu trúc cat Deleted: đến struct cat *ptr_bk; Bây để gán địa biến cấu trúc books kiểu cat cho ptr_bk, câu lệnh sau: ptr_bk = &books; Toán tử -> dùng để truy cập đến phần tử trỏ cấu trúc Toán tử tổ hợp dấu trừ (-) dấu lớn (>) biết đến tốn tử tổ hợp Ví dụ như, trường author truy cập theo cách sau đây: Deleted: vào Deleted: cấu trúc sử dụng ptr_bk->author books.author (*ptr_bk).author Trong biểu thức cuối cùng, dấu ngoặc bắt buộc tốn tử chấm (.) có độ ưu tiên cao tốn tử vơ hướng (*) Khơng có dấu ngoặc, trình biên dịch sinh lỗi, tốn tử chấm khơng áp dụng biến trỏ ptr_bk Deleted: ptr_bk (một trỏ) khơng tương thích trực tiếp với tốn tử chấm Formatted Cũng tất khai báo trỏ khác, việc khai báo trỏ cấp phát không gian cho trỏ mà không cấp phát cho nơi trỏ đến Vì vậy, trỏ cấu trúc khai báo, không gian cấp phát dành cho địa cấu trúc thân cấu trúc Deleted: mà 19.1.10 Deleted: đối Truyền trỏ cấu trúc tham số Có thể sử dụng trỏ cấu trúc tham số hàm Tại thời điểm gọi hàm, trỏ cấu trúc địa biến cấu trúc truyền vào hàm Điều cho phép hàm sửa đổi phần tử cấu trúc cách trực tiếp 19.2 Từ khóa typedef Một kiểu liệu định nghĩa cách sử dụng từ khóa typedef Từ khóa khơng tạo kiểu liệu mới, mà định nghĩa tên cho kiểu có Cú pháp tổng quát câu lệnh typedef là: typedef type name; type kiểu liệu cho phép name tên cho kiểu liệu Tên định nghĩa, tên thêm vào, tên thay thế, cho kiểu liệu có Ví dụ như, tên cho float định nghĩa theo cách sau: typedef float deci; Các Kiểu liệu Nâng cao Sắp xếp 267 Deleted: đối số Deleted: tường minh Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only Câu lệnh báo cho trình biên dịch biết để nhận dạng deci tên khác float Một biến float định nghĩa sử dụng deci sau: deci amt; Ở đây, amt biến số thực kiểu deci, tên khác float Sau định nghĩa, deci sử dụng kiểu liệu câu lệnh typedef để gán tên khác cho kiểu float Chẳng hạn, typedef deci point; Câu lệnh báo cho trình biên dịch biết để nhận dạng point tên khác deci, tên khác float Đặc tính typedef đặc biệt tiện lợi định nghĩa cấu trúc, ta khơng cần nhắc lại nhãn struct sử dụng cấu trúc Khi việc sử dụng cấu trúc thuận tiện Thêm vào đó, tên kiểu cấu trúc người dùng định nghĩa thường gợi nhớ đến mục đích cấu trúc chương trình Một cách tổng quát, cấu trúc người dùng định nghĩa viết sau: Deleted: Vì vậy, cấu trúc liên hệ cách xác Deleted: cho typedef struct new_type { type var1; type var2; } Ở đây, new_type kiểu cấu trúc người dùng định nghĩa khơng phải biến cấu trúc Bây giờ, biến kiểu cấu trúc định nghĩa theo kiểu liệu mới.Ví dụ: typedef { int int int } date; Deleted: Một ví dụ sau: struct day; month; year; date due_date; Ở đây, date kiểu liệu due_date biến kiểu date Cần nhớ typedef sử dụng với storage classes 19.3 Sắp xếp mảng (Sorting Arrays) Sắp xếp có nghĩa xếp mảng liệu theo thứ tự xác định tăng dần hay giảm dần Khi mảng xếp, việc tìm kiếm mảng trở nên dễ dàng Có số phương pháp để xếp mảng Chúng ta xem xét hai phương pháp sau đây: Bubble Sort Insertion Sort Các phương pháp trình bày sau áp dụng mảng xếp theo thứ tự tăng dần 19.3.1 Bubble Sort 268 Lập trình C Deleted: Deleted: Dữ liệu mảng dễ dàng tìm mảng xếp Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only Bản thân tên q trình xếp mơ tả cách thức làm việc Ở đây, việc so sánh phần tử phần tử có giá trị nhỏ bọt dần lên đỉnh Quá trình xếp mảng 5-phần tử theo thứ tự tăng dần cho sau: So sánh giá trị phần tử thứ với giá trị phần tử thứ Nếu giá trị phần tử thứ nhỏ giá trị phần tử thứ 4, giá trị hai phần tử hoán đổi Kế tiếp, so sánh giá trị phần tử thứ với giá trị phần tử thứ 3, theo cách tương tự, giá trị hoán đổi giá trị phần tử sau nhỏ giá trị phần tử trước So sánh giá trị phần tử thứ với giá trị phần tử thứ 2, q trình so sánh hốn đổi tiếp tục Sau lượt, giá trị nhỏ đặt vào phần tử Một cách nơm na, phát biểu giá trị nhỏ ‘nổi lên’ Trong lượt kế tiếp, việc so sánh lại bắt đầu với phần tử cuối cùng, so sánh dần lên đến phần tử thứ Vì phần tử thứ chứa giá trị nhỏ nhất, không cần thiết phải so sánh Deleted: Tên Deleted: trao Deleted: trao Deleted: Deleted: ên Deleted: trao Deleted: dời Deleted: đến Deleted: thấp Với cách vậy, cuối trình xếp, phần tử nhỏ ‘nổi bọt’ dần lên trên, giá trị lớn ‘chìm xuống’ Hình 19.2 minh họa cho phương pháp buble sort 23 23 23 23 90 90 90 23 9 90 90 25 16 16 16 16 16 25 25 25 25 9 9 23 23 23 16 90 90 16 23 16 16 90 90 25 25 25 25 9 16 16 16 23 23 23 90 25 25 25 90 90 9 16 16 23 23 25 25 90 90 Các Kiểu liệu Nâng cao Sắp xếp 269 Deleted: phần tử Deleted: đỉnh Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only 16 23 25 90 Figure 19.2: Bubble Sort Chương trình thực xếp mảng theo phương pháp bubble sort: Formatted Deleted: cho sau Ví dụ 2: #include void main() { int i, j, temp, arr_num[5] = { 23, 90, 9, 25, 16}; clrscr(); for(i = 3; i >= 0; i ) /* Tracks every pass */ for(j = 4; j >= - i; j ) /* Compares elements */ { if(arr_num[j] < arr_num[j - 1]) { temp = arr_num[j]; arr_num[j] = arr_num[j - 1]; arr_num[j - 1] = temp; } } printf("\nThe sorted array"); for(i = 0; i < 5; i++) printf("\n%d", arr_num[i]); getch(); } 270 Lập trình C Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only 19.3.2 Insertion Sort Trong phương pháp Insertion sort, ta xét phần tử mảng đặt vào vị trí phần tử xếp Khi phần tử cuối đặt vào vị trí nó, mảng xếp Ví dụ, xét mảng có phần tử, Giá trị phần tử thứ xem thứ tự So sánh giá trị phần tử thứ hai với phần mảng xếp, mà có phần tử thứ Nếu giá trị phần tử thứ hai nhỏ hơn, xen trước phần tử thứ Bây giờ, hai phần tử tạo thành phần danh sách xếp phần lại danh sách chưa xếp Phần tử danh sách chưa xếp, phần tử thứ 3, so sánh với danh sách xếp Nếu giá trị phần tử thứ nhỏ phần tử thứ 1, giá trị phần tử thứ xen trước phần tử thứ Ngược lại, giá trị phần tử thứ nhỏ phần tử thứ 2, giá trị phần tử thứ xen trước phần tử thứ Bây giờ, phần xếp mảng gồm phần tử, phần chưa xếp gồm phần tử lại Quá trình so sánh phần tử danh sách chưa xếp với phần tử danh sách xếp tiếp tục phần tử cuối mảng so sánh đặt vào vị trí Ở cuối q trình xếp, phần tử xen vào vị trí Hình 19.3 minh họa cách làm việc insertion sort Các Kiểu liệu Nâng cao Sắp xếp 23 23 90 90 9 25 25 16 16 23 90 23 90 25 25 16 16 9 9 23 23 23 23 90 90 90 25 25 25 25 90 16 16 16 16 9 23 23 16 25 25 23 90 90 25 271 Deleted: phần tử mảng xem xét, Formatted Deleted: tạo thành Deleted: chứa Deleted: Deleted: chứa Formatted Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only 16 16 90 Figure 19.3: Insertion Sort Chương trình thực xếp mảng theo phương pháp insertion sort : Formatted Deleted: cho sau Ví dụ 3: #include void main() { int i, j, arr[5] = { 23, 90, 9, 25, 16 }; char flag; clrscr(); /*Loop to compare each element of the unsorted part of the array*/ for(i = 1; i < 5; i++) /*Loop for each element in the sorted part of the array*/ for(j = 0, flag = 'n'; j < i && flag == 'n'; j++) { if(arr[j] > arr[i]) { /*Invoke the function to insert the number*/ insertnum(arr, i, j); flag = 'y'; } } printf("\n\nThe sorted array\n"); for(i = 0; i < 5; i++) printf("%d\t", arr[i]); getch(); } insertnum(int arrnum[], int x, int y) { int temp; /*Store the number to be inserted*/ temp = arrnum[x]; /*Loop to push the sorted part of the array down from the position where the number has to inserted*/ for(; x > y; x ) arrnum[x] = arrnum[x - 1]; /*Insert the number*/ arrnum[x] = temp; 272 Lập trình C Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only } Các Kiểu liệu Nâng cao Sắp xếp 273 Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only Tóm tắt Một cấu trúc tập biến có kiểu liệu khác nhóm lại với tên Deleted: Một cấu trúc nhóm biến có kiểu liệu khác gom lại tên Việc định nghĩa cấu trúc tạo kiểu liệu cho phép người dùng sử dụng chúng để khai báo biến kiểu cấu trúc Deleted: Một định nghĩa cấu trúc tạo thành khn mẫu, khn mẫu sử dụng để tạo biến cấu trúc Các phần tử độc lập cấu trúc truy cập cách sử dụng toán tử chấm (.), hay cịn gọi tốn tử thành viên Formatted Deleted: tham chiếu đến Các giá trị biến cấu trúc gán cho biến khác có kiểu cách sử dụng câu lệnh gán đơn giản Có thể có cấu trúc nằm cấu trúc khác Tuy nhiên cấu trúc khơng thể lồng Deleted: đối Một biến cấu trúc truyền vào hàm tham số Deleted: cài đặt Cách sử dụng thông dụng cấu trúc hình thức mảng cấu trúc Deleted: Toán tử -> sử dụng để truy cập vào phần tử cấu trúc thông qua trỏ trỏ đến cấu trúc Một kiểu liệu định nghĩa từ khóa typedef Deleted: kỹ thuật Hai phương pháp dùng để xếp mảng bubble sort insertion sort Trong bubble sort, giá trị phần tử so sánh với giá trị phần tử Trong phương pháp này, phần tử nhỏ lên dần, cuối mảng xếp Trong insertion sort, ta xét phần tử mảng chèn vào vị trí phần tử xếp 274 Lập trình C Deleted: xem xét, Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only Kiểm tra tiến độ học tập Một nhóm số mẫu liệu lại với nhau, mẫu liệu khơng thiết phải có kiểu Các phần tử cấu trúc truy cập đến thông qua việc sử dụng _ Các giá trị biến cấu trúc gán cho biến khác có kiểu cách sử dụng câu lệnh gán đơn giản (Đúng / Sai) Khơng thể có cấu trúc nằm cấu trúc khác Một kiểu liệu định nghĩa sử dụng từ khóa _ Deleted: tham chiếu (Đúng / Sai) Trong bubble sort, phần tử so sánh Trong insertion sort, phần tử chưa xếp phải đặt vào vị trí xếp đó, giá trị trao đổi với (Đúng / Sai) Các Kiểu liệu Nâng cao Sắp xếp Deleted: ục Deleted: cần Deleted: ục 275 Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only Bài tập tự làm Viết chương trình C để cài đặt hệ thống quản lý kho Hãy lưu trữ mã số, tên hàng, giá số lượng có hàng cấu trúc Nhập chi tiết hàng vào mảng cấu trúc hiển thị tên hàng tổng giá trị Ở cuối chương trình , hiển thị tổng giá trị kho hàng Viết chương trình C để lưu trữ tên điểm số sinh viên mảng cấu trúc Hãy xếp mảng cấu trúc theo thứ tự điểm số giảm dần Hiển thị điểm số cao 276 Lập trình C ... mảng, biến kiểu cấu trúc khởi tạo thời điểm khai báo Hình thức tương tự cách khởi tạo mảng Xét cấu trúc sau dùng để lưu số thứ tự tên nhân viên: struct employee Các Kiểu liệu Nâng cao Sắp xếp 261... nghĩa tên cho kiểu có Cú pháp tổng quát câu lệnh typedef là: typedef type name; type kiểu liệu cho phép name tên cho kiểu liệu Tên định nghĩa, tên thêm vào, tên thay thế, cho kiểu liệu có Ví dụ... number*/ arrnum[x] = temp; 272 Lập trình C Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only } Các Kiểu liệu Nâng cao Sắp xếp 273 Generated by Foxit