Hệ thống máy tính và ngôn ngữ C

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++.

pdf599 trang | Chia sẻ: tlsuongmuoi | Lượt xem: 2957 | Lượt tải: 2download
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:

  • pdfHệ thống máy tính và ngôn ngữ C.pdf
Tài liệu liên quan