Bài giảng Nhập môn lập trình: Kiểu dữ liệu cấu trúc

pdf 11 trang phuongnguyen 2730
Bạn đang xem tài liệu "Bài giảng Nhập môn lập trình: Kiểu dữ liệu cấu trúc", để 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:

  • pdfbai_giang_nhap_mon_lap_trinh_kieu_du_lieu_cau_truc.pdf

Nội dung text: Bài giảng Nhập môn lập trình: Kiểu dữ liệu cấu trúc

  1. Trang 1 NHẬP MÔN LẬP TRÌNH KIỂU DỮ LIỆU CẤU TRÚC 1. Đặt vấn đề Để lưu thông tin của 1 sinh viên, ta cần khai báo 7 biến như sau: 1 biến kiểu chuỗi dài 7 ký tự để lưu trữ mã số sinh viên, ví dụ “0912345”. char mssv[8]; 1 biến kiểu chuỗi dài 30 ký tự để lưu trữ họ tên sinh viên, ví dụ “Nguyen Van A”. char hoten[31]; 1 biến kiểu chuỗi dài 8 ký tự để lưu trữ ngày tháng năm sinh, ví dụ “01/01/91”. char ntns[9]; 1 biến kiểu ký tự để lưu trữ phái, ví dụ „y‟ là nam và „n‟ là nữ. char phai; 3 biến kiểu số thực để lưu trữ điểm toán, lý và hóa, ví dụ 8.5, 8.0, 9.5 float toan, ly, hoa; Để viết hàm xuất thông tin của 1 sinh viên, ta phải viết như sau: void Xuat(char *mssv, char *hoten, char *ntts, char phai, float toan, float ly, float hoa) { } Vấn đề nảy sinh khi số lượng sinh viên lớn hoặc chưa thể xác định tại thời điểm lập trình thì: Làm sao để có thể lưu trữ được thông tin của các sinh viên này sao cho thuận tiện cho việc khai báo và truy xuất? Làm sao để truyền thông tin của các sinh viên này cho hàm để thuận tiện cho các thao tác tìm kiếm, sao chép, sắp xếp? Kiểu struct cho phép “gom” các thông tin của cùng một sinh viên để dễ dàng khai báo (tên các thành phần như nhau với mọi sinh viên) và truy xuất. Bộ môn Tin học cơ sở Tháng 10 – 2009
  2. Trang 2 NHẬP MÔN LẬP TRÌNH 2. Kiểu cấu trúc (struct) 1.1. Khai báo kiểu Cú pháp: struct { ; ; }; Ví dụ: struct DIEM { int x; int y; }; 1.2. Khai báo biến 1.2.1. Khai báo tường minh Cú pháp: struct { ; ; } , ; Bộ môn Tin học cơ sở Tháng 10 – 2009
  3. Trang 3 NHẬP MÔN LẬP TRÌNH Ví dụ: struct DIEM { int x, y; } diem1, diem2; 1.2.2. Khai báo không tường minh Cú pháp: struct { ; ; }; struct ; Ví dụ: struct DIEM { int x, y; }; struct DIEM diem1, diem2; // C++ có thể bỏ struct Sử dụng typedef, cú pháp: typedef struct { ; ; }; ; Bộ môn Tin học cơ sở Tháng 10 – 2009
  4. Trang 4 NHẬP MÔN LẬP TRÌNH Ví dụ: typedef struct { int x; int y; } DIEM; struct DIEM diem1, diem2; 1.3. Khởi tạo Cú pháp: struct { ; ; } = { , , }; Ví dụ: struct { int x; int y; } diem1 = {2912, 1706}, diem2; 1.4. Truy xuất Để truy xuất đến từng thành phần của cấu trúc, ta sử dụng toán tử chấm (dot operation). Cú pháp: . Bộ môn Tin học cơ sở Tháng 10 – 2009
  5. Trang 5 NHẬP MÔN LẬP TRÌNH Ví dụ: struct DIEM { int x; int y; } diem1; printf(“x = %d, y = %d”, diem1.x, diem1.y); 1.5. Gán Cú pháp: = ; . = ; Ví dụ: struct DIEM { int x; int y; } diem1 = {2912, 1706}, diem2; diem2 = diem1; diem2.x = diem1.x; diem2.y = diem1.y * 2; Bộ môn Tin học cơ sở Tháng 10 – 2009
  6. Trang 6 NHẬP MÔN LẬP TRÌNH 1.6. Một số cấu trúc phức tạp 1.6.1. Thành phần của cấu trúc là một cấu trúc khác Ví dụ dưới đây cho thấy cấu trúc HINHCHUNHAT chứa cấu trúc DIEM. struct DIEM { int x; int y; }; struct HINHCHUNHAT { struct DIEM traitren; struct DIEM phaiduoi; } hcn1; hcn1.traitren.x = 2912; hcn1.traitren.y = 1706; 1.6.2. Thành phần của cấu trúc là mảng Ví dụ dưới đây cho thấy thành phần của cấu trúc là một mảng (chuỗi ký tự). struct SINHVIEN { char hoten[30]; float toan, ly, hoa; } sv1; strcpy(sv1.hoten, “Nguyen Van A”); sv1.toan = 10; sv1.ly = 6.5; sv1.hoa = 9; Bộ môn Tin học cơ sở Tháng 10 – 2009
  7. Trang 7 NHẬP MÔN LẬP TRÌNH 1.6.3. Cấu trúc đệ quy (tự trỏ) Ví dụ dưới đây cho thấy cấu trúc PERSON có thành phần là con trỏ đến cấu trúc PERSON. struct PERSON { char hoten[30]; struct PERSON *father, *mother; }; struct NODE { int value; struct NODE *pNext; }; 1.6.4. Thành phần của cấu trúc có kích thước theo bit Ví dụ dưới đây cho thấy cấu trúc chứa các thành phần có kích thước theo bit. struct bit_fields { int bit_0 : 1; int bit_1_to_4 : 4; int bit_5 : 1; int bit_6_to_15 : 10; }; Bộ môn Tin học cơ sở Tháng 10 – 2009
  8. Trang 8 NHẬP MÔN LẬP TRÌNH 1.7. Kích thước của cấu trúc Cho hai cấu trúc sau: struct B1 struct B2 { { int a; int a; int b; double c; double c; int b; }; }; Mặc dù 2 cấu trúc trên đều chứa các thành phần có kích thước như nhau (chỉ khác thứ tự) nhưng kích thước của 2 cấu trúc này không phải lúc nào cũng bằng nhau. Chỉ thị #pragma pack (n) n = 1, 2, 4, 8, 16 (byte): biên lớn nhất của các thành phần trong struct (BC n mặc định là 1, VC++ n mặc định là 8). Có thể chỉnh lại trong VC++ 6.0 bằng cách Project settings Compile Option C/C++ Code Generation Structure Alignment Canh biên cho 1 cấu trúc: #pragma pack(push, 1) struct MYSTRUCT { }; #pragma pack(pop) Ví dụ: không có #pragma pack (1) struct A { double a; int b; int c; }; Bộ môn Tin học cơ sở Tháng 10 – 2009
  9. Trang 2 NHẬP MÔN LẬP TRÌNH struct B { int b; double a; int c; }; struct C { int b; int c; double a; }; 1.8. Một số lưu ý Kiểu cấu trúc được định nghĩa để làm khuôn dạng còn biến cấu trúc được khai báo để sử dụng khuôn dạng đã định nghĩa. Trong C++, có thể bỏ từ khóa struct khi khai báo biến (hoặc sử dụng typedef) Khi nhập các biến kiểu số thực trong cấu trúc phải nhập thông qua một biến trung gian. struct DIEM { float x, y;} d1; float temp; scanf(“%f”, &temp); d1.x = temp; 2. Mảng cấu trúc Tương tự như mảng với kiểu dữ liệu cơ sở (char, int, float, ) struct DIEM { int x, y; }; DIEM mang1[20]; DIEM mang2[10] = {{3, 2}, {4, 4}, {2, 7}}; Bộ môn Tin học cơ sở Tháng 10 – 2009
  10. Trang 3 NHẬP MÔN LẬP TRÌNH 3. Truyền cấu trúc cho hàm Giống như truyền kiểu dữ liệu cơ sở. Ví dụ: struct DIEM { int x, y; }; void xuat1(int x, int y) { }; void xuat2(DIEM diem) { }; // Truyen gia tri void xuat3(DIEM &diem) { }; // Truyen tham chieu void xuat4(DIEM *diem) { }; // Truyen dia chi (con tro) 4. Bài tập 4.1. Phân số Khai báo kiểu dữ liệu phân số (PHANSO). Nhập/Xuất phân số. Rút gọn phân số. Tính tổng, hiệu, tích, thương hai phân số. Kiểm tra phân số tối giản. Quy đồng hai phân số. Kiểm tra phân số âm hay dương. So sánh hai phân số. Mở rộng cho mảng phân số: Nhập/Xuất n phân số. Rút gọn mọi phân số. Đếm số lượng phân số âm/dương trong mảng. Tìm phân số dương đầu tiên trong mảng. Tìm phân số nhỏ nhất/lớn nhất trong mảng. Sắp xếp mảng tăng dần/giảm dần. 4.2. Đơn thức Khai báo kiểu dữ liệu đơn thức (DONTHUC). Nhập/Xuất đơn thức. Tính tích, thương hai đơn thức . Bộ môn Tin học cơ sở Tháng 10 – 2009
  11. Trang 4 NHẬP MÔN LẬP TRÌNH Tính đạo hàm cấp 1 của đơn thức . Tính đạo hàm cấp k của đơn thức. Tính giá trị đơn thức tại x = x0. 4.3. Đa thức Khai báo kiểu dữ liệu đa thức (DATHUC). Nhập/Xuất đa thức. Tính tổng, hiệu, tích hai đa thức. Tính đạo hàm cấp 1 của đa thức. Tính đạo hàm cấp k của đa thức. Tính giá trị đơn thức tại x = x0. 4.4. Điểm trong mặt phẳng Oxy Khai báo kiểu dữ liệu điểm (DIEM). Nhập/Xuất tọa độ điểm. Tính khoảng cách giữa hai điểm. Tìm điểm đối xứng qua gốc toạ độ/trục Ox/Oy. Kiểm tra điểm thuộc phần tư nào? Mở rộng cho mảng điểm: Nhập/Xuất n điểm. Đếm số lượng điểm có hoành độ dương. Đếm số lượng điểm không trùng với các điểm khác trong mảng. Tìm điểm có hoành độ lớn nhất/nhỏ nhất. Tìm điểm gần gốc tọa độ nhất. 4.5. Ngày Khai báo kiểu dữ liệu ngày (NGAY). Nhập/Xuất ngày (ngày, tháng, năm). Kiểm tra năm nhuận. Tính số thứ tự ngày trong năm. Tính số thứ tự ngày kể từ ngày 1/1/1. Tìm ngày trước đó, sau đó k ngày. Tính khoảng cách giữa hai ngày. So sánh hai ngày. Bộ môn Tin học cơ sở Tháng 10 – 2009