Bài 11: Mảng [Lý Thuyết]
Mục tiêu:
Kết thúc bài học này, bạn có 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 lý 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/ ký 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:
Có 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à 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 là 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 là 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ố là 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ố là N-1. Phạm vi cho phép của các giá trị chỉ số
được gọi là miền giới hạn của chỉ số mảng, giới hạn dưới và
giới hạn trên. Một chỉ số mảng hợp lệ phải có 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 mã 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ố là nằm trong miền giới hạn hợp lệ.
Ø Khai báo một mảng:
Một mảng có một vài đặc tính riêng biệt và 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ộ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 là một biểu thức xác
định số phần tử trong mảng và phải định ra một trị nguyên dương. Lớp_lưu_trữ là 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, và 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ẽ là từ 0 đến 10.
Các qui tắc đặt tên mảng là giống với qui tắc đặt tên biến.
Một tên mảng và 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ử có kiểu khác.
·
Mỗi
phần tử của mảng có 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 có 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 là
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 có thể là int, char, float, hoặc double.
11.2 Việc quản lý 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ỉ có 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 có thể có 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];
Cấu trúc for là cách lý tưởng để thao tác các
mảng.
Ví dụ 11.1:
/* Program demonstrates a single dimensional array */
#include <stdio.h>
#include <conio.h>
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++)
printf("\n Number at [%d] is %d", i, num[i]);
getch();
}
Kết quả của chương trình:
Ví 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.
Ví dụ 11.2:
/*Input values are accepted from the user into the array ary[10]*/
#include <stdio.h>
#include <conio.h>
main()
{
int ary[10];
int i, total, high;
for (i = 0; i < 10; i++)
{
printf("Enter 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++)
total = total + ary[i];
printf("\nThe average of the element of
ary is %d", total/i);
getch();
}
Một ví dụ về kết quả:
Ø 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 mã 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 có 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 có thể được sử dụng để khởi
tạo một mảng các ký tự như sau:
Ví dụ 11.3:
#include
<stdio.h>
#include <conio.h>
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]);
}
getch ();
}
Kết quả của chương trình:
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 có 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.
Ví 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ể là 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 là 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. Ví 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 có thể được khai báo như là một mảng ký
tự, và được kết thúc bởi một ký tự NULL. Mỗi ký
tự của chuỗi chiếm 1 byte, và ký tự cuối cùng của chuỗi luôn luôn là ký tự ‘\0’. Ký tư ‘\0’ được gọi là ký tự null. Nó là một mã thoát (escape sequence)
tương tự như ‘\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 ký tự phải có nhiều hơn một
ký 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
lý 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ữ ký tự null. Nên nhớ rằng ký tự kết thúc (ký tự null) là
rất quan trọng.
Các giá trị chuỗi có 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 mà lần
lượt các ký tự của mảng sẽ được lưu trữ.
Ví dụ 11.4:
#include <stdio.h>
#include <conio.h>
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]);
getch();
}
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 là appl, kết
quả sẽ là:
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 rõ với mã ASCII cho các ký tự được in ra ở dòng thứ
hai. Ký tự thứ năm được in là 0, là giá trị của ký tự null.
Nếu chuỗi nhập vào là apple, kết quả sẽ là:
Kết quả ở trên của là 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 rõ 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à:
Trong ví dụ trên, khi chỉ có hai ký tự được nhập, ký 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 ký tự còn lại
là những ký tự không dự đoán được.
Trong trường hợp trên, tính quan trọng của ký 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 là đ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 là 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ư:
“Hi Dientumaytinh!”
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
|
Chức năng
|
strcpy(s1, s2)
|
Sao chép chuỗi s2 vào s1
|
strcat(s1, s2)
|
Nối chuỗi s2 vào cuối chuỗi
của s1
|
strlen(s1)
|
Trả về chiều dài của chuỗi s1
|
strcmp(s1, s2)
|
Trả về 0 nếu s1 và s2 là 2
chuỗi giống nhau; nhỏ hơn 0 nếu s1<s2; lớn hơn 0 nếu s1> s2 (theo thứ
tự mã ASCII)
|
strchr(s1, ch)
|
Trả về một con trỏ trỏ đến
vị trí xuất hiện đầu tiên của ch trong s1
|
strstr(s1, s2)
|
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ỉ có một chỉ số. Các mảng có thể có 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 và 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
có thể được biểu diễn như sau:
storage_class data_type ary[exp1][exp2]....[expN];
Ở đó, ary là một mảng có lớp là storage_class,
kiểu dữ liệu là 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 và thường được sử dụng nhất của các mảng đa
chiều là mảng hai chiều. Một mảng hai chiều có thể xem như là 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 và cột của nó. Một mảng hai
chiều tmp có kiểu int với 2 dòng và 3 cột có
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:
Ở đó 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];
Ø Khởi tạo mảng đa chiều:
Khai báo mảng đa chiều có 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ỉ có mảng external và static có
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[0][1] = 2 ary[0][2]
= 3 ary[0][3]= 4
ary[1][0] = 5 ary[1][1] = 6 ary[1][2] = 7
ary[1][3] = 8
ary[2][0] = 9 ary[2][1] = 10 ary[2][2] = 11
ary[2][3] = 12
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ư
là một mảng của 3 phần tử, mỗi phần tử là 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[0][1]=2
ary[0][2]=3
ary[0][3]=0
ary[1][0]=4 ary[1][1]=5
ary[1][2]=6
ary[1][3]=0
ary[2][0]=7 ary[2][1]=8
ary[2][2]=9
ary[2][3]=0
Một phần tử của mảng đa chiều có 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.
Ví dụ 11.5:
/* Chương trình nhập các số vào một mảng hai chiều. */
#include <stdio.h>
#include <conio.h>
main()
{
int arr[2][3];
int row, col;
for(row = 0; row < 2; row++)
{
for(col = 0; col < 3; col++)
{
printf("Enter a Number at [%d][%d]: ", row, col);
scanf("%d", &arr[row][col]);
}
}
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]);
}
}
getch();
}
Một ví dụ về kết quả thực thi chương trình:
Ø Mảng hai chiều và chuỗi:
Như chúng ta đã biết ở phần trước, một chuỗi có thể được biểu diễn
bằng mảng một chiều, kiểu ký tự. Mỗi ký tự trong chuỗi được lưu trữ trong một
phần tử của mảng. Mảng của chuỗi có thể
được tạo bằng cách sử dụng mảng ký tự hai chiều. Chỉ số bên trái xác định
số lượng chuỗi, và chỉ số bên phải xác định chiều dài tối đa của mỗi chuỗi. Ví
dụ bên dưới khai báo một mảng chứa 25 chuỗi và mỗi chuỗi có độ dài tối đa 80 ký
tự kể cả ký tự null.
char str_ary[25][80];
Ø Ví dụ minh hoạ cách sử dụng của một mảng
hai chiều:
Ví 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.
Ví dụ 11.6
#include <stdio.h>
#include <string.h>
#include <conio.h>
main()
{
int
i, n = 0;
int
item;
char x[10][12];
char temp[12];
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]);
}
getch();
}
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() và
sự đổi chỗ được thực hiện với hàmg strcpy().
Một ví dụ về kết quả thực thi của chương trình:
Tóm tắt bài học
Ø Một mảng là 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 có thể có các kiểu dữ liệu như int, char, float,
hoặc double.
Ø Phần tử của mảng có 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 và static có
thể được khởi tạo khi khai báo.
Ø Mảng hai chiều có thể xem như là một mảng
của các mảng một chiều.
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 và được tham chiếu bởi cùng một tên.
A. Vòng
lặp
B. Mảng
C. Cấu
trúc
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ố
B. Miền giá trị, Chỉ số
C. Tất cả đều sai
3. Một tên mảng và
một tên biến có thể giống
nhau (Đúng/Sai)
4. Một phần tử của mảng có 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
B. Sự phủ định
C. Bằng
nhau
D. Tất cả đều sai
6. Một chuỗi được
khai báo như là một mảng kiểu ký tự, được kết thúc bởi ký tự _________.
A. chấm
phẩy
B. phẩy
C.
NULL
D. Tất cả đều sai
7. Các mảng có thể có 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
B. strcat, strcpy
C. strlen,
strcat
D. Tất cả đều sai
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ố
ký 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 và đảo ngược mảng
34
45
56
67
89
hay
Trả lờiXóa