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.
57 trang |
Chia sẻ: maiphuongtl | Lượt xem: 6560 | Lượt tải: 1
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:
- chuong5c_2011_563.pdf