7.1. Khái niệm cấu trúc Trong C, structure (gọi tắt là struct) ~ kiểu dữ liệu bản ghi (record) trong Pascal. Kiểu dữ liệu cấu trúc (struct) là kiểu dữ liệu phức hợp bao gồm nhiều thành phần, mỗi thành phần có thể thuộc những kiểu dữ liệu khác nhau. Các thành phần dữ liệu trong cấu trúc được gọi là các trường dữ liệu (field).
31 trang |
Chia sẻ: thanhle95 | Lượt xem: 472 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Bài giảng Tin học đại cương - Bài 7: Cấu trúc - Nguyễn Thanh Hùng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
1TIN HỌC ĐẠI CƯƠNGPHẦN 2: LẬP TRÌNH BẰNG NGÔN NGỮ CBÀI 7: CẤU TRÚC (struct)KHOA C¤NG NGHÖ TH¤NG TINFACULTY OF INFORMATION TECHNOLOGY2Bài 7: Cấu trúc (struct)7.1. Khái niệm cấu trúc7.2. Khai báo và sử dụng cấu trúc7.3. Xử lí dữ liệu cấu trúc7.4. Mảng cấu trúc7.5. Bài tập 3Bài 7: Cấu trúc (struct)7.1. Khái niệm cấu trúc7.2. Khai báo và sử dụng cấu trúc7.3. Xử lí dữ liệu cấu trúc7.4. Mảng cấu trúc7.5. Bài tập 47.1. Khái niệm cấu trúcTrong C, structure (gọi tắt là struct) ~ kiểu dữ liệu bản ghi (record) trong Pascal.Kiểu dữ liệu cấu trúc (struct) là kiểu dữ liệu phức hợp bao gồm nhiều thành phần, mỗi thành phần có thể thuộc những kiểu dữ liệu khác nhau.Các thành phần dữ liệu trong cấu trúc được gọi là các trường dữ liệu (field).57.1. Khái niệm cấu trúc (tiếp)“Mô tả” đối tượng có nhiều phần thông tin, ví dụ quản lý hồ sơ cán bộ, sinh viên Ví dụ: Cấu trúc mô tả sinh viên:Cần lưu giữ các thông tin liên quan đến sinh viên như họ tên, tuổi, kết quả học tập Mỗi thông tin thành phần lại có kiểu dữ liệu khác nhauHọ tên có kiểu dữ liệu là xâu kí tựTuổi có kiểu dữ liệu là số nguyênKết quả học tập có kiểu dữ liệu là số thực.6Bài 7: Cấu trúc (struct)7.1. Khái niệm cấu trúc7.2. Khai báo và sử dụng cấu trúc7.3. Xử lí dữ liệu cấu trúc7.4. Mảng cấu trúc7.5. Bài tập 77.2.1. Khai báo kiểu dữ liệu cấu trúcCú pháp:struct ten_cau_truc{ ;};Ví dụ:struct Sinh_Vien{ char ma_so_sinh_vien[10]; char ho_va_ten[30]; float diem_TinDC; };87.2.2. Khai báo biến cấu trúcCú pháp: ten_cau_truc ten_bien_cau_truc;Hoặc: struct ten_cau_truc ten_bien_cau_truc;Ví dụ:Sinh_Vien a, b, c;Hoặc: struct Sinh_Vien a, b, c;97.2.3. Khai báo kết hợpCó thể kết hợp vừa khai báo kiểu dữ liệu cấu trúc vừa khai báo biến cấu trúc: struct [ten_cau_truc] { //khai_bao_cac_truong; } ten_bien_cau_truc;Ví dụ: struct Thi_Sinh { char SBD[10]; // so bao danh char ho_va_ten[30]; float ket_qua; } ts1, ts2;10Struct lồng nhauStruct có thể lồng nhau. Ví dụ:struct Dia_Chi{//địa chỉ int so_nha; char ten_pho[20]; char thanh_pho[20];};struct Nhan_Su{ //nhân sự char ho_ten[20]; Dia_Chi address; //trường address có kiểu địa chỉ float he_so_luong;};117.2.4. Định nghĩa kiểu dữ liệu cấu trúc với typedefĐặt tên mới cho kiểu dữ liệu cấu trúc cú pháp: typedef struct tên_cũ ten_moi;Hoặc có thể định nghĩa kiểu dữ liệu cấu trúc ngay khi khai báo bằng cú pháp typedef struct [tên_cũ] { //khai_bao_cac_truong; }danh_sach_cac_tên_mới;Lưu ý: Được phép đặt tên_mới trùng với tên_cũ.127.2.4. Định nghĩa kiểu dữ liệu cấu trúc với typedef (tiếp)Ví dụ: struct point_3D { float x, y, z; } P; struct point_3D M; typedef struct point_3D p_3D; p_3D N;137.2.4. Định nghĩa kiểu dữ liệu cấu trúc với typedef (tiếp)Ví dụ (tiếp):typedef struct hocsinh { char hoten[35]; char lop[7]; float diemtoan, diemly, diemhoa;} HOCSINH;HOCSINH hs1, hs2;14Bài 7: Cấu trúc (struct)7.1. Khái niệm cấu trúc7.2. Khai báo và sử dụng cấu trúc7.3. Xử lý dữ liệu cấu trúc7.4. Mảng cấu trúc7.5. Bài tập 157.3. Xử lý dữ liệu cấu trúc Truy nhập các trường dữ liệu của cấu trúcPhép gán giữa các biến cấu trúcCon trỏ cấu trúc167.3.1. Truy nhập các trường dữ liệu của cấu trúcCú pháp: ten_bien_cau_truc.ten_truongVí dụ:struct point_2D { char ten_diem; float x, y; } p;Truy cập tên của 1 điểm: p.ten_diem17Vấn đề vào ra dữ liệu cho các biến structCũng như dữ liệu kiểu mảng, không thể nhập/xuất dữ liệu trực tiếp cho struct mà cần phải nhập/xuất dữ liệu lần lượt cho từng trường của struct.Ví dụ, để nhập dữ liệu cho biến sv1, có thể viết như sau:printf(“Nhap SBD:”);scanf(“%d”,&sv1.sbd);printf(“Nhap ho ten:”); fflush(stdin); //xoá bộ đệm, nếu không sv1.sbd sẽ nhận giá trị “3” !!!gets(sv1.ho_ten);printf(“Nhap diem thi:”);scanf(“%f”,&sv1.diem_thi);//In kết quả ra màn hình:printf(“SBD:%d\nHo ten:%s\nDiem:%d”,sv1.sbd,sv1.ho_ten,sv1.diem_thi);187.3.2. Phép gán giữa các biến cấu trúcGiả sử ta có 2 biến cấu trúc là a và b có cùng kiểu dữ liệu là một cấu trúc nào đó.Phép gán cấu trúc có cú pháp tương tự như phép gán thông thường: bien_cau_truc_1 = bien_cau_truc_2;197.3.3. Con trỏ cấu trúcCú pháp:struct ten_cau_truc *ten_bien_con_tro_ctruc;Có 2 cách truy nhập vào trường dữ liệu của cấu trúc từ biến con trỏ cấu trúc là(*ten_bien_con_tro_ctruc).ten_truong_du_lieuHoặc: ten_bien_con_tro_ctruc->ten_truong_du_lieu20Con trỏ structVí dụ:struct SinhVien *p; //hoac SinhVien *p;struct SinhVien sv, *psv;//psv là con trỏprintf(“Nhap SBD:”);scanf(“%d”,&sv.sbd);psv = &sv;//lấy địa chỉ của biến svprintf(“SBD vua nhap:%d”, psv->sbd);printf(“Nhap lai SBD:”);scanf(“%d”,&(psv->sbd));printf(“SBD vua nhap:%d”, (*psv).sbd);21Chú ýTrong ví dụ trước, chúng ta rút ra một số nhận xét:&sv cho ta địa chỉ của struct sv*psv là nội dung của bản ghi có địa chỉ là psvpsv->sbd và (*psv).sbd là tương đương.22Bài 7: Cấu trúc (struct)7.1. Khái niệm cấu trúc7.2. Khai báo và sử dụng cấu trúc7.3. Xử lý dữ liệu cấu trúc7.4. Mảng cấu trúc7.5. Bài tập 237.4. Mảng cấu trúc Cú pháp: struct ten_cau_truc ten_mang_ctruc[so_ptu];Ví dụ: struct sinh_vien { char ho_ten[20]; float diem_thi; }; struct sinh_vien lop_Tin5[80];24Truyền tham số struct cho hàmHàm trong C cho phép truyền tham số là struct. Hãy xem ví dụ sau đây (hàm viết thông tin một sinh viên ra màn hình):void in_sinh_vien(sinh_vien sv){ printf(“\nHo ten: %s\nDiem thi: %4.1f, sv.ho_ten, sv.diem_thi);}Trong ví dụ trên, sv được truyền theo kiểu “tham trị”.Muốn truyền “tham biến”, hãy sử dụng con trỏ struct.25Ví dụ#include #include #include void main(){ struct sinh_vien { char ma_sv[10]; char ho_ten[20]; float diem_thi; }; struct sinh_vien sv[3]; int i; clrscr();26Ví dụ (tiếp)for(i=0;i<3;i++){ char str[20]; float diem; printf(“\nNhap thong tin cho sinh vien %d”,i+1); printf(“\nMa so sinh vien:”); fflush(stdin); gets(str); strcpy(sv[i].ma_sv,str); printf(“\n Ho va ten: “); fflush(stdin); gets(str); strcp(sv[i].ho_ten,str); printf(“\n Diem thi: “); scanf(“%f”,&diem); sv[i].diem_thi = diem;}27Ví dụ (tiếp) printf(“\n Thong tin ve cac sinh vien”); for(i=0;i<3;i++) { printf(“\n Sinh vien thu %d ”,i+1); printf(“%-10s %-20s %3.1f”, sv[i].ma_sv, sv[i].ho_ten, sv[i].diem_thi); } getch();} 28Ví dụ - Kết quảNhap thong tin cho sinh vien thu 1Ma so sinh vien: SV0032Ho va ten: Nguyen Thanh BinhDiem thi: 8.5Nhap thong tin cho sinh vien thu 2Ma so sinh vien: SV0002Ho va ten: Pham Hong PhucDiem thi: 9Nhap thong tin cho sinh vien thu 3Ma so sinh vien: SV0046Ho va ten: Le Minh HoaDiem thi: 10Thong tin ve cac sinh vienSinh vien thu 1: SV0032 Nguyen Thanh Binh 8.5Sinh vien thu 2: SV0002 Pham Hong Phuc 9.0Sinh vien thu 3: SV0046 Le Minh Hoa 10.029Bài tậpViết 1 chương trình thực hiện những công việc sau:Yêu cầu người dùng nhập vào một số nguyên dương n với 5 n 20 (có kiểm tra tính hợp lệ của giá trị được nhập vào, nếu giá trị n nhập vào không thỏa mãn điều kiện thì yêu cầu nhập lại)Yêu cầu người dùng nhập vào thông tin của n sinh viên gồm những mục sauHọ và tên: có kiểu dữ liệu là xâu kí tự gồm không quá 30 kí tựLớp: xâu kí tự có độ dài không quá 5 kí tựĐiểm thi Tin đại cương: là một số nguyên có giá trị từ 0 đến 10Đưa ra màn hình danh sách các sinh viên cùng thông tin của họ mà người dùng vừa nhập vào.30Bài tậpViết 1 chương trình thực hiện những công việc sau (tiếp):Yêu cầu người dùng nhập vào từ bàn phím một số thực. Đưa ra màn hình danh sách các sinh viên có điểm thi Tin đại cương nhỏ hơn giá trị số thực vừa nhập vào.Đưa ra màn hình danh sách sinh viên được sắp xếp theo chiều giảm dần của điểm thi Tin đại cương.Đưa ra màn hình danh sách sinh viên với họ và tên được sắp xếp theo chiều của bảng chữ cái.31Câu hỏi ?