LTC- Cấu trúc

23 379 0
LTC- Cấu trúc

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

LTC- Cấu trúc

Biên soạn: TS Ngô Hữu PhúcBiên soạn: TS Ngô Hữu PhúcBộ môn Khoa học máy tínhBộ môn Khoa học máy tínhHọc viện Kỹ thuật quân sựHọc viện Kỹ thuật quân sựC u trú cấC u trú cấChương 9Chương 91Chương 9: Cấu trúc Khái niệmKhái niệmCấu trúc là tập hợp của một hoặc nhiều biến, chúng có thể có kiểu dữ liệu khác nhau, được nhóm lại dưới một tên duy nhất để tiện xử lý. Cấu trúc còn gọi là bản ghi trong một số ngôn ngữ lập trình khác, chẳng hạn như PASCAL.Một số ví dụ về khái niệm cấu trúc:Phiếu ghi lương, gồm có: tên, địa chỉ, lương, phụ cấp, … một số trong các thuộc tính này lại có thể là một cấu trúc bởi trong nó có thể chứa nhiều thành phần: Tên ( Họ, đệm, tên ), Địa chỉ ( Phố, số nhà ), .Danh sách sinh viên, gồm có: mã sinh viên, họ tên, ngày sinh, điểm toán, điểm lý, điểm hóa…; trong đó, ngày sinh có thể chứa nhiều thành phần ngày, tháng, năm.Những dạng như vậy  sử dụng cấu trúc.2Chương 9: Cấu trúc 9.1. Kiểu cấu trúc9.1. Kiểu cấu trúcChương 9: Cấu trúc3Để sử dụng cấu trúc, cần định nghĩa cấu trúc trước khi sử dụng.Định nghĩa cấu trúc:struct tên_kiểu_cấu_trúc{Khai báo các thành phần của cấu trúc (1)};Ý nghĩa các thành phần: struct là từ khoátên_kiểu _cấu_trúc là một tên bất kỳ do người lập trình tự đặt theo qui tắc đặt.thành phần của cấu trúc có thể là: biến, mảng, cấu trúc khác đã được định nghĩa trước đó. Ví dụ về định nghĩa cấu trúcVí dụ về định nghĩa cấu trúcChương 9: Cấu trúc4Ví dụ 1: Mô tả một kiểu cấu trúc có tên là ngay gồm có ba thành phần: biến nguyên ngaythu, mảng thang, và biến nguyên nam.struct ngay {int ngaythu;char thang[12];int nam; };Ví dụ 2: Tạo ra kiểu cấu trúc có tên là nhancong gồm có năm thành phần. Ba thành phần đầu là ten, diachi, bacluong. Hai thành phần còn lại là các cấu trúc ngaysinh và ngaybatdaucongtac được xây dựng theo cấu trúc ngay được định nghĩa trong ví dụ 1.struct nhancong {char ten[15];char diachi[20]double bacluong;struct ngay ngaysinh;struct ngay ngaybatdaucongtac; }; 9.1. Định nghĩa cấu trúc bằng typedef (t)9.1. Định nghĩa cấu trúc bằng typedef (t)Chương 9: Cấu trúc5Cú pháp: typedef <type difinition> <identifier> ;Ví dụ: có thể dùng toán tử typedef để định nghĩa các kiểu dữ liệu mới có cấu trúc là: ngay và nhancong ở trên như sau:typedef struct{ int ngaythu;char thang[12];int nam;} ngay;typedef struct{ char ten[15];char diachi[20]double bacluong;struct ngay ngaysinh;struct ngay ngaybatdaucongtac;} nhancong;Đặc tính typedef đặc biệt tiện lợi khi định nghĩa các cấu trúc, vì ta không cần nhắc lại từ khóa struct mỗi khi cần khai báo một biến theo cấu trúc đó 9.2. Khai báo biến theo một kiểu cấu trúc 9.2. Khai báo biến theo một kiểu cấu trúc đã định nghĩađã định nghĩaChương 9: Cấu trúc6Khai báo biến kiểu cấu trúc hoàn toàn giống như việc khai báo các biến và các mảng kiểu thông thường khác. Giả sử ta đã khai báo các kiểu cấu trúc ngay và nhancong như trong mục trên bằng từ khóa struct. Khi đó ta có thể khai báo các biến như sau:Ví dụ 1: struct ngay ngaydi, ngayden;/* cần nhắc lại từ khóa struct */khi đó, sẽ cho ta hai biến với tên là ngaydi và ngayden kiểu cấu trúc ngay. Tổng quát ta có: Cách 1: struct <tên_kiểu_cấu_trúc_đã_khai_báo> <danh_sách_tên_biến>;Ví dụ: struct ngay a,b,*c; // trên Cngay a,b,*c; // trên C++Chú ý:Các biến kiểu cấu trúc được khai báo theo mẫu trên sẽ được cấp phát bộ nhớ một cách đầy đủ cho tất cả các thành phần của nó. 9.2. Khai báo biến theo một kiểu cấu trúc 9.2. Khai báo biến theo một kiểu cấu trúc đã định nghĩađã định nghĩaChương 9: Cấu trúc7Việc khai báo kiểu cấu trúc cũng có thể thực hiện đồng thời với việc khai báo biến kiểu cấu trúc. Cách 2:struct tên_kiểu_cấu_trúc {Thành phần của cấu trúc;} danh_sách_biến_các_cấu_trúc; Ví dụ 1:struct ngay {int ngaythu;char thang[12];int nam;} ngaydi, ngayden; Ví dụ 2:struct nhancong {char ten[15];char diachi[20];double bacluong;struc ngay ngaysinh;struc ngay ngaybatdau;} nhom1, nhom2;Khi vừa khai báo kiểu cấu trúc, vừa khai báo biến kiểu cấu trúc như trong ví dụ trên, ta có thể không cần chỉ định tên kiểu cấu trúc theo cú pháp sau:struct {Thành phần của cấu trúc;} danh_sách_tên_các_cấu_trúc; 9.3. Truy cập đến các thành phần của cấu trúc9.3. Truy cập đến các thành phần của cấu trúcChương 9: Cấu trúc8Để truy cập đến một thành phần cơ bản (là biến hoặc mảng) của một cấu trúc ta sử dụng một trong các cách viết sau:tên_cấu_trúc.tên_thành_phần tên_cấu_trúc.tên_cấu_trúc.tên_thành_phầntên_cấu_trúc. tên_cấu_trúc.tên_cấu_trúc.tên_thành_phần .Ví dụ: ngay a;a.ngaythu=15;…printf(“%d”,a.ngaythu); Chú ý:Có thể sử dụng phép toán lấy địa chỉ đối với các thành phần của cấu trúc để nhập số liệu trực tiếp vào các thành phần của cấu trúc. Ví dụ như ta viết:scanf("%d",&nhom1.ngaybatdaucongtac.nam);Tuy nhiên ta nên nhập số liệu vào một biến trung gian sau đó mới gán cho thành phần của cấu trúc như sau:int year;scanf("%d",&year);nhom1. ngaybatdaucongtac.nam=year; 9.4. Mảng cấu trúc9.4. Mảng cấu trúcChương 9: Cấu trúc9Có thể sử dụng một kiểu cấu trúc đã mô tả để khai báo các biến kiểu cấu trúc và mảng kiểu cấu trúc.Cách khai báo mảng cấu trúc:struct <tên_kiểu_cấu_trúc_đã_định_nghĩa> <tên_mảng[số phần tử của mảng]>;Ví dụ 1: Giả sử kiểu cấu trúc canbo đã được định nghĩa như mục trên. Khi đó dòng khai báo:struct canbo cb1,cb2,nhom1[10],nhom2[7]; cb1 và cb2 là 2 biến cấu trúc;nhom1 là mảng cấu trúc có 10 phần tử; nhom2 là mảng cấu trúc có 7 phần tử.Ví dụ 2: Đoạn chương trình sau sẽ tính tổng lương cho các phần tử nhóm 1:double tongluong=0;for (i=0;i<10;++i)tongluong+=nhom1[i].luong; Ví dụ về cấu trúcVí dụ về cấu trúcChương 9: Cấu trúc10Đầu bài:Xây dựng cấu trúc sinh viên gồm:mã sinh viên: kiểu mảng char;họ tên sinh viên: kiểu mảng char;ngày sinh: kiểu cấu trúc ngày;điểm toán: kiểu nguyên;điểm lý: kiểu nguyên;điểm hóa: kiểu nguyên;Yêu cầu:Nhập vào n sinh viên, n nhập từ bàn phím;Đưa ra các sinh viên có điểm trung bình >= 8 và không có môn nào phải thi lại. [...]... scanf("%d",&sv[i].diemtoan); 11 Chương 9: Cấu trúc getch(); } Minh họa 9.5 Phép gán cấu trúc  Có thể thực hiện phép gán trên các biến và phần tử mảng kiểu cấu trúc cùng kiểu như sau:  Gán hai biến cùng kiểu cấu trúc cho nhau  Gán biến cho phần tử mảng cùng kiểu cấu trúc  Gán phần tử mảng cho biến cùng kiểu cấu trúc  Gán hai phần tử mảng cùng kiểu cấu trúc cho nhau  Mỗi một phép gán trên tương... 9: Cấu trúc } Ví dụ về phép gán cấu trúc: Có n sinh viên, sắp xếp theo điểm trung bình giảm dần 9.6 Con trỏ cấu trúc và địa chỉ cấu trúc 9.6.1 Con trỏ và địa chỉ  Xét ví dụ: struct ngay { int ngaythu; char thang[10]; int nam; };  Khi đó, với khai báo: struct ngay *p,*p1,*p2,nc1,nc2,ds[100];  Ta có:  p, p1, p2 là con trỏ kiểu cấu trúc  nc1, nc2 là các biến kiểu cấu trúc  ds là mảng kiểu cấu trúc. .. 9: Cấu trúc 9.6.5 Con trỏ và mảng  Giả sử con trỏ p trỏ tới đầu mảng ds, khi đó:  Ta có thể truy nhập tới các thành phần của cấu trúc bằng các cách sau: ds[i].thành_phần ds[i] nam p[i].thành_phần p[i] nam (p+i)->thành_phần (p+i)->nam  Khi ta sử dụng cả cấu trúc thì các cách viết sau là tương đương: ds[i] 18 Chương 9: Cấu trúc p[i] *(p+i) 9.7 Thành phần con trỏ cấu trúc  Trong định nghĩa cấu trúc, ... cấu trúc  Như vậy, con trỏ kiểu cấu trúc dùng để lưu trữ địa chỉ của biến kiểu cấu trúc và mảng kiểu cấu trúc  Ví dụ: struct ngay*p,*p1,*p2,nc1,nc2,ds[100]; p1=&nc1; /* Gán địa chỉ nc1 cho p1 */ p2=&ds[4]; /* Gán địa chỉ ds[4] cho p2 */ p=ds; 14 /* Gán địa chỉ ds[0] cho p */ Chương 9: Cấu trúc 9.6.2 Truy nhập qua con trỏ  Có thể truy nhập đến các thành phần của cấu trúc thông qua con trỏ theo một... con trỏ trỏ tới cấu trúc đang định nghĩa  Cú pháp: struct danhsach { char hoten[25]; int tuoi; struct danhsach *lienket; };  Ý nghĩa:  Tạo một danh sách có hoten (char 25), tuổi (int) và một con trỏ, trỏ tới cấu trúc đang định nghĩa  Thường sử dụng định nghĩa trên cho danh sách liên kết, cây,…  Chú ý: Không được khai báo biến cấu trúc khi đang định nghĩa cấu trúc 19 Chương 9: Cấu trúc Ví dụ về thành... free(temp); } printf("Co tiep khong? (c/k)\n"); getch(); 21 Chương 9: Cấu trúc } Ví dụ về danh sách liên kết đơn 9.8 Union (hợp)  Union là dạng cấu trúc dữ liệu tương tự như cấu trúc  Các thành phần của Union có kiểu khác nhau và tại một thời điểm chỉ lưu một thành phần dữ liệu  Cú pháp: union ten_hop { Thành phần của hơp; }; 22 Chương 9: Cấu trúc Ví dụ về hợp #include “stdio.h” #include “conio.h” #include... 9: Cấu trúc Ví dụ về thành phần con trỏ cấu trúc Đầu bài:  Xây dựng cấu trúc sinh viên gồm:  Mã sinh viên: char 10,  Họ tên sinh viên: char 25,  Điểm toán: int,  Điểm lý: int,  Điểm hóa: int  Yêu cầu:  Tạo danh sách sinh viên, với sinh viên được nhập khi chạy chương trình  Đưa ra danh sách sinh viên có có điểm trung bình =7.0 20 Chương 9: Cấu trúc #include "conio.h" #include "stdio.h"... *p,*p1,*p2,nc1,nc2,ds[100]; nc1 nam; p1-> nam; ds[4] thang; (*p2).thang; 15 Chương 9: Cấu trúc 9.6.3 Phép gán qua con trỏ  Giả sử ta gán: p1=&nc1; p2=&ds[4];  Khi đó ta có thể dùng: *p1 thay cho nc1 *p2 thay cho ds[4]  Tức là việc chúng ta viết: ds[5]=nc1; ds[4]=nc2;  Tương đương với: ds[5]=*p1; *p2=nc2; 16 Chương 9: Cấu trúc 9.6.4 Phép cộng địa chỉ  Sau các phép gán: p=ds; p2=&ds[4];  Khi đó, p trỏ... trúc  Gán phần tử mảng cho biến cùng kiểu cấu trúc  Gán hai phần tử mảng cùng kiểu cấu trúc cho nhau  Mỗi một phép gán trên tương đương với một dãy phép gán các thành phần tương ứng 12 Chương 9: Cấu trúc //Sap xep danh sach for (i=0;i . vậy  sử dụng cấu trúc. 2Chương 9: Cấu trúc 9.1. Kiểu cấu trúc9 .1. Kiểu cấu trúcChương 9: Cấu trúc3 Để sử dụng cấu trúc, cần định nghĩa cấu trúc trước khi. một cấu trúc ta sử dụng một trong các cách viết sau:tên _cấu_ trúc. tên_thành_phần tên _cấu_ trúc. tên _cấu_ trúc. tên_thành_phầntên _cấu_ trúc. tên _cấu_ trúc. tên _cấu_ trúc. tên_thành_phần.....Ví

Ngày đăng: 05/11/2012, 14:53

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan