Giáo trình Lập trình cơ bản C - Bài 11: Mảng

Bài 11  
Mảng  
Mục tiêu:  
Kết thúc bài học này, bạn thể:  
Hiểu được các phần tử của mảng và các chỉ số mảng  
Khai báo một mảng  
Hiểu cách quản mảng trong C  
Hiểu một mảng được khởi tạo như thế nào  
Hiểu mảng chuỗi/ tự  
Hiểu mảng hai chiều  
Hiểu cách khởi tạo mảng nhiều chiều.  
Giới thiệu:  
thể bạn sẽ gặp khó khăn khi lưu trữ một tập hợp các phần tử dữ liệu giống nhau trong các biến  
khác nhau. Ví dụ, điểm cho tất cả 11 cầu thủ của một đội bóng đá phải được ghi nhận trong một trận  
đấu. Sự lưu trữ điểm của mỗi cầu thủ trong các biến có tên khác nhau thì chắc chắn phiền hơn dùng  
một biến chung cho chúng. Với mảng mọi việc sẽ được thực hiện đơn giản hơn. Một mảng một tập  
hợp các phần tử dữ liệu có cùng kiểu. Mỗi phần tử được lưu trữ ở các vị trí kế tiếp nhau trong bộ nhớ  
chính. Những phần tử này được gọi phần tử mảng.  
11.1 Các phần tử mảng và các chỉ mục:  
Mỗi phần tử của mảng được định danh bằng một chỉ mục hoặc chỉ số gán cho nó. Chiều của mảng  
được xác định bằng số chỉ số cần thiết để định danh duy nhất mỗi phần tử. Một chỉ số một số  
nguyên dương được bao bằng dấu ngoặc vuông [ ] đặt ngay sau tên mảng, không có khoảng trắng ở  
giữa. Một chỉ số chứa các giá trị nguyên bắt đầu bằng 0. Vì vậy, một mảng player với 11 phần tử  
được biểu diễn như sau:  
player[0], player[1], player[2], ... , player[10].  
Như đã thấy, phần tử mảng bắt đầu với player[0], và vì vậy phần tử cuối cùng là player[10] không  
phải là player[11]. Điều này là do bởi trong C, chỉ số mảng bắt đầu từ 0; do đó trong mảng N phần tử,  
phần tử cuối cùng có chỉ số N-1. Phạm vi cho phép của các giá trị chỉ số được gọi miền giới hạn  
của chỉ số mảng, giới hạn dưới giới hạn trên. Một chỉ số mảng hợp lệ phải một giá trị nguyên  
nằm trong niềm giới hạn. Thuật ngữ hợp lệ được sử dụng cho một nguyên nhân rất đặc trưng. Trong  
C, nếu người dùng cố gắng truy xuất một phần tử nằm ngoài dãy chỉ số hợp lệ (như player[11] trong ví  
dụ trên của mảng), trình biên dịch C sẽ không phát sinh ra lỗi. Tuy nhiên, có thể nó truy xuất một giá  
trị nào đó dẫn đến kết quả không đoán được. Cũng có nguy cơ viết chồng lên dữ liệu hoặc lệnh  
chương trình. Vì vậy, người lập trình phải đảm bảo rằng tất cả các chỉ số nằm trong miền giới hạn  
hợp lệ.  
Khai báo một mảng:  
Một mảng một vài đặc tính riêng biệt phải được khai báo khi sử dụng chúng. Những đặc tính  
này bao gồm:  
Lớp lưu trữ  
Kiểu dữ liệu của các phần tử mảng.  
Tên mảng – xác định vị trí phần tử đầu tiên của mảng.  
Kích thước mảng - một hằng số có giá trị nguyên dương.  
Mảng  
1
Một mảng được khai báo giống như cách khai báo một biến, ngoại trừ tên mảng được theo sau bởi một  
hoặc nhiều biểu thức, được đặt trong dấu ngoặc vuông [] xác định chiều dài của mảng. Cú pháp tổng  
quát khai báo một mảng như sau:  
lớp_lưu_trữ  
kiểu_dữ_liệu  
tên_mảng[biểu_thức_kích_thước]  
Ở đây, biểu_thức_kích_thước một biểu thức xác định số phần tử trong mảng phải định ra một  
trị nguyên dương. Lớp_lưu_trữ một tùy chọn. Mặc định lớp automatic được dùng cho mảng khai  
báo bên trong một hàm hoặc một khối lệnh, lớp external được dùng cho mảng khai báo bên ngoài  
một hàm. Vì vậy mảng player được khai báo như sau:  
int player[11];  
Nên nhớ rằng, trong khi khai báo mảng, kích thước của mảng sẽ là 11, tuy nhiên các chỉ số của từng  
phần tử bên trong mảng sẽ từ 0 đến 10.  
Các qui tắc đặt tên mảng giống với qui tắc đặt tên biến. Một tên mảng một tên biến không được  
giống nhau, nó dẫn đến sự nhập nhằng. Nếu một sự khai báo như vậy xuất hiện trong chương trình,  
trình biên dịch sẽ hiển thị thông báo lỗi.  
Một vài qui tắc với mảng:  
Tất cả các phần tử của một mảng có cùng kiểu. Điều này có nghĩa là, nếu một mảng được khai  
báo kiểu int, nó không thể chứa các phần tử kiểu khác.  
Mỗi phần tử của mảng thể được sử dụng bất cứ nơi nào mà một biến được cho phép hay  
được yêu cầu.  
Một phần tử của mảng thể được tham chiếu đến bằng cách sử dụng một biến hoặc một biểu  
thức nguyên. Sau đây là các tham chiếu hợp lệ:  
player[i]; /*Ở đó i một biến, tuy nhiên cần phải chú ý rằng  
i nằm trong miền giới hạn của chỉ số đã được khai  
báo cho mảng player*/  
player[3] = player[2] + 5;  
player[0] += 2;  
player[i / 2 + 1];  
Kiểu dữ liệu của mảng thể int, char, float, hoặc double.  
11.2 Việc quản mảng trong C:  
Một mảng được “đối xử” khác với một biến trong C. Thậm chí hai mảng có cùng kiểu và kích thước  
cũng không thể tương đương nhau. Hơn nữa, không thể gán một mảng trực tiếp cho một mảng khác.  
Thay vì thế, mỗi phần tử mảng phải được gán riêng lẻ tương ứng với từng phần tử của mảng khác. Các  
giá trị không thể được gán cho toàn bộ một mảng, ngoại trừ tại thời điểm khởi tạo. Tuy nhiên, từng  
phần tử không chỉ thể được gán trị mà còn có thể được so sánh.  
int player1[11], player2[11];  
for (i = 0; i < 11; i++)  
player1[i] = player2[i];  
Tương tự, cũng thể kết quả như vậy bằng việc sử dụng các lệnh gán riêng lẻ như sau:  
player1[0] = player2[0];  
player1[1] = player2[1];  
...  
player1[10] = player2[10];  
2
Lập trình cơ bản C  
Cấu trúc for là cách lý tưởng để thao tác các mảng.  
dụ 11.1:  
/* Program demonstrates a single dimensional array */  
#include <stdio.h>  
void main()  
{
int num[5];  
int i;  
num[0] = 10;  
num[1] = 70;  
num[2] = 60;  
num[3] = 40;  
num[4] = 50;  
for (i = 0; i < 5; i++)  
pirntf(“\n Number at [%d] is %d”, i, num[i]);  
}
Kết quả của chương trình được trình bày bên dưới:  
Number at [0] is 10  
Number at [1] is 70  
Number at [2] is 60  
Number at [3] is 40  
Number at [4] is 50  
dụ bên dưới nhập các giá trị vào một mảng có kích thước 10 phần tử, hiển thị giá trị lớn nhất và giá  
trị trung bình.  
dụ 11.2:  
/*Input values are accepted from the user into the array ary[10]*/  
#include <stdio.h>  
void main()  
{
int ary[10];  
int i, total, high;  
for (i = 0; i < 10; i++)  
{
printf(“\nEnter value: %d: “, i + 1);  
scanf(“%d”, &ary[i]);  
}
/* Displays highest of the entered values */  
high = ary[0];  
for (i = 1; i < 10; i++)  
{
if (ary[i] > high)  
high = ary[i];  
}
printf(“\n Highest value entered was %d”, high);  
/* Prints average of value entered for ary[10] */  
for (i = 0, total = 0; i < 10; i++)  
Mảng  
3
total = total + ary[i];  
printf(“\nThe average of the element of ary is %d”, total/i);  
}
Một dụ về kết quả được trình bày dưới đây:  
Enter value: 1: 10  
Enter value: 2: 20  
Enter value: 3: 30  
Enter value: 4: 40  
Enter value: 5: 50  
Enter value: 6: 60  
Enter value: 7: 70  
Enter value: 8: 80  
Enter value: 9: 90  
Enter value: 10: 10  
Highest value entered was 90  
The average of the element of ary is 46  
Việc khởi tạo mảng:  
Các mảng không được khởi tạo tự động, trừ khi mỗi phần tử mảng được gán một giá trị riêng lẻ.  
Không nên dùng các mảng trước khi có sự khởi tạo thích hợp. Điều này là bởi vì không gian lưu trữ  
của mảng không được khởi tạo tự động, do đó dễ gây ra kết quả không lường trước. Mỗi khi các phần  
tử của một mảng chưa khởi tạo được sử dụng trong các biểu thức toán học, các giá trị đã tồn tại sẵn  
trong ô nhớ sẽ được sử dụng, các giá trị này không đảm bảo rằng có cùng kiểu như khai báo của mảng,  
trừ khi các phần tử của mảng được khởi tạo một cách rõ ràng. Điều này đúng không chỉ cho các mảng  
mà còn cho các biến thông thường.  
Trong đoạn lệnh sau, các phần tử của mảng được gán giá trị bằng các dùng vòng lặp for.  
int ary[20], i;  
for(i=0; i<20; i++)  
ary[i] = 0;  
Khởi tạo một mảng sử dụng vòng lặp for thể được thực hiện với một hằng giá trị, hoặc các giá trị  
được sinh ra từ một cấp số cộng.  
Một vòng lặp for cũng thể được sử dụng để khởi tạo một mảng các ký tự như sau:  
dụ 11.3:  
#include <stdio.h>  
void main()  
{
char alpha[26];  
int i, j;  
for(i = 65, j = 0; i < 91; i++, j++)  
{
alpha[j] = i;  
printf(“The character now assigned is %c\n”, alpha[j]);  
}
getchar();  
}
4
Lập trình cơ bản C  
Một phần kết quả của chương trình trên như sau:  
The character now assigned is A  
The character now assigned is B  
The character now assigned is C  
.
.
.
Chương trình trên gán các mã ký tự ASCII cho các phần tử của mảng alpha. Kết quả là khi in với định  
dạng %c, một chuỗi các ký tự được xuất ra màn hình. Các mảng cũng thể được khởi tạo khi khai  
báo. Điều này được thực hiện bằng việc gán tên mảng với một danh sách các giá trị phân cách nhau  
bằng dấu phẩy (,) đặt trong cặp dấu ngoặc nhọn {}. Các giá trị trong cặp dấu ngoặc nhọn {} được gán  
cho các phần tử trong mảng theo đúng thứ tự xuất hiện.  
dụ:  
int deci[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};  
static float rates[4] = {0.0, -2.5, 13.75, 18.0};  
char company[5] = {‘A’, ‘P’, ‘P’, ‘L’, ‘E’};  
int marks[100] = {15, 13, 11, 9}  
Các giá trị khởi tạo của mảng phải là các hằng, không thể biến hoặc các biểu thức. Một vài phần tử  
đầu tiên của mảng sẽ được khởi tạo nếu số lượng giá trị khởi tạo là ít hơn số phần tử mảng được khai  
báo. Các phần tử còn lại sẽ được khởi tạo giá trị 0. Ví dụ, trong mảng marks sau khi có sự khởi tạo  
như trên, bốn phần tử đầu tiên (từ 0 đến 3) tương ứng được khởi tạo là 15, 13, 11 và 9. Các phần tử  
còn lại có giá trị 0. Không thể chỉ khởi tạo các phần tử từ 1 đến 4, hoặc từ 2 đến 4, hay từ 2 đến 5 khi  
sự khởi tạo được thực hiện tại thời điểm khai báo. Trong C không có khả năng lặp lại sự khởi tạo giá  
trị.  
Trong trường hợp sự khởi tạo tường minh, lớp extern hoặc static, các phần tử của mảng được đảm  
bảo khởi tạo là 0 (không giống lớp auto).  
Không cần thiết khai báo kích thước của mảng đang được khởi tạo. Nếu kích thước của mảng được bỏ  
qua khi khai báo, trình biên dịch sẽ xác định kích thước của mảng bằng cách đếm các giá trị đang  
được khởi tạo. dụ, sự khai báo mảng external sau đây sẽ chỉ định kích thước của mảng ary là 5 vì  
có 5 giá trị khởi tạo.  
int ary[] = {1, 2, 3, 4, 5};  
Các mảng chuỗi/ký tự:  
Một chuỗi thể được khai báo như một mảng tự, được kết thúc bởi một tự NULL. Mỗi  
tự của chuỗi chiếm 1 byte, và tự cuối cùng của chuỗi luôn luôn là ký tự ‘\0’. Ký ‘\0’ được gọi  
tự null. Nó là một mã thoát (escape sequence) tương tự n‘\n’, thay thế cho ký tự có giá trị 0.  
Vì ‘\0’ luôn là ký tự cuối cùng của một chuỗi, nên các mảng tự phải nhiều hơn một tự so với  
chiều dài tối đa mà chúng quản lý. Ví dụ, một mảng ary quản một chuỗi 10 ký tự phải được khai  
báo như sau:  
char ary[11];  
Vị trí thêm vào được sử dụng để lưu trữ tự null. Nên nhớ rằng tự kết thúc (ký tự null) là rất quan  
trọng.  
Mảng  
5
Các giá trị chuỗi thể được nhập vào bằng cách sử dụng hàm scanf(). Với chuỗi ary được khai báo ở  
trên, mã lệnh nhập sẽ như sau:  
scanf(“%s”, ary);  
Trong lệnh trên, ary xác định vị trí nơi lần lượt các ký tự của mảng sẽ được lưu trữ.  
dụ 11.4:  
#include <stdio.h>  
void main()  
{
char ary[5];  
int i;  
printf(“\n Enter string: ”);  
scanf(“%s”, ary);  
printf(“\n The string is %s \n\n”, ary);  
for (i = 0; i < 5; i++)  
printf(“\t%d”, ary[i]);  
}
Các kết quả thực thi chương trình với những dữ liệu nhập khác nhau như sau:  
Nếu chuỗi được nhập appl, kết qus:  
The string is appl  
97  
112 112 108  
0
Kết quả như trên là của 4 ký tự (appl) và ký tự thứ 5 là ký tự null. Điều này được thấy với mã  
ASCII cho các ký tự được in ra dòng thứ hai. Ký tự thứ năm được in la 0, là giá trị của tự null.  
Nếu chuỗi nhập vào là apple, kết quả sẽ là:  
The string is apple  
97  
112 112 108 101  
Kết quả ở trên của một dữ liệu đầu vào có 5 ký tự a, p, p, l và e. Nó không được xem là một chuỗi  
bởi vì ký tự thứ 5 của mảng không phải là \0. Một lần nữa, điều này được thấy bằng dòng in ra mã  
ASCII của các ký tự a, p, p, l, e.  
Nếu chuỗi được nhập vào là ap, thì kết quả sẽ là:  
The string is ap  
97  
112  
0
6
100  
Trong ví dụ trên, khi chỉ có hai ký tự được nhập, tự thứ ba sẽ là ký tự null. Điều này cho biết là  
chuỗi đã được kết thúc. Những tự còn lại những tự không dự đoán được.  
Trong trường hợp trên, tính quan trọng của tự null trở nên rõ ràng. Ký tự null xác định sự kết thúc  
của chuỗi và là cách duy nhất để các hàm làm việc với chuỗi sẽ biết đâu điểm kết thúc của chuỗi.  
Mặc dù C không có kiểu dữ liệu chuỗi, nhưng nó cho phép các hằng chuỗi. Một hằng chuỗi một dãy  
các ký tự được đặt trong dấu nháy đôi (“”). Không giống như các hằng khác, nó không thể được sửa  
đổi trong chương trình. Ví dụ như:  
6
Lập trình cơ bản C  
“Hi Aptechite!”  
Trình biên dịch C sẽ tự động thêm vào ký tự null cuối chuỗi.  
C hỗ trợ nhiều hàm cho chuỗi, các hàm này nằm trong thư viện chuẩn string.h. Một vài hàm được đưa  
ra trong bảng 11.1. Cách làm việc của các hàm này sẽ được thảo luận trong bài 17.  
Tên hàm  
strcpy(s1, s2)  
strcat(s1, s2)  
strlen(s1)  
Chức năng  
Sao chép s2 vào s1  
Nối s2 vào cuối của s1  
Trả về chiều dài của s1  
strcmp(s1, s2)  
Trả về 0 nếu s1 và s2 là giống nhau; nhỏ hơn 0 nếu s1<s2; lớn hơn 0  
nếu s1> s2  
strchr(s1, ch)  
strstr(s1, s2)  
Trả về một con trỏ trỏ đến vị trí xuất hiện đầu tiên của ch trong s1  
Trả về một con trỏ trỏ đến vị trí xuất hiện đầu tiên của chuỗi s2 trong  
chuỗi s1  
Bảng 11.1  
11.3 Mảng hai chiều:  
Chúng ta đã biết thế nào là mảng một chiều. Điều này có nghĩa là các mảng chỉ một chỉ số. Các  
mảng thể nhiều hơn một chiều. Các mảng đa chiều giúp dễ dàng trình bày các đối tượng đa  
chiều, chẳng hạn một đồ thị với các dòng cột hay tọa độ màn hình của máy tính. Các mảng đa chiều  
được khai báo giống như các mảng một chiều, ngoại trừ có thêm một cặp dấu ngoặc vuông [] trong  
trường hợp mảng hai chiều. Một mảng ba chiều sẽ cần ba cặp dấu ngoặc vuông,... Một cách tổng quát,  
một mảng đa chiều thể được biểu diễn như sau:  
storage_class data_type ary[exp1][exp2]....[expN];  
Ở đó, ary một mảng lớp storage_class, kiểu dữ liệu data_type, và exp1, exp2,..... , expN là  
các biểu thức nguyên dương xác định số phần tử của mảng được kết hợp với mỗi chiều.  
Dạng đơn giản nhất thường được sử dụng nhất của các mảng đa chiều mảng hai chiều. Một  
mảng hai chiều thể xem như một mảng của hai ‘mảng một chiều’. Một mảng hai chiều đặc trưng  
như bảng lịch trình của máy bay, xe lửa. Đxác định thông tin, ta sẽ chỉ định dòng và cột cần thiết, và  
thông tin được đọc ra từ vị trí (dòng và cột) được tìm thấy. Tương tự như vậy, một mảng hai chiều là  
một khung lưới chứa các dòng và cột trong đó mỗi phần tử được xác định duy nhất bằng toạ độ dòng  
cột của nó. Một mảng hai chiều tmp kiểu int với 2 dòng và 3 cột thể được khai báo như sau,  
int tmp[2][3];  
Mảng này sẽ chứa 2 x 3 (6) phần tử, và chúng có thể được biểu diễn như sau:  
Dòng  
0
1
2
0
1
e1  
e4  
e2  
e5  
e3  
e6  
Ở đó e1 – e6 biểu diễn cho các phần tử của mảng. Cả dòng và cột được đánh số từ 0. Phần tử e6 được  
xác định bằng dòng 1 và cột 2. Truy xuất đến phần tử này như sau:  
tmp[1][2];  
Mảng  
7
Khởi tạo mảng đa chiều:  
Khai báo mảng đa chiều thể kết hợp với việc gán các giá trị khởi tạo. Cần phải cẩn thận lưu ý đến  
thứ tự các giá trị khởi tạo được gán cho các phần tử của mảng (chỉ mảng external static thể  
được khởi tạo). Các phần tử trong dòng đầu tiên của mảng hai chiều sẽ được gán giá trị trước, sau đó  
đến các phần tử của dòng thứ hai, … Hãy xem sự khai báo mảng sau:  
int ary[3][4] ={1,2,3,4,5,6,7,8,9,10,11,12};  
Kết quả của phép khai báo trên sẽ như sau:  
ary[0][0] = 1  
ary[1][0] = 5  
ary[2][0] = 9  
ary[0][1] = 2  
ary[1][1] = 6  
ary[2][1] = 10 ary[2][2] = 11 ary[2][3] = 12  
ary[0][2] = 3  
ary[1][2] = 7  
ary[0][3]= 4  
ary[1][3] = 8  
Chú ý rằng chỉ số thứ 1 chạy từ 0 đến 2 và chỉ số thứ hai chạy tử 0 đến 3. Một điểm cần nhớ là các  
phần tử của mảng sẽ được lưu trữ ở những vị trí kế tiếp nhau trong bộ nhớ. Mảng ary trên có thể  
xem như một mảng của 3 phần tử, mỗi phần tử một mảng của 4 số nguyên, và sẽ xuất hiện như  
sau:  
Dòng 0  
Dòng 1  
Dòng 2  
1
2
3
4
5
6
7
8
9
10  
11  
12  
Thứ tự tự nhiên mà các giá trị khởi tạo được gán có thể thay đổi bằng hình thức nhóm các giá trị khởi  
tạo lại trong các dấu ngoặc nhọn {}. Quan sát sự khởi tạo sau:  
int ary [3][4] ={  
{1, 2, 3},  
{4, 5, 6},  
{7, 8, 9}  
};  
Mảng sẽ được khởi tạo như sau:  
ary[0][0]=1  
ary[1][0]=4  
ary[2][0]=7  
ary[0][1]=2  
ary[1][1]=5  
ary[2][1]=8  
ary[0][2]=3  
ary[1][2]=6  
ary[2][2]=9  
ary[0][3]=0  
ary[1][3]=0  
ary[2][3]=0  
Một phần tử của mảng đa chiều thể được sử dụng như một biến trong C bằng cách dùng các chỉ số  
để xác định phần tử của mảng.  
dụ 11.5:  
/* Chương trình nhập các số vào một mảng hai chiều. */  
#include <stdio.h>  
void main()  
{
int arr[2][3];  
int row, col;  
for(row = 0; row < 2; row++)  
{
for(col = 0; col < 3; col++)  
{
printf(“\nEnter a Number at [%d][%d]: ”, row, col);  
scanf(“%d”, &arr[row][col]);  
8
Lập trình cơ bản C  
}
}
for(row = 0; row < 2; row++)  
{
for(col = 0; col < 3; col++)  
{
printf(“\nThe Number at [%d][%d] is %d”,  
row, col, arr[row][col]);  
}
}
}
Một dụ về kết quả thực thi chương trình trên như sau:  
Enter a Number at [0][0]: 10  
Enter a Number at [0][1]: 100  
Enter a Number at [0][2]: 45  
Enter a Number at [1][0]: 67  
Enter a Number at [1][1]: 45  
Enter a Number at [1][2]: 230  
The Number at [0][0] is 10  
The Number at [0][1] is 100  
The Number at [0][2] is 45  
The Number at [1][0] is 67  
The Number at [1][1] is 45  
The Number at [1][2] is 230  
Mảng hai chiều chuỗi:  
Như chúng ta đã biết ở phần trước, một chuỗi thể được biểu diễn bằng mảng một chiều, kiểu tự.  
Mỗi tự trong chuỗi được lưu trữ trong một phần tử của mảng. Mảng của chuỗi thể được tạo bằng  
cách sử dụng mảng tự hai chiều. Chỉ số bên trái xác định số lượng chuỗi, chỉ số bên phải xác  
định chiều dài tối đa của mỗi chuỗi. dụ bên dưới khai báo một mảng chứa 25 chuỗi mỗi chuỗi có  
độ dài tối đa 80 ký tự kể ctự null.  
char str_ary[25][80];  
dụ minh hoạ cách sử dụng của một mảng hai chiều:  
dụ bên dưới minh hoạ cách dùng của mảng hai chiều như các chuỗi.  
Xét bài toán tổ chức một danh sách tên theo thứ tự bảng chữ cái. Ví dụ sau đây nhập một danh sách  
các tên và sau đó sắp xếp chúng theo thứ tự bảng chữ cái.  
dụ 11.6  
#include <stdio.h>  
#include <string.h>  
#include <conio.h>  
void main()  
{
int i, n = 0;  
int item;  
Mảng  
9
char x[10][12];  
char temp[12];  
clrscr();  
printf(“Enter each string on a separate line \n\n”);  
printf(“Type ‘END’ when over \n\n”);  
/* Read in the list of strings */  
do  
{
printf(“String %d: ”, n + 1);  
scanf(“%s”, x[n]);  
} while (strcmp(x[n++], “END”));  
/*Reorder the list of strings */  
n = n – 1;  
for(item = 0; item < n - 1; ++item)  
{
/* Find lowest of remaining strings */  
for(i = item + 1; i < n; ++i)  
{
if(strcmp(x[item], x[i]) > 0)  
{
/*Interchange two strings*/  
strcpy(temp, x[item]);  
strcpy(x[item], x[i]);  
strcpy(x[i], temp);  
}
}
}
/* Display the arranged list of strings */  
printf(“Recorded list of strings: \n”);  
for(i = 0; i < n; ++i)  
{
printf("\nString %d is %s", i + 1, x[i]);  
}
}
Chương trình trên nhập vào các chuỗi đến khi người dùng nhập vào từ “END”. Khi END được nhập  
vào, chương trình sẽ sắp xếp danh sách các chuỗi và in ra theo thứ tự đã sắp xếp. Chương trình kiểm  
tra hai phần tử kế tiếp nhau. Nếu thứ tự của chúng không thích hợp, thì hai phần tử sẽ được đổi chỗ.  
Sự so sánh hai chuỗi được thực hiện với sự trợ giúp của hàm strcmp() sự đổi chỗ được thực hiện  
với hàmg strcpy().  
Một dụ về kết quả thực thi của chương trình như sau:  
Enter each string on a separate line  
Type ‘END’ when over  
String 1:  
String 2:  
has  
seen  
10  
Lập trình cơ bản C  
String 3:  
String 4:  
String 5:  
alice  
wonderland  
END  
Record list of strings:  
String 1 is alice  
String 2 is has  
String 3 is seen  
String 4 is wonderland  
Mảng  
11  
Tóm tắt bài học  
Một mảng một tập hợp các phần tử dữ liệu có cùng kiểu được tham chiếu bởi cùng một tên.  
Mỗi phần tử của mảng có cùng kiểu dữ liệu, cùng lớp lưu trữ và có cùng các đặc tính.  
Mỗi phần tử được lưu trữ ở vị trí kế tiếp nhau trong bộ nhớ chính. Các phần tử dữ liệu được biết  
như là các phần tử mảng.  
Chiều của mảng được xác định bởi số các chỉ số cần thiết để định danh duy nhất mỗi phần tử.  
Các mảng thể có các kiểu dữ liệu như int, char, float, hoặc double.  
Phần tử của mảng thể được tham chiếu bằng cách sử dụng một biến hoặc một biểu thức số  
nguyên.  
Một mảng không thể được khởi tạo, trừ khi mỗi phần tử được gán một giá trị riêng lẻ.  
Các mảng extern static thể được khởi tạo khi khai báo.  
Mảng hai chiều thể xem như một mảng của các mảng một chiều.  
12  
Lập trình cơ bản C  
Kiểm tra tiến độ học tập  
1. Một ________ là một tập hợp các phần tử dữ liệu cùng kiểu được tham chiếu bởi cùng một tên.  
A. Vòng lặp  
C. Cấu trúc  
B. Mảng  
D. Tất cả đều sai  
2. Mỗi phần tử của mảng được định danh bằng ________ duy nhất hoặc ________ được gán tới nó.  
A. Chỉ mục, Chỉ số  
C. Tất cả đều sai  
B. Miền giá trị, Chỉ số  
3. Một tên mảng một tên biến thể giống nhau  
(Đúng/Sai)  
4. Một phần tử của mảng thể được sử dụng bất kỳ vị trí nào mà một biến được cho phép và yêu  
cầu. (Đúng/Sai)  
5. Hai mảng, ngay cả khi chúng có cùng kiểu và kích thước, không thể được xem là _________.  
A. Điều kiện  
C. Bằng nhau  
B. Sự phủ định  
D. Tất cả đều sai  
6. Một chuỗi được khai báo như một mảng kiểu tự, được kết thúc bởi tự _________.  
A. chấm phẩy  
B. phẩy  
C. NULL  
D. Tất cả đều sai  
7. Các mảng thể nhiều hơn một chiều.  
(Đúng/Sai)  
8. Sự so sánh hai chuỗi được thực hiện với sự giúp đỡ của ________ và sự đổi vị trí được thực hiện  
bằng _________.  
A. strcmp, strcpy  
C. strlen, strcat  
B. strcat, strcpy  
D. Tất cả đều sai  
Mảng  
13  
Bài tập tự làm  
1. Viết một chương trình để sắp xếp các tên sau đây theo thứ tự abc.  
George  
Albert  
Tina  
Xavier  
Roger  
Tim  
William  
2. Viết một chương trình đếm số tự nguyên âm trong một dòng văn bản.  
3. Viết một chương trình nhập các số sau đây vào một mảng đảo ngược mảng  
34  
45  
56  
67  
89  
14  
Lập trình cơ bản C  
doc 14 trang Thùy Anh 14600
Bạn đang xem tài liệu "Giáo trình Lập trình cơ bản C - Bài 11: Mảng", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • docgiao_trinh_lap_trinh_co_ban_c_bai_11_mang.doc