KTLT C14 ConTroNangCao - PPT (By Bsquochoai - Ga)

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 48

B mn Cng ngh phn mm

Khoa Cng ngh thng tin


Trng i hc Khoa hc T nhin

K THUT LP TRNH
ThS. ng Bnh Phng
dbphuong@fit.hcmus.edu.vn

D LIU KIU CON TR


(NNG CAO)

1
&
VC
BB
Ni dung

1 Con tr cp 2

2 Con tr v mng nhiu chiu

3 Mng con tr

4 Con tr hm

D liu kiu con tr (nng cao)


2
&
VC
BB
Con tr cp 2 (con tr n con tr)

t vn
void CapPhat(int *p, int n)
{
p = (int *)malloc(n * sizeof(int));
}
void main()
{
int *a = NULL;
CapPhat(a, 2);
// a vn = NULL
}
Lm sao thay i gi tr ca con tr (khng
phi gi tr m n tr n) sau khi gi hm?

D liu kiu con tr (nng cao)


3
&
VC
BB
Con tr cp 2
int *p int n

18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25

22
N 00
U 00
L 00
L 02 00 00 00

CapPhat int *p int n


NULL 2
0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17

N U L L

int *a = NULL D liu kiu con tr (nng cao)


4
&
VC
BB
Con tr cp 2

Gii php
S dng tham chiu int *&p (trong C++)
void CapPhat(int *&p, int n)
{
p = (int *)malloc(n * sizeof(int));
}

Khng thay i trc tip tham s m tr v


int* CapPhat(int n)
{
int *p = (int *)malloc(n * sizeof(int));
return p;
}

D liu kiu con tr (nng cao)


5
&
VC
BB
Con tr cp 2

Gii php
S dng con tr p tr n con tr a ny. Hm
s thay i gi tr ca con tr gin tip
thng qua con tr p.
void CapPhat(int **p, int n)
{
*p = (int *)malloc(n * sizeof(int));
}

void main()
{
int *a = NULL;
CapPhat(&a, 4);
}
D liu kiu con tr (nng cao)
6
&
VC
BB
Con tr cp 2
int **p int n

18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25

0B 00 00 00 02 00 00 00

CapPhat int **p int n


0B 2
0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17

22
N 00
U 00
L 00
L

int *a = NULL D liu kiu con tr (nng cao)


7
&
VC
BB
Con tr cp 2

Lu
int x = 12;
int *ptr = &x; // OK
int k = &x; ptr = k; // Li

int **ptr_to_ptr = &ptr; // OK


int **ptr_to_ptr = &x; // Li

**ptr_to_ptr = 12; // OK
*ptr_to_ptr = 12; // Li

printf(%d, ptr_to_ptr); // a ch ptr


printf(%d, *ptr_to_ptr); // Gi tr ptr
printf(%d, **ptr_to_ptr); // Gi tr x

D liu kiu con tr (nng cao)


8
&
VC
BB
Con tr v mng 2 chiu

int a[3][4];
0 1 2 3 4 5 6 7 8 9 10 11

a 0

2 int

0 1 2 3 1 2

a 0

2 int[4]
D liu kiu con tr (nng cao)
9
&
VC
BB
Con tr v mng 2 chiu

Hng tip cn 1
Cc phn t to thnh mng 1 chiu
S dng con tr int * duyt mng 1 chiu

int *p = (int *)a

+1

0 1 2 3 4 5 6 7 8 9 10 11

int a[3][4]

D liu kiu con tr (nng cao)


10
&
VC
BB
Hng tip cn 1

Nhp / Xut theo ch s mng 1 chiu


#define D 3
#define C 4
void main()
{
int a[D][C], i;
int *p = (int *)a;
for (i = 0; i < D*C; i++)
{
printf(Nhap phan tu thu %d: , i);
scanf(%d, p + i);
}

for (i = 0; i < D*C; i++)


printf(%d , *(p + i));
} D liu kiu con tr (nng cao)
11
&
VC
BB
Hng tip cn 1

Lin h gia ch s mng 1 chiu v ch s mng


2 chiu
(d, c) i ?

i = d*C + c

0 1 2 3 4 5 6 7 8 9 10 11

aCxD 0

1
i (d, c) ?
2
d=i/C
c=i%C

D liu kiu con tr (nng cao)


12
&
VC
BB
Hng tip cn 1

Nhp / Xut theo ch s mng 2 chiu


int a[D][C], i, d, c;
int *p = (int *)a;

for (i = 0; i < D*C; i++)


{
printf(Nhap a[%d][%d]: , i / C, i % C);
scanf(%d, p + i);
}
for (d = 0; d < D; d++)
{
for (c = 0; c < C; c++)
printf(%d , *(p + d * C + c));// *p++
printf(\n;
}
D liu kiu con tr (nng cao)
13
&
VC
BB
Con tr v mng 2 chiu

Hng tip cn 2
Mng 1 chiu, mi phn t l mng 1 chiu
a cha a[0], a[1], a = &a[0]
a[0] cha a[0][0], a[0][1], a[0] = &a[0][0]
a
+1
0 1 2

int a[3][4]

+1
a[0]
D liu kiu con tr (nng cao)
14
&
VC
BB
Hng tip cn 2

Kch thc ca mng


void main()
{
int a[3][4];
printf(KT ca a = %d, sizeof(a));
printf(KT ca a[0] = %d, sizeof(a[0]));
printf(KT ca a[0][0] = %d, sizeof(a[0][0]));
} 0 1 2

0 1 2 3
a[0]

a[0][0] 15
D liu kiu con tr (nng cao)
&
VC
BB
Hng tip cn 2

Nhn xt
a l con tr n a[0], a[0] l con tr n
a[0][0] a l con tr cp 2.
C th truy xut a[0][0] bng 3 cch:
void main()
{
int a[3][4];
a[0][0] = 1;
*a[0] = 1;
**a = 1;

a[1][0] = 1; *a[1] = 1; **(a+1) = 1;


a[1][2] = 1; *(a[1]+2) = 1; *(*(a+1)+2) = 1;
} D liu kiu con tr (nng cao)
16
&
VC
BB
Hng tip cn 2

Truyn mng cho hm


Truyn a ch phn t u tin cho hm.
Khai bo con tr ri gn a ch mng cho con
tr ny n tr n mng.
Con tr ny phi cng kiu vi bin mng, tc
l con tr n vng nh n phn t (mng)
C php
<kiu d liu> (*<tn con tr>)[<s phn t>];

V d
int (*ptr)[4];
D liu kiu con tr (nng cao)
17
&
VC
BB
Hng tip cn 2

Truyn mng cho hm


void Xuat_1_Mang_C1(int (*ptr)[4]) // ptr[][4]
{
int *p = (int *)ptr;
for (int i = 0; i < 4; i++)
printf(%d , *p++);
}
void main()
{
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int (*ptr)[4];
ptr = a;
for (int i = 0; i < 3; i++)
Xuat_1_Mang_C1(ptr++); // hoc ptr + i
Xuat_1_Mang_C1(a++); // sai => a + i
} D liu kiu con tr (nng cao)
18
&
VC
BB
Hng tip cn 2

Truyn mng cho hm


void Xuat_1_Mang_C2(int *ptr, int n) // ptr[]
{
for (int i = 0; i < n; i++)
printf(%d , *ptr++);
}
void main()
{
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int (*ptr)[4];
ptr = a;
for (int i = 0; i < 3; i++)
Xuat_1_Mang_C2((int *)ptr++);
Xuat_1_Mang_C2((int *)(a + i));// a++ sai
}
D liu kiu con tr (nng cao)
19
&
VC
BB
Hng tip cn 2

Truyn mng cho hm


void Xuat_n_Mang_C1(int (*ptr)[4], int n)
{
int *p = (int *)ptr;
for (int i = 0; i < n * 4; i++)
printf(%d , *p++);
}
void main()
{
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int (*ptr)[4];
ptr = a;

Xuat_n_Mang_1(ptr, 3);
Xuat_n_Mang_1(a, 3);
} D liu kiu con tr (nng cao)
20
&
VC
BB
Hng tip cn 2

Truyn mng cho hm


void Xuat_n_Mang_C2(int (*ptr)[4], int n)
{
int *p;
for (int i = 0; i < n; i++)
{
p = (int *)ptr++;

for (int i = 0; i < 4; i++)


printf(%d , *p++);

printf(\n);
}
}

D liu kiu con tr (nng cao)


21
&
VC
BB
Mng con tr

t vn
S dng cu trc d liu no lu tr thng
tin sau?
0 1 2 3 4 5 6 7

0 1 5 6
1 2 9 1 2 1 7 0 6
2 0 2

Gii php?
Cch 1: Mng 2 chiu 3x8 (tn b nh)

D liu kiu con tr (nng cao)


22
&
VC
BB
Mng con tr

Cch 2: Mng 1 chiu cc con tr


18 19 1A 1B 1C 1D 1E 1F

1 5 6
28 29 2A 2B 2C 2D 2E 2F

2 9 1 2 1 7 0 6
3A 3B 3C

0 2
0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17

19 00 00 00 28 00 00 00 3A 00 00 00

array D liu kiu con tr (nng cao)


23
&
VC
BB
Mng con tr

V d
void print_strings(char *p[], int n)
{
for (int i = 0; i<n; i++)
printf(%s , p[i]);
}

void main()
{
char *message[4] = {Tin, Hoc, Co, So};

print_strings(message, 4);
}

D liu kiu con tr (nng cao)


24
&
VC
BB
Con tr hm

Khi nim
Hm cng uc lu tr trong b nh, tc l
cng c a ch.
Con tr hm l con tr tr n vng nh cha
hm v c th gi hm thng qua con tr .

0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17

11 00 00 00

p int Cong(int, int)D liu kiu con tr (nng cao) 25


&
VC
BB
Con tr hm

Khai bo tng minh


<kiu tr v> (* <tn bin con tr>)(ds tham s);

V d
// Con tr n hm nhn i s int, tr v int
int (*ptof1)(int x);

// Con tr n hm nhn 2 i s double, khng tr v


void (*ptof2)(double x, double y);

// Con tr n hm nhn i s mng, tr v char


char (*ptof3)(char *p[]);

// Con tr n khng nhn i s v khng tr v


void (*ptof4)();
D liu kiu con tr (nng cao)
26
&
VC
BB
Con tr hm

Khai bo khng tng minh (thng qua kiu)


typedef <kiu tr v> (* <tn kiu>)(ds tham s);
<tn kiu> <tn bin con tr>;

V d
int (*pt1)(int, int); // Tng minh

typedef int (*PhepToan)(int, int);

PhepToan pt2, pt3; // Khng tng minh

D liu kiu con tr (nng cao)


27
&
VC
BB
Con tr hm

Gn gi tr cho con tr hm
<bin con tr hm> = <tn hm>;
<bin con tr hm> = &<tn hm>;

Hm c gn phi cng dng (vo, ra)


V d
int Cong(int x, int y); // Hm
int Tru(int x, int y); // Hm
int (*tinhtoan)(int x, int y); // Con tr hm

tinhtoan = Cong; // Dng ngn gn


tinhtoan = &Tru; // Dng s dng a ch
tinhtoan = NULL; // Khng tr n u c
D liu kiu con tr (nng cao)
28
&
VC
BB
Con tr hm

So snh con tr hm
if (tinhtoan != NULL)
{
if (tinhtoan == &Cong)
printf(Con tr n hm Cong.);
else
if (tinhtoan == &Tru)
printf(Con tr n hm Tru.);
else
printf(Con tr n hm khc.);
}
else
printf(Con tr cha c khi to!);

D liu kiu con tr (nng cao)


29
&
VC
BB
Con tr hm

Gi hm thng qua con tr hm


S dng ton t ly ni dung * (chnh quy)
nhng trng hp ny c th b
int Cong(int x, int y);
int Tru(int x, int y);

int (*tinhtoan)(int, int);

tinhtoan = Cong;
int kq1 = (*tinhtoan)(1, 2); // Chnh quy
int kq2 = tinhtoan(1, 2); // Ngn gn

D liu kiu con tr (nng cao)


30
&
VC
BB
Con tr hm

Truyn tham s l con tr hm


int Cong(int x, int y);
int Tru(int x, int y);
int TinhToan(int x, int y, int (*pheptoan)(int, int))
{
int kq = (*pheptoan)(x, y); // Gi hm
return kq;
}

void main()
{
int (*pheptoan)(int, int) = &Cong;
int kq1 = TinhToan(1, 2, pheptoan);
int kq2 = TinhToan(1, 2, &Tru);
}
D liu kiu con tr (nng cao)
31
&
VC
BB
Con tr hm

Tr v con tr hm
int (*LayPhepToan(char code))(int, int)
{
if (code == +)
return &Cong;
return &Tru;
}

void main()
{
int (*pheptoan)(int, int) = NULL;
pheptoan = LayPhepToan(+);
int kq2 = pheptoan(1, 2, &Tru);
}

D liu kiu con tr (nng cao)


32
&
VC
BB
Con tr hm

Tr v con tr hm (khai bo kiu)


typedef (*PhepToan)(int, int);
PhepToan LayPhepToan(char code)
{
if (code == +)
return &Cong;
return &Tru;
}

void main()
{
PhepToan pheptoan = NULL;
pheptoan = LayPhepToan(+);
int kq2 = pheptoan(1, 2, &Tru);
}
D liu kiu con tr (nng cao)
33
&
VC
BB
Con tr hm

Mng con tr hm
typedef (*PhepToan)(int, int);
void main()
{
int (*array1[2])(int, int); // tng minh
PhepToan array2[2]; // k tng minh

array1[0] = array2[1] = &Cong;


array1[1] = array2[0] = &Tru;

printf(%d\n, (*array1[0])(1, 2));


printf(%d\n, array1[1](1, 2));
printf(%d\n, array2[0](1, 2));
printf(%d\n, array2[1](1, 2));
}
D liu kiu con tr (nng cao)
34
&
VC
BB
Con tr hm

Lu
Khng c qun du () khi khai bo con tr
hm
int (*PhepToan)(int x, int y);
int *PhepToan(int x, int y);
C th b tn bin tham s trong khai bo
con tr hm
int (*PhepToan)(int x, int y);
int (*PhepToan)(int, int);

D liu kiu con tr (nng cao)


35
&
VC
BB
Bi tp

Cu 1: Ta c th khai bo v s dng bin con


tr n cp th my?

Cu 2: C s khc nhau gia con tr n mt


chui v con tr n mt mng k t khng?

D liu kiu con tr (nng cao)


36
&
VC
BB
Bi tp

Cu 3: Nu khng s dng cc kin thc nng


cao v con tr, ta c th gii quyt mt s bi
ton no khng?

Cu 4: Hy nu vi ng dng ca con tr hm.


D liu kiu con tr (nng cao)


37
&
VC
BB
Bi tp

Cu 5: Vit on lnh khai bo bin x kiu float,


khai bo v khi to con tr px n bin x v
khai bo v khi to con tr ppx n con tr px.

Cu 6: Ta mun gn 100 cho x thng qua con


tr ppx bng biu thc gn ppx = 100; c
c khng?

D liu kiu con tr (nng cao)
38
&
VC
BB
Bi tp

Cu 7: Gi s ta khai bo mng array 3 chiu:


int array[2][3][4]. Cho bit cu trc ca mng
ny i vi trnh bin dch C.

Cu 8: Cho bit array[0][0] c ngha l g?


D liu kiu con tr (nng cao)


39
&
VC
BB
Bi tp

Cu 9: Xt xem biu thc so snh no sau y


ng
a. array[0][0] == &array[0][0][0];
b. array[0][1] == array[0][0][1];
c. array[0][1] == &array[0][1][0];

Cu 10: Vit nguyn mu ca mt hm nhn
mt mng con tr n kiu char lm i s, v
gi tr tr v c kiu void.

D liu kiu con tr (nng cao)
40
&
VC
BB
Bi tp

Cu 11: Theo cch vit ca cu 10, ta c th


bit c s phn t ca mng c truyn k?

Cu 12: Con tr n hm l g?

Cu 13: Vit khai bo con tr n mt hm m


hm c gi tr tr v kiu char, nhn i s l
mt mng con tr n kiu char.

D liu kiu con tr (nng cao)
41
&
VC
BB
Bi tp

Cu 13: Ta vit khai bo con tr cu 12 nh


vy c ng khng? char *ptr(char *x[]);

Cu 14: Cho bit ngha ca cc khai bo sau:


a. int *var1;
b. int var2;
c. int **var3;

D liu kiu con tr (nng cao)


42
&
VC
BB
Bi tp

Cu 15: Cho bit ngha ca cc khai bo sau:


a. int a[3][12];

b. int (*b)[12];

c. int *c[12];

D liu kiu con tr (nng cao)


43
&
VC
BB
Bi tp

Cu 16: Cho bit ngha ca cc khai bo sau:


a. char *z[10];

b. char *y(int field);


c. char (*x)(int field);


D liu kiu con tr (nng cao)


44
&
VC
BB
Bi tp

Cu 17: Vit khai bo con tr func n mt hm


nhn i s l mt s nguyn v tr v gi tr
kiu float.

Cu 18: Vit khai bo mt mng con tr n
hm. Cc hm nhn mt chui k t lm tham
s v tr v gi tr kiu nguyn. Ta c th s
dng mng ny lm g?

D liu kiu con tr (nng cao)


45
&
VC
BB
Bi tp

Cu 19: Vit cu lnh khai bo mt mng 10 con


tr n kiu char.

Cu 20: Tm li sai trong on lnh sau
int x[3][12];
int *ptr[12];
ptr = x;

D liu kiu con tr (nng cao)


46
&
VC
BB
Bi tp

Cu 21: Vit chng trnh khai bo mng hai


chiu c 12x12 phn t kiu char. Gn k t X
cho mi phn t ca mng ny. S dng con tr
n mng in gi tr cc phn t mng ln
mn hnh dng li.
Cu 22: Vit chng trnh khai bo mng 10 con
tr n kiu float, nhn 10 s thc t bn phm,
sp xp li v in ra mn hnh dy s sp xp.
Cu 23: Sa li bi tp 22 ngi s dng c
th la chn cch sp xp theo th t tng hay
gim dn.
D liu kiu con tr (nng cao)
47
&
VC
BB
Bi tp

Cu 24: Chng trnh cho php ngi dng


nhp cc dng vn bn t bn phm n khi
nhp mt dng trng. Chng trnh s sp xp
cc dng theo th t alphabet ri hin th chng
ra mn hnh.
Cu 25: S dng con tr hm vit cc hm
sp xp sau
Tng dn
Gim dn
Dng gim ri m tng, cui cng l s 0
48
D liu kiu con tr (nng cao)

You might also like