Tài liệu Kĩ thuật lập trình - Chương 5: Kiểu con trỏ và kiểu cấu trúc: CHƯƠNG 5: KIỂU CON TRỎ VÀ KIỂU CẤU TRÚCMục tiêuGiới thiệu các kiến thức về kiểu Con trỏ và kiểu Cấu trúc: khái niệm, cách định nghĩa, khai báo biến con trỏ, biến cấu trúc, cách truy xuất dữ liệu bằng con trỏ và thao tác với từng thành phần của cấu trúc.CHƯƠNG 5: KIỂU CON TRỎ VÀ KIỂU CẤU TRÚCNội dungKiểu con trỏKiểu cấu trúcCấu trúc tự trỏMảng cấu trúcCon trỏ và mảngMảng con trỏ Địa chỉ và phép toán & Khai báo biến con trỏ Các phép toán trên con trỏ Cấp phát và giải phóng bộ nhớ cho con trỏ5.1 Kiểu Con trỏ- Địa chỉ Là một đại lượng dùng để định vị (xác định) vị trí Đối tượng muốn xác định ở đây là các biến và các phần tử (ô nhớ) chứa dữ liệu Để xác định được địa chỉ của một đối tượng nào đó trong C++, ta sử dụng phép toán một ngôi lấy địa chỉ là “&” theo cú pháp: &Đốitượng \\ Dùng để xác định vị trí ô nhớ “Đốitượng”Địa chỉ và phép toán &Trường hợp, đối tượng là một biến, ta viết &Tenbien \\Lấy địa chỉ của biếnYêu cầu: Xác định địa chỉ của đối tượng nếu là mảng, chuỗi ký tự?Địa chỉ và p...
56 trang |
Chia sẻ: Khủng Long | Lượt xem: 1329 | Lượt tải: 0
Bạn đang xem trước 20 trang mẫu tài liệu Kĩ thuật lập trình - Chương 5: Kiểu con trỏ và kiể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
CHƯƠNG 5: KIỂU CON TRỎ VÀ KIỂU CẤU TRÚCMục tiêuGiới thiệu các kiến thức về kiểu Con trỏ và kiểu Cấu trúc: khái niệm, cách định nghĩa, khai báo biến con trỏ, biến cấu trúc, cách truy xuất dữ liệu bằng con trỏ và thao tác với từng thành phần của cấu trúc.CHƯƠNG 5: KIỂU CON TRỎ VÀ KIỂU CẤU TRÚCNội dungKiểu con trỏKiểu cấu trúcCấu trúc tự trỏMảng cấu trúcCon trỏ và mảngMảng con trỏ Địa chỉ và phép toán & Khai báo biến con trỏ Các phép toán trên con trỏ Cấp phát và giải phóng bộ nhớ cho con trỏ5.1 Kiểu Con trỏ- Địa chỉ Là một đại lượng dùng để định vị (xác định) vị trí Đối tượng muốn xác định ở đây là các biến và các phần tử (ô nhớ) chứa dữ liệu Để xác định được địa chỉ của một đối tượng nào đó trong C++, ta sử dụng phép toán một ngôi lấy địa chỉ là “&” theo cú pháp: &Đốitượng \\ Dùng để xác định vị trí ô nhớ “Đốitượng”Địa chỉ và phép toán &Trường hợp, đối tượng là một biến, ta viết &Tenbien \\Lấy địa chỉ của biếnYêu cầu: Xác định địa chỉ của đối tượng nếu là mảng, chuỗi ký tự?Địa chỉ và phép toán &Ví dụ:string st="hello";float a[]={5.0,4.0,3.0,2.0,1.0};int i;char b[1]={'a'}; cout Khai báo con trỏ có tên tên_biến_con_trỏ trỏ tới ô nhớ chứa dữ liệu có kiểu_dữ_liệuKhai báo biến con trỏ- Sử dụng con trỏ Để con trỏ có tênbiếncontrỏ trỏ đến biến (ô nhớ) có kiểudữliệu ta cần phải gán con trỏ tênbiếncontrỏ cho địa chỉ của biến(ô nhớ) cần trỏ đến: tênbiếncontrỏ = địa chỉ của ô nhớ (biến) cần trỏ tới Lưu ý: Không thể gán một hằng địa chỉ cụ thể cho biếncontrỏ Để lấy nội dung ô nhớ mà con trỏ trỏ tới ta sử dụng phép toán *.Khai báo biến con trỏVí dụ:float a[]={5.2, 4.3, 3.1, 2.25, 1.0};int i=9, *q;float *p, *p1; p=a; p1=&a[3]; cout, >= Các phép toán này thường áp dụng cho các con trỏ trỏ đến các phần tử của cùng một mảng dữ liệuCác phép toán trên con trỏ Cấp phát bộ nhớ: sử dụng toán tử new + Cấp phát tĩnh + Cấp phát độngCú pháp: p = new kieugiatri; p = new kieugiatri[so_phan_tu]Cấp phát và giải phóng bộ nhớ cho con trỏ Giải phóng bộ nhớ: sử dụng toán tử delete Cú pháp: delete p; delete[] p;Cấp phát và giải phóng bộ nhớ cho con trỏVí dụ: int *p;cout>*p;cout>*p;cout ; ; .. ; }; /*Kết thúc một cấu trúcĐịnh nghĩa cấu trúcVí dụ: struct Ngaythang{ unsigned int Ngay; unsigned int Thang; unsigned int Nam;};//struct lồng nhaustruct Sinhvien{ char MSSV[10]; char Hoten[40]; struct Ngaythang Ngaysinh; char Gioitinh[5]; char Diachi[40];};Định nghĩa cấu trúcCú pháp khai báo biến kiểu cấu trúc: Tên_kiểu_cấu_trúc , , ;struct Ngaythang{ unsigned int Ngay; unsigned int Thang; unsigned int Nam;};Ngaythang Ngay_den, Ngay_di //Vừa định nghĩa vừa khai báo biếnstruct Ngaythang{ unsigned int Ngay; unsigned int Thang; unsigned int Nam;}Ngay_den, Ngay_di;Khai báo biến cấu trúcLưu ý: Có thể vừa khai báo vừa khởi tạo giá trị cho biến kiểu cấu trúc- Không được phép gán trực tiếp một bộ giá trị cụ thể cho một biến cấu trúc.Khai báo biến cấu trúcVí dụ:struct Ngaythang{ unsigned int Ngay, Thang, Nam;};Ngaythang Ngay_den={20,04,2010};cout>sv.Mon1;cout>sv.Mon2;cout>sv.Mon3;hs = sv;coutHoten; *(p+i).Hoten;Con trỏ cấu trúcstruct Sinhvien{ char Hoten[30], Gioitinh[5]; float Diem;} lop[50];Sinhvien *p;cout>lop[10].Diem;p = lop;coutGioitinhDiem); Địa chỉ của các thành phần cấu trúctypedef struct Têncấutrúc tênbiếncấutrúc;struct Têncấutrúc{ các thành phần; tênbiếncấutrúc *contrỏ;};5.3 Cấu trúc tự trỏCách 1: Cách 2: struct Têncấutrúc{ các thành phần; Têncấutrúc *contrỏ;};typedef Têncấutrúc tênbiếncấutrúc;5.3 Cấu trúc tự trỏCách 3: typedef struct tênbiếncấutrúc{ các thành phần; tênbiếncấutrúc *contrỏ;};5.3 Cấu trúc tự trỏCách 4: struct tênbiếncấutrúc{ các thành phần; tênbiếncấutrúc *contrỏ;};5.3 Cấu trúc tự trỏVí dụ: typedef struct SV sinhvien;struct SV{ char Hoten[30]; float Diem; sinhvien *tiep;};struct SV{ char Hoten[30]; float Diem; SV *tiep;};typedef SV sinhvien;5.3 Cấu trúc tự trỏVí dụ: typedef struct sinhvien;{ char Hoten[30]; float Diem; sinhvien *tiep;};struct sinhvien{ char Hoten[30]; float Diem; sinhvien *tiep;};5.3 Cấu trúc tự trỏ Mảng cấu trúc là mảng mà kiểu phần tử của nó là kiểu cấu trúc.Ví dụ: ta xét khai báo sauXây dựng danh sáchsinh viên của lớp gồm nsinh viên.struct sinhvien{ char Hoten[30]; float Diem;};sinhvien SV[60];5.4 Mảng cấu trúc Con trỏ và mảng một chiều Con trỏ và xâu ký tự5.5 Con trỏ và mảng- Con trỏ có thể trỏ đến một biến hoặc một mảng. Khi đó, địa chỉ của mảng chính là địa chỉ của phần tử đầu tiên của mảng a[0]. a+i là địa chỉ thành phần thứ i của mảng a. Nếu cho con trỏ *p trỏ đến mảng a ta gán: p=a hoặc p=&a Khi đó, giá trị dữ liệu của của phần tử a[0] là *p=a[0], phần tử thứ i là *(p+i)=a[i]=*(a+i)Chú ý: ta có thể viết *(p+1), *(a+1), *(p++) nhưng không thể viết *(a++).Con trỏ và mảng một chiềuVí dụ:int a[100];int i, n, *p; cout>n;for (i=0;i>a[i];}cout cho phép quản lý nhiều mảng dữ liệu cùng kiểu.5.6 Mảng con trỏ Khai báo mảng con trỏ kiểudữliệu *tênmảng[sốphầntử];Tác dụng: khai báo mảng con trỏ có số phần tử và kiểu dữ liệu được chỉ ra.Chú ý: mảng xâu ký tự là trường hợp riêng của mảng con trỏ nói chung, trong đó kiểu dữ liệu là kiểu char5.6 Mảng con trỏVí dụ:char *Hoten[35];int i, n;cout>n;cin.ignore();for (i=0;i<n;i++){ Hoten[i] = new char[40]; cin.getline(Hoten[i],40);}cout<<"Xuat gia tri vua nhap:"<<endl;for (i=0;i<n;i++) cout<<Hoten[i]<<endl;5.6 Mảng con trỏBÀI TẬP THỰC HÀNH1. Cho p, q là các con trỏ trỏ đến ký tự c. Gán *p = *q + 1. Khi đó, có thể khẳng định *q = *p – 1?2. Cho p, q là 2 con trỏ trỏ đến biến nguyên x = 10. Gán *p = *q + 5. Lúc này, giá trị của *p và *q là bao nhiêu? 3. Cho p, q, r, s là các con trỏ trỏ đến biến nguyên x = 5. Gán *q = *p + 1; *r = *q + 1; *s = *r + 1. *q = *s – 2. Hỏi giá trị của biến x là bao nhiêu?4. Không dùng mảng, hãy nhập vào một dãy số nguyên sau đó xuất dãy ra màn hình theo thứ tự ngược lại.5. Không dùng mảng, hãy nhập vào một dãy số nguyên sau đó in ra màn hình dãy đã được sắp xếp dãy theo chiều tăng (hoặc giảm) dần?BÀI TẬP THỰC HÀNH6. Dùng con trỏ, nhập giá trị vào cho một dãy các số thực. Sau đó, tìm và xuất ra màn hình phần tử lớn nhất và bé nhất có trong dãy.7. Sử dụng con trỏ, nhập vào một dãy ký tự. Sau đó, tìm và thay thế các ký tự ‘a’ bằng ký tự ‘b’. Hiển thị ra màn hình dãy ký tự trước và sau khi thay thế.8. Xây dựng hàm nhập, xuất, sắp xếp mảng bất kỳ bằng cách sử dụng biến con trỏ làm tham số hình thức của hàm. Sử dụng các hàm trên để viết chương trình nhập các giá trị vào cho mảng sau đó xuất ra màn hình các giá trị của mảng trước và sau khi sắp xếp9. Sử dụng con trỏ để xây dựng hàm tính tổng 2 mảng. Sau đó, xuất ra màn hình kết quả tính được.BÀI TẬP THỰC HÀNH10. Sử dụng con trỏ, nhập vào một xâu ký tự. Sau đó, đếm và xuất ra màn hình tần suất xuất hiện các ký tự trong xâu.11. Sử dụng con trỏ, nhập vào một xâu ký tự. Sau đó, đếm và xuất ra màn hình các từ có trong xâu.12. Tính số ngày đã qua kể từ đầu năm cho đến ngày hiện tại. Quy ước ngày được khai báo dưới dạng cấu trúc.13. Nhập một ngày tháng năm dưới dang cấu trúc. Tính chính xác (kể cả năm nhuận) số ngày đã qua bắt đầu từ ngày 1/ 1/ 1 đến ngày vừa nhập. 14. Khai báo ngày tháng năm theo kiểu cấu trúc. Viết chương trình tính khoảng cách (số ngày) giữa 2 tháng bất kỳBÀI TẬP THỰC HÀNH15. Viết chương trình nhập vào một ngày tháng năm bất kỳ. Xuất ra màn hình ngày đó là thứ mấy nếu ta xem ngày 1/ 1/ 1 là thứ 2.16. Viết chương trình nhập vào 2 ngày nào đó của tháng bất kỳ của năm bất kỳ. Tính và hiển thị ra màn hình khoảng cách giữa 2 ngày đó là bao nhiêu ngày.17. Cho số phức dưới dạng cấu trúc gồm có 2 phần là phần thực và phần ảo. Viết chương trình nhập vào 2 số phức bất kỳ. Tính và xuất ra màn hình kết quả tổng, hiệu, tích, thương của chúng18. Cho phân số dưới dạng cấu trúc gồm 2 phần là tử số và mẫu số. Viết chương trình nhập vào 2 phân số. Tính và hiển thị ra màn hình tổng, hiệu, tích, thương của chúng sau khi đã rút gọn.BÀI TẬP THỰC HÀNH19. Viết chương trình nhập vào một mảng sinh viên, thông tin về mỗi sinh viên gồm: Hoten, tuoi, quequan. Sắp xếp mảng vừa nhập theo chiều tăng dần của chuỗi. Sau đó, xuất ra màn hình mảng sau khi đã sắp xếp.20. Cho hình chữ nhật dưới dạng cấu trúc gồm chiều dài và chiều rộng. Nhập vào một mảng các hình chữ nhật. Tính và xuất ra màn hình chu vi, diện tích tương ứng của mỗi hình.21. Tạo danh sách gồm 10 số nguyên dương. Sau đó sắp xếp danh sách theo thứ tự tăng dần.22. Tạo danh sách LIFO gồm 100 số nguyên tố đầu tiên23. Tạo danh sách FIFO gồm n sinh viên, mỗi sinh viên được quản lý bởi: họ tên, tuổi, điểm trung bình. Sau đó sắp xếp danh sách sinh viên theo thứ tự giảm dần của điểm trung bình.
Các file đính kèm theo tài liệu này:
- tailieu.ppt