Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 11 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
11
Dung lượng
582,94 KB
Nội dung
Trang 1 NHẬP MÔN LẬP TRÌNH Bộ môn Tin học cơ sở Tháng 10 – 2009 KIỂU DỮLIỆUCẤUTRÚ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. Trang 2 NHẬP MÔN LẬP TRÌNH Bộ môn Tin học cơ sở Tháng 10 – 2009 2. Kiểucấutrúc (struct) 1.1. Khai báo kiểu Cú pháp: struct <tên kiểucấu trúc> { <kiểu dữ liệu> <tên thành phần 1>; … <kiểu dữ liệu> <tên thành phần n>; }; 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 <tên kiểucấu trúc> { <kiểu dữ liệu> <tên thành phần 1>; … <kiểu dữ liệu> <tên thành phần n>; } <tên biến 1>, <tên biến 2>; Trang 3 NHẬP MÔN LẬP TRÌNH Bộ môn Tin học cơ sở Tháng 10 – 2009 Ví dụ: struct DIEM { int x, y; } diem1, diem2; 1.2.2. Khai báo không tường minh Cú pháp: struct <tên kiểucấu trúc> { <kiểu dữ liệu> <tên thành phần 1>; … <kiểu dữ liệu> <tên thành phần n>; }; struct <tên kiểucấu trúc> <tên biến>; 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 <tên kiểucấu trúc> { <kiểu dữ liệu> <tên thành phần 1>; … <kiểu dữ liệu> <tên thành phần n>; }; <tên kiểucấu trúc> <tên biến>; Trang 4 NHẬP MÔN LẬP TRÌNH Bộ môn Tin học cơ sở Tháng 10 – 2009 Ví dụ: typedef struct { int x; int y; } DIEM; struct DIEM diem1, diem2; 1.3. Khởi tạo Cú pháp: struct <tên kiểucấu trúc> { <kiểu dữ liệu> <tên thành phần 1>; … <kiểu dữ liệu> <tên thành phần n>; } <tên biến> = {<giá trị 1>,…,<giá trị n>}; 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: <tên biến cấu trúc>.<tên thành phần> Trang 5 NHẬP MÔN LẬP TRÌNH Bộ môn Tin học cơ sở Tháng 10 – 2009 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: <biến cấutrúc đích> = <biến cấutrúc nguồn>; <biến cấutrúc đích>.<tên thành phần> = <giá trị>; Ví dụ: struct DIEM { int x; int y; } diem1 = {2912, 1706}, diem2; … diem2 = diem1; diem2.x = diem1.x; diem2.y = diem1.y * 2; Trang 6 NHẬP MÔN LẬP TRÌNH Bộ môn Tin học cơ sở Tháng 10 – 2009 1.6. Một số cấutrúc phức tạp 1.6.1. Thành phần của cấutrúc là một cấutrúc khác Ví dụ dưới đây cho thấy cấutrúc HINHCHUNHAT chứa cấutrú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ấutrúc là mảng Ví dụ dưới đây cho thấy thành phần của cấutrú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; Trang 7 NHẬP MÔN LẬP TRÌNH Bộ môn Tin học cơ sở Tháng 10 – 2009 1.6.3. Cấutrúc đệ quy (tự trỏ) Ví dụ dưới đây cho thấy cấutrúc PERSON có thành phần là con trỏ đến cấutrú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ấutrúc có kích thước theo bit Ví dụ dưới đây cho thấy cấutrú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; }; Trang 8 NHẬP MÔN LẬP TRÌNH Bộ môn Tin học cơ sở Tháng 10 – 2009 1.7. Kích thước của cấutrúc Cho hai cấutrúc sau: struct B1 { int a; int b; double c; }; struct B2 { int a; double c; int b; }; Mặc dù 2 cấutrú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ấutrú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; }; Trang 2 NHẬP MÔN LẬP TRÌNH Bộ môn Tin học cơ sở Tháng 10 – 2009 struct B { int b; double a; int c; }; struct C { int b; int c; double a; }; 1.8. Một số lưu ý Kiểucấutrúc được định nghĩa để làm khuôn dạng còn biến cấutrú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ấutrú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ấutrúc Tương tự như mảng với kiểudữliệu cơ sở (char, int, float, …) struct DIEM { int x, y; }; DIEM mang1[20]; DIEM mang2[10] = {{3, 2}, {4, 4}, {2, 7}}; Trang 3 NHẬP MÔN LẬP TRÌNH Bộ môn Tin học cơ sở Tháng 10 – 2009 3. Truyền cấutrú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ểudữ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ểudữliệu đơn thức (DONTHUC). Nhập/Xuất đơn thức. Tính tích, thương hai đơn thức . [...]... 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... Đế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 . Tháng 10 – 2009 2. Kiểu cấu trúc (struct) 1.1. Khai báo kiểu Cú pháp: struct <tên kiểu cấu trúc& gt; { < ;kiểu dữ liệu& gt; <tên thành phần 1>; … < ;kiểu dữ liệu& gt; <tên. pháp: struct <tên kiểu cấu trúc& gt; { < ;kiểu dữ liệu& gt; <tên thành phần 1>; … < ;kiểu dữ liệu& gt; <tên thành phần n>; }; struct <tên kiểu cấu trúc& gt; <tên biến>;. typedef struct <tên kiểu cấu trúc& gt; { < ;kiểu dữ liệu& gt; <tên thành phần 1>; … < ;kiểu dữ liệu& gt; <tên thành phần n>; }; <tên kiểu cấu trúc& gt; <tên biến>;