Bài giảng Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc

19. 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ên 23. 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.

pdf57 trang | Chia sẻ: maiphuongtl | Lượt xem: 6544 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Bài giảng Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
1/47Ngôn ngữ lập trình C++ LẬP TRÌNH C++ (3 Tín chỉ) Gv: Nguyễn Văn Hùng Khoa: Khoa học máy tính Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 2/56 CHƯƠNG 5: KIỂU CON TRỎ VÀ KIỂU CẤU TRÚC  Mục tiêu  Giớ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. Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 3/56 CHƯƠNG 5: KIỂU CON TRỎ VÀ KIỂU CẤU TRÚC  Nội dung  Kiểu con trỏ  Kiểu cấu trúc  Cấu trúc tự trỏ  Mảng cấu trúc  Con trỏ và mảng  Mảng con trỏ Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 4/56 - Đị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ỏ Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 5/56 - Đị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 & Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 6/56 Trường hợp, đối tượng là một biến, ta viết &Tenbien \\Lấy địa chỉ của biến Yê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 & Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 7/56 Ví dụ: string st="hello"; float a[]={5.0,4.0,3.0,2.0,1.0}; int i; char b[1]={'a'}; cout<<&st<<endl; for (i=0; i<=4; i++) cout<<&a[i]<<endl; cout<<&a<<endl; cout<<&b<<endl; cout<<b[0]<<endl; Địa chỉ và phép toán & Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 8/56 - Con trỏ là một biến chứa địa chỉ của biến khác. - Giả sử P là con trỏ chứa địa chỉ của biến x thì ta gọi p trỏ tới x hay x được trỏ bởi p. - Thông qua con trỏ, ta có thể làm việc được với nội dung của ô nhớ mà con trỏ trỏ đến. Khai báo biến con trỏ Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 9/56 - Cú pháp: kiểu_dữ_liệu *tên_biến_con_trỏ; Trong đó: - Kiểu_dữ_liệu là kiểu dữ liệu của ô nhớ mà ta muốn con trỏ trỏ tới. - Dấu (*) nhằm báo cho trình biên dịch biết đang làm việc với kiểu dữ liệu là kiểu con trỏ - tên_biến_con_trỏ cũng được đặt theo quy tắc đặt tên => 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ệu Khai báo biến con trỏ Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 10/56 - 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ỏ Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 11/56 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<<a<<endl; cout<<p<<endl; cout<<p1<<endl; cout<<a[3]<<endl; cout<<*p1<<endl; cout<<*p<<endl; cout<<*p+*p<<endl; q=&i; cout<<q<<endl; Khai báo biến con trỏ Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 12/56 + Phép gán: - Gán con trỏ với địa chỉ một biến - Gán các con trỏ với nhau (phải cùng kiểu) Các phép toán trên con trỏ Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 13/56 Ví dụ: int i=9, j=4, *p, *q; p=&i; q=&j; cout<<p<<endl; cout<<q<<endl; cout<<*p<<endl; cout<<*q<<endl; p=q; cout<<p<<endl; cout<<q<<endl; cout<<*p<<endl<<*q<<endl; Các phép toán trên con trỏ Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 14/56 + Phép tăng giảm địa chỉ: p+n: Con trỏ trỏ đến thành phần thứ n sau p p-n: Con trỏ trỏ đến thành phần thứ n trước p Một đơn vị tăng của con trỏ bằng kích thước của biến được trỏ. Chẳng hạn, biến có kiểu nguyên thì khi con trỏ tăng hay giảm một đơn vị tương đương với 2 bytes Các phép toán trên con trỏ Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 15/56 Ví dụ: int a[5]={1, 2, 3, 4, 5}; int *p, i; p=a; cout<<p<<endl<<endl; cout<<*p<<endl<<endl; for (i=0; i<5; i++) { cout<<p+i<<endl<<endl; cout<<*(p+i)<<endl<<endl; } Các phép toán trên con trỏ Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 16/56 + Phép toán tự tăng, giảm: p++, p--, ++p, --p + Hiệu 2 con trỏ: p – q + Phép toán so sánh: , >=… 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ệu Các phép toán trên con trỏ Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 17/56 - Cấp phát bộ nhớ: sử dụng toán tử new + Cấp phát tĩnh + Cấp phát động Cú 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ỏ Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 18/56 - 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ỏ Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 19/56 Ví dụ: int *p; cout<<"Nhap mot so nguyen : "; cin>>*p; cout<<*p<<endl; int *p; cout<<"Nhap mot so nguyen : "; p = new int; cin>>*p; cout<<*p<<endl; Cấp phát và giải phóng bộ nhớ cho con trỏ Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 20/56 Bài 1. Viết chương trình khai báo biến con trỏ kiểu nguyên. Sau đó, nhập vào một dãy gồm 10 số nguyên. Hiển thị dãy đó ra màn hình: - Theo thứ tự nhập vào - Theo thứ tự ngược lại Bài 2. Sử dụng con trỏ để nhập vào một dãy gồm n số thực. Sau đó: - Hiển thị dãy vừa nhập ra màn hình - Hiển thị dãy vừa nhập ra màn hình sau khi đã sắp xếp Cấp phát và giải phóng bộ nhớ cho con trỏ Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 21/56 - Kiểu cấu trúc là gì? - Làm thế nào để định nghĩa một cấu trúc? - Cách khai báo biến cấu trúc? - Làm thế nào để làm việc với các thành phần của cấu trúc? 5.2 Kiểu cấu trúc Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 22/56 - Kiểu cấu trúc là kiểu dữ liệu bao gồm nhiều thành phần có kiểu khác nhau, mỗi thành phần được gọi là một trường (field) - Chẳng hạn, Sinh viên gồm nhiều trường: mã sinh viên, họ tên, ngày tháng năm sinh, giới tính, quê quán, … Khái niệm Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 23/56 - Xác định các kiểu dữ liệu đơn giản của các biến thành phần được nhóm lại trong cấu trúc đó. - Cần chỉ ra: tên của cấu trúc và các thành phần của nó. Phân biệt thành phần này với thành phần khác thông qua kiểu dữ liệu, tên biến và kết thúc bằng dấu chấm phẩy (;). Các thành phần của cấu trúc được đặt trong cặp dấu móc nhọn ({}) và dùng dấu chấm phẩy (;) để kết thúc việc định nghĩa một cấu trúc. Định nghĩa cấu trúc Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 24/56 Cú pháp tổng quát để định nghĩa một kiểu cấu trúc như sau: struct Tên_kiểu_cấu_trúc { /*Bắt đầu một cấu trúc*/ ; ; …….. ; }; /*Kết thúc một cấu trúc Định nghĩa cấu trúc Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 25/56 Ví dụ: struct Ngaythang { unsigned int Ngay; unsigned int Thang; unsigned int Nam; }; //struct lồng nhau struct Sinhvien { char MSSV[10]; char Hoten[40]; struct Ngaythang Ngaysinh; char Gioitinh[5]; char Diachi[40]; }; Định nghĩa cấu trúc Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 26/56 Cú 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ến struct Ngaythang { unsigned int Ngay; unsigned int Thang; unsigned int Nam; }Ngay_den, Ngay_di; Khai báo biến cấu trúc Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 27/56 Lư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úc Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 28/56 Ví dụ: struct Ngaythang { unsigned int Ngay, Thang, Nam; }; Ngaythang Ngay_den={20,04,2010}; cout<<Ngay_den.Ngay<<endl; cout<<Ngay_den.Thang<<endl; cout<<Ngay_den.Nam<<endl; Khai báo biến cấu trúc Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 29/56 Ví dụ: struct Ngaythang { unsigned int Ngay, Thang, Nam; }; Ngaythang Ngay_den; Ngay_den={20,04,2010}; cout<<Ngay_den.Ngay<<endl; cout<<Ngay_den.Thang<<endl; cout<<Ngay_den.Nam<<endl; Khai báo biến cấu trúc Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 30/56 - Nếu kiểu struct được khai báo trước tất cả các hàm, nó có hiệu lực trong toàn bộ chương trình có sử dụng nó. - Nếu nó đặt bên trong một hàm, thì chỉ có hàm đó được dùng nó. - Thông thường kiểu cấu trúc được khai báo trong tệp tiêu đề (.h) và được sử dụng trong chương trình bằng lệnh #include. Phạm vi của cấu trúc Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 31/56 - Nếu biến cấu trúc là thành phần trực tiếp của một cấu trúc, ta truy cập theo cú pháp: Tên_biến_cấu_trúc.tên_thành_phần - Nếu biến cấu trúc là thành phần trực tiếp của một cấu trúc mà bản thân cấu trúc này lại là thành phần của một cấu trúc khác lớn hơn, ta truy cập theo cú pháp: Tên_biến_cấu_trúc.tên_biến_cấu_trúc.tên_thành_phần Tên_biến_cấu_trúc.tên_biến_cấu_trúc.tên_biến_cấu_tr úc.tên_thành_phần - Để làm việc với một biến cấu trúc, ta cần phải thao tác trên từng thành phần của nó. Truy cập thành phần của cấu trúc Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 32/56 Lưu ý: Đối với cấu trúc, ta có thể gán 2 giá trị biến cấu trúc cho nhau. Phép gán này cũng tương đương với việc gán từng thành phần của cấu trúc Truy cập thành phần của cấu trúc Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 33/56 Ví dụ: struct Diem { int Mon1, Mon2, Mon3; } sv, hs; cout<<"Nhap diem cho sinh vien!"<<endl; cout>sv.Mon1; cout>sv.Mon2; cout>sv.Mon3; hs = sv; cout<<“Tong diem : "<<sv.Mon1+sv.Mon2+sv.Mon3<<endl; cout<<“Tong diem : "<<hs.Mon1+hs.Mon2+hs.Mon3<<endl; Truy cập thành phần của cấu trúc Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 34/56 - Con trỏ cấu trúc là con trỏ chứa địa chỉ của một biến cấu trúc hoặc một vùng nhớ có kiểu cấu trúc nào đó. - Cách khởi tạo một con trỏ cấu trúc: + Gán địa chỉ của một biến cấu trúc cho một thành phần của mảng + Con trỏ được khởi tạo bằng việc sử dụng toán tử new để cấp phát bộ nhớ + Đối với con trỏ p trỏ đến mảng a, ta có thể truy cập đến các thành phần của phần tử mảng: p[i].Hoten; (p+i)->Hoten; *(p+i).Hoten; Con trỏ cấu trúc Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 35/56 struct Sinhvien { char Hoten[30], Gioitinh[5]; float Diem; } lop[50]; Sinhvien *p; cout<<"Nhap ho ten sinh vien thu 11: "; cin.getline(lop[10].Hoten,30); cout<<"Nhap gioi tinh : "; cin.getline(lop[10].Gioitinh,5); cout>lop[10].Diem; p = lop; cout<<p[10].Hoten<<endl; coutGioitinh<<endl; cout<<"Diem : "<<(*(p+10)).Diem<<endl; Con trỏ cấu trúc Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 36/56 - Các thành phần của cấu trúc cũng giống như các biến. Do đó, việc lấy địa chỉ của các thành phần này cũng tương tự như với biến. Chẳng hạn: &Sinhvien.Hoten; &Lop[10].Gioitinh; &(p->Diem); Địa chỉ của các thành phần cấu trúc Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 37/56 typedef 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: Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 38/56 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ỏ Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 39/56 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ỏ Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 40/56 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ỏ Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 41/56 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ỏ Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 42/56 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ỏ Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 43/56 - 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 sau Xây dựng danh sách sinh viên của lớp gồm n sinh viên. struct sinhvien { char Hoten[30]; float Diem; }; sinhvien SV[60]; 5.4 Mảng cấu trúc Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 44/56 - Con trỏ và mảng một chiều - Con trỏ và xâu ký tự 5.5 Con trỏ và mảng Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 45/56 - 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ều Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 46/56 Ví dụ: int a[100]; int i, n, *p; cout>n; for (i=0;i<n;i++) { cout>a[i];} cout<<"In cac gia tri vua nhap "<<endl; for (i=0;i<n;i++) cout<<a[i]; cout<<endl; for (p=a;p<a+n;p++) cout<<*p; cout<<endl; for (p=a,i=0;i<n;i++) cout<<*(p+i); cout<<endl; for (i=0;i<n;i++) cout<<*(a+i); cout<<endl; Con trỏ và mảng một chiều Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 47/56 Một con trỏ ký tự có thể xem như một xâu ký tự, trong đó xâu chính là tất cả các ký tự kể từ byte con trỏ đầu tiên đến byte “\0” gặp đầu tiên. Vì vậy, có thể khai báo các xâu dưới dạng con trỏ ký tự như sau: char *st; char *st1=“Hello”; Con trỏ và xâu ký tự Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 48/56 Các hàm trên xâu vẫn được áp dụng như khai báo nó dưới dạng mảng ký tự. Tuy nhiên, ta có thể gán trực tiếp 2 xâu dưới dạng con trỏ. Ví dụ: char *st; char *s=“Hello”; st = s; Con trỏ và xâu ký tự Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 49/56 Khi khai báo xâu dạng con trỏ, thì nó vẫn chưa cấp phát bộ nhớ cụ thể. Do đó, ta phải sử dụng toán tử new để xin cấp phát bộ nhớ cho xâu với độ dài cần thiết. Ví dụ 1: char *st, *s = new char[30]; strcpy(s, “Hello”); st = s; Ví dụ 2: char *st, *s = new char[30]; strcpy(s, “Hello”); st = new char[30]; strcpy(st,s); Con trỏ và xâu ký tự Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 50/56  Khái niệm chung - Mảng con trỏ là mảng mà các phần tử của nó là các con trỏ có cùng kiểu. - Do phần tử của mảng con trỏ là một con trỏ trỏ đến một mảng nào đó -> cho phép quản lý nhiều mảng dữ liệu cùng kiểu. 5.6 Mảng con trỏ Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 51/56  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 char 5.6 Mảng con trỏ Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 52/56 Ví dụ: char *Hoten[35]; int i, n; cout<<"Nhap so sinh vien n= "; cin>>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ỏ Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 53/56 BÀI TẬP THỰC HÀNH 1. 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? Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 54/56 BÀI TẬP THỰC HÀNH 6. 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ếp 9. 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. Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 55/56 BÀI TẬP THỰC HÀNH 10. 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ỳ Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 56/56 BÀI TẬP THỰC HÀNH 15. 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úng 18. 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. Ngôn ngữ Lập trình C++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 57/56 BÀI TẬP THỰC HÀNH 19. 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ên 23. 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:

  • pdfchuong5c_2011_563.pdf