Bài giảng Cơ sở lập trình 1 - Chương 8: Kiểu dữ liệu cấu trúc (structure)
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Cơ sở lập trình 1 - Chương 8: Kiểu dữ liệu cấu trúc (structure)", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- bai_giang_co_so_lap_trinh_1_chuong_8_kieu_du_lieu_cau_truc_s.pptx
Nội dung text: Bài giảng Cơ sở lập trình 1 - Chương 8: Kiểu dữ liệu cấu trúc (structure)
- Chương 8 KIỂU DỮ LIỆU CẤU TRÚC (structure) Khoa Hệ thống thông tin quản lý Hà Nội – 2013
- Nội dung 1 Khái niệm kiểu cấu trúc (struct) 2 Các thao tác với cấu trúc 3 Mảng cấu trúc 4 Con trỏ cấu trúc 5 Chuyển tham số struct cho hàm 6 Union 23/05/2021 Chương 8-Kiểu dữ liệu cấu trúc 2
- 1. Khái niệm kiểu cấu trúc o Kiểu cấu trúc (struct) n Là kiểu dữ liệu bao gồm nhiều thành phần có kiểu khác nhau, mỗi thành phần được gọi là một trường (field) n Kiểu cấu trúc và mảng: o Các phần tử của mảng là cùng kiểu o Các phần tử của cấu trúc có thể có kiểu khác nhau n Struct được dùng để định nghĩa các kiểu dữ liệu mới 23/05/2021 Chương 8-Kiểu dữ liệu cấu trúc 3/28
- Khai báo cấu trúc o Khai báo trực tiếp struct { ; ; } , ; o Ví dụ n Khai báo cấu trúc NgayThang gồm 3 trường: ngày, tháng, năm struct NgayThang { unsigned char Ngay; unsigned char Thang; unsigned int Nam; } date1,date2; 23/05/2021 Chương 8-Kiểu dữ liệu cấu trúc 4/28
- Khai báo cấu trúc (tt) o Khai báo gián tiếp typedef struct { ; ; } ; o Ví dụ n Khai báo kiểu cấu trúc NgayThang gồm 3 trường: ngày, tháng, năm typedef struct { unsigned char Ngay; unsigned char Thang; unsigned int Nam; } NgayThang; 23/05/2021 Chương 8-Kiểu dữ liệu cấu trúc 5/28
- Khai báo cấu trúc lồng nhau o Ví dụ: n Khai báo cấu trúc SinhVien gồm: mã sinh viên, họ tên, ngày sinh (thuộc kiểu ngaythang ở trên), giới tính, địa chỉ Khai báo trực tiếp Khai báo gián tiếp struct SinhVien typedef struct { { char Masv[10]; char Masv[10]; char Hoten[40]; char Hoten[40]; NgayThang NgaySinh; NgayThang NgaySinh; int Gioitinh; int Gioitinh; char Diachi[50]; char Diachi[50]; } SinhVien; }; 23/05/2021 Chương 8-Kiểu dữ liệu cấu trúc 6/28
- Khai báo biến kiểu cấu trúc o Khai báo biến kiểu cấu trúc n Khai báo tương tự như khai báo biến thuộc kiểu dữ liệu chuẩn n Với cách khai báo cấu trúc trực tiếp, có thể khai báo biến ngay khi khai báo cấu trúc n Ví dụ 1: Khai báo biến A và B struct Diem { float x; float y; } A,B; n Ví dụ 2: Khai báo biến SV1,SV2 có kiểu SinhVien SinhVien SV1,SV2; 23/05/2021 Chương 8-Kiểu dữ liệu cấu trúc 7/28
- 2. Các thao tác với cấu trúc o Khởi tạo cấu trúc n Biến cấu trúc có thể được khởi tạo giá trị trong lúc khai báo. n Các trường của cấu trúc được đặt giữa cặp dấu { và }, ngăn cách bằng dấu phẩy (,) n Ví dụ: Khởi tạo biến cấu trúc ngaysinh struct NgayThang NgaySinh={01,08,1991} 23/05/2021 Chương 8-Kiểu dữ liệu cấu trúc 8/28
- Truy cập vào phần tử struct o Đặc điểm n Không thể truy xuất trực tiếp n Thông qua toán tử thành phần cấu trúc . hay còn gọi là toán tử chấm (dot operation) o Cú pháp . o Ví dụ: n Viết ra toạ độ điểm A trong khai báo trên printf(“x = %f, y = %f”, A.x, A.y); o Chú ý: n Các biến cấu trúc có thể gán cho nhau, vd: B=A; n KHÔNG thực hiện được các hàm nhập xuất, các phép quan hệ, số học, logic trên biến cấu trúc 23/05/2021 Chương 8-Kiểu dữ liệu cấu trúc 9/28
- Gán dữ liệu kiểu cấu trúc o Có 2 cách = ; . = ; o Ví dụ struct Diem { int x, y; } diem1 = {2912, 1706}, diem2; diem2 = diem1; diem2.x = diem1.x; diem2.y = diem1.y * 2; 23/05/2021 Chương 8-Kiểu dữ liệu cấu trúc 10/28
- Cấu trúc phức tạp o Cấu trúc đệ quy (tự trỏ) struct PERSON { char hoten[30]; struct PERSON *father, *mother; }; struct NODE { int value; struct NODE *pNext; }; n Sử dụng để tạo danh sách liên kết (đơn – LIFO, FIFO, kép, vòng) 23/05/2021 Chương 8-Kiểu dữ liệu cấu trúc 11/28
- Ví dụ - Nhập/in thông tin sinh viên o Viết chương trình nhập từ bàn phím thông tin về 1 sinh viên, in các thông tin đó ra màn hình typedef struct { unsigned char Ngay; unsigned char Thang; unsigned int Nam; } NgayThang; typedef struct { char MSSV[10]; char HoTen[40]; NgayThang NgaySinh; int Gioitinh; char DiaChi[40]; } SinhVien; 23/05/2021 Chương 8-Kiểu dữ liệu cấu trúc 12/28
- Ví dụ - Nhập/in thông tin sinh viên void InSV(SinhVien s) { printf("MSSV: | Ho va ten | Ngay Sinh | Dia chi\n"); printf("%s | %s | %d-%d-%d |%s\n", s.MSSV, s.HoTen, s.NgaySinh.Ngay,s.NgaySinh.Thang,s.NgaySinh.Nam,s.DiaChi); } int main() { SinhVien SV1, SV2; printf("Nhap MSSV: ");gets(SV1.MSSV); printf("Nhap Ho va ten: ");gets(SV1.HoTen); printf("Sinh ngay: ");scanf("%d",&SV1.NgaySinh.Ngay); printf("Thang: ");scanf("%d",&SV1.NgaySinh.Thang); printf("Nam: ");scanf("%d",&SV1.NgaySinh.Nam); pintf("Gioi tinh (0: Nu), (1: Nam):"); scanf("%d",&SV1.Gioitinh); fflush(stdin);// Xoa bo nho dem printf("Dia chi: ");gets(SV1.DiaChi); InSV(SV1); SV2=SV1; /* Gan thong tin cua SV1 cho SV2*/ InSV(SV2); 23/05/2021} Chương 8-Kiểu dữ liệu cấu trúc 13/28
- Ví dụ - Tính tổng 2 số phức o Nhập vào 2 số phức, tính tổng và in kết quả typedef struct { float Thuc; float Ao; } SoPhuc; void InSoPhuc(SoPhuc p) { printf("%.2f + i%.2f\n",p.Thuc,p.Ao); } int main() { SoPhuc p1,p2,p; printf("Nhap so phuc thu nhat:\n"); printf("Phan thuc: ");scanf("%f",&p1.Thuc); printf("Phan ao: ");scanf("%f",&p1.Ao); 23/05/2021 Chương 8-Kiểu dữ liệu cấu trúc 14/28
- Ví dụ - Tính tổng 2 số phức printf("Nhap so phuc thu hai:\n"); printf("Phan thuc: ");scanf("%f",&p2.Thuc); printf("Phan ao: ");scanf("%f",&p2.Ao); printf("So phuc thu nhat: "); InSoPhuc(p1); printf("So phuc thu hai: "); InSoPhuc(p2); p.Thuc = p1.Thuc+p2.Thuc; p.Ao = p1.Ao + p2.Ao; printf("Tong 2 so phuc: "); InSoPhuc(p); getch(); } 23/05/2021 Chương 8-Kiểu dữ liệu cấu trúc 15/28
- 3. Mảng cấu trúc o Mảng cấu trúc n Khai báo tương tự như mảng với kiểu dữ liệu cơ sở (char, int, float, ) o Ví dụ: n Khai báo mảng để lưu danh sách sinh viên struct SinhVien DanhSach[100]; n Mảng các struct cũng được đánh chỉ số từ 0 n Truy cập đến Hoten của sinh viên thứ i DanhSach[i].Hoten o Bài tập Nhập vào danh sách n sinh viên, in danh sách vừa nhập ra màn hình 23/05/2021 Chương 8-Kiểu dữ liệu cấu trúc 16/28
- 4. Con trỏ cấu trúc o C cho phép sử dụng con trỏ trỏ tới cấu trúc cũng như các con trỏ trỏ tới các kiểu dữ liệu khác o Khai báo struct * ; Khi khai báo, con trỏ chưa trỏ tới địa chỉ cụ thể nào. o Ví dụ: Khai báo một con trỏ cấu trúc kiểu NgayThang ở trên struct NgayThang *p; struct NgayThang date; p=&date; Khi đó, p sẽ chứa địa chỉ của date 23/05/2021 Chương 8-Kiểu dữ liệu cấu trúc 17/28
- Con trỏ cấu trúc (tt) o Truy cập đến các trường của cấu trúc đang được quản lý bởi con trỏ n Sử dụng toán tử mũi tên (->) n Sử dụng toán tử lấy giá trị (*) p->Ngay là tương đương (*p).Ngay o Ví dụ: Viết ra ngày-tháng-năm struct NgayThang *p; //Sử dụng toán tử mũi tên printf("%d-%d-%d",p->Ngay,p->Thang,p->Nam); //Sử dụng toán tử * printf("%d-%d-%d",(*p).Ngay,(*p).Thang,(*p).Nam); 23/05/2021 Chương 8-Kiểu dữ liệu cấu trúc 18/28
- 5. Chuyển tham số struct cho hàm o Tham số của hàm có thể là n Từng trường của cấu trúc n Biến cấu trúc (tham số thực sự là giá trị cấu trúc) n Con trỏ cấu trúc (tham số thực sự là địa chỉ của biến cấu trúc) n Con trỏ cấu trúc hoặc mảng cấu trúc (tham số thực sự là tên mảng cấu trúc) o Hàm có thể trả về n Giá trị cấu trúc n Con trỏ cấu trúc 23/05/2021 Chương 8-Kiểu dữ liệu cấu trúc 19/28
- Ví dụ - Số phức o Khai báo kiểu số phức, viết các hàm n SoPhuc cong(SoPhuc u, SoPhuc v); trả về tổng của các giá trị phức u,v. n void InSP(SoPhuc u); dùng để in số phức u typedef struct { float Thuc; float Ao; } SoPhuc; //Ham tinh tong 2 so phuc u,v SoPhuc cong(SoPhuc u, SoPhuc v) { SoPhuc tong; tong.Thuc=u.Thuc+v.Thuc; tong.Ao=u.Ao+v.Ao; return tong; } 23/05/2021 Chương 8-Kiểu dữ liệu cấu trúc 20/28
- Ví dụ - Số phức (tt) void InSoPhuc(SoPhuc u) { printf("%.2f + i%.2f\n",u.Thuc,u.Ao); } int main() { SoPhuc p1,p2,p; printf("Nhap so phuc thu nhat:\n"); printf("Phan thuc: ");scanf("%f",&p1.Thuc); printf("Phan ao: ");scanf("%f",&p1.Ao); printf("Nhap so phuc thu hai:\n"); printf("Phan thuc: ");scanf("%f",&p2.Thuc); printf("Phan ao: ");scanf("%f",&p2.Ao); printf("Tong 2 so phuc: "); InSoPhuc(cong(p1,p2)); getch(); } 23/05/2021 Chương 8-Kiểu dữ liệu cấu trúc 21/28
- 6. Union o Khái niệm n Được khai báo và sử dụng như cấu trúc n Các thành phần của union có chung địa chỉ đầu (nằm chồng lên nhau trong bộ nhớ) o Khai báo union { ; ; }; 23/05/2021 Chương 8-Kiểu dữ liệu cấu trúc 22/28
- So sánh struct và union o Ví dụ struct MYSTRUCT union MYUNION { { char c; char c; int n; int n; } s; } u; s.c = 1; s.n = 2; u.c = 1; u.n = 2; 0 1 2 3 4 0 1 2 3 01 02 00 00 00 0102 00 00 00 c n c n 23/05/2021 Chương 8-Kiểu dữ liệu cấu trúc 23/28
- Bài tập thực hành 1. Phân số n Khai báo kiểu dữ liệu phân số (PHANSO) n Nhập/Xuất phân số n Rút gọn phân số n Tính tổng, hiệu, tích, thương hai phân số n Kiểm tra phân số tối giản n Quy đồng hai phân số n So sánh hai phân số 23/05/2021 Chương 8-Kiểu dữ liệu cấu trúc 24/28
- Bài tập thực hành 2. Mảng phân số n Nhập/Xuất n phân số n Rút gọn mọi phân số n Đếm số lượng phân số âm/dương trong mảng n Tìm phân số dương đầu tiên trong mảng n Tìm phân số nhỏ nhất/lớn nhất trong mảng n Sắp xếp mảng tăng dần/giảm dần 23/05/2021 Chương 8-Kiểu dữ liệu cấu trúc 25/28
- Bài tập thực hành 3. Điểm trong mặt phẳng Oxy n Khai báo kiểu dữ liệu điểm (DIEM) n Nhập/Xuất tọa độ 2 điểm A và B n Tính khoảng cách giữa hai điểm A và B n Tìm điểm đối xứng qua gốc toạ độ/trục Ox/Oy 4. Tam giác n Khai báo kiểu dữ liệu tam giác (TAMGIAC) n Nhập/Xuất tam giác n Tính chu vi, diện tích tam giác 23/05/2021 Chương 8-Kiểu dữ liệu cấu trúc 26/28
- Bài tập thực hành 5. Mảng điểm n Nhập/Xuất n điểm n Đếm số lượng điểm có hoành độ dương n Tìm điểm có hoành độ lớn nhất/nhỏ nhất n Tìm điểm gần gốc tọa độ nhất 6. Quản lý học sinh n Khai báo kiểu dữ liệu học sinh (HOCSINH) n Nhập n học sinh với các thuộc tính: Họ tên, năm sinh, điểm toán, lý, hoá, tổng điểm. (Tổng điểm = toán + lý + hoá, được tính sau khi nhập các điểm toán, lý, hoá) 23/05/2021 Chương 8-Kiểu dữ liệu cấu trúc 27/28
- Bài tập thực hành 6. Quản lý học sinh n Sắp xếp danh sách theo thứ tự giảm của tổng điểm, in kết quả ra màn hình n Tìm kiếm theo họ và tên của học sinh, đưa kết quả ra màn hình. n In ra màn hình các thí sinh có tổng điểm lớn hơn 15 23/05/2021 Chương 8-Kiểu dữ liệu cấu trúc 28/28