Bài giảng Kỹ thuật lập trình Chương 3 Kiểu dữ liệu có cấu trúc cung cấp cho người học các kiến thức Khái niệm, khai báo, cách truy xuất thành phần bên trong cấu trúc, xử lý cấu trúc đơn, xử lý mảng có cấu trúc. Mời các bạn cùng tham khảo.
Lập trình C Chương Kiểu liệu có cấu trúc (3 tiết) Trần Minh Thái Email: minhthai@huflit.edu.vn Website: www.minhthai.edu.vn Cập nhật: 28/02/2017 Nội dung • Khái niệm • Khai báo • Cách truy xuất thành phần bên cấu trúc • Xử lý cấu trúc đơn • Xử lý mảng có cấu trúc • Bài tập KHÁI NIỆM VÀ KHAI BÁO Khái niệm Là kiểu liệu (KDL) lập trình viên tự định nghĩa bằng cách gom nhóm KDL C thành một KDL phức hợp gồm nhiều thành phần • Khai báo struct StructName { khai báo thuộc tính; }; typedef struct StructName NewDataType; Khái niệm • Ví dụ khai báo kiểu liệu lưu thông tin ngày: struct StructDate { char thu[10]; int ngay; int thang; int nam; }; typedef struct StructDate Date; TRUY CẬP CÁC THÀNH PHẦN TRONG CẤU TRÚC Truy cập thuộc tính cấu trúc • Biến kiểu cấu trúc NewDataType variableName; variableName.atributeName; • Ví dụ Date x; x.ngay = 5; Truy cập thuộc tính cấu trúc • Biến trỏ kiểu cấu trúc NewDataType *pointerName; pointerName -> attributeName; Ví dụ: Date *x ; x = (Date*) malloc(sizeof(Date)); x -> = ; Khai báo đệ quy struct StructName { khai báo thuộc tính; struct StructName *attributeName;; }; Khai báo đệ quy • Ví dụ: struct StructNode { int key; struct StructNode *pNext; }; 10 Ví dụ void Xuat (Diem d) { printf("Toa diem: (%lf, %lf)", d.x, d.y); } Diem Tong (Diem d1, Diem d2) { Diem temp; temp.x = d1.x + d2.x ; temp.y = d1.y + d2.y ; return temp; } 13 Ví dụ double TinhKhoangCach(Diem A, Diem B) { return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y)); } 14 int main() { Diem A , B, AB; double kc; printf("Nhap vao toa diem A: "); Nhap(A); printf("Toa diem A: "); Xuat(A); printf("\nNhap vao toa diem B: "); Nhap(B); printf("Toa diem B: "); Xuat(B); printf("\n Toa tong cua A va B: "); AB = Tong (A, B); Xuat (AB); kc=TinhKhoangCach(A, B); printf("\nKhoang cach A va B: %lf", kc); getch(); return 0; } BÀI TẬP 16 Bài tập Viết chương trình nhập vào thông tin một sinh viên có cấu trúc sau: • Mã số sinh viên (mssv) • Họ tên (hoTen) • Điểm kỳ (gk) • Điểm thực hành (th) • Điểm lý thuyết (lt) Tính điểm tổng kết môn theo công thức: gk*10%+th*30%+lt*60% 17 Bài tập Sử dụng KDL có cấu trúc để khai báo viết chương trình gồm chức sau: Nhập vào phân số Tính tổng tích hai phân số (kết phải là phân số tối giản) Xuất kết hình 18 Bài tập Viết chương trình nhập vào thời gian t1 t2 (thông tin thời gian gồm: giờ, phút giây); tính khoảng cách t1 t2 (đơn vị tính bằng giây) 19 MẢNG CÓ CẤU TRÚC 20 Mảng cấu trúc • Cách khai báo tương tự mảng một chiều (KDL mảng KDL có cấu trúc) • Cách truy cập phần tử mảng cũng truy cập mảng một chiều Nhưng từng phần tử có kiểu cấu trúc nên phải chỉ định rõ cần lấy thành phần (truy cập đến thành phần cuối cùng có KDL bản) 21 Nguyên tắc lập trình mảng cấu trúc Do kiểu liệu có cấu trúc chứa nhiều thành phần nên viết chương trình loại ta cần: Xây dựng hàm xử lý cho một kiểu cấu trúc Muốn xử lý cho mảng cấu trúc, gọi hàm xử lý cho một kiểu cấu trúc bằng cách dùng vòng lặp 22 22 Ví dụ Viết hàm nhập vào mảng phân số struct StructPhanSo { int tu; int mau; }; typedef struct StructPhanSo PhanSo; 23 Ví dụ void Nhap1PhanSo (PhanSo &ps) { printf("Nhap tu so: "); scanf("%d " , &ps.tu); printf("\nNhap mau so: “); scanf(“%d”, &ps.mau); } 24 Ví dụ void NhapMang (PhanSo dsps[], int n) { for(int i=0; i