Một ngôn ngữ lập trình (NNLT) bậc cao cho phép người sử dụng (NSD) biểu hiện ý tưởng của mình để giải quyết một vấn đề, bài toán bằng cách diễn đạt gần với ngôn ngữ thông thường thay vì phải diễn đạt theo ngôn ngữ máy (dãy các kí hiệu 0,1). Hiển nhiên, các ý tưởng NSD muốn trình bày phải được viết theo một cấu trúc chặt chẽ thường được gọi là thuật toán hoặc giải thuật và theo đúng các qui tắc của ngôn ngữ gọi là cú pháp hoặc văn phạm. Trong giáo trình này chúng ta bàn đến một ngôn ngữ lập trình như vậy, đó là ngôn ngữ lập trình C++ và làm thế nào để thể hiện các ý tưởng giải quyết vấn đề bằng cách viết thành chương trình trong C++.
599 trang |
Chia sẻ: tlsuongmuoi | Lượt xem: 2957 | Lượt tải: 2
Bạn đang xem trước 20 trang tài liệu Hệ thống máy tính và ngôn ngữ C, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
danh_saùch_teân_bieán;
vôùi kieåu laø kieåu khai baùo cho bieán, kieåu naøy chæ coù
theå laø int, char, unsigned, long hoaëc pointer
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
10.4 BIEÁN REGISTER
Ví duï:
register int i;
register char c;
register unsigned u;
resister long l;
register int *r;
register t;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
10.4 BIEÁN REGISTER
Taàm söû duïng vaø thôøi gian toàn taïi cuûa caùc bieán
thanh ghi töông töï nhö caùc bieán cuïc boä, nhöng
chuùng ñöôïc truy xuaát nhanh hôn caùc bieán cuïc boä
bình thöôøng vì chuùng chính laø caùc thanh ghi cuûa boä
vi xöû ly.
Caùc bieán thanh ghi thöôøng ñöôïc söû duïng laøm caùc
bieán ñieàu khieån trong caùc voøng laëp hoaëc caùc bieán
phaûi truy xuaát nhieàu laàn trong chöông trình.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
10.5 KHÔÛI ÑOÄNG TRÒ CHO BIEÁN
ÔÛ CAÙC LÔÙP
Ñoái vôùi bieán toaøn cuïc hoaëc bieán tónh, ngay sau khi
ñöôïc khai baùo, moãi bieán seõ ñöôïc C töï ñoäng gaùn trò
laø 0.
Trong khi ñoù bieán töï ñoäng vaø bieán thanh ghi seõ coù
giaù trò khoâng xaùc ñònh (goïi laø trò raùc).
trò baèng moät bieåu thöùc haèng.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
10.5 KHÔÛI ÑOÄNG TRÒ CHO BIEÁN
ÔÛ CAÙC LÔÙP
Trong suoát quaù trình chaïy chöông trình, bieán toaøn
cuïc vaø bieán tónh chæ coù theå ñöôïc khôûi ñoäng trò moät
laàn, ñoù laø laàn ñaàu tieân maø khai baùo bieán ñoù ñöôïc
thöïc thi.
Bieán toaøn cuïc vaø bieán tónh coù theå ñöôïc khôûi ñoäng
trò baèng moät bieåu thöùc haèng.
Bieán töï ñoäng vaø bieán thanh ghi coù theå ñöôïc khôûi
ñoäng trò baèng moät bieåu thöùc maø giaù trò cuûa bieåu
thöùc tôùi luùc ñoù ñaõ xaùc ñònh(coù theå goïi haøm).
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
10.5 KHÔÛI ÑOÄNG TRÒ CHO BIEÁN
ÔÛ CAÙC LÔÙP
Vieäc khôûi ñoäng cho caùc bieán thuoäc kieåu döõ kieän coù
caáu truùc nhö maûng (array), struct vaø union chæ coù
theå thöïc hieän ñöôïc ñoái vôùi caùc bieán toaøn cuïc hoaëc
bieán tónh maø thoâi
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
10.6 SÖÏ CHUYEÅN KIEÅU
Khi thöïc hieän caùc pheùp toaùn soá hoïc hoaëc luaân lyù, C
luoân thöïc hieän söï chuyeån kieåu töï ñoäng.
C coøn cho pheùp laäp trình vieân thöïc hieän vieäc
chuyeån kieåu baét buoäc, eùp kieåu (type casting). Cuù
phaùp ñeå eùp kieåu moät bieán, haèng hay bieåu thöùc:
(type) giaù_trò
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
10.6 SÖÏ CHUYEÅN KIEÅU
Ví duï:
Cho khai baùo bieán sau:
int a = 10, b = 3;
double d;
bieåu thöùc naøo cho keát quaû ñuùng, giaûi thích?(xem laïi
thöù töï öu tieân caùc pheùp toaùn cuûa C)
a) d = (double)(a/b);
b) d = (double)a/b;
c) d = a/(double)b;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
BAØI TAÄP CUOÁI CHÖÔNG
1. Vieát moät haøm sao cho moãi laàn goïi haøm thì haøm
seõ traû veà moät trò soá ngay sau trò tröôùc ñoù trong
daõy soá Fibonaci.
2. Vieát chöông trình vôùi caùc haøm tính caùc bieåu thöùc
sau ñaây: duøng vaø khoâng duøng bieán thanh ghi
... ... ( ) ... ( )
...
! ( )! ( )! !
+ + + + − + + −
= − + − +
− −
1 n 1 n 1 1 n 2 1t
n n 1 n 2 1
( ... ) ( ... ( )) ( ... ( )) ... !
! ( )! ( )! ... !
+ + + + + − + + + − + +
=
+ − + − + +
1 n 1 n 1 1 n 2 1T
n n 1 n 2 1
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
BAØI TAÄP CUOÁI CHÖÔNG
3. Vieát moät chöông trình goàm hai module: main.c
vaø func.c, trong ñoù module main.c löu haøm main()
coù caùc leänh goïi nhaäp ba heä soá cuûa tam thöùc baäc hai,
kieåm tra in aán; coøn trong module func.c löu caùc
haøm caàn thieát ñeå giaûi phöông trình baäc hai vaø bieän
luaän tam thöùc baäc hai.
4. In ra maøn hình caùc soá nguyeân toá töø 1 ñeán 1.000.
Duøng bieán thanh ghi vaø khoâng duøng bieán thanh
ghi. Kieåm tra thôøi gian.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
KEÁT THUÙC CHÖÔNG 10
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
CHÖÔNG 11
MAÛNG
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
CHÖÔNG 11
MAÛNG
11.1 Khaùi nieäm
11.2 Khai baùo maûng
11.3 Khôûi ñoäng trò cuûa maûng
11.4 Maûng laø ñoái soá cuûa haøm maûng laø bieán toaøn cuïc
11.5 Caùc öùng duïng
Baøi taäp cuoái chöông
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.1 KHAÙI NIEÄM
Maûng laø moät bieán caáu truùc trong ñoù coù nhieàu phaàn
töû cuøng kieåu, moãi phaàn töû laø moät bieán thaønh phaàn
cuûa maûng. Moãi bieán thaønh phaàn naøy laø moät bieán
bình thöôøng vaø coù cöôùc soá (subscript) ñeå phaân bieät
giöõa phaàn töû naøy vaø phaàn töû kia. Nhö vaäy, ñeå truy
xuaát moät phaàn töû cuûa maûng, ta caàn bieát ñöôïc cöôùc
soá cuûa noù.
Trong boä nhôù, caùc phaàn töû cuûa maûng ñöôïc caáp phaùt
oâ nhôù coù ñòa chæ lieân tieáp nhau.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.1 KHAÙI NIEÄM
C cuõng cho pheùp laäp trình vieân khai baùo vaø laøm
vieäc treân maûng moät chieàu (singledimensional
array) vaø maûng nhieàu chieàu (multidimensional
array). Soá phaàn töû treân moät chieàu ñöôïc goïi laø kích
thöôùc cuûa chieàu ñoù.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.2 KHAI BAÙO MAÛNG
1- Maûng moät chieàu
Cuù phaùp khai baùo maûng moät chieàu nhö sau:
kieåu teân_maûng [kích_thöôùc];
Vôùi kích_thöôùc laø moät haèng soá nguyeân cuï theå, cho
bieát soá phaàn töû trong chieàu ñang xeùt.
Trong C, cöôùc soá caùc phaàn töû cuûa maûng luoân ñi töø
0 trôû ñi, neân maûng moät chieàu coù n phaàn töû thì
cöôùc soá caùc phaàn töû cuûa maûng laø 0,..., n-1.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.2 KHAI BAÙO MAÛNG
1- Maûng moät chieàu
Ví duï : int a[100];
Nhö vaäy maûng a coù 100 phaàn töû int, caùc phaàn töû
ñoù laø a[0], a[1],...,a[99].
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.2 KHAI BAÙO MAÛNG
1- Maûng moät chieàu
Ví duï :
Vieát chöông trình nhaäp moät daõy caùc soá nguyeân,
tìm soá lôùn nhaát trong daõy soá ñoù.
#include
#include
main()
{
int i, n, max, vtmax;
int a[100];
clrscr();
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.2 KHAI BAÙO MAÛNG
printf ("Chuong trinh thu mang \n");
printf ("Moi ban nhap so phan tu cua mang: ");
scanf ("%d", &n);
printf ("Moi nhap cac phan tu cua mang:");
for (i = 0; i < n; i++)
scanf ("%d", &a[i]);
max = a[0]; vtmax = 0;
for (i = 1; i < n; i++)
if (max < a[i])
{ max = a[i];
vtmax = i; }
printf ("Phan tu %d co tri lon nhat la %d\n", vtmax, max);
getch()
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.2 KHAI BAÙO MAÛNG
2- Maûng nhieàu chieàu
Cuù phaùp khai baùo maûng nhieàu chieàu nhö sau:
kieåu teân_maûng [kích_thöôùc_chieàu1] [kích_thöôùc_chieàu2] [...];
Khi dòch C baùo loãi
Array size too large ?
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.2 KHAI BAÙO MAÛNG
2- Maûng nhieàu chieàu
Ví duï: Khai baùo maûng hai chieàu a
int a[4][3];
Nhö vaäy maûng a coù 4x3 phaàn töû int, caùc phaàn töû
ñoù laø
a[0][0] a[0][1] a[0][2]
a[1][0] a[1][1] a[1][2]
a[2][0] a[2][1] a[2][2]
a[3][0] a[3][1] a[3][2]
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.2 KHAI BAÙO MAÛNG
2- Maûng nhieàu chieàu
Caùc phaàn töû naøy ñöôïc saép trong boä nhôù theo thöù
töï a[0][0], a[0][1], a[0][2], a[1][0], a[1][1], a[1][2],
a[2][0], a[2][1], a[2][2],....
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.2 KHAI BAÙO MAÛNG
2- Maûng nhieàu chieàu
Ví duï:
Vieát chöông trình taïo vaø in ra maøn hình ma traän
coù daïng sau:
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.2 KHAI BAÙO MAÛNG
2- Maûng nhieàu chieàu
#include
#include
#define MAX 20
main()
{
int i, j;
int a[MAX][MAX];
int n;
clrscr();
printf ("Chuong trinh thu mang \n");
printf ("Moi ban nhap cap cua ma tran: ");
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.2 KHAI BAÙO MAÛNG
2- Maûng nhieàu chieàu
scanf ("%d", &n);
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
if (i == j) a[i][i] = 1;
else a[i][j] = 0;
printf ("Ma tran duoc tao la: \n");
for (i = 0; i < n; i++)
{ for (j = 0; j < n; j++)
printf ("%d", a[i][j]);
getch () }
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.2 KHAI BAÙO MAÛNG
2- Maûng nhieàu chieàu
Ví duï : Coù khai baùo
int a[10];
maø ta laïi thöïc hieän leänh
for (i = 0; i<= 10; i++) a[i] = i;
thì trong thöïc teá khoâng coù phaàn töû a[10], nhöng
vieäc gaùn cuõng ñöôïc thöïc hieän, vaø oâ nhôù keá tieáp
phaàn töû a[9] ñöôïc gaùn trò.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.2 KHAI BAÙO MAÛNG
2- Maûng nhieàu chieàu
C khoâng coù söï phaân bieät giöõa moät bieán chuoãi vaø
moät maûng caùc kyù töï. Caû hai tröôøng hôïp ñeàu ñöôïc
khai baùo
char teân [chieàu_daøi];
Ñieåm khaùc bieät?
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.2 KHAI BAÙO MAÛNG
2- Maûng nhieàu chieàu
Haøm gets() cho pheùp nhaäp moät chuoãi coù teân ñeå
trong ñoái soá haøm naøy.
Ví duï :
char s[20];
gets (s);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.2 KHAI BAÙO MAÛNG
2- Maûng nhieàu chieàu
Haøm puts() cho pheùp xuaát moät chuoãi coù teân ñeå
trong ñoái soá haøm naøy ra maøn hình.
Ví duï :
char s[20];
puts (s);
Caû hai gets() vaø puts() ñeàu coù prototype naèm trong
file stdio.h.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.2 KHAI BAÙO MAÛNG
2- Maûng nhieàu chieàu
Ví duï :
Chöông trình truy xuaát chuoãi duøng haøm chuaån cuûa
C.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.2 KHAI BAÙO MAÛNG
2- Maûng nhieàu chieàu
#include
#include
main()
{ char s[100];
clrscr();
printf ("Moi nhap mot chuoi: ");
gets (s);
printf ("Chuoi da nhap la: ");
puts (s);
getch();
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.3 KHÔÛI ÑOÄNG TRÒ CUÛA MAÛNG
Khi khai baùo maûng laø bieán toaøn cuïc hoaëc tónh thì
maûng coù theå ñöôïc khôûi ñoäng trò baèng caùc giaù trò
haèng.
Ví duï :
int a[5] = {1, 3, 5, 7, 9};
int b[10] = {1, 2, 3, 4, 5};
Neáu soá trò ít hôn soá phaàn töû maûng thì caùc phaàn töû
coøn laïi khoâng ñöôïc khôûi ñoäng trò, coù nghóa caùc
phaàn töû naøy coù trò laø 0.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.3 KHÔÛI ÑOÄNG TRÒ CUÛA MAÛNG
Ví duï:
double a[] = {1.23, –5.67, 9.87, 1.34};
char s[30] = “I go to shool \n”;
char ch[] = “Hello, World!”;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.3 KHÔÛI ÑOÄNG TRÒ CUÛA MAÛNG
Ví duï :
Chuoãi char s[] = “Hello”;
char ch[] = {'H', 'e', 'l', 'l', 'o'};
H e l l o \0
H e l l o
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.4 MAÛNG LAØ ÑOÁI SOÁ CUÛA HAØM MAÛNG
LAØ BIEÁN TOAØN CUÏC
Khi khai baùo ñoái soá cuûa haøm laø maûng, thì kích
thöôùc cuûa chieàu ñaàu tieân cuûa maûng khoâng caàn xaùc
ñònh cuï theå. Tuy nhieân töø chieàu thöù hai trôû ñi,
kích thöôùc maûng phaûi xaùc ñònh.
Teân maûng chính laø ñòa chæ cuûa maûng, neân vieäc
truyeàn teân maûng cho haøm chính laø truyeàn ñòa chæ
thöïc cuûa maûng neân moïi thay ñoåi treân maûng trong
haøm cuõng chính laø thay ñoåi treân maûng thaät
(truyeàn theo kieåu tham soá bieán).
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.4 MAÛNG LAØ ÑOÁI SOÁ CUÛA HAØM MAÛNG
LAØ BIEÁN TOAØN CUÏC
Ví duï 5.14 (SGT)
void select_sort (int a[ ], int n)
{
....
}
Ví duï 5.15 (SGT)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.5 CAÙC ÖÙNG DUÏNG
11.5.1 Saép xeáp maûng
Trong phaàn treân, ñeå saép xeáp moät maûng, giaûi thuaät
ñöôïc neâu ra laø giaûi thuaät select sort, trong muïc
naøy ta seõ xeùt theâm hai giaûi thuaät nöõa laø giaûi
thuaät bubble sort vaø quick sort.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.5 CAÙC ÖÙNG DUÏNG
11.5.1 Saép xeáp maûng
1- Bubble sort (ví duï 5.17)
Giaûi thuaät sort naøy döïa vaøo nguyeân taéc: phaàn töû
nhoû hôn seõ "nheï hôn" vaø vì vaäy seõ "noåi" leân treân.
Nhö vaäy, ñaây laø phöông phaùp so saùnh tröïc tieáp
hai phaàn töû trong maûng vôùi nhau, neáu phaàn töû
naøo nhoû seõ ñöôïc ñoåi choã sang choã coù chæ soá (cöôùc
soá) thaáp hôn (neáu vieäc saép xeáp theo thöù töï töø nhoû
tôùi lôùn).
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.5 CAÙC ÖÙNG DUÏNG
11.5.1 Saép xeáp maûng
1- Bubble sort (ví duï 5.17)
Chuong trinh thu ma tran
Moi ban nhap kich thuoc day: 5
Moi nhap cac phan tu cua ma tran:
9 -5 7 0 1
Lan lap thu 0
9 -5 0 7 1
-5 9 0 7 1
Lan lap thu 1
-5 9 0 1 7
-5 0 9 1 7
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.5 CAÙC ÖÙNG DUÏNG
11.5.1 Saép xeáp maûng
1- Bubble sort (ví duï 5.17)
Lan lap thu 2
-5 0 1 9 7
Lan lap thu 3
-5 0 1 7 9
Ma tran duoc sap xep la:
-5 0 1 7 9
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.5 CAÙC ÖÙNG DUÏNG
11.5.1 Saép xeáp maûng
2- Quick sort
Ñaây laø giaûi thuaät sort ñöôïc ñaùnh giaù laø nhanh
nhaát trong caùc giaûi thuaät saép xeáp. Nguyeân taéc cuûa
giaûi thuaät naøy nhö sau:
Giaûi thuaät quick sort baét ñaàu baèng vieäc tìm moät
giaù trò giöõa taàm cho maûng.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.5 CAÙC ÖÙNG DUÏNG
11.5.1 Saép xeáp maûng
2- Quick sort
Giaù trò giöõa taàm coù theå ñöôïc tính baèng trung bình
coäng cuûa hai phaàn töû ñaàu tieân vaø sau cuøng trong
phaàn maûng ñang ñöôïc saép xeáp. Giaûi thuaät seõ
chuyeån taát caû caùc phaàn töû coù giaù trò nhoû hôn giaù
trò giöõa taàm sang phaàn coù chæ soá thaáp cuûa maûng,
vaø chuyeån taát caû caùc phaàn töû coù giaù trò lôùn hôn
giaù trò giöõa taàm sang phaàn coù chæ soá cao cuûa
maûng.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
86 3 10 23 12 67 59 47 31 24
Trò giöõa taàm Vò trí trong maûng
0 1 2 3 4 5 6 7 8 9
Böôùc 1: 55 86 3 10 23 12 67 59 47 31 24
Böôùc 2: 35 24 3 10 23 12 31 47 59 67 86
Böôùc 3: 27 24 3 10 23 12 31 47 59 67 86
Böôùc 4: 18 24 3 10 23 12 31 47 59 67 86
Böôùc 5: 11 12 3 10 23 24 31 47 59 67 86
Böôùc 6: 6 10 3 12 23 24 31 47 59 67 86
Böôùc 7: 23 3 10 12 23 24 31 47 59 67 86
Böôùc 8: 72 3 10 12 23 24 31 47 59 67 86
Böôùc 9: 63 3 10 12 23 24 31 47 59 67 86
Böôùc 10: 63 3 10 12 23 24 31 47 59 67 86
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.5 CAÙC ÖÙNG DUÏNG
11.5.1 Saép xeáp maûng
3- Select sort
Giaûi thuaät seõ tìm giaù trò lôùn nhaát ñöa veà vò trí coù
cöôùc soá thaát nhaát, sau ñoù tìm giaù trò lôùn thöù nhì
ñöa veà vò trí coù cöôùc soá thaát nhì, quaù trình dieãn ra
töông töï cho ñeán heát
Ví duï 8.14(SGT)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.5 CAÙC ÖÙNG DUÏNG
11.5.2 Stack
Stack (taïm dòch laø ngaên xeáp) laø moät kieåu caáu truùc
döõ lieäu do laäp trình vieân töï laäp ra, khi caàn, laäp
trình vieân coù theå theâm moät phaàn töû vaøo stack,
hoaëc xoùa moät phaàn töû ra khoûi stack.
Ñaëc ñieåm cuûa caáu truùc döõ lieäu naøy laø döõ lieäu ñöôïc
ghi vaøo hoaëc laáy ra khoûi stack theo traät töï vaøo
tröôùc ra sau (last-in first-out).
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.5 CAÙC ÖÙNG DUÏNG
11.5.2 Stack
Caùc thao taùc caàn coù ñeå laøm vieäc treân stack:
- Khôûi ñoäng stack, töông öùng vôùi haøm init_stack()
caàn thieát keá.
- Caùc haøm ñeå xem stack roãng, ñaày, hay xem trò
treân ñænh stack.
- Ñaåy moät phaàn töû vaøo stack, töông öùng haøm
push() caàn thieát keá.
- Laáy moät phaàn töû töø ñænh stack ra, töông öùng vôùi
haøm pop() caàn thieát keá.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.5 CAÙC ÖÙNG DUÏNG
11.5.2 Stack
Ví duï:
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.5 CAÙC ÖÙNG DUÏNG
11.5.2 Stack
Chöông trình öùng duïng stack (SGT)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.5 CAÙC ÖÙNG DUÏNG
11.5.3 Queue
Queue laø moät caáu truùc döõ lieäu, trong ñoù vieäc theâm
döõ lieäu vaøo ñöôïc thöïc hieän ôû moät ñaàu, coøn vieäc laáy
moät phaàn töû ra khoûi queue ñöôïc thöïc hieän ôû ñaàu
kia. Döõ lieäu vaøo ra queue theo traät töï vaøo ñaàu tieân
ra ñaàu tieân (first-in first-out).
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.5 CAÙC ÖÙNG DUÏNG
11.5.3 Queue
Cuõng töông töï nhö ñoái vôùi stack, caùc thao taùc caàn
coù ñeå laøm vieäc treân queue:
- Khôûi ñoäng queue, töông öùng vôùi haøm init_queue()
caàn thieát keá.
- Caùc haøm ñeå xem queue roãng, ñaày.
- Theâm moät phaàn töû vaøo queue, töông öùng haøm
addqueue() caàn thieát keá.
- Laáy moät phaàn töû ra khoûi queue, töông öùng vôùi
haøm deletequeue() caàn thieát keá.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.5 CAÙC ÖÙNG DUÏNG
11.5.3 Queue
Ví duï:
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
11.5 CAÙC ÖÙNG DUÏNG
11.5.3 Queue
Ví du (SGT)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
BAØI TAÄP CUOÁI CHÖÔNG
1. Nhaäp moät ma traän n x n baát kyø, saép xeáp laïi ma
traän sao cho caùc trò lôùn nhaát treân töøng haøng, naèm
treân ñöôøng cheùo cuûa ma traän.
2. Vieát chöông trình taïo vaø in ra maøn hình ma
traän coù daïng sau:
a b c d
b c d a
c d a b n : tham soá nhaäp
d a b c
n
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
BAØI TAÄP CUOÁI CHÖÔNG
3. Nhaäp moät chuoãi baát kyø töø baøn phím, xoùa taát caû
caùc kyù töï khoaûng traéng thöøa cuûa chuoãi vaø in ra
maøn hình chuoãi môùi.
4. Nhaäp moät daõy soá töø baøn phím. Vieát hai haøm ñeå
in ra maøn hình bieåu ñoà ngang vaø bieåu ñoà doïc cuûa
caùc daáu * töông öùng vôùi caùc soá nhaäp trong daõy soá.
Ví duï: Nhaäp 2 4 3; * * *
* * * * *
* * * * * *
* * * *
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
BAØI TAÄP CUOÁI CHÖÔNG
5. Vieát chöông trình taïo vaø in ra maøn hình tam
giaùc PASCAL caáp n, vôùi n nhaäp töø baøn phím.
6. Vieát chöông trình taïo ma traän nghòch ñaûo n x
n.
7. Vieát chöông trình giaûi heä phöông trình tuyeán
tính baèng phöông phaùp Gauss.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
BAØI TAÄP CUOÁI CHÖÔNG
8. Nhaäp moät ma traän vuoâng baát kyø, tính toång caùc
haøng, caùc coät, caùc ñöôøng cheùo.
9. Nhaäp moät ma traän baát kyø. In ra maøn hình caùc
trò vaø vò trí cuûa caùc soá nguyeân toá coù trong maûng
ñoù.
10. Vieát caùc haøm ñoåi töø soá sang chuoãi, vaø töø chuoãi
sang soá.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
KEÁT THUÙC CHÖÔNG 11
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
CHÖÔNG 12
POINTER
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
CHÖÔNG 12
POINTER
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.1 KHAÙI NIEÄM
Trong ngoân ngöõ C, moãi bieán vaø chuoãi kyù töï ñeàu
ñöôïc löu tröõ trong boä nhôù vaø coù ñòa chæ rieâng, ñòa
chæ naøy xaùc ñònh vò trí cuûa chuùng trong boä nhôù.
Khi laäp trình trong C, nhieàu luùc chuùng ta caàn laøm
vieäc vôùi caùc ñòa chæ naøy, vaø C uûng hoä ñieàu ñoù khi
ñöa ra kieåu döõ lieäu pointer (taïm dòch laø con troû)
ñeå khai baùo cho caùc bieán löu ñòa chæ.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.1 KHAÙI NIEÄM
Moät bieán coù kieåu pointer coù theå löu ñöôïc döõ lieäu
trong noù, laø ñòa chæ cuûa moät ñoái töôïng ñang khaûo
saùt. Ñoái töôïng ñoù coù theå laø moät bieán, moät chuoãi
hoaëc moät haøm.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.2 THAO TAÙC TREÂN POINTER
12.2.1 Khai baùo bieán pointer - pointer haèng
Trong ngoân ngöõ C coù moät toaùn töû laáy ñòa chæ cuûa
moät bieán ñang laøm vieäc, toaùn töû naøy laø moät daáu &
(ampersand), taïm goïi laø toaùn töû laáy ñòa chæ. Cuù
phaùp nhö sau:
& bieán
vôùi bieán laø moät bieán thuoäc kieåu baát kyø, nhöng
khoâng ñöôïc laø bieán thanh ghi.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.2 THAO TAÙC TREÂN POINTER
12.2.1 Khai baùo bieán pointer - pointer haèng
Ví duï: Neáu coù moät bieán ñaõ ñöôïc khai baùo laø
int heä_soá_a;
thì
& heä_soá_a
seõ laø ñòa chæ cuûa bieán heä_soá_a.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.2 THAO TAÙC TREÂN POINTER
12.2.1 Khai baùo bieán pointer - pointer haèng
Cuù phaùp ñeå khai baùo bieán pointer:
kieåu * teân_bieán_pointer
vôùi - kieåu coù theå laø kieåu baát kyø, xaùc ñònh kieåu döõ
lieäu coù theå ñöôïc ghi vaøo ñoái töôïng maø con troû
ñang troû ñeán.
- teân_bieán_pointer laø teân cuûa bieán con troû, moät
danh hieäu hôïp leä.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.2 THAO TAÙC TREÂN POINTER
12.2.1 Khai baùo bieán pointer - pointer haèng
Bieán hoaëc ñoái töôïng maø con troû ñang troû ñeán coù
theå ñöôïc truy xuaát qua teân cuûa bieán con troû vaø daáu
"*" ñi ngay tröôùc bieán con troû, cuù phaùp cuï theå nhö
sau:
* teân_bieán_con_troû
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.2 THAO TAÙC TREÂN POINTER
12.2.1 Khai baùo bieán pointer - pointer haèng
Ví duï: Xeùt caùc khai baùo sau:
int a, b;
int *pa;
Sau khi khai baùo, ta coù ba oâ nhôù cho ba bieán a, b
vaø pa nhö sau:
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.2 THAO TAÙC TREÂN POINTER
12.2.1 Khai baùo bieán pointer - pointer haèng
Ví duï:
void * pvoid;
int a, * pint;
double b, * pdouble;
pvoid = (void *) &a;
pint = (int *) pvoid;
(*pint) ++;
pvoid = (void *) &b;
pdouble = (double *) pvoid;
(*pdouble) -- ;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.2 THAO TAÙC TREÂN POINTER
12.2.2 Caùc pheùp toaùn treân pointer
Coù theå coäng, tröø moät pointer vôùi moät soá nguyeân
(int, long,...). Keát quaû laø moät pointer.
Ví duï :
int *pi1, *pi2, n;
pi1 = &n;
pi2 = pi1 + 3;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.2 THAO TAÙC TREÂN POINTER
12.2.2 Caùc pheùp toaùn treân pointer
Ví duï: Cho khai baùo
int a[20];
int *p;
p = &a[0];
p += 3;
/* p löu ñòa chæ phaàn töû a[0 + 3], töùc &a[3] */
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.2 THAO TAÙC TREÂN POINTER
12.2.2 Caùc pheùp toaùn treân pointer
Khoâng theå thöïc hieän caùc pheùp toaùn nhaân, chia,
hoaëc laáy dö moät pointer vôùi moät soá, vì pointer löu
ñòa chæ, neân neáu thöïc hieän ñöôïc ñieàu naøy cuõng
khoâng coù moät yù nghóa naøo caû.
Pheùp tröø giöõa hai pointer vaãn laø moät pheùp toaùn
hôïp leä, keát quaû laø moät trò thuoäc kieåu int bieåu thò
khoaûng caùch (soá phaàn töû) giöõa hai pointer ñoù.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.2 THAO TAÙC TREÂN POINTER
12.2.2 Caùc pheùp toaùn treân pointer
Ví duï:
Xeùt chöông trình ví duï sau:
#include
#include
main()
{
int *p1, *p2;
int a[10];
clrscr();
p1 = &a[0];
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.2 THAO TAÙC TREÂN POINTER
12.2.2 Caùc pheùp toaùn treân pointer
Ví duï:
p2 = &a[5];
printf ("Dia chi cua bien a[0] la: %p\n", p1);
printf ("Dia chi cua bien a[5] la: %p\n", p2);
printf ("Khoang cach giua hai phan tu la %d int\n", p2 - p1);
getch();
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.2 THAO TAÙC TREÂN POINTER
12.2.2 Caùc pheùp toaùn treân pointer
Chöông trình seõ cho xuaát lieäu ví duï:
Dia chi cua bien a[0] la: FFE2
Dia chi cua bien a[5] la: FFEC
Khoang cach giua hai phan tu la 5 int
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.2 THAO TAÙC TREÂN POINTER
12.2.2 Caùc pheùp toaùn treân pointer
Ví duï: Cho caùc khai baùo sau:
int * a1;
char * a2;
a1 = 0; /* Chöông trình dòch seõ nhaéc nhôû leänh naøy */
a2 = (char *)0;
if( a1 != a2) /* Chöông trình dòch seõ nhaéc nhôû kieåu cuûa ñoái töôïng */
{
a1 = (int *) a2; /* Hôïp leä vì ñaõ eùp kieåu */
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.2 THAO TAÙC TREÂN POINTER
12.2.2 Caùc pheùp toaùn treân pointer
Ví duï:
#include
#include
main()
{
int *pint, a = 0 6141;
char *pchar;
clrscr();
pint = &a;
pchar = (char *) &a;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.2 THAO TAÙC TREÂN POINTER
12.2.2 Caùc pheùp toaùn treân pointer
Ví duï:
printf ("Tri cua bien pint la: %p\n", pint);
printf ("Tri cua bien pchar la: %p\n", pchar);
printf ("Doi tuong pint dang quan ly la %X \n", *pint);
printf ("Doi tuong pchar dang quan ly la %c \n", *pchar);
pchar++;
printf ("Doi tuong pchar dang quan ly la %c \n", *pchar);
getch();
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.2 THAO TAÙC TREÂN POINTER
12.2.2 Caùc pheùp toaùn treân pointer
Chöông trình cho xuaát lieäu ví duï:
Tri cua bien pint la: FFF4
Tri cua bien pchar la: FFF4
Doi tuong pint dang quan ly la 6141
Doi tuong pchar dang quan ly la A
Doi tuong pchar dang quan ly la a
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.2 THAO TAÙC TREÂN POINTER
12.2.2 Caùc pheùp toaùn treân pointer
C cho pheùp khai baùo moät bieán pointer laø haèng
hoaëc ñoái töôïng cuûa moät pointer laø haèng.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.2 THAO TAÙC TREÂN POINTER
12.2.2 Caùc pheùp toaùn treân pointer
Caùc khai baùo sau ñaây laø bieán pointer haèng:
1. int a, b;
int * const pint = &a;
pint = &b; C baùo
loãi
2. char * const ps = "ABCD";
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.2 THAO TAÙC TREÂN POINTER
12.2.2 Caùc pheùp toaùn treân pointer
Caùc khai baùo sau ñaây cho thaáy ñoái töôïng cuûa moät
pointer laø haèng:
1. int i;
const int * pint;
pint = &i;
i = 1;
(*pint) ++; C baùo loãi
i++;
2. const char * s = "ABCD" hoaëc
char const * s = "ABCD";
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.2 THAO TAÙC TREÂN POINTER
12.2.2 Caùc pheùp toaùn treân pointer
Phaân bieät:
const tröôùc * : pointer chæ ñeán ñoái töôïng haèng
* tröôùc const : pointer haèng
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.3 POINTER VAØ MAÛNG
Coù moät söï töông quan chaët cheû giöõa maûng vaø
pointer, vì trong C, teân maûng laø moät haèng
pointer, noù chính laø ñòa chæ cuûa phaàn töû ñaàu tieân
cuûa maûng.
Ví duï: Cho khai baùo sau:
int a[10];
int *pa;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.3 POINTER VAØ MAÛNG
*(a + 0) chính laø a[0],
*(a + 1) chính laø a[1],
....
*(a + i) chính laø a[i].
Coù theå gaùn:
pa = a;
hoaëc
pa =&a[0];
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.3 POINTER VAØ MAÛNG
Khi ñoù, (pa + 0) seõ chæ ñeán phaàn töû a[0],
(pa + 1) seõ chæ ñeán phaàn töû a[1],
...
(pa + i) seõ chæ ñeán phaàn töû a[i].
Nhö vaäy, caùc ñoái töôïng
*(pa + 0) chính laø *(a + 0), cuõng laø a[0]
*(pa + 1) chính laø *(a + 1), cuõng laø a[1]
...
*(pa + i) chính laø *(a + i), cuõng laø a[i]
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.3 POINTER VAØ MAÛNG
Coù theå truy suaát ñeán caùc ñoái töôïng cuûa maûng maø
pointer ñang troû ñeán nhö sau:
pa[0] chính laø phaàn töû a[0]
pa[1] chính laø phaàn töû a[1]
...
pa[i] chính laø phaàn töû a[i].
Ví duï 6.15 (SGT)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.3 POINTER VAØ MAÛNG
Phaân bieät roõ raøng giöõa maûng vaø pointer.
-Moät maûng, sau khi ñöôïc khai baùo vaø ñònh nghóa,
ñaõ ñöôïc caáp moät vuøng nhôù trong boä nhôù trong cuûa
maùy tính vaø ñòa chæ chính laø teân maûng.
-Moät bieán pointer, sau khi ñöôïc khai baùo, thì vuøng
nhôù ñöôïc caáp chæ laø baûn thaân bieán pointer, coøn trò
beân trong noù laø moät ñòa chæ raùc.
-Ngoaøi ra, bieán pointer coù moät ñòa chæ trong boä
nhôù, coøn khoâng theå laáy ñòa chæ cuûa teân maûng.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.3 POINTER VAØ MAÛNG
Ví duï:
Sau khi khai baùo
int a[10];
thì trong boä nhôù, a laø moät haèng pointer, hay moät
ñòa chæ coá ñònh
Caùc phaàn töû trong maûng ñang coù trò raùc.
Vì teân maûng laø moät haèng pointer
a++;
laø khoâng hôïp leä.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.3 POINTER VAØ MAÛNG
Ví duï:
int *pa;
thì trong boä nhôù
do ñoù leänh gaùn
*pa = 2; laø khoâng coù yù nghóa, duø C khoâng baùo loãi
trong tröôøng hôïp naøy.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.3 POINTER VAØ MAÛNG
Ví duï 6.18 vaø 6.19 (SGT)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.4 ÑOÁI SOÁ CUÛA HAØM LAØ POINTER -
TRUYEÀN ÑOÁI SOÁ THEO SOÁ DAÏNG
THAM SOÁ BIEÁN
Ví duï:
#include
#include
void hoan_doi (int a, int b);
main()
{
int so1 = 1, so2 = 2;
clrscr();
printf ("Tri cua hai bien so1 vaø so2 la: %d %d\n", so1, so2);
hoan_doi(so1, so2),
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.4 ÑOÁI SOÁ CUÛA HAØM LAØ POINTER -
TRUYEÀN ÑOÁI SOÁ THEO SOÁ DAÏNG
THAM SOÁ BIEÁN
printf("Sau khi goi ham, tri cua so1 va so2 la: %d %d\n",so1,so2);
getch();
}
void hoan_doi (int a, int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.4 ÑOÁI SOÁ CUÛA HAØM LAØ POINTER -
TRUYEÀN ÑOÁI SOÁ THEO SOÁ DAÏNG
THAM SOÁ BIEÁN
Ví duï:
#include
#include
void hoan_doi (int *a, int *b);
main ()
{
int so1 = 1, so2 = 2;
clrscr();
printf ("Tri cua hai bien so1 va so2 la: %d %d\n", so1, so2);
hoan_doi (&so1, &so2);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.4 ÑOÁI SOÁ CUÛA HAØM LAØ POINTER -
TRUYEÀN ÑOÁI SOÁ THEO SOÁ DAÏNG
THAM SOÁ BIEÁN
printf ("Sau khi goi ham, tri cua so1 va so2 la: %d %d\n", so1,
so2);
getch();
}
void hoan_doi (int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.4 ÑOÁI SOÁ CUÛA HAØM LAØ POINTER -
TRUYEÀN ÑOÁI SOÁ THEO SOÁ DAÏNG
THAM SOÁ BIEÁN
Trong thö vieän chuaån cuûa C cuõng coù nhieàu haøm
nhaän ñoái soá vaøo theo ñòa chæ, ví duï haøm scanf(),
nhaäp trò vaøo cho bieán töø baøn phím.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.4 ÑOÁI SOÁ CUÛA HAØM LAØ POINTER -
TRUYEÀN ÑOÁI SOÁ THEO SOÁ DAÏNG
THAM SOÁ BIEÁN
Ví duï:
#include
#include
main()
{ int n; clrscr();
printf("Moi nhap mot so nguyen ");
scanf("%d", &n);
printf("\n Binh phuong cua %d la %d\n", n, n*n);
getch();
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.5 HAØM TRAÛ VEÀ POINTER VAØ MAÛNG
Moät pointer coù theå ñöôïc traû veà töø haøm, neáu
pointer troû ñeán ñoái töôïng laø maûng, thì haøm traû veà
maûng; neáu pointer chæ troû ñeán bieán bình thöôøng,
thì haøm chæ traû veà con troû troû ñeán bieán thöôøng, cuù
phaùp khai baùo haøm nhö sau:
kieåu * teân_haøm (danh_saùch_khai_baùo_ñoái_soá);
vôùi kieåu laø kieåu cuûa ñoái töôïng maø pointer ñöôïc
haøm traû veà troû ñeán.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.5 HAØM TRAÛ VEÀ POINTER VAØ MAÛNG
Ví duï: Coù khai baùo
int * lon_nhat (int a, int b, int c);
thì haøm lon_nhat() traû veà moät ñòa chæ, ñòa chæ ñoù
coù theå laø ñòa chæ cuûa moät int hoaëc ñòa chæ cuûa moät
maûng caùc int, vieäc söû duïng ñòa chæ theo ñoái töôïng
naøo laø do nôi goïi.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.5 HAØM TRAÛ VEÀ POINTER VAØ MAÛNG
Ví duï: Thieát keá haøm nhaäp trò cho maûng caùc int
int *nhap_tri (int *num)
{
static int a[10];
int i, n;
printf ("Nhap kich thuoc mang:");
scanf ("%d", &n);
*num = n;
printf ("Nhap tri cho %d phan tu cua mang:", n);
for (i = 0; i < n; i++)
scanf ("%d", &a[i]);
return a; /* a laø ñòa chæ ñaàu maûng caàn traû veà */
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.5 HAØM TRAÛ VEÀ POINTER VAØ MAÛNG
Ví duï: Chöông trình söû duïng haøm nhaäp trò maûng
#include
#include
int *nhap_tri(int *num);
main()
{ int *pint, so_phan_tu, i;
clrscr();
pint = nhap_tri (&so_phan_tu);
printf ("Cac phan tu cua mang la:");
for (i =0; i <so_phan_tu; i++)
printf ("%d", pint[i]);
getch();
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.6 CHUOÃI KYÙ TÖÏ
Ví duï: Khi khai baùo
“Hello, world!”
thì chuoãi naøy seõ ñöôïc C ghi vaøo moät nôi naøo ñoù
trong boä nhôù vaø coù ñòa chæ xaùc ñònh. Ñòa chæ naøy
coù theå ñöôïc gaùn vaøo cho moät bieán con troû troû ñeán
kyù töï ñeå quaûn lyù chuoãi.
Ví duï : Cho khai baùo
char s[20];
s = “Hello, world!”; Khoâng hôïp leä
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.6 CHUOÃI KYÙ TÖÏ
1- Nhaäp trò chuoãi
Vieäc nhaäp trò cho chuoãi bao goàm hai böôùc: ñaàu
tieân caàn khai baùo moät nôi troáng ñeå chöùa chuoãi,
sau ñoù duøng moät haøm nhaäp trò ñeå laáy chuoãi.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.6 CHUOÃI KYÙ TÖÏ
1- Nhaäp trò chuoãi
- Haøm gets() ñoïc caùc kyù töï ñeán khi naøo gaëp kyù töï
quy ñònh haøng môùi (töùc kyù töï '\n', töùc khi ta aán
phím ENTER) thì keát thuùc vieäc nhaäp. Sau ñoù haøm
naøy laáy taát caû caùc kyù töï ñaõ nhaäp tröôùc kyù töï '\n',
gaén theâm vaøo cuoái chuoãi moät kyù töï NUL ('\0') vaø
traû chuoãi cho chöông trình goïi. Prototype cuûa haøm
naøy trong file stdio.h:
char * gets (char * s);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.6 CHUOÃI KYÙ TÖÏ
1- Nhaäp trò chuoãi
Ví duï:
#include
#include
main()
{ char ten[41];
char *pten;
clrscr();
printf ("Ban ten gi?\n");
pten = gets (ten);
printf("%s? A! Chao ban %s\n", ten, pten);
getch(); }
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.6 CHUOÃI KYÙ TÖÏ
1- Nhaäp trò chuoãi
- Haøm scanf() cuõng cho pheùp nhaäp chuoãi qua ñònh
daïng nhaäp %s. Vieäc nhaäp chuoãi seõ keát thuùc khi
haøm scanf() gaëp moät trong caùc kyù töï khoaûng
traéng, kyù töï tab hay kyù töï xuoáng haøng ñaàu tieân
maø noù gaëp. Ñaây chính laø ñieåm khaùc nhau giöõa hai
haøm nhaäp chuoãi gets() vaø scanf().
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.6 CHUOÃI KYÙ TÖÏ
1- Nhaäp trò chuoãi
Ví duï:
#include
#include
main()
{ char ten1[41], ten2[41];
clrscr();
printf(Moi ban nhap hai ten: );
scanf ("%s %s", ten1, ten2);
printf("A! Chao hai ban %s va %s \n", ten1, ten2);
getch();
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.6 CHUOÃI KYÙ TÖÏ
2- Xuaát chuoãi
Ñeå xuaát chuoãi, hai haøm thöôøng hay ñöôïc duøng laø
puts() vaø printf().
- Haøm puts: ta chæ caàn cung caáp cho haøm ñoái soá laø
ñòa chæ cuûa chuoãi caàn in. Haøm naøy seõ ñoïc töøng kyù
töï cuûa chuoãi vaø in ra maøn hình cho ñeán khi gaëp
kyù töï NUL thì in ra maøn hình theâm moät kyù töï
xuoáng haøng nöõa. Prototype cuûa haøm naøy nhö sau:
int puts (char * s);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.6 CHUOÃI KYÙ TÖÏ
2- Xuaát chuoãi
- Haøm printf () cuõng cho pheùp xuaát chuoãi ra maøn
hình neáu ta duøng ñònh daïng xuaát "%s" cho noù.
Haøm naøy seõ khoâng töï ñoäng in theâm kyù töï xuoáng
haøng môùi nhö haøm puts().
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.6 CHUOÃI KYÙ TÖÏ
2- Xuaát chuoãi
Ví duï:
#include
#include
main()
{ char ten[41];
clrscr();
printf ("Moi ban nhap ten: ");
gets(ten);
printf ("A! Chao ban: %s", ten);
getch();
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.6 CHUOÃI KYÙ TÖÏ
3- Gaùn trò cho chuoãi
Vieäc gaùn trò cho bieán chuoãi thöïc teá laø vieäc cheùp
töøng kyù töï töø haèng chuoãi hoaëc bieán chuoãi ñaõ bieát
sang moät bieán chuoãi khaùc. Trong C, thao taùc naøy
ñöôïc thöïc hieän nhôø haøm strcpy(), haøm naøy coù
prototype trong file string.h nhö sau:
char *strcpy(char *dest, const char *src);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.6 CHUOÃI KYÙ TÖÏ
3- Gaùn trò cho chuoãi
Haøm strcpy coù theå ñöôïc moâ taû nhö sau:
char *strcpy(char *dest, const char *src)
{
int i;
for (i = 0; (dest[i] = scr[i]) != '\0'; i++)
;
return dest;
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.6 CHUOÃI KYÙ TÖÏ
3- Gaùn trò cho chuoãi
Ví duï:
#include
#include
#include
main()
{ char ten1[41], ten2[41];
clrscr();
printf("Moi ban nhap ten: ");
gets(ten1);
strcpy (ten2, ten1);
printf("A! Chao ban: %s", ten2);
getch(); }
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.6 CHUOÃI KYÙ TÖÏ
4- Laáy chieàu daøi chuoãi
Trong C, ñeå laáy chieàu daøi chuoãi ta duøng haøm
strlen(). Prototype cuûa haøm naøy trong file
string.h:
size_t strlen(const char *s);
vôùi size_t laø moät kieåu nguyeân, C quy ñònh ñaây laø
unsigned.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.6 CHUOÃI KYÙ TÖÏ
4- Laáy chieàu daøi chuoãi
Ví duï:Xeùt chöông trình nhaäp moät chuoãi, ñoåi caùc kyù
töï thöôøng cuûa chuoãi ñoù thaønh kyù töï hoa, in chuoãi
ñoù ra laïi maøn hình.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.6 CHUOÃI KYÙ TÖÏ
4- Laáy chieàu daøi chuoãi
#include
#include
#include
main()
{ char ten[41];
int i; clrscr();
printf("Moi ban nhap ten: "); gets(ten);
for ( i = 0; i < strlen (ten); i++)
if (ten[i] >= 'a' && ten[i] <= 'z') ten[i] -= 32;
printf ("A! Chao ban: %s", ten);
getch();}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.6 CHUOÃI KYÙ TÖÏ
5- Noái chuoãi
Ñeå noái hai chuoãi laïi, C coù haøm chuaån strcat().
Haøm naøy nhaän hai chuoãi laøm ñoái soá, vaø moät baûn
sao cuûa chuoãi thöù hai seõ ñöôïc cheùp noái vaøo cuoái
cuûa chuoãi thöù nhaát, ñeå taïo ra chuoãi môùi. Chuoãi thöù
hai vaãn khoâng coù gì thay ñoåi. Prototype cuûa haøm
naøy trong file string.h:
char *strcat(char *dest, const char *src);
Ví duï 6.37(SGT)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.6 CHUOÃI KYÙ TÖÏ
6- So saùnh chuoãi
Haøm naøy laø strcmp(), coù prototype trong file
string.h:
int strcmp(const char *s1, const char*s2);
Haøm naøy so saùnh hai chuoãi s1 vaø s2 vaø traû veà moät
trò laø:
- soá döông neáu s1 > s2
- soá aâm neáu s1 < s2
- soá 0 neáu s1 == s2
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.6 CHUOÃI KYÙ TÖÏ
6- So saùnh chuoãi
Ví duï:Xeùt chöông trình ví duï sau ñaây
#include
#include
#include
main()
{ clrscr();
printf("%d \n", strcmp("QUAN", quan));
printf("%d \n', strcmp("QUAN", "QUAN"));
printf("%d \n", strcmp("quan", "QUAN"));
printf("%d \n", strcmp("quang, quanG"));
printf("%d \n", strcmp("quang, quan"));
getch(); }
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.6 CHUOÃI KYÙ TÖÏ
6- So saùnh chuoãi
Chöông trình cho xuaát lieäu:
-32
032
32
103
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.7 POINTER VAØ VIEÄC ÑÒNH VÒ BOÄ
NHÔÙ ÑOÄNG
C cho pheùp khai baùo caùc bieán ñoäng, caùc bieán
naøy khi caàn thì xin choã, khoâng caàn thì giaûi
phoùng vuøng nhôù cho chöông trình söû duïng
vaøo muïc ñích khaùc. Caùc bieán ñoäng naøy ñöôïc
caáp phaùt trong vuøng nhôù heap, laø vuøng ñaùy
boä nhôù (vuøng coøn laïi sau khi ñaõ naïp caùc
chöông trình khaùc xong), vaø ñöôïc quaûn lyù
bôûi caùc bieán pointer
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.7 POINTER VAØ VIEÄC ÑÒNH VÒ BOÄ
NHÔÙ ÑOÄNG
Trong C coù hai haøm chuaån ñeå xin caáp phaùt
boä nhôù ñoäng malloc() vaø calloc(), caû hai haøm
ñeàu coù prototype naèm trong file alloc.h hoaëc
stdlib.h nhö sau:
void *malloc(size_t size);
void *calloc(size_t nitems, size_t size);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.7 POINTER VAØ VIEÄC ÑÒNH VÒ BOÄ
NHÔÙ ÑOÄNG
Neáu bieán ñoäng ñöôïc xin, sau khi duøng xong, vuøng
nhôù cuûa noù khoâng ñöôïc giaûi phoùng thì noù vaãn
chieám choå trong boä nhôù, maëc duø chöông trình ñaõ
keát thuùc. C ñöa ra haøm free() ñeå giaûi phoùng khoái
boä nhôù ñöôïc xin baèng haøm malloc() hoaëc calloc().
Prototype cuûa haøm free() trong file stdlib.h hoaëc
alloc.h nhö sau:
void free (void * block);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.7 POINTER VAØ VIEÄC ÑÒNH VÒ BOÄ
NHÔÙ ÑOÄNG
Ví duï:
Caàn xin moät khoái boä nhôù coù 10 phaàn töû int, ta
vieát nhö sau:
int *pint;
pint = (int *) malloc (10 * siezof (int));
hoaëc
pint = (int *) calloc (10, siezof (int));
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.7 POINTER VAØ VIEÄC ÑÒNH VÒ BOÄ
NHÔÙ ÑOÄNG
Ví duï:
#include
#include
#include EXIT
#include
main()
{ int *pint, s = 0, i;
pint = (int *) calloc (10, sizeof (int));
if (pint == NULL)
{
printf ("Khong du bo nho \n");
exit (1); }
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.7 POINTER VAØ VIEÄC ÑÒNH VÒ BOÄ
NHÔÙ ÑOÄNG
Ví duï:
clrscr();
printf ("Moi nhap 10 tri vao mang: ");
for (i = 0; i <10; i++)
scanf ("%d", &pint[i]);
for (i = 0; i <10; i++)
s += pint[i];
printf ("Tong cac phan tu cua mang la: %d \n", s);
getch();
free (pint);
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.8 MAÛNG CAÙC POINTER
Cuù phaùp khai baùo maûng caùc pointer:
kieåu * teân_maûng [Kích_thöôùc];
Ví duï: Khi khai baùo
int * pint[4];
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.8 MAÛNG CAÙC POINTER
Ví duï: Khi khai baùo
int * pint[4];
int a = 2, b = 3, c = 4, d = 5;
pint[0] = &a;
pint[1] = &b;
pint[2] = &c;
pint[3] = &d;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.8 MAÛNG CAÙC POINTER
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.8 MAÛNG CAÙC POINTER
Ví duï: Khi khai baùo
int * pint[4];
int a[3], b[3], c[3], d[3];
pint[0] = a;
pint[1] = b;
pint[2] = c;
pint[3] = d;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.8 MAÛNG CAÙC POINTER
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.8 MAÛNG CAÙC POINTER
Ví duï 6.43, 6.44 (SGT)
Moät maûng caùc pointer cuõng coù theå ñöôïc khôûi ñoäng
trò neáu maûng laø maûng toaøn cuïc hay maûng tónh.
Ví duï:
static char *thu[7] = {"Thu 2", "Thu 3", "Thu 4",
"Thu 5", "Thu 6", "Thu 7", "Chua nhat"};
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.9 POINTER CUÛA POINTER
Cuù phaùp khai baùo pointer naøy nhö sau:
kieåu ** teân_pointer
Ví duï:
int **pint;
int a[4][4];
thì pint = a; laø moät leänh hôïp leä
Thay vì truy xuaát a[i][j], ta coù theå truy xuaát *(pint
+ m*i + j), vôùi m laø soá phaàn töû treân moät haøng cuûa
maûng hai chieàu.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.9 POINTER CUÛA POINTER
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.9 POINTER CUÛA POINTER
Ví duï :
int *m[4];
int a = 1, b = 2, c = 3, d = 4; int **pint;
pint = m;
m[0] = &a; m[1] = &b; m[2] = &c; m[3] = &d;
Thay vì truy xuaát tröïc tieáp a, b, ..., ta coù theå duøng
pointer
*(pint[i])
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.9 POINTER CUÛA POINTER
Ví duï: Xeùt khai baùo sau:
int ** pi;
int * pint[4];
int a[3], b[3], c[3], d[3];
pi = pint;
pint[0] = a; pint[1] = b; pint[2] = c; pint[3] = d;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.9 POINTER CUÛA POINTER
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.9 POINTER CUÛA POINTER
Ví duï 6.51(SGT)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.10 ÑOÁI SOÁ CUÛA HAØM MAIN
C hoaøn toaøn cho pheùp vieäc nhaän ñoái soá vaøo haøm
main(), coù hai ñoái soá C ñaõ quy ñònh theo thöù töï:
int agrc: ñoái soá cho bieát soá tham soá ñaõ nhaäp, keå
caû teân chöông trình.
char *argv[]: maûng caùc pointer troû ñeán caùc chuoãi
laø tham soá ñi theo sau teân chöông trình khi chaïy
chöông trình töø DOS.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.10 ÑOÁI SOÁ CUÛA HAØM MAIN
Ví duï: Xeùt chöông trình ví duï sau:
#include
#include
main (int argc, char *argv[])
{ int i;
clrscr();
printf ("Cac doi so cua chuong trinh la: \n");
printf ("Ten chuong trinh la: %s \n", argv[0]);
if ( argc >1 )
for (i = 1; i < argc; i++)
printf ("Doi so thu %d: %s \n", i, argv[i]);
getch(); }
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.10 ÑOÁI SOÁ CUÛA HAØM MAIN
Neáu nhaäp töø baøn phím nhö sau
C:\>thu_main tin thu 123
thì chöông trình cho xuaát lieäu laø:
Cac doi so cua chuong trinh la:
Ten chuong trinh la: C:\thu_main.exe
Doi so thu 1: tinDoi so thu 2: thu
Doi so thu 3: 123
Ví duï 6.54(SGT)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.11 POINTER TROÛ ÑEÁN HAØM
Cuù phaùp khai baùo moät pointer chæ tôùi haøm:
kieåu (* teân_pointer) (kieåu_caùc_ñoái_soá);
Chuù yù:
kieåu * teân_haøm (kieåu_caùc_ñoái_soá);Haøm traû
veà pointer
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.11 POINTER TROÛ ÑEÁN HAØM
Ví duï:
Neáu khai baùo int (* p_function) (int, int);
vaø ñaõ coù haøm
int cong (int a, int b)
{
...
}
p_function = cong;
tong = (*p_function) (m, n);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.11 POINTER TROÛ ÑEÁN HAØM
Ví duï 6.57 (SGT)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
12.12 ÖÙNG DUÏNG
12.12.1 Danh saùch lieân keát laø stack
12.12.2 Danh saùch lieân keát laø queue
(SGT)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
KEÁT THUÙC CHÖÔNG 12
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
CHÖÔNG 13
CAÙC KIEÅU DÖÕ LIEÄU COÙ CAÁU TRUÙC
VAØ KIEÅU DÖÕ LIEÄU TÖÏ ÑÒNH NGHÓA
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
CHÖÔNG 13
CAÙC KIEÅU DÖÕ LIEÄU COÙ CAÁU TRUÙC
VAØ KIEÅU DÖÕ LIEÄU TÖÏ ÑÒNH NGHÓA
13.1 Kieåu STRUCT
13.2 Kieåu UNION
13.3 Kieåu ENUM (Enumerated)
13.4 Ñònh nghóa kieåu baèng TYPEDEF
Baøi taäp cuoái chöông
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
13.1 KIEÅU STRUCT
13.1.1 Khaùi nieäm - Khai baùo struct
Struct (taïm diïch laø caáu truùc) laø moät kieåu döõ lieäu
phöùc hôïp ñöôïc taïo töø caùc kieåu döõ lieäu khaùc, caùc
kieåu döõ lieäu naøy ñöôïc söû duïng khai baùo cho caùc
bieán thaønh phaàn cuûa bieán kieåu struct.
struct teân_caáu_truùc
{
Khai baùo caùc bieán thaønh phaàn
};
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
13.1 KIEÅU STRUCT
13.1.1 Khaùi nieäm - Khai baùo struct
struct sinh_vieân
{
char ma_so[10];
char ho_ten[40];
int tuoi;
char dia_chi[80];
};
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
13.1 KIEÅU STRUCT
13.1.1 Khaùi nieäm - Khai baùo struct
Cuù phaùp cuûa moät khai baùo bieán caáu truùc gioáng nhö
khai baùo bieán bình thöôøng:
struct teân_struct teân_bieán;
Ví duï:
struct sinh_vien sv1, sv2;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
13.1 KIEÅU STRUCT
13.1.1 Khaùi nieäm - Khai baùo struct
Ví duï:
struct sinh_vieân
{
char ma_so[10];
char ho_ten[40];
int tuoi;
char dia_chi[80];
} sv1, sv2;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
13.1 KIEÅU STRUCT
13.1.1 Khaùi nieäm - Khai baùo struct
10 byte 40 byte 2 byte 80 byte
ma_so ho_ten tuoi dia_chi
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
13.1 KIEÅU STRUCT
13.1.1 Khaùi nieäm - Khai baùo struct
Ví duï:
struct sinh_vien sv1 = { "4950897", "Tran van
Vinh", 21, "42 Truong Cong Dinh p.13 q.TB"};
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
13.1 KIEÅU STRUCT
13.1.1 Khaùi nieäm - Khai baùo struct
Ñeå truy xuaát moät thaønh phaàn cuûa bieán caáu truùc, C
coù toaùn töû chaám “.” ñeå laáy töøng thaønh phaàn.
Ví duï:
strcpy (sv1.ma_so, 4950897");
strcpy (sv1.ho_ten, Tran van Dinh");
sv1.tuoi = 21;
strcpy (sv1.dia_chi, "42 Truong Cong Dinh p.13 q.TB");
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
13.1 KIEÅU STRUCT
13.1.1 Khaùi nieäm - Khai baùo struct
C cho pheùp gaùn caùc caáu truùc cuøng kieåu cho nhau
qua teân bieán caáu truùc thay vì phaûi gaùn töøng thaønh
phaàn cho nhau.
Ví duï:
sv2 = sv1;
Ví duï 7.8 (SGT)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
13.1 KIEÅU STRUCT
13.1.1 Khaùi nieäm - Khai baùo struct
Caùc thaønh phaàn cuûa bieán struct cuõng laø bieán bình
thöôøng, neân ta coù theå laáy ñòa chæ cuûa chuùng, ñòa
chæ naøy laø moät haèng pointer troû ñeán thaønh phaàn
töông öùng.
Ví duï 7.9 (SGT)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
13.1 KIEÅU STRUCT
13.1.1 Khaùi nieäm - Khai baùo struct
Kieåu struct coù theå ñöôïc laáy kích thöôùc tính theo
byte nhôø toaùn töû sizeof, ví duï:
sizeof (struct sinh_vien);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
13.1 KIEÅU STRUCT
13.1.2 Maûng caùc struct
Cuù phaùp khai baùo maûng caùc struct:
struct ten_cau_truc ten_mang [kich_thuoc];
Ví duï:
struct sinh_vien sv[50];
strcpy (sv[0].ho_ten, “Dang thanh Tin”);
sv[0].tuoi = 28;
Ví duï 7.12(SGT)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
13.1 KIEÅU STRUCT
13.1.3 Pointer tôùi moät struct
Cuù phaùp khai baùo bieán pointer naøy nhö sau:
struct teân_caáu_truùc *teân_pointer;
Ví duï :
struct sinh_vien a, *psv;
psv =&a;
hoaëc
struct sinh_vien sv[20], *psv;
psv =sv;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
13.1 KIEÅU STRUCT
13.1.3 Pointer tôùi moät struct
Vieäc truy xuaát ñeán moät thaønh phaàn cuûa moät caáu
truùc thoâng qua moät pointer ñöôïc thöïc hieän baèng
toaùn töû laáy thaønh phaàn cuûa ñoái töôïng cuûa pointer,
kyù hieäu laø -> (coù theå goïi laø toaùn töû muõi teân).
Ví duï:
printf ("Ho ten sinh vien: %s \n", psv -> ho_ten);
hay
printf ("Ho ten sinh vien: %s \n", (*psv).ho_ten);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
13.1 KIEÅU STRUCT
13.1.3 Pointer tôùi moät struct
Ví duï 7.16 (SGT)
C laïi cho pheùp khai baùo struct maø trong caùc thaønh
phaàn cuûa noù laïi coù caùc pointer chæ ñeán moät caáu
truùc cuøng kieåu. Ví duï:
struct node
{
char message[81];
struct node * };
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
13.1 KIEÅU STRUCT
13.1.4 Struct daïng field
C cho pheùp ta khai baùo caùc thaønh phaàn cuûa struct
theo bit hoaëc moät nhoùm bit. Moät thaønh phaàn nhö
vaäy ñöôïc goïi laø moät field (taïm dòch laø vuøng).
struct teân_caáu_truùc
{
kieåu teân_vuøng 1: soá_bit1;
kieåu teân_vuøng 2:soá_bit2;
...
} teân_bieán;
Vôùi kieåu chæ coù theå laø unsigned, signed hoaëc int
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
13.1 KIEÅU STRUCT
13.1.4 Struct daïng field
Ví duï:
struct date
{
unsigned day: 5;
unsigned month: 4;
unsigned year: 6;
int: 0;
} ngay;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
13.1 KIEÅU STRUCT
13.1.4 Struct daïng field
Chuù yù:
-Moãi vuøng chæ coù theå daøi toái ña 16 bit (moät
int) vaø ñöôïc caáp choã trong moät int, chöù khoâng theå
naèm treân hai int khaùc nhau ñöôïc.
-Söï phaân boá bit cho caùc field trong moät int
cuûa struct (töø traùi sang phaûi hay ngöôïc laïi), khoâng
phaân bieät ñöôïc.
-Moïi thao taùc thöïc hieän treân bieán kieåu field
coù lieân quan ñeán ñòa chæ ñeàu khoâng ñöôïc thöïc hieän
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
13.1 KIEÅU STRUCT
13.1.4 Struct daïng field
Ví duï:
Khi khai baùo
struct vi_du
{ unsigned field1: 7;
unsigned field2: 5;
unsigned field3: 2;
unsigned field4: 6;
unsigned field5: 7; } vd;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
13.1 KIEÅU STRUCT
13.1.4 Struct daïng field
Ví duï:
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
13.2 KIEÅU UNION
Trong ngoân ngöõ C coù kieåu döõ lieäu union (taïm dòch
laø kieåu hôïp nhaát), ñaây laø moät kieåu döõ lieäu ñaëc bieät
maø neáu ñöôïc khai baùo thì öùng vôùi moät vuøng nhôù,
giaù trò ôû moãi thôøi ñieåm khaùc nhau thì coù theå coù
kieåu khaùc nhau tuøy vaøo vieäc söû duïng bieán thaønh
phaàn trong noù.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
13.2 KIEÅU UNION
Ví duï:
Coù khai baùo union nhö sau:
union thu
{
char c;
int i;
float f;
double d;
};
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
13.2 KIEÅU UNION
Khai baùo bieán kieåu union:
union teân_union
{
khai_baùo_bieán_thaønh_phaàn
} bieán, bieán [,...];
hoaëc
union teân_union bieán, bieán [...];
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
13.2 KIEÅU UNION
Ví duï:
union thu
{ char c;
int i;
float f;
double d;
} a, b;
hoaëc
union thu a, b;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
13.2 KIEÅU UNION
Ñeå truy xuaát ñeán moät bieán thaønh phaàn cuûa bieán
thuoäc kieåu uinion, ta cuõng duøng toaùn töû chaám “.”.
Ví duï:
unoin thu a;
a.c = 'a';
Ta coù theå khai baùo moät bieán pointer chæ ñeán moät
bieán kieåu union. Ví duï:
union thu *pthu, a;
pthu = &a;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
13.2 KIEÅU UNION
Vieäc truy xuaát ñeán moät thaønh phaàn cuûa union qua
pointer cuõng ñöôïc thöïc hieän baèng toaùn töû muõi teân,
ñeå laáy thaønh phaàn cuûa union ñang ñöôïc pointer
chæ ñeán.
Ví duï:
pthu->c = 'A';
Ví duï 7.30 (SGT)
Kieåu union coù theå ñöôïc laáy kích thöôùc tính theo
byte qua toaùn töû sizeof, ví duï: sizeof (union thu);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
13.3 KIEÅU ENUM (ENUMERATED)
13.4 ÑÒNH NGHÓA KIEÅU BAÈNG
TYPEDEF
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
KEÁT THUÙC CHÖÔNG 13
Các file đính kèm theo tài liệu này:
- Hệ thống máy tính và ngôn ngữ C.pdf