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 <= "<

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 <= "<

for(j = 0; j < n; j++) {

cout<<"\n"<>*(a+i*n+j);

}

}

//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) ư ệ

Nguyên m u c a hàm

Ch c năng

ẫ ủ

Th vi n ư ệ

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 ạ