kỹ thuật lập trình,đặng bình phương,dhkhtnhcm Kiểu dữ liệu có cấu trúc Giáo trình Bài Tập Kỹ Thuật Lập Trình Trang 78 CHƯƠNG 7 KIỂU DỮ LIỆU CÓ CẤU TRÚC Cung cấp cơ chế cho phép khai báo các kiểu dữ li[.]
Kiểu liệu có cấu trúc CHƯƠNG KIỂU DỮ LIỆU CÓ CẤU TRÚC Cung cấp chế cho phép khai báo kiểu liệu để giải theo yêu cầu toán dựa vào kiểu liệu cài đặt sẵn ngôn ngữ lập trình I TĨM TẮT LÝ THUYẾT I.1 Khái niệm Cấu trúc (struct) thực chất kiểu liệu người dùng định nghĩa cách gom nhóm kiểu liệu có sẵn C thành kiểu liệu c om phức hợp nhiều thành phần I Định nghĩa kiểu liệu an co struct < tên cấu trúc > { Các kiểu liệu thành phần ; }; ng Cú pháp du on Cú pháp g liệu có th Ngồi ta dùng từ khố typedef để định nghĩa tên cho kiểu typedef struct < tên cấu trúc > < tên >; u Ví dụ1: Kiểu liệu DATE gồm thành phần: cu • Thứ (thu): chuỗi có tối đa ký tự • Ngày (ngay): số nguyên byte • Tháng (thang): số nguyên byte • Năm (nam): số nguyên bytes Ta định nghĩa DATE sau: struct DATE { char thu[5]; unsigned char ngay; unsigned char thang; int nam; }; typedef struct DATE d; Giáo trình Bài Tập Kỹ Thuật Lập Trình CuuDuongThanCong.com Trang 78 https://fb.com/tailieudientucntt Kiểu liệu có cấu trúc Kiểu liệu có cấu trúc lồng vào Ví dụ 2: Định nghĩa kiểu liệu học sinh HOCSINH gồm: • Mã số học sinh (MSHS): chuỗi có tối đa ký tự • Họ tên (hoten): chuỗi có tối đa 30 ký tự • Ngày tháng năm sinh (ngaysinh): kiểu DATE • Địa (diachi): chuỗi có tối đa 50 ký tự • Giới tính (phai): chuỗi có tối đa ký tự • Điểm trung bình (diemtb): số thực ng u du on g th an typedef struct HOCSINH { char MSHS[6]; char hoten[31]; struct DATE ngaysinh; char diachi[51]; unsigned char phai[4]; float diemtb; }; co struct DATE { char thu[5]; unsigned char ngay; unsigned char thang; int nam; }; c om Ta định nghĩa kiểu HOCSINH sau: cu # Khi định nghĩa kiểu liệu struct lồng nhau, ta cần lưu ý: Kiểu liệu sử dụng phải khai báo phía I.3 Khai báo Khi ta định nghĩa kiểu liệu tức ta có kiểu liệu mới, muốn sử dụng ta phải khai báo biến Cú pháp khai báo kiểu liệu giống cách khai báo kiểu liệu chuẩn struct < tên cấu trúc > < tên biến > ; Ví dụ : struct DATE x ; // Khai bao bien x co kieu du lieu DATE Giáo trình Bài Tập Kỹ Thuật Lập Trình CuuDuongThanCong.com Trang 79 https://fb.com/tailieudientucntt Kiểu liệu có cấu trúc Tuy nhiên ta định nghĩa struct có dùng từ khố typedef ta khai báo trực tiếp mà khơng cần từ khố “struct” Ví dụ : DATE x ; // Khai bao bien x co kieu DATE *Biến trỏ kiểu cấu trúc: Ngồi cách khai báo ta khai báo theo kiểu trỏ sau struct < tên cấu trúc > *< tên biến > ; Để sử dụng ta phải cấp phát vùng nhớ giống kiểu liệu chuẩn Ví dụ : // Khai bao tro y kieu cau truc DATE c om DATE *y; y = ( DATE * ) malloc ( sizeof ( DATE )) ; I.4 Truy xuất ng Để truy xuất thành phần liệu bên cấu trúc ta có trường hợp co truy xuất sau : an • Biến x biến cấu trúc thơng thường, ta dùng tốn tử dấu chấm “.” th Cú pháp : < Tên cấu trúc >.< Biến thành phần >; du on g Ví dụ : DATE x ; // khai bao bien x kieu DATE x.ngay = ; // gan bang u • Biến x biến trỏ, ta dùng toán tử mũi tên “->“ (Gồm dấu trừ ‘–‘ cu dấu lớn ‘>’) Cú pháp : < Tên cấu trúc > -> < Biến thành phần >; Ví dụ : DATE *x ; // khai bao bien x kieu tro DATE x -> = ; // gan bang # Đối với kiểu liệu có struct lồng phải truy cập đến thành phần cuối có kiểu liệu Ví dụ: Giả sử, có kiểu HOCSINH HOCSINH hs; // khai bao bien hs kieu HOCSINH Muốn in học sinh A sinh vào tháng ta phải truy cập sau: Giáo trình Bài Tập Kỹ Thuật Lập Trình CuuDuongThanCong.com Trang 80 https://fb.com/tailieudientucntt Kiểu liệu có cấu trúc printf(“Thang sinh cua hoc sinh A la: %d”,(hs.ngaysinh).thang); I.5 Ví dụ minh hoạ Viết chương trình nhập vào toạ độ hai điểm mặt phẳng tính tổng hai toạ độ #include #include th an co ng void Nhap (DIEM &d) { printf (“\nNhap vao tao diem\n”); printf (“Tung : “); scanf (“%d”, & d x); printf (“Hoanh : ”); scanf (“%d”, & d.y); } c om typedef struct DIEM //khai bao mot kieu du lieu DIEM gom toa x va y { int x; int y; }; du on g void Xuat (DIEM d) { printf (“\nToa diem : (%d , %d)”,d.x,d.y); } cu u DIEM Tong (DIEM d1,DIEM d2) { DIEM temp; temp.x = d1.x + d2.x ; temp.y = d1.y + d2.y ; return Temp; } void main () { DIEM A , B, AB; //khai bao diem A, B, AB; clrscr (); Nhap ( A ); Xuat ( A ); Nhap ( B ); Xuat ( B ); printf (“\n Tong cua hai diem vua nhap la : ”); AB = Tong ( A, B); Xuat ( AB ); Giáo trình Bài Tập Kỹ Thuật Lập Trình CuuDuongThanCong.com Trang 81 https://fb.com/tailieudientucntt Kiểu liệu có cấu trúc getch (); } I.6 Mảng cấu trúc • Cách khai báo tương tự mảng chiều hay ma trận (Kiểu liệu kiểu liệu có cấu trúc) • Cách truy cập phần tử mảng truy cập mảng chiều hay ma trận Nhưng phần tử có kiểu cấu trúc nên phải định rõ cần lấy thành phần nào, tức phải truy cập đến thành phần cuối có c om kiểu liệu (xem lại bảng kiểu liệu bản) I.7 Ngun tắc viết chương trình có mảng cấu trúc chương trình loại ta cần lưu ý: ng Do kiểu liệu có cấu trúc thường chứa nhiều thành phần nên viết co • Xây dựng hàm xử lý cho kiểu cấu trúc • Muốn xử lý cho mảng cấu trúc, ta gọi lại hàm xử lý cho kiểu cấu trúc an xây dựng cách dùng vịng lặp th Ví dụ 1: Cho lớp học gồm n học sinh (n≤50) Thông tin học sinh g mô tả ví dụ 2, mục I.2 Hãy viết chương trình nhập xuất danh sách học du on sinh sau đếm xem có học sinh lên lớp (Điều kiện lên lớp điểm trung bình ≥ 5.0) Cách làm: u Trước hết ta phải xây dựng hàm nhập xuất cho học sinh cu - Xây dựng hàm nhập xuất ngày tháng năm (Kiểu liệu DATE) - Sau xây dựng hàm nhập xuất cho danh sách học sinh #define MAX 50 struct DATE { char thu[5]; unsigned char ngay; unsigned char thang; int nam; }; typedef struct HOCSINH { char MSHS[6]; char hoten[31]; struct DATE ngaysinh; Giáo trình Bài Tập Kỹ Thuật Lập Trình CuuDuongThanCong.com Trang 82 https://fb.com/tailieudientucntt Kiểu liệu có cấu trúc char diachi[51]; unsigned char phai[4]; float diemtb; }; void NhapNamSinh(DATE &d); void XuatNamSinh(DATE d); void Nhap1HS (HOCSINH &hs); void Xuat1HS (HOCSINH hs); void NhapDSHS(HOCSINH lh[], int &n); void XuatDSHS(HOCSINH lh[], int n); int DemHSLenLop(HOCSINH lh[], int n); an co ng c om void main() { HOCSINH lh[MAX]; //Khai báo mảng lh gồm có tối đa 50 học sinh int n, sohsdau; NhapDSHS(lh, n); XuatDSHS(lh, n); sohsdau = DemHSLenLop(lh, n); printf(“\nSo luong hoc sinh duoc len lop la: %d”, sohsdau); getch(); } cu u du on g th void NhapNamSinh(DATE &d) { printf(“\nNhap vao ngay: ”); scanf(“%u”, &d.ngay); printf(“\nNhap vao thang: ”); scanf(“%u”, &d.thang); printf(“\nNhap vao nam: ”); scanf(“%d”, &d.nam); } void XuatNamSinh(DATE d) { printf(“%02u / %02u / %4d”, d.ngay, d.thang, d.nam); } void Nhap1HS(HOCSINH &hs) { float d; lushall(); //Xoa vung dem printf(“\nNhap ma so hoc sinh: ”); gets(hs.MSHS); printf(“\nNhap ho ten hoc sinh: ”); gets(hs.hoten); printf(“\nNhap thang nam sinh: ”); Giáo trình Bài Tập Kỹ Thuật Lập Trình CuuDuongThanCong.com Trang 83 https://fb.com/tailieudientucntt Kiểu liệu có cấu trúc flushall(); //Xoa vung dem NhapNamSinh(hs.ngaysinh); printf(“\nNhap vao dia chi: ”); flushall(); //Xoa vung dem gets(hs.diachi); printf(“\nPhai: ”); gets(hs.phai); printf(“\nNhap vao diem trung binh: ”); flushall(); //Xoá vùng đệm scanf(“%f”, &d);//Nhập vào biến tạm d sau gán vào hs.diemtb hs.diemtb=d; } an co ng c om void NhapDSHS(HOCSINH lh[], int &n) { printf(“\nNhap vao so luong hoc sinh: ”); scanf(“%d”, &n); for(int i=0; i