Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 153 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
153
Dung lượng
2,33 MB
Nội dung
ệm Các kiểu liệu trừu tượng th u Chương ng hi 6.1 Kiểu liệu trừu tượng cấu trúc (struct) Trong chương trước, ta thấy để lưu trữ giá trị gồm nhiều thành phần liệu giống ta sử dụng kiểu mảng Tuy nhiên, thực tế nhiều liệu tập kiểu liệu khác tập hợp lại, ví dụ lý lịch người gồm nhiều kiểu liệu khác họ tên, tuổi, giới tính, mức lương … để quản lý liệu kiểu C++ đưa kiểu liệu cấu trúc hộ iđ ồn g Kiểu cấu trúc giống kiểu mảng chỗ quản lý tập hợp liệu chia thành thành phần Các thành phần kiểu mảng truy cập thơng qua số, cịn thành phần kiểu cấu trúc (còn gọi trường) truy cập thông qua tên gọi thành phần Điểm giống khác kiểu mảng cấu trúc thành phần lưu trữ liên tiếp nhớ, nhiên số bytes thành phần kiểu cấu trúc khác nhau, khác với kiểu mảng độ dài thành phần giống chúng có kiểu Ví dụ, chương trình quản lý điểm tốt nghiệp sinh viên, sinh viên đối tượng mà có thành phần liệu cần phải có là: họ tên, năm sinh, điểm tốt nghiệp Để quản lý đối tượng sinh viên ta xây dựng kiểu cấu trúc sau: nh ch o struct Student { char name [30]; int birth_year ; double mark; }; dà Lưu ý, Student gọi thẻ tên (identifier_tag) kiểu cấu trúc tên biến Để đơn giản ta gọi kiểu cầu trúc Student hay ngắn gọn kiểu Student (như kiểu chuẩn int, double, bool, … ) Trong kiểu Student có chứa thành phần với kiểu khác : xâu kí tự, số nguyên số thực tương ứng với tên thành phần là: name, birth_year, mark Thông thường, kiểu cấu trúc hay dùng chung cho hàm nên phần lớn chúng khai báo kiểu tồn cục Tóm lại, việc xây dựng thẻ tên kiểu cấu trúc hay kiểu cấu trúc tuân theo cú pháp sau 6.1.1 Khai báo, khởi tạo 120 Các kiểu liệu trừu tượng struct identifier_tag { list of members ; } var_list ; • Mỗi thành phần (member) giống biến riêng kiểu, gồm kiểu tên thành phần Một thành phần gọi trường (field) th u • Phần tên (tag) kiểu cấu trúc phần danh sách biến có khơng Tuy nhiên khai báo kí tự kết thúc cuối phải dấu chấm phẩy (;) ệm • Các kiểu cấu trúc phép khai báo lồng nhau, nghĩa thành phần kiểu cấu trúc lại trường có kiểu cấu trúc khác • Một biến có kiểu cấu trúc phân bố nhớ cho thành phần kề liên tục theo thứ tự xuất khai báo struct identifier_tag list_of_var ; // kiểu cũ C theo C++ bỏ qua từ khóa struct: list_of_var ; // C++ ồn g identifier_tag ng hi • Khai báo biến kiểu cấu trúc giống khai báo biến kiểu sở dạng: Các biến khai báo kèm khởi tạo: Ví dụ khai báo kiểu Student: iđ identifier_tag var1 = { created_value }, var2 , ; ch o hộ struct Student { char name [30]; int birth_year ; double mark; } monitor = { “Nguyen Van ”Anh , 1992 , 8.7} , x; nh Trong khai báo trên, ta đồng thời khai báo biến kiểu Student monitor (lớp trưởng) x, x chưa khởi tạo monitor khởi tạo với họ tên Nguyễn Vân Anh, sinh năm 1992 điểm tốt nghiệp 8.7 Khi cần khai báo thêm biến có kiểu Student, theo cú pháp, ví dụ: dà Student vice_monitor , K58 [60] , y; Trong khai báo trên, vice_monitor, y biến đơn, K58 mảng mà thành phần sinh viên, ví dụ dùng để biểu diễn liệu lớp học Ưu điểm kiểu cấu trúc dùng để biểu diễn tập giá trị khác kiểu, nhiên với tập giá trị kiểu hiển nhiên biểu diễn kiểu cấu trúc nhiều trường hợp ý nghĩa đối tượng rõ ràng so với biểu diễn kiểu mảng Ví dụ, chương trước ta biểu diễn phân số mảng thành phần với ngầm định thành phần thứ tử thành phần thứ hai mẫu Dữ liệu phân số biểu diễn cấu trúc sau: 6.1 Kiểu liệu trừu tượng cấu trúc (struct) 121 struct Fraction { int numerator ; int denomirator ; } ; Với cách biểu diễn này, thành phần tử mẫu phân số đặt tên thay phải ngầm định cách biểu diễn dạng mảng Tương tự, ngày tháng khai báo : ệm th u struct Date { int day ; int month ; int year ; } holiday = { 1, 5, 2000 } ; ng hi biến holiday khai báo kèm kiểu khởi tạo số 1, 5, 2000 Các giá trị khởi tạo gán cho thành phần theo thứ tự khai báo, tức day = 1, month = year = 2000 Vì thành phần day, month, year kiểu int nên giống khai báo loại biến khác, chúng gộp dòng (vẫn giữ thứ tự): ồn g struct Date { int day , month , year ; } holiday = { 1, 5, 2000 } ; iđ Kiểu cấu trúc chứa thành phần kiểu cấu trúc Ví dụ, kiểu sinh viên khai báo trên, ta thay trường năm sinh (birth_year) trường có chứa ngày tháng năm sinh như: ch o hộ struct Student { char name [30]; Date birthday ; double mark; } monitor = { " Nguyen Van Anh", {1, 1, 1992} , 8.7} , x; nh thành phần birthday Student có kiểu Date cấu trúc, cách khởi tạo giá trị cho biến monitor thay đổi cho phù hợp từ việc khởi tạo 1992 cho thành phần birth_year khai báo cũ thành {1, 1, 1992} cho trường birthday khai báo dà Kiểu cấu trúc Class dùng chứa thông tin lớp học gồm tên lớp, danh sách sinh viên ví dụ minh họa cho việc kết hợp loại kiểu khác kiểu struct Class { char name [10] , Student list[MAX ]; } ; // xâu kí tự // mảng cấu trúc Tên thành phần phép trùng cấu trúc khác nhau, ví dụ name xuất hai cấu trúc Student Class Giống biến mảng, để làm việc với biến cấu trúc, số thao tác phải thực thành phần chúng Ví dụ để vào/ra biến cấu trúc ta phải viết câu lệnh vào/ra cho thành phần ví dụ 122 Các kiểu liệu trừu tượng Tuy nhiên, may mắn so với cách làm việc mảng, cấu trúc phép gán (=) giá trị cho cách trực tiếp, mảng gán thành phần Phép gán trực tiếp tương đương với việc gán thành phần cấu trúc Ví dụ: Student monitor = { "NVA", { 1, 1, 1992 }, 5.0 }; Student good_stu ; good_stu = monitor ; Student good_stu ; good_stu = { "NVA", { 1, 1, 1992 }, 5.0 }; // sai # include # include using namespace std; ệm 10 11 12 13 14 15 16 17 18 19 20 21 ng hi ồn g iđ int main () { const int NUM_OF_STUDENTS = 3; struct Date { int day , month , year ; }; struct Student { char name [30]; Date birthday ; double mark; }; Student monitor = { "Bill Gate", { 1, 11, 2001 }, 5.0 }; Student other_student ; other_student = monitor ; other_student birthday year = 2002; // Dat lai nam sinh hộ ch o 22 24 25 26 27 nh cout