CHÖÔNG 11 MAÛNG CHÖÔNG 11 MAÛNG 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 CHÖÔNG 11 MAÛNG 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.
CHÖÔNG 11 MAÛNG 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ù. CHÖÔNG 11 MAÛNG 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,.
CHÖÔNG 11 MAÛNG 11.2 KHAI BAÙO MAÛNG 1- Maûng moät chieàu Ví dụ: Cho khai báo sau: int a[10], x; Như vậy mảng a có 10 phần tử int, các phần tử đó là a[0], a[1], …, a[9]. Các phần tử này được cấp phát vị trí trong bộ nhớ như hình 12. CHÖÔNG 11 MAÛNG 11.2 KHAI BAÙO MAÛNG 1- Maûng moät chieàu Lệnh a[5] = a[3] + 1; có mã LC-3 như sau: ADD R0, R5, #-9 ; R0 = &a[0]: địa chỉ của a[0] LDR R1, R0, #3 ; R1 = a[3] ADD R1, R1, #1 ; tăng 1 STR R1, R0, #5 ; a[5] = R1, tức a[5] = a[3] + 1. CHÖÔNG 11 MAÛNG 11.2 KHAI BAÙO MAÛNG 1- Maûng moät chieàu Lệnh a[5] = 7; có mã LC-3 như sau: AND R0, R0, #0 ADD R0, R0, #7 ; R0 = 7 ADD R1, R5, #-9 ; R1 = &a[0]: địa chỉ của phần tử a[0] STR R0, R1, #5 ; a[5] = R0 CHÖÔNG 11 MAÛNG 11.2 KHAI BAÙO MAÛNG 1- Maûng moät chieàu Còn lệnh a[x+1] = a[x] + 2; với x là biến đang chứa trị là chỉ số nào đó cần làm việc, có mã LC-3 như sau: LDR R0, R5, #-10 ; R0 = x ADD R1, R5, #-9 ; R1 = &a[0] ADD R1, R0, R1 ; R1 = &a[x] LDR R2, R1, #0 ; R2 = a[x] ADD R2, R2, #2 ; cộng thêm 2 CHÖÔNG 11 MAÛNG 11.2 KHAI BAÙO MAÛNG 1- Maûng moät chieàu LDR R0, R5, #-10 ; R0 = x ADD R0, R0, #1 ; R0 = x+1 ADD R1, R5, #-9 ; R1 = &a[0] ADD R1, R0, R1 ; R1 = &a[x+1] STR R2, R1, #0 ; a[x+1] = R2 CHÖÔNG 11 MAÛNG 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ù.h> main() { int i, n, max, vtmax; int a[100]; clrscr(); CHÖÔNG 11 MAÛNG 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() } CHÖÔNG 11 MAÛNG 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 ? CHÖÔNG 11 MAÛNG 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] CHÖÔNG 11 MAÛNG 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],.
CHÖÔNG 11 MAÛNG 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 CHÖÔNG 11 MAÛNG 11.2 KHAI BAÙO MAÛNG 2- Maûng nhieàu chieàu #include <stdio.h> #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: "); CHÖÔNG 11 MAÛNG 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]); printf(“\n”);} getch () } } CHÖÔNG 11 MAÛNG 11.2 KHAI BAÙO MAÛNG 2- Maûng nhieàu chieàu Ví duï : Cho các khai báo sau #define MAX 4 int a[MAX][MAX]; int n = 3;/* cấp thực sự cần làm việc của ma trận */ int i, j; /* biến là chỉ số mảng */ /* Nhập trị cho mảng*/ for (i = 0; i < n; i++) for (j = 0; j < n; j++) scanf (“%d”, &a[i][j]); CHÖÔNG 11 MAÛNG 11.2 KHAI BAÙO MAÛNG 2- Maûng nhieàu chieàu Giả sử trị nhập vào là: 0 1 2 3 4 5 6 7 8 9 10 11 Mảng a[3][3], là một phần của ma trận a[MAX][MAX] CHÖÔNG 11 MAÛNG 11.2 KHAI BAÙO MAÛNG 2- Maûng nhieàu chieàu a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3] a[3][0] a[3][1] a[3][2] a[3][3] CHÖÔNG 11 MAÛNG 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ò. CHÖÔNG 11 MAÛNG 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? CHÖÔNG 11 MAÛNG 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); CHÖÔNG 11 MAÛNG 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. CHÖÔNG 11 MAÛNG 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. CHÖÔNG 11 MAÛNG 11.2 KHAI BAÙO MAÛNG 2- Maûng nhieàu chieàu #include <stdio.h> main() { char s[100]; clrscr(); printf ("Moi nhap mot chuoi: "); gets (s); printf ("Chuoi da nhap la: "); puts (s); getch(); } CHÖÔNG 11 MAÛNG 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.
CHÖÔNG 11 MAÛNG 11.3 KHÔÛI ÑOÄNG TRÒ CUÛA MAÛNG Ví duï: double a[] = {1.34}; char s[30] = “I go to school \n”; char ch[] = “Hello, World!”; CHÖÔNG 11 MAÛNG 11.3 KHÔÛI ÑOÄNG TRÒ CUÛA MAÛNG Ví duï: Cho khai báo mảng và khởi động trị như sau: int a[][3] = { { 11, 12, 13}, { 21, 22, 23}, { 31, 32, 33} }; Với khai báo này, mảng a sẽ có 9 phần tử trong 3 hàng CHÖÔNG 11 MAÛNG 11.3 KHÔÛI ÑOÄNG TRÒ CUÛA MAÛNG Ví duï : Chuoãi char s[] = “Hello”; H e l l o \0 char ch[] = {'H', 'e', 'l', 'l', 'o'}; H e l l o CHÖÔNG 11 MAÛNG 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, 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). CHÖÔNG 11 MAÛNG 11.4 MAÛNG LAØ ÑOÁI SOÁ CUÛA HAØM MAÛNG LAØ BIEÁN TOAØN CUÏC Ví duï 12.16 (SGT) CHÖÔNG 11 MAÛNG 11.4 MAÛNG LAØ ÑOÁI SOÁ CUÛA HAØM MAÛNG LAØ BIEÁN TOAØN CUÏC Ví dụ 12.17: Xét chương trình tính trung bình của các số như sau: #include <stdio.h> #define MAX 10 int Average (int values[]); main() { int index; int mean; int a[MAX]; CHÖÔNG 11 MAÛNG 11.4 MAÛNG LAØ ÑOÁI SOÁ CUÛA HAØM MAÛNG LAØ BIEÁN TOAØN CUÏC printf (“Mời nhập %d số nguyên: ”, MAX); // Nhập trị cho mảng for (index = 0; index < MAX; index++) scanf (“%d”, &a[index]); mean = Average (a); printf (“Trung bình của các số này là %d.\n”, mean); } CHÖÔNG 11 MAÛNG 11.4 MAÛNG LAØ ÑOÁI SOÁ CUÛA HAØM MAÛNG LAØ BIEÁN TOAØN CUÏC int Average (int values[]) { int index; int sum = 0; for (index = 0; index < MAX; index++) sum += values[index]; return (sum/MAX); } CHÖÔNG 11 MAÛNG 11.4 MAÛNG LAØ ÑOÁI SOÁ CUÛA HAØM MAÛNG LAØ BIEÁN TOAØN CUÏC CHÖÔNG 11 MAÛNG 11.4 MAÛNG LAØ ÑOÁI SOÁ CUÛA HAØM MAÛNG LAØ BIEÁN TOAØN CUÏC #include <stdio.h> #define MAX 10 int Average (int values[], int number); main() { int index; int mean; int n; int a[MAX]; CHÖÔNG 11 MAÛNG 11.4 MAÛNG LAØ ÑOÁI SOÁ CUÛA HAØM MAÛNG LAØ BIEÁN TOAØN CUÏC // Nhập số số nguyên cần làm việc do { printf (“Bạn muốn làm việc với bao nhiêu số nguyên? (0 < n <= 10): ”); scanf (“%d”, &n); if (n <= 0 || n > 10) printf (“Sai trị.\n”); } while (n <= 0 || n > 10); printf (“Mời nhập %d số nguyên: ”, n); CHÖÔNG 11 MAÛNG 11.4 MAÛNG LAØ ÑOÁI SOÁ CUÛA HAØM MAÛNG LAØ BIEÁN TOAØN CUÏC // Nhập trị cho mảng for (index = 0; index < n; index++) scanf (“%d”, &a[index]); mean = Average (a, n); printf (“Trung bình của các số này là %d.\n”, mean); } CHÖÔNG 11 MAÛNG 11.4 MAÛNG LAØ ÑOÁI SOÁ CUÛA HAØM MAÛNG LAØ BIEÁN TOAØN CUÏC int Average (int values[], int number) { int index; int sum = 0; for (index = 0; index < number; index++) sum + = values[index]; return (sum/number); } CHÖÔNG 11 MAÛNG 11.5 CAÙC ÖÙNG DUÏNG 11.