intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Bài giảng Ngôn ngữ lập trình C - Chương 7: Cấu trúc

Chia sẻ: Đinh Trường Gấu | Ngày: | Loại File: PPT | Số trang:21

80
lượt xem
5
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Cấu trúc là tập hợp của một hoặc nhiều biến, có thể khác kiểu nhau, được nhóm lại dưới dạng một tên duy nhất cho tiện xử lý. (Giống cấu trúc Record trong Pascal). Mời các bạn cùng tham khảo "Bài giảng Ngôn ngữ lập trình C - Chương 7: Cấu trúc" để nắm bắt được những nội dung chi tiết trong bài.

Chủ đề:
Lưu

Nội dung Text: Bài giảng Ngôn ngữ lập trình C - Chương 7: Cấu trúc

  1. CHƯƠNG 7 CẤU TRÚC Cấu  trúc  là  tập  hợp  của  một  hoặc  nhiều  biến, có thể khác kiểu nhau,  được nhóm lại dưới  dạng một tên duy nhất cho tiện xử lý. (Giống cấu  trúc Record trong Pascal). Cấu  trúc  giúp  cho  việc  tổ  chức  các  dữ  liệu  phức tạp, đặc biệt trong những chương trình lớn vì  trong  nhiều  tình  huống  chúng  cho  phpé  nhóm  các  biến có liên quan lại  để xử lý như một đơn vị thay  vì như các thực thể tách biệt.
  2. I. Định nghĩa cấu trúc và khai báo biến cấu trúc 1. Định nghĩa cấu trúc struct  {  ;  ; ... } Trong đó: struct: Là từ khoá Tên_kiểu_cấu_trúc: là tên bất kỳ, do người sử  dụng đặt
  3. Ví dụ: struct  Date {    int  day;    int  month;    int year; }; 2. Định nghĩa cấu trúc bằng typedef Nếu  một  cấu  trúc  được  định  nghĩa  với  tên_kiểu_cấu_trúc  thì  ta  có  thể  cùng  typedef  đê  định nghĩa như sau: Typedef struct    ;
  4. Ví dụ: typedef struct Date DATE; Nếu một cấu trúc chưa định nghĩa, thì ta có thể  dùng typedef để định nghĩa: Typedef struct [Tên_kiểu_cấu_trúc] {  ;  ; ... } ; Ví dụ: Với ví dụ trên ta có thể dùng typedef để định nghĩa  lại như sau:
  5. typedef struct { int day; int month; int year; } DATE; 3. Khai báo biến cấu trúc Khai báo kết hợp: struct  {  ;  ; ... } ;
  6. Ví dụ: struct Date { int day; int month; int year; } date, *pd; Khai báo riêng lẽ:  Dùng  Tên_kiểu_bản_ghi  hoặc  thông  qua  tên  cấu trúc đã được định nghĩa bằng typedef +  Dùng tên_kiểu_cấu_trúc: struct  
  7. Ví dụ: struct Date date,*pd; +  Dùng tên định nghĩa bằng typedef   Ví dụ: DATE date,*pd II. Khởi đầu giá trị cho cấu trúc: Ta có thể khởi đầu giá trị cho một cấu trúc theo  phương cách như là khởi  đầu giá trị cho mảng.  Theo  sau  tên_biến_cấu_trúc  là  dấu  bằng  (=),  sau  đó  là  danh  dách  các  giá  trị  khởi  đầu  được  đặt trong các dấu móc {}. Các giá trị khởi  đầu  có  cùng  kiểu  với  các  trường  tương  ứng  trong  cấu trúc.
  8. Ví dụ: DATE date = {12, 3, 2003} III. Truy cập đến các thành phần của cấu trúc: Có hai cách tham chiếu  đến các thành phần của  cấu trúc tương ứng với hai trường hợp sau: Nếu nó là một biến cấu trúc: Ta  dùng  toán  tử  dấu  chấm  (.)  để  tham  chiếu  đến các trường (thành phần) của cấu trúc. Cú pháp:   .
  9.   Nếu  nó  là  một  biến  con  trỏ  trỏ  đến  cấu  trúc: Ta dùng toán tử mũi tên (­>) để tham chiếu đến. Cú pháp: ­> Ví dụ: struct Date { int day; int month; int year; } date; typedef struct Date DATE
  10. Với  các  khai  báo  trên  ta  có  các  cách  tham  chiếu  sau: date.day=18; date.month=4; date.year=2003; Hoặc: p­>day = 18 p­>month=4; p­>year=2003; Các phép toán con trỏ tương đương với: (*p).day=18; (*p).month=4; (*p).year=2003;
  11. Gán  hai  biến  cấu  trúc  cho  nhau(cùng  kiểu  cấu  trúc) Ví dụ: struct Date d={18,4,2003}; struct Date today; today=d; Có  thể  lấy  địa  chỉ  các  trường  của  cấu  trúc,  kết  quả là con trỏ trỏ đến thành phần tương ứng. Ví dụ: scanf(“%2d ­ %2d %4d”, &today.day,  &today.month, &today.year);
  12. IV. Mảng các cấu trúc Vì cấu trúc là khối  đối tượng dữ liệu, do  đó hoàn toàn  có  khả  năng  tạo  ra  một  mảng  các  cấu  trúc.  Khai  báo  mảng các cấu truc như sau: struct   []; Hoặc là dùng tên đã được khai báo bởi typedef:  []; Ví dụ: Khai báo mảng cấu trúc: struct Date aa[10]; DATE ab[10]; Lúc đó để tham chiếu  đến các trường ta có thể dùng như  sau: aa[2].month = 4;
  13. V. Cấu trúc lồng nhau Một cấu trúc được gọi là lồng nhau nếu có một  trong  các  trường  của  cấu  trúc  này  lại  có  kiểu  cấu trúc. Cấu trúc lồng nhau thường  được dùng  phổ  biến  trong  lập  trình  C  bởi  vì  nó  cho  phép  tạo ra các dữ liệu có thứ bậc. Vi dụ: Tạo cấu trúc  để lưu thông tin ngày sinh  của một người.
  14. typedef struct  { char name[30]; struct { int day; int month; int year; } birth_day; } BDATE;
  15. Hoặc: typedef struct { char name[30]; struct Date birth_day; } BDATE; Hoặc typedef { char name[30]; DATE birth_day; }BDATE;
  16. Tham chiếu  đến các thành phần của cấu trúc lồng  nhau  thì  hoàn  toàn  giống  với  việc  tham  chiếu  trong  cấu  trúc  không  lồng  nhau,  tuy  chỉ  có  những  trường  chứa cấu trúc thì phải thêm tên biến cấu trúc đó vào. Ví dụ Với  cấu  trúc  vừa  định  nghĩa  ở  ví  dụ  trên,  ta  tham  chiếu  đến các thành phần của biến ngaysinh có kiểu  BDATE là: Tên: ngaysinh.name=“Tran Van A”; Ngày sinh: ngaysinh.birth_day.day=19; ngaysinh.birth_day.month=04; ngaysinh.birth_day.year=2003;
  17. Về mặt lý thuyết thì không có bất kỳ một giới hạn  nào về số mức lồng nhau của cấu trúc. Nhưng lúc đó các  tham chiếu đến các trường sẽ càng trở nên phúc tạp và  khó đọc hơn. Cấu trúc tự tham chiếu: Các cấu trúc gọi là tự tham chiếu nếu nó chứa  một trường là con trỏ trỏ đến chính nó. Ví dụ: struct a { int a,b; float c; struct a *ptoa; };
  18. Tính tham chiếu trước (Forward  Referencing) Tính chất này cho phép ta  đưa ra các khai báo các  con trỏ trỏ  đến các cấu trúc chưa được định nghĩa,  đặc  tính  này  cũng  cho  phép  ta  tạo  ra  sự  tự  tham  chiếu như đã đề cập  ở trên. Ta có thể tạo ra cấu  trúc sự tham chiếu lẫn nhau. Ví dụ: struct s1 { int a; struct s2 *b;
  19. struct s2  {  int a; struct s1 *b; }; Đặc tính này không áp dụng trong các khai báo  bằng typedef VI. Truyền cấu trúc cho hàm Có hai cách truyền cấu trúc cho hàm: ­ Truyền theo biến cấu trúc (gọi là truyền theo  giá trị) ­ Truyền con trỏ trỏ đến cấu trúc (gọi là truyền  theo tham chiếu)
  20. Ví dụ: DATE d; .  .  func (d); /* Định nghĩa hàm func(DATE d) */ func(&d);/* Định nghĩa hàm func (DATE *d)*/ . . Truyền  theo  địa  chỉ  luôn  nhanh  hơn  bởi  vì  chỉ  là  một con trỏ  đơn giản  được sao chép  đến vùng  đối  số. Mặt khác, truyền theo giá trị sẽ đòi hỏi toàn bộ  các  cấu  trúc  sẽ  được  sao  chép.  Chỉ  có  hai  trương  hợp nên truyền theo giá trị:
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
9=>0