Giáo Trình Lập Trình Căn Bản Phần 2: Tìm Hiểu Về Kiểu Cấu Trúc và Khai Báo Biến

Giáo trình nghiên cứu lập trình căn bản phần 2 trần thị hoa, trình bày lý thuyết rõ ràng, minh họa ví dụ thực tế, phù hợp sinh viên .

Trường đại học

Trường Đại Học

Chuyên ngành

Lập Trình Căn Bản

Người đăng

Ẩn danh

Thể loại

Giáo Trình

2023

68
1
0

Phí lưu trữ

30 Point

Mục lục chi tiết

6. CHƯƠNG 6: KIỂU CẤU TRÚC, KIỂU HỢP

6.1. Kiểu cấu trúc

6.2. Định nghĩa kiểu cấu trúc

6.3. Khai báo biến cấu trúc

6.4. Truy nhập tới các thành phần của cấu trúc

6.5. Sử dụng #define

6.6. Sử dụng cấu trúc

6.7. Mảng cấu trúc

6.8. Khởi đầu cho một cấu trúc và phép gán cấu trúc

6.9. Định nghĩa kiểu hợp (union)

6.10. Khai báo biến kiểu hợp

6.11. Cấu trúc tự trỏ và danh sách liên kết

6.12. Cấp phát bộ nhớ động

6.13. Cấu trúc tự trỏ

6.14. Danh sách liên kết

6.15. Các phép toán trên danh sách liên kết

Tóm tắt

I. Tổng quan về Giáo Trình Lập Trình Căn Bản Phần 2

Giáo trình lập trình căn bản phần 2 tập trung vào việc hiểu rõ về kiểu cấu trúckhai báo biến trong lập trình. Đây là những khái niệm quan trọng giúp lập trình viên có thể xử lý và lưu trữ thông tin phức tạp hơn. Việc nắm vững các khái niệm này sẽ giúp người học có nền tảng vững chắc để phát triển các ứng dụng phức tạp hơn trong tương lai.

1.1. Khái niệm về kiểu cấu trúc trong lập trình

Kiểu cấu trúc là một công cụ mạnh mẽ trong lập trình, cho phép lưu trữ nhiều loại dữ liệu khác nhau trong cùng một biến. Điều này giúp tổ chức dữ liệu một cách hiệu quả hơn.

1.2. Tại sao khai báo biến lại quan trọng

Khai báo biến là bước đầu tiên trong lập trình, giúp xác định loại dữ liệu mà chương trình sẽ sử dụng. Việc khai báo chính xác giúp tránh lỗi và tối ưu hóa hiệu suất chương trình.

II. Vấn đề và thách thức trong việc sử dụng kiểu cấu trúc

Mặc dù kiểu cấu trúc mang lại nhiều lợi ích, nhưng việc sử dụng chúng cũng gặp phải một số thách thức. Một trong những vấn đề chính là việc quản lý bộ nhớ và truy cập đến các thành phần của cấu trúc. Nếu không cẩn thận, lập trình viên có thể gặp phải lỗi tràn bộ nhớ hoặc truy cập đến các thành phần không hợp lệ.

2.1. Quản lý bộ nhớ khi sử dụng cấu trúc

Quản lý bộ nhớ là một trong những thách thức lớn nhất khi làm việc với kiểu cấu trúc. Việc cấp phát và giải phóng bộ nhớ cần được thực hiện cẩn thận để tránh rò rỉ bộ nhớ.

2.2. Truy cập đến các thành phần của cấu trúc

Truy cập đến các thành phần của cấu trúc có thể gây khó khăn nếu không nắm rõ cách thức hoạt động. Việc sử dụng toán tử truy cập đúng cách là rất quan trọng để đảm bảo tính chính xác của chương trình.

III. Phương pháp khai báo biến cấu trúc hiệu quả

Khai báo biến cấu trúc có thể thực hiện theo nhiều cách khác nhau. Việc lựa chọn phương pháp phù hợp sẽ giúp lập trình viên dễ dàng hơn trong việc quản lý và sử dụng các biến cấu trúc trong chương trình.

3.1. Các mẫu khai báo biến cấu trúc

Có nhiều mẫu khai báo biến cấu trúc khác nhau, từ việc khai báo đơn giản đến phức tạp. Việc hiểu rõ các mẫu này sẽ giúp lập trình viên linh hoạt hơn trong việc sử dụng.

3.2. Sử dụng typedef để định nghĩa kiểu cấu trúc

Sử dụng typedef giúp đơn giản hóa việc khai báo biến cấu trúc, giúp mã nguồn trở nên dễ đọc và dễ bảo trì hơn.

IV. Ứng dụng thực tiễn của kiểu cấu trúc trong lập trình

Kiểu cấu trúc được ứng dụng rộng rãi trong nhiều lĩnh vực khác nhau, từ quản lý dữ liệu đến phát triển phần mềm. Việc hiểu rõ cách sử dụng kiểu cấu trúc sẽ giúp lập trình viên phát triển các ứng dụng phức tạp hơn.

4.1. Quản lý thông tin sinh viên bằng cấu trúc

Cấu trúc có thể được sử dụng để quản lý thông tin sinh viên, bao gồm họ tên, tuổi, điểm số và địa chỉ. Điều này giúp tổ chức dữ liệu một cách hiệu quả.

4.2. Ứng dụng trong các bài toán quản lý dữ liệu

Kiểu cấu trúc giúp giải quyết nhiều bài toán quản lý dữ liệu phức tạp, từ việc lưu trữ đến xử lý thông tin.

V. Kết luận và tương lai của kiểu cấu trúc trong lập trình

Kiểu cấu trúc là một phần không thể thiếu trong lập trình hiện đại. Việc nắm vững các khái niệm và phương pháp liên quan đến kiểu cấu trúc sẽ giúp lập trình viên phát triển kỹ năng và khả năng giải quyết vấn đề tốt hơn trong tương lai.

5.1. Tương lai của lập trình với kiểu cấu trúc

Với sự phát triển không ngừng của công nghệ, kiểu cấu trúc sẽ tiếp tục đóng vai trò quan trọng trong việc phát triển phần mềm và ứng dụng.

5.2. Lời khuyên cho lập trình viên mới

Lập trình viên mới nên chú trọng đến việc học hỏi và thực hành với kiểu cấu trúc để có thể áp dụng hiệu quả trong các dự án thực tế.

17/07/2025
Giáo trình lập trình căn bản phần 2 trần thị hoa

Trích đoạn nội dung tài liệu

lOMoARcPSD|16991370 CHƢƠNG 6: KIỂU CẤU TRÚC, KIỂU HỢP Để lƣu trữ và xử lý thông tin trong máy tính ta có các biến và các mảng. Mỗi biến chỉ lƣu đƣợc một giá trị. Mảng là một tập hợp nhiều biến có cùng một kiểu giá trị và cùng tên mảng. Cấu trúc có thể xem nhƣ một sự mở rộng của các khái niệm biến và mảng, nó cho phép lƣu trữ và xử lý các dạng thông tin phức tạp hơn.

Khái niệm cấu trúc trong C có nhiều nét tƣơng tự nhƣ khái niệm bản ghi trong pascal hay foxpro. Cấu trúc là một công cụ mạnh để mô tả và xử lý các cấu trúc dữ liệu phức tạp trong các bài toán quản lý, điển hình nhƣ bài toán quản lý sinh viên,khi đó mỗi sinh viên đƣợc xem nhƣ một cấu trúc gồm các thành phần nhƣ họ tên, quê quán, tuổi, địa chỉ,… 6. Kiểu cấu trúc 6. Định nghĩa kiểu cấu trúc Khi định nghĩa một kiểu cấu trúc ta cần chỉ ra: tên của kiểu cấu trúc và các thành phần của nó.

Việc này đƣợc thực hiện theo mẫu sau: Mẫu 1: struct tên kiểu cấu trúc { Khai báo các thành phần }; trong đó thành phần của cấu trúc có thể là biến, mảng hoặc một cấu trúc khác mà kiểu của nó đã đƣợc định nghĩa từ trƣớc.1: struct que_quan { char xa[20], huyen[20], tinh[20]; } ; Thiết kế một kiểu cấu trúc có tên là que_quan gồm ba thành phần: xa, huyen, tinh đều có cùng kiểu dữ liệu là kiểu mảng ký tự. struct sinh_vien { 101 Downloaded by nguyenphuong Phuong nguyen (Kimphuongrio@gmail.com) lOMoARcPSD|16991370 char ho_ten[30]; int tuoi; float diem; struct que_quan dia_chi; }; Thiết kế một kiểu cấu trúc có tên là sinh_viên gồm bốn thành phần: thành phần thứ nhất có tên là ho_ten là một mảng char, thành phần thứ hai là tuoi có kiểu là int, thành phần thứ ba là diem có kiểu là float và thành phần cuối cùng là dia_chi, là một cấu trúc có kiểu là que_quan đƣợc định nghĩa ở trƣớc đó. Chú ý: Có thể dùng toán tử typedef để định nghĩa các kiểu cấu trúc nhƣ sau: Mẫu 2: typedef struct { Khai báo các thành phần } tên kiểu cấu trúc; Ví dụ 6. Các kiểu cấu trúc que_quan và sinh_vien ở trên có thể định nghĩa nhƣ sau: typedef struct { char xa[20], huyen[20], tinh[20]; } que_quan; typedef struct { char ho_ten[30]; int tuoi; float diem; que_quan dia_chi; } sinh_vien; 102 Downloaded by nguyenphuong Phuong nguyen (Kimphuongrio@gmail.

Khai báo biến cấu trúc Khai báo biến cấu trúc đƣợc thực hiện theo các mẫu sau: Mẫu 1: struct tên kiểu cấu trúc danh sách tên biến cấu trúc; Ví dụ 6.3: struct sinh_vien sv1, sv2; sẽ cho ta hai biến cấu trúc sv1 và sv2. Cả hai đều đƣợc xây dựng theo kiểu sinh_viên đã đƣợc định nghĩa ở ví dụ 6. Mẫu 2: Cho phép vừa thiết kế kiểu cấu trúc vừa khai báo biến cấu trúc struct tên kiểu cấu trúc { Khai báo các thành phần } danh sách tên biến cấu trúc; Ví dụ 6.4: Các biến cấu trúc sv1 và sv2 có thể đƣợc xây dựng theo cách sau: struct sinh_vien { char ho_ten[30]; int tuoi; float diem; struct que_quan dia_chi; } sv1, sv2; trong đó kiểu cấu trúc que_quan đƣợc định nghĩa nhƣ trong ví dụ 6. Mẫu 3: Vừa định nghĩa kiểu cấu trúc vừa khai báo biến cấu trúc nhƣ trên, ta có thể không cần chỉ ra tên kiểu cấu trúc nhƣ sau struct { Khai báo các thành phần } danh sách tên biến cấu trúc; Ví dụ 6.5: Các cấu trúc sv1, sv2 có thể khai báo nhƣ sau: 103 Downloaded by nguyenphuong Phuong nguyen (Kimphuongrio@gmail.com) lOMoARcPSD|16991370 struct { char ho_ten[30]; int tuoi; float diem; struct que_quan dia_chi; } sv1, sv2; với kiểu cấu trúc que_quan đƣợc định nghĩa nhƣ trong ví dụ 6.

Sự khác nhau giữa mẫu 2 và mẫu 3: ở mẫu 2 ngoài việc xây dựng đƣợc các biến cấu trúc ta còn tạo ra đƣợc kiểu cấu trúc. Kiểu này có thể đƣợc sử dụng để khai báo các biến cấu trúc khác. Còn mẫu 3 thì chỉ khai báo các biến cấu trúc, tức là chỉ thực hiện đƣợc một phần công việc của mẫu 2. Chú ý: Nếu dùng typedef để định nghĩa kiểu cấu trúc, thì khi khai báo biến cấu trúc có kiểu đã định nghĩa đó thì ta chỉ cần dùng tên kiểu (bỏ từ khóa struct).

Ví dụ nếu kiểu cấu trúc que_quan đƣợc định nghĩa nhƣ trong ví dụ 6.2 thì biến cấu trúc dịa_chi có thể khai báo trong các ví dụ 6.5 nhƣ sau: struct sinh_vien { char ho_ten[30]; int tuoi; float diem; que_quan dia_chi; } sv1, sv2; 6. Truy nhập tới các thành phần của cấu trúc Từ các chƣơng đầu, ta đã khá quen với việc sử dụng các biến, các phần tử mảng trong các câu lệnh. Các thành phần của một cấu trúc đóng vai trò nhƣ là biến, phần tử mảng. Do đó phép toán nào thực hiện đƣợc trên các biến, phần tử mảng thì cũng thực hiện đƣợc trên các thành phần đó.

Câu lệnh nào dùng cho biến, phần tử mảng thì cũng có thể dùng đƣợc cho các thành phần của cấu trúc. Để truy nhập đến các thành phần của cấu trúc ta sử dụng một trong các cách sau: 104 Downloaded by nguyenphuong Phuong nguyen (Kimphuongrio@gmail.com) lOMoARcPSD|16991370 tên cấu trúc1.tên cấu trúc2.tên cấu trúcn.tên thành phần Ví dụ 6.6: Biến cấu trúc sv1 đƣợc khai báo ở ví dụ 6.4 có các thành phần sau: sv1.ho_ten sv1.tinh Chú ý: Để truy nhập tới các thành phần của cấu trúc ta không những phải chỉ ra tên thành phần đó mà còn phải liệt kê tên các cấu trúc chứa thành phần này. Điều này gây ra sự mất công và tẻ nhạt khi viết chƣơng trình. Ta có thể rút gọn việc truy nhập đến các thành phần cấu trúc bằng cách dùng chỉ thị #define nhƣ sau: #define tên tên cấu trúc1.tên cấu trúc2.tên cấu trúcn Khi đó, truy nhập đến các thành phần của một biến cấu trúc ta không cần phải chỉ ra tên cấu trúc1.tên cấu trúc2.tên cấu trúcn mà thay vào đó ta chỉ viết là tên.7: Sử dụng #define #define ht sv1.ho_ten #define t sv1.tuoi #define đc sv1.dia_chi Khi đó nếu viết ht tức là viết sv1.ho_ten, viết t tức là viết sv1.tuoi, tƣơng tự đc.xã tƣơng đƣơng với sv1.

Sử dụng cấu trúc Cách sử dụng kiểu cấu trúc cũng nhƣ các kiểu dữ liệu số (int, float…) chỉ khác ở những điểm sau: - Để nhập dữ liệu cho các thành phần của cấu trúc ta thực hiện giống nhƣ nhập dữ liệu cho các biến/mảng. - Khi có con trỏ cấu trúc trỏ tới một đối tƣợng cấu trúc thì ta có thể truy nhập đến các thành phần của cấu trúc thông qua con trỏ nhƣ sau: Cách 1: tên con trỏ -> thành phần Cách 2: (*tên con trỏ).thành phần 105 Downloaded by nguyenphuong Phuong nguyen (Kimphuongrio@gmail.com) lOMoARcPSD|16991370 Ví dụ 6.8: Giả sử ta có khai báo struct sinh_vien sv, *p; sau đó dùng phép gán p = &sv; khi đó các cách viết sau là tƣơng đƣơng: sv1.ho_ten tƣơng đƣơng với p ->ho_ten hay (*p).ho_ten Ví dụ 6.9: Viết chƣơng trình nhập vào thông tin về một sinh viên gồm các thành phần họ tên, tuổi, điểm trung bình, địa chỉ. Sau đó in thông tin về sinh viên ra màn hình.h” void main() { typedef struct { char xa[20], huyen[20], tinh[20]; } que_quan; struct sinh_vien { char ho_ten[30]; int tuoi; float diem; que_quan dia_chi; } sv; float x; printf(“Nhap thong tin ve sinh viên\n”); printf(“Nhap ho ten sinh viên\n”); fflush(stdin); gets(sv.ho_ten); 106 Downloaded by nguyenphuong Phuong nguyen (Kimphuongrio@gmail.com) lOMoARcPSD|16991370 printf(“Nhap tuoi sinh vien\n”); scanf(“%d”, &sv.tuoi); printf(“Nhap diem trung binh sinh vien\n”); scanf(“%f”,&sv.diem); printf(“Nhap dia chi sinh vien\n”); printf(“Nhap xa:”); gets(sv.xa); printf(“Nhap huyen:”); gets(sv.huyen); printf(“Nhap tinh:”); gets(sv.tinh); printf(“In thông tin ve sinh vien ra man hinh\n”); printf(“Ho ten \t tuoi \t diem trung binh \t dia chi”); printf(“%6s\t%d\t%f\t %s %s %s”,sv.ho_ten, sv.diem_tb, sv. Mảng cấu trúc Là một mảng mà mỗi phần tử của mảng có kiểu là kiểu cấu trúc.

Giả sử kiểu cấu trúc sinh_viên đã đƣợc định nghĩa ở tên. Khi đó khai báo: struct sinh_vien sv, danh_sach[100]; sẽ cho một biến cấu trúc sv kiểu sinh_vien và một mảng cấu trúc danh_sach. Mảng danh_sach gồm 100 phần tử, mỗi phần tử là một cấu trúc kiểu sinh_vien. Chú ý: không cho phép sử dụng phép toán lấy địa chỉ đối với các thành phần thực của mỗi phần tử trong mảng cấu trúc.

Chẳng hạn không cho phép viết &danh_sách[i].diem nếu kiểu của diem là thực còn nếu kiểu của diem là nguyên thì cho phép.10: Viết chƣơng trình nhập vào thông tin về một lớp gồm n sinh viên, mỗi sinh viên là một cấu trúc gồm các thành phần họ tên, tuổi, điểm trung bình, địa chỉ. Sau đó in thông tin về sinh viên ra màn hình.h” 107 Downloaded by nguyenphuong Phuong nguyen (Kimphuongrio@gmail.com) lOMoARcPSD|16991370 void main() { struct sinh_vien { char ho_ten[30], dia_chi[30]; int tuoi; float điem; } lop[100]; float x; int n,i; printf(“Nhap so sinh vien:”); scanf(“%d”,&n); for (i = 1;i<=n;i++) { printf(“Nhap thông tin ve sinh vien thu %d\n”,i); printf(“Nhap ho ten sinh vien\n”); fflush(stdin); gets(lop[i].ho_ten); printf(“Nhap tuoi sinh vien\n”); scanf(“%d”, &lop[i].dia_chi); } printf(“In thông tin ve sinh vien ra man hinh\n”); printf(“ Ho ten \t Tuoi \t Diem \t Dia chi\n”); 108 Downloaded by nguyenphuong Phuong nguyen (Kimphuongrio@gmail.com) lOMoARcPSD|16991370 for (i = 1;i<=n;i++) { printf(“%s \t %d\t %f\t%s\n”, lop[i].ho_ten, lop[i].dia_chi); } getch(); } 6. Khởi đầu cho một cấu trúc và phép gán cấu trúc Có thể khởi đầu cho một cấu trúc bằng cách viết vào sau khai báo của chúng một danh sách các giá trị cho các thành phần .11: xét đoạn khai báo struct sinh_vien sv ={“tran van A”, 20, 6.5, “Ha noi”}; Xác định một cấu trúc có tên là sv kiểu là sinh_viên đã đƣợc định nghĩa ở ví dụ 6.1 và khởi đầu cho các thành phần của cấu trúc này. Nhƣ vậy sv.họ_ten là “tran van A”, sv.dia_chi = “Ha noi”.

Có thể thực hiện phép gán trên các biến và phần tử mảng cấu trúc cùng kiển. Khi đó mỗi thành phần của cấu trúc này sẽ đƣợc gán cho thành phần tƣơng ứng của cấu trúc kia. Chẳng hạn ta có thể viết sv1 = sv2, ở đây sv1, sv2 là các cấu trúc có cùng kiểu sinh_viên. Phép gán hai cấu trúc tỏ ra rất tiện lợi khi ta cần sắp xếp lại một mảng cấu trúc theo một trật tự mới.12: Đoạn chƣơng trình sau sắp xếp danh sách sinh viên trong ví dụ trên theo thứ tự tăng dần của điểm trung bình for (i=1;i<=n-1;i++) for(j=i+1; j<=n; j++) if (lop[i].diem) { tg = lop[i]; lop[i] = lop[j]; lop[j] = tg; } 109 Downloaded by nguyenphuong Phuong nguyen (Kimphuongrio@gmail.

Định nghĩa kiểu hợp (union) Cũng nhƣ cấu trúc, union gồm nhiều thành phần, nhƣng chúng khác nhau ở chỗ: các thành phần của cấu trúc có những vùng nhớ khác nhau, còn các thành phần của union đƣợc cấp phát một vùng nhớ chung. Độ dài của union bằng độ dài của thành phần lớn nhất 6. Khai báo biến kiểu hợp Việc định nghĩa một kiểu union, khai báo union, mảng union, con trỏ union và cách truy nhập đến các thành phần của union đƣợc thực hiện hoàn toàn giống nhƣ đối với cấu trúc.

Nội dung được bảo vệ bản quyền — Tải xuống đầy đủ