Bài giảng Kỹ thuật lập trình - Chương V: Kiểu dữ liệu cấu trúc

5.1 Khai báo, khởi tạo Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 3 Khai báo cấu trúc:  Mỗi thành phần giống như một biến riêng của kiểu, nó gồm kiểu và tên thành phần.  Phần tên của kiểu cấu trúc và phần danh sách biến có thể có hoặc không.  Các kiểu cấu trúc được phép khai báo lồng nhau.  Một biến có kiểu cấu trúc sẽ được phân bố bộ nhớ sao cho các thực hiện của nó được sắp liên tục theo thứ tự xuất hiện trong khai báo.

pdf20 trang | Chia sẻ: thanhle95 | Lượt xem: 524 | Lượt tải: 1download
Bạn đang xem nội dung tài liệu Bài giảng Kỹ thuật lập trình - Chương V: Kiểu dữ liệu cấu trúc, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
LOGO Chương V Kiểu dữ liệu cấu trúc COMPANY LOGO www.themegallery.com Nội dung chính Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 2 Khai báo, khởi tạo5.1 Truy nhập các thành phần5.2 Hàm với cấu trúc5.3 Câu lệnh typedef5.4 Hàm sizeof()5.5 COMPANY LOGO www.themegallery.com 5.1 Khai báo, khởi tạo Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 3 Khai báo cấu trúc:  Mỗi thành phần giống như một biến riêng của kiểu, nó gồm kiểu và tên thành phần.  Phần tên của kiểu cấu trúc và phần danh sách biến có thể có hoặc không.  Các kiểu cấu trúc được phép khai báo lồng nhau.  Một biến có kiểu cấu trúc sẽ được phân bố bộ nhớ sao cho các thực hiện của nó được sắp liên tục theo thứ tự xuất hiện trong khai báo. struct { các thành phần ; } ; COMPANY LOGO www.themegallery.com 5.1 Khai báo, khởi tạo Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 4 - Khai báo biến kiểu cấu trúc cũng giống như khai báo các biến kiểu cơ sở dưới dạng: struct ; Hoặc: ; - Các biến được khai báo cũng có thể đi kèm khởi tạo: biến = { giá trị khởi tạo } ; COMPANY LOGO www.themegallery.com Ví dụ 1: Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 5 Khai báo kiểu cấu trúc chứa phân số gồm 2 thành phần nguyên chứa tử số và mẫu số. struct Phanso { int tu ; int mau ; } ; hoặc: struct Phanso { int tu, mau ; }; COMPANY LOGO www.themegallery.com Ví dụ 2: Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 6 Kiểu ngày tháng gồm 3 thành phần nguyên chứa ngày, tháng, năm. struct Ngaythang { int ng ; int th ; int nam ; } holiday = { 1,5,2000 } ; Một biến holiday cũng được khai báo kèm cùng kiểu này và được khởi tạo bởi bộ số 1. 5. 2000. Các giá trị khởi tạo này lần lượt gán cho các thành phần theo đúng thứ tự trong khai báo, tức ng = 1, th = 5 và nam = 2000. COMPANY LOGO www.themegallery.com Ví dụ 3: Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 7 Kiểu Lop dùng chứa thông tin về một lớp học gồm tên lớp và sĩ số sinh viên. Các biến kiểu Lop được khai báo là daihoc và caodang, trong đó daihoc được khởi tạo bởi bộ giá trị {“CN14A", 60} với ý nghĩa tên lớp đại học là CN14A và sĩ số là 60 sinh viên. struct Lop { char tenlop[10], int soluong; } ; struct Lop daihoc = {" CN14A ", 60}, caodang ; hoặc: Lop daihoc = {" CN14A ", 60}, caodang ; COMPANY LOGO www.themegallery.com 5.2 Truy nhập các thành phần Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 8  Đối với biến thường: Tên biến.Tên thành phần  Đối với biến con trỏ : Tên biến -> Tên thành phần  Đối với biến mảng: Truy nhập thành phần mảng rồi đến thành phần cấu trúc.  Đối với cấu trúc lồng nhau. Truy nhập thành phần ngoài rồi đến thành phần của cấu trúc bên trong, sử dụng các phép toán . hoặc -> (các phép toán lấy thành phần) một cách thích hợp. COMPANY LOGO www.themegallery.com Ví dụ Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 9 #include #include using namespace std; int main() { struct sinhvien //Khai báo cấu trúc sinhvien { char ten[33]; int tuoi; char que_quan[33]; }*p; sinhvien a={"Ly Minh Tai", 22, "Hai Duong"}; cout<<a.tuoi<<endl; // Xuất ra 22 p=new sinhvien; strcpy(p->ten, a.ten); Copy thành phần ten tử cấu trúc a sang p coutten; // Xuất ra Ly Minh Tai } COMPANY LOGO www.themegallery.com 5.3 Hàm với cấu trúc Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 10 A. Con trỏ và địa chỉ cấu trúc Một con trỏ cấu trúc cũng giống như con trỏ trỏ đến các kiểu dữ liệu khác, có nghĩa nó chứa địa chỉ của một biến cấu trúc hoặc một vùng nhớ có kiểu cấu trúc nào đó B. Địa chỉ của các thành phần của cấu trúc Các thành phần của một cấu trúc cũng giống như các biến, do vậy cách lấy địa chỉ của các thành phần này cũng tương tự như đối với biến bình thường. COMPANY LOGO www.themegallery.com Ví dụ: Con trỏ và địa chỉ cấu trúc Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 11 #include using namespace std; int main() { struct sinhvien { char ten[33]; int tuoi; char que_quan[33]; }*p,*q, a[20], b={"Ly Minh Tai", 22, "Nam Dinh"}; p=&b; a[4]=b; //Cho p trỏ vào b, a[4] gán bằng b coutten<<endl; // Xuất ra Ly Minh Tai q=&a[4]; Cho q trỏ vào a[4] coutque_quan; // Xuất ra Nam Dinh } COMPANY LOGO www.themegallery.com Ví dụ: Địa chỉ của các thành phần của cấu trúc Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 12 #include using namespace std; int main() { struct sinhvien { char ten[33]; int tuoi; char que_quan[33]; }b={"Tran Viet Hoang",19,"Ca Mau"}; int *t; char *ht; t=&(b.tuoi); // t trỏ vào thành phần tuoi của b ht=b.ten; // ht trỏ vào thành phần ten của b (không cần dấu &) cout<<ht<<" "<<*t<<" tuoi"; //Tran Viet Hoang 19 tuoi } COMPANY LOGO www.themegallery.com 5.3 Hàm với cấu trúc Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 13 C. Đối của hàm là cấu trúc Một cấu trúc có thể được sử dụng để làm đối của hàm dưới các dạng sau đây:  Là một biến cấu trúc, khi đó tham đối thực sự là một cấu trúc.  Là một con trỏ cấu trúc, tham đối thực sự là địa chỉ của một cấu trúc.  Là một tham chiếu cấu trúc, tham đối thực sự là một cấu trúc.  Là một mảng cấu trúc hình thức hoặc con trỏ mảng, tham đối thực sự là tên mảng cấu trúc. COMPANY LOGO www.themegallery.com Ví dụ: Sử dụng cấu trúc làm đối số của hàm Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 14 #include using namespace std; struct so_thuc{ //Khai báo cấu trúc so_thuc int phan_nguyen; unsigned thap_phan;}; void hien(so_thuc a); int main() { so_thuc x={-222,178}; // x là cấu trúc so_thuc hien(x); // Đối số x là một cấu trúc } void hien(so_thuc a) // Hàm hiện số thực { cout<<a.phan_nguyen<<"."<<a.thap_phan; } COMPANY LOGO www.themegallery.com 5.3 Hàm với cấu trúc Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 15 D. Giá trị hàm là cấu trúc Cũng tương tự như các kiểu dữ liệu cơ bản, giá trị trả lại của một hàm cũng có thể là các cấu trúc dưới các dạng sau:  Là một biến cấu trúc.  Là một con trỏ cấu trúc.  Là một tham chiếu cấu trúc. COMPANY LOGO www.themegallery.com Ví dụ Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 16 #include using namespace std; struct so_phuc{ float thuc; float ao;}; so_phuc tong(so_phuc a, so_phuc b) { so_phuc kq; kq.thuc=a.thuc+b.thuc; kq.ao=a.ao+b.ao; return kq; } int main() { so_phuc x={1,23}, y={2,22}, z; z = tong(x, y); cout<<z.thuc<<"+"<<z.ao<<"*i"; } COMPANY LOGO www.themegallery.com 5.4 Câu lệnh typedef Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 17 Để thuận tiện trong sử dụng, thông thường các kiểu được người sử dụng tạo mới sẽ được gán cho một tên kiểu bằng câu lệnh typedef như sau: typedef ; Ví dụ: Có thể đặt tên cho kiểu ngày tháng là Date với khai báo sau: typedef struct Date { int ng; int th; int nam; }; COMPANY LOGO www.themegallery.com 5.5 Hàm sizeof() Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 18 Hàm sizeof() trả lại kích thước của một biến hoặc kiểu. Ví dụ: #include using namespace std; int main() { double x; struct date{ int ngay; int thang; int nam; }y; cout<<sizeof(x)<<endl; // Xuất ra 8 cout<<sizeof(y); //Xuất ra 12 ( kiểu int kích thước là 4) } COMPANY LOGO www.themegallery.com Bài tập chương 5 Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 19 Bài 1. Cho phân số dưới dạng cấu trúc gồm 2 thành phần là tử và mẫu. Viết chương trình nhập 2 phân số, in ra tổng, tích, hiệu, thương của chúng dưới dạng tối giản. Bài 2. Nhập một ngày tháng năm dưới dạng cấu trúc. Tính chính xác (kể cả năm nhuận) số ngày đã qua kể từ ngày 1/1/1 cho đến ngày đó. Bài 3. Hiện thứ của một ngày bất kỳ nào đó, lấy ngày thứ hiện tại để làm chuẩn. Bài 4. Viết chương trình nhập một mảng sinh viên, thông tin về mỗi sinh viên gồm họ tên và ngày sinh (kiểu cấu trúc). Sắp xếp mảng theo tuổi và in ra màn hình. Bài 5. Tính số ngày đã qua kể từ đầu năm cho đến ngày hiện tại. LOGO www.themegallery.com