Bài th c hành s 9:
ự
ố
Con trỏ
A. M c tiêu
ụ
N m v ng đ nh nghĩa bi n con tr , các thao tác c b n trên con tr . ỏ ỏ ơ ả ữ ế ắ ị
Năm v ng các m ng đ ng, xâu đ ng cài đ t b ng con tr ặ ằ ữ ả ộ ộ ỏ
Rèn luy n cách g i hàm, truy n tham bi n. ệ ề ế ọ
B.
Ôn t p:ậ
Các đ nh nghĩa ki u con tr ể ị ỏ
Các thao tác c b n trên con tr ơ ả ỏ
M ng đ ng, xâu đ ng cài đ t b ng con tr ặ ằ ả ộ ộ ỏ
Truy n tham s . ố ề
I. Bi n c u tr - Ki u con tr : ỏ ỏ
ế ấ
ể
1.
Cú pháp đ nh nghĩa bi n con tr : ỏ ế ị
KDL *ConTro;
2. Đ nh nghĩa ki u con tr ể ị ỏ
typedef KDL *KieuConTro;
II. Các phép toán trên con tr :ỏ
1.
Phép toán con tr “ * “: ỏ
*px : tr v n i dung c a đ a ch mà con tr px t i. ả ề ộ ủ ị ỏ ỉ ớ
2. Phép gán đ a ch cho con tr cùng ki u: ể ỏ ị ỉ
gi s : ả ử
int *px, x;
px = &x;
3.
( khi đó có: *px == x)
Gán 2 con tr cùng ki u. ỏ ể
L u ý: M i con tr đ u có th nh n giá tr NULL ể ậ ỏ ề ư ọ ị
px = NULL;
4. C p phát vùng nh cho bi n con tr (đ ch a d li u) ế ỏ ể ứ ữ ệ ấ ớ
px = new KDL;
5. Gi ả i phóng vùng nh cho bi n con tr ớ ế ỏ
delete px;
III. M ng đ ng 1chi u ộ
ề
ả
(C p phát đ ng cho m ng 1 chi u thông qua con tr ) ỏ ề ấ ả ộ
Dùng con tr đ cài đ t m ng 1 chi u. ỏ ể ề ặ ả
1 Khai báo :
KDL *a;
2. C p phát vung nh : ấ ớ
//C p phát cho m ng đ ng a ch a đ MAX ph n t ki u KDL ứ ủ ầ ử ể ấ ả ộ
a = new KDL[MAX];
3. Thu h i vùng nh : ồ ớ
delete []a;
4. Truy c p đ n ph n t ầ ử ị (đ a ch , giá tr ) trong m ng: ị ế ả ậ ỉ
a[i] *(a+i) Giá tr :ị
Đ a ch : &a[i] a + i ị ỉ
IV. M ng đ ng 2 chi u (Ma tr n)
ộ
ề
ả
ậ
(C p phát đ ng cho m ng 2 chi u thông qua con tr ) ỏ ề ấ ả ộ
1. Khai báo :
KDL *a;
2. C p phát vùng nh đ l u tr d li u : ử ữ ệ ớ ể ư ấ
a = new KDL[KT1*KT2];
// (a = new int[m*n];)
3. Thu h i vùng nh . ớ ồ
delete [ ]a;
4. Duy t các ph n t c a m ng : ầ ử ủ ệ ả
c a m ng, theo cách đã bi t là d a vào ch s c a các ầ ử ủ ế ả
ệ ỉ ố ủ c a m ng( a[i][j]), ngoài ra có th s d ng con tr theo cách sau: Đ duy t các ph n t ể ph n t ầ ử ủ ể ử ụ ự ỏ ả
a + i*n + j tr t i ph n t a[i][j] ( m ng m hàng, n c t) ỏ ớ ầ ử ả ộ
V. Xâu ký t
đ ng
ự ộ
1. Khai báo :
char *a;
//wchar *a; TCHAR *a;
2. Kh i t o : ở ạ
*a = NULL;
2. C p phát vùng nh : ớ ấ
a = new char[MAX];
3. Thu h i vùng nh : ớ ồ
delete [ ]a;
4. Truy c p đ n ph n t (đ a ch , giá tr ) trong xâu: ầ ử ị ế ậ ỉ ị
a[i] *(a+i) Giá tr :ị
Đ a ch : &a[i] a + i ị ỉ
VI. Con tr c u trúc:
ỏ ấ
Xét ki u c u trúc: KCT ể ấ
1. Khai báo :
KCT *p;
2. C p phát vùng nh : ớ ấ
p = new KCT
3. Thu h i vùng nh : ớ ồ
delete [ ]p;
4. Truy c p đ n các tr ế ậ ườ ng d li u c a c u trúc: ữ ệ ủ ấ
Theo cú pháp:
p -> Ten_Thanh_Phan
Ch ng h n v i ớ ki u c u trúc NHANVIEN (Lab8): ể ấ ẳ ạ
p -> MaNV
p -> Sdt
VII. M ng đ ng c u trúc ộ
ả
ấ
Xét ki u c u trúc KCT ể ấ
1. Khai báo :
KCT *a;
2. C p phát vùng nh : ớ ấ
a = new KCT[MAX];
3. Thu h i vùng nh : ớ ồ
delete [ ]a;
VIII. Truy n tham s ề
ố
1. M t s đi m l u ý: ộ ố ể ư
• Mu n hàm tr v m t giá tr (M ng, xâu) thì tr v m t con tr . ỏ ả ả ề ộ ả ề ộ ố ị
Mu n tham s th c gi u l ố
• i thay đ i khi ch ổ dùng các truy n b ng bi n (t c là đ i ph i dùng con tr ho c tham chi u). ố ng trình ra kh i hàm thì ph i ả ỏ ươ ế ỏ ữ ạ ứ ố ự ế ề ằ ả ặ
2.Truy n tham s : ố ề
C.
Luy n t p: ệ ậ
chèn x vào a tại vị trí thứ k, kết quả trả về a.
Cho mảng a[0..n-1] có n số nguyên, x là số nguyên. Viết chương trình thực hiện chức năng sau: Chen(a,n,x,k) ” (đếm k từ 0 )
Th c hi n:
ự
ệ
B c 1: T o Project v i tên “Lab9_Vd1”.
ướ
ạ
ớ
B c 2: T o t p tin ch
ng trình vd1.cpp
ạ ậ
ướ
ươ
B c 3: Trong t p tin vd1.cpp, so n code theo c u trúc:
ướ
ậ
ạ
ấ
#include
#define MAX 1000
using namespace std;
void Nhap(int *a, int n); void Xuat(int *a, int n); void Chen(int *a, int &n, int x, int k);
void main() {
Ví d 1:ụ
int a[MAX], n, x, k; cout<<"\nNhap n = "; cin>>n; Nhap(a,n); Xuat(a,n); cout<<"\nNhap gia tri can chen x = "; cin>>x; do {
cout<<"\nNhap vi tri can chen (0 <= K <= "<
} while(1); Chen(a, n,x,k); Xuat(a,n);
} //Cac ham nhap xuat void Nhap(int *a, int n) {
for (int i = 0; i < n; i++) {
cout<<"\na["<>*(a+i);
}
}
void Xuat(int *a, int n) {
int i; cout<<"\n"; for (i = 0; i < n; i++)
cout<<*(a+i)<<'\t';
}
void Chen(int *a, int &n, int x, int k) {
int i; for(i = n-1; i >= k; i--)
*(a+i+1) = *(a+i);
*(a+k) = x; n = n+1;
}
Lưu ý:
Hàm main() có thể viết cách khác như sau:
void main() {
ứ ủ
ớ ề
ị ể
ấ
int *a, //Dùng con tr ỏ n, x, k; cout<<"\nNhap n = "; cin>>n; a = new int[n]; //c p phát vùng nh đ a ch a đ n giá tr ki u int Nhap(a,n); Xuat(a,n); cout<<"\nNhap gia tri can chen x = "; cin>>x; do {
cout<<"\nNhap vi tri can chen (0 <= K <= "<
} while(1); Chen(a, n,x,k); Xuat(a,n); delete []a; //Thu h i vùng nh đã c p phát cho a
ấ
ớ
ồ
}
//Khi đó ta bỏ định nghĩa hằng MAX ở trước.
Viết chương trình tính tích 2 ma trận vuông cấp n
Th c hi n:
ự
ệ
B c 1: T o Project v i tên “Lab9_Vd2”.
ướ
ạ
ớ
B c 2: T o t p tin ch
ng trình vd1.cpp
ạ ậ
ướ
ươ
B c 3: Trong t p tin vd2.cpp, so n code theo c u trúc sau:
ướ
ấ
ạ
ậ
#include
void main() {
int *a, *b, *c, n;
Ví d 2:ụ
cout<<"\nNhap n = "; cin>>n; a = new int[n*n]; b = new int[n*n]; c = new int[n*n];
Nhap(a,n,'a'); Nhap(b,n,'b'); Tich_MT(a,b,c, n); Xuat(a,n,'a'); Xuat(b,n,'b'); Xuat(c,n,'c');
cout<<'\n'; delete []a; delete []b; delete []c;
} //Nhap ma tran Kt void Nhap(int *a, int n, char Kt) {
int i, j;
cout<<"\nNhap ma tran "< for(j = 0; j < n; j++)
{ cout<<"\n"< } } //Xuat ma tran Kt
void Xuat(int *a, int n, char Kt)
{ int i, j;
cout<<"\nMa tran "< cout<<'\n';
for (j = 0; j < n; j++) cout<<*(a+i*n+j)<<'\t'; } }
//c = ab
void Tich_MT(int *a, int *b, int *c, int n)
{ int i,j,k;
for (i = 0; i < n; i++) for(j = 0; j < n; j++)
{ *(c+i*n+j) = 0;
for(k = 0; k < n; k++) *(c+i*n+j) += *(a+i*n+k)* *(b+k*n+j); } } Lưu ý: Hàm main() có thể viết cách khác như sau: void main()
{ int a[MAX][MAX], b[MAX][MAX], c[MAX][MAX];
int n;
cout<<"\nNhap n = ";
cin>>n; Nhap( (int)a,n,’a’); //ép ki uể
Nhap((int)b,n,’b’); Tich_MT( (int) a, (int) b, (int)c, n); Xuat((int)a,n,’a’);
Xuat((int)b,n,’b’);
Xuat((int)c,n,’c’); } //Khi đó ta c n đ nh nghĩa h ng MAX c. ầ ằ ị tr
ở ướ Ví d 3:ụ ng trình t ch c menu th c hi n các thao tác trên xâu ký t v i các ế ươ ổ ứ ự ệ ự ớ t ch
Vi
ch c năng sau: ứ 1. Tr v chi u dài xâu ả ề ề 3. So sánh 2 xâu ký t 2. N i xâu b vào sau xâu a (Xâu k t qu g m 2 xâu a,b) ả ồ ế ố theo th t đi n (phân bi t ch th ng và hoa) ự t
ứ ự ừ ể ệ ữ ườ 4. So sánh 2 xâu ký t theo th t đi n (b qua ch th ng và hoa) ự t
ứ ự ừ ể ữ ườ ỏ 5. Chép xâu b sang xâu a 6. Đ o ng oc xâu ký t
ự ả ự 7. Tr v s nguyên t xâu các ký s ả ề ố ừ ố 8. Tr v s th c t xâu các ký t (s , d u ch m) ả ề ố ự ừ ự ố ấ ấ (dùng các hàm th vi n sau) ư ệ char *strcat( char *Dest, const char *Src ); string.h ố N i xâu Src vào sau xâu
Dest, k t qu tr v xâu
ả ả ề
m i g m 2 xâu trên. ế
ớ ồ int strcmp(const char *s1, const char *s2 ); string.h So sánh 2 chu i s1, s2 theo
ỗ
đi n.
th t t
ứ ự ừ ể Kq =-1; s1 Kq=0; s1==s2 Kq = 1; s1 > s2 char *strcpy(char *Dest, const char *Src ); Chép Src sang dest string.h int stricmp( const char *s1, const char *s2 ); ỏ string.h So sánh 2 chu i s1, s2 (b
qua ch th ỗ
ng , hoa) ữ ườ size_t strlen(const char *s); string.h Tr v chi u dài xâu s
ề ả ề char *_strrev( char *s ); string.h ị c xâu s (s đã b
c) Đ o ng
ả
đ o ng
ả ượ
ượ double atof( const char *str ); stdlib.h ố Chuy n xâu ký s thành
ể
s th c
ố ự int atoi( const char *str ); stdlib.h ố Chuy n xâu ký s thành
ể
s nguyên
ố Ví d 4:ụ Xem ví d 1, lab8:
ụ ậ ữ ệ //Hàm nh p d li u cho c u trúc p : dùng tham chi u
ế
ấ
void Nhap_CT(NHANVIEN &p)
{ cout<<"\nMa nhan vien: ";
gets(p.MaNV);
cout<<"\nHo nhan vien: ";
gets(p.HoNV);
cout<<"\nTen nhan vien: ";
gets(p.TenNV);
cout<<"\nTuoi: ";
cin>>p.Tuoi;
cout<<"\nDia chi: ";
gets(p.Dc); • Vi i hàm nh p Ds. Hàm nh p Ds s g i hàm nh p m t c u trúc t l
ế ạ ộ ấ ẽ ọ ậ ậ ậ cout<<"\nSo dien thoai: ";
cin>>p.Sdt;
cout<<"\nLuong: ";
cin>>p.Luong;
cout<<"\nPhong: ";
gets(p.Phong); } ậ ậ ọ ộ //Hàm nh p danh sách nhân viên g i hàm nh p m t nhân viên
void Nhap ( NHANVIEN Ds[MAX], int n)
{ int i;
for( i = 0; i < n; i++)
{ cout<<"\nNhap thong tin nguoi thu "<
} } • Vi int n), hàm này g i hàm t l
ế ạ ọ i hàm DSLuong_Tang ( NHANVIEN Ds[MAX],
ấ Hv, hàm Hv hoán đ i giá tr 2 c u trúc
ổ ị void Hv(NHANVIEN &p, NHANVIEN &q) //p, q dùng tham chi uế
{ NHANVIEN Tam;
Tam = p;
p = q;
q = Tam; } //Sap danh sach tang dan theo luong
void DSLuong_Tang ( NHANVIEN Ds[MAX], int n)
{ int i, j;
for( i = 0; i < n-1; i++) for(j=i+1; j < n; j++) if(Ds[i].Luong > Ds[j].Luong)
Hv(Ds[i],Ds[j]); } D. Bài t pậ Bài 1: ỉ ố ầ ủ ố ế ế ấ ớ 1. Cs_Am_Max: Tìm ch s (đ u tiên) c a s âm l n nh t, n u có. N u không,
tr v -1.
ả ề 2. Tong_Phan_Biet: T ng các giá tr phân bi
ổ ị ệ
t. 2. Sap_Am_Tang: S p tăng các s âm, các s khác gi nguyên v trí. ắ ố ố ữ ị Bài 2: Vi ng trình nh p vào m t ma tr n vuông c p n, v i n là s ế t m t ch
ộ ươ ấ ậ ậ ộ ớ ố nguyên d ng , các ph n t c a ma tr n là s nguyên , Xu t ra màn hình ma tr n đã ươ ầ ử ủ ấ ậ ậ ố n = • nh p, tính và in ra màn hình giá tr S – T , trong đó : ậ ị ih S
, hi là s âm nh nh t c a hàng i ; i -n
.
,0 1 =
1 i n • = ˛ (cid:213) ỏ ấ ủ ố -n
.
,0 1 jv =
1 j j˛ ấ ủ ộ ị ớ ,vj Là giá tr l n nh t c a c t j ;
T (cid:229) Yêu c u c a ch
ầ ủ ươ ng trình là s d ng các hàm :
ử ụ ậ
ậ • Nh p ma tr n ,
ậ
• Xu t ma tr n ,
ấ
• Tính S,
• Tính T. Bài 3: ấ
ng trình qu n lý các khách hàng thuê bao đi n tho i, trong đó s d ng c u ử ụ ệ ạ ả ế Vi
t ch
ươ
trúc g m ồ Mã khách hàng,
H tên,
ọ
Đ a ch ,
ị
ỉ
S đi n tho i.
ố ệ ạ ng trình th c hi n các ch c năng sau: Yêu c u ch
ầ ươ ự ứ ệ • Thêm m t khách hàng m i
ớ
ộ
• Xóa m t khách hàng
ộ
• Tìm ki m đ a ch khi bi
ế ị ỉ ế ố ệ t s đi n tho i
ạNguyên m u c a hàm
Ch c năng
ẫ ủ
ứ
Th vi n
ư ệ