<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>
Lập trình nâng cao - Chương 05 - Ngô Công Thắng 1
<b>Ch</b>
<b>ươ</b>
<b>ng 5. Ki</b>
<b>ể</b>
<b>u m</b>
<b>ả</b>
<b>ng và xâu ký t</b>
<b>ự</b>
I. M
ả
ng
II. Xâu ký t
ự
III. Bài t
ậ
p ch
ươ
ng 5
I. M
ả
ng
1. Khái ni
ệ
m v
ề
ki
ể
u m
ả
ng
2. Khai báo bi
ế
n m
ả
ng m
ộ
t chi
ề
u
3. Truy nh
ậ
p các ph
ầ
n t
ử
c
ủ
a m
ả
ng m
ộ
t chi
ề
u
4. Kh
ở
i t
ạ
o m
ả
ng m
ộ
t chi
ề
u
5. M
ả
ng nhi
ề
u chi
ề
u
</div>
<span class='text_page_counter'>(2)</span><div class='page_container' data-page=2>
Lập trình nâng cao - Chương 05 - Ngơ Công Thắng 3
I.1. Khái ni
ệ
m v
ề
ki
ể
u m
ả
ng
²
M
ả
ng là m
ộ
t nhóm các bi
ế
n n
ằ
m c
ạ
nh nhau
có cùng ki
ể
u, cùng tên. M
ỗ
i bi
ế
n
đượ
c g
ọ
i là
m
ộ
t ph
ầ
n t
ử
. Các ph
ầ
n t
ử
c
ủ
a m
ả
ng
đượ
c truy
nh
ậ
p tr
ự
c ti
ế
p thông qua tên bi
ế
n m
ả
ng và ch
ỉ
s
ố
.
²
S
ố
ph
ầ
n t
ử
c
ủ
a m
ả
ng
đượ
c xác
đị
nh ngay t
ừ
khi
đị
nh ngh
ĩ
a ra m
ả
ng.
Đ
ây là
đ
i
ể
m h
ạ
n ch
ế
c
ủ
a m
ả
ng b
ở
i vì n
ế
u khơng dùng h
ế
t các bi
ế
n
c
ủ
a m
ả
ng s
ẽ
gây lãng phí b
ộ
nh
ớ
.
I.2. Khai báo bi
ế
n m
ả
ng m
ộ
t chi
ề
u
² Khai báo biến mảng là xác định tên biến mảng, kiểu
phần tử, số chiều và kích thước mỗi chiều.
² Cú pháp khai báo biến mảng một chiều:
Kiểu_phần_tử Tên_biến_mảng[Kích thước];
trong đó kích thước là số phần tử của mảng, phải cho dưới
dạng hằng hoặc biểu thức hằng. Kiểu phần tử có thể là bất kỳ
kiểu nào.
<i>Ví dụ:</i> int a[5];
</div>
<span class='text_page_counter'>(3)</span><div class='page_container' data-page=3>
Lập trình nâng cao - Chương 05 - Ngô Công Thắng 5
I.3. Truy nh
ậ
p các ph
ầ
n t
ử
c
ủ
a m
ả
ng m
ộ
t chi
ề
u
²
Các ph
ầ
n t
ử
c
ủ
a m
ả
ng
đượ
c
đ
ánh s
ố
. Các s
ố
này g
ọ
i là ch
ỉ
s
ố
. Ph
ầ
n t
ử đầ
u tiên có ch
ỉ
s
ố
là
0, ph
ầ
n t
ử
th
ứ
2 có ch
ỉ
s
ố
là 1,… M
ả
ng có
kích th
ướ
c n thì ph
ầ
n t
ử
cu
ố
i cùng có ch
ỉ
s
ố
n-1.
²
<i>Ví d</i>
<i>ụ</i>
<i>:</i>
n
ế
u ta
đị
nh ngh
ĩ
a m
ộ
t bi
ế
n m
ả
ng
int a[5];
thì ta
đượ
c m
ộ
t bi
ế
n m
ả
ng tên là a có 5 ph
ầ
n
t
ử
, ph
ầ
n t
ử đầ
u tiên có ch
ỉ
s
ố
là 0, ph
ầ
n t
ử
th
ứ
5 có ch
ỉ
s
ố
là 4.
I.3. Truy nh
ậ
p các ph
ầ
n t
ử
c
ủ
a m
ả
ng m
ộ
t chi
ề
u
²
M
ỗ
i ph
ầ
n t
ử
c
ủ
a m
ả
ng có th
ể
truy nh
ậ
p tr
ự
c
ti
ế
p thông qua tên bi
ế
n m
ả
ng và ch
ỉ
s
ố
c
ủ
a nó
đặ
t trong ngo
ặ
c vng []. Ch
ỉ
s
ố
c
ủ
a ph
ầ
n t
ử
có th
ể
cho d
ướ
i d
ạ
ng h
ằ
ng ho
ặ
c bi
ể
u th
ứ
c.
Tên bi
ế
n m
ả
ng[Ch
ỉ
s
ố
]
²
<i>Ví d</i>
<i>ụ</i>
<i>:</i>
5 ph
ầ
n t
ử
c
ủ
a m
ả
ng a
ở
ví d
ụ
trên có
tên là a[0], a[1],… Ta có th
ể
dùng các l
ệ
nh
sau:
</div>
<span class='text_page_counter'>(4)</span><div class='page_container' data-page=4>
Lập trình nâng cao - Chương 05 - Ngô Công Thắng 7
I.4. Kh
ở
i t
ạ
o m
ả
ng m
ộ
t chi
ề
u
²
Ta có th
ể
kh
ở
i t
ạ
o giá tr
ị
cho các ph
ầ
n t
ử
c
ủ
a
m
ả
ng ngay khi khai báo b
ằ
ng cách li
ệ
t kê các
giá tr
ị
kh
ở
i t
ạ
o
đặ
t trong ngo
ặ
c {}.
²
<i>Ví d</i>
<i>ụ</i>
<i>:</i>
Các giá trị khởi tạo
Kích thước mảng
int a[5] = {12, 6, 10, 7, 19};
Dấu chấm phẩy
I.4. Kh
ở
i t
ạ
o m
ả
ng m
ộ
t chi
ề
u (ti
ế
p)
² Nếu số giá trị khởi tạo ít hơn kích thước mảng thì
các phần tử cịn lại sẽ được khởi tạo bằng 0. Nếu số
giá trị khởi tạo lớn hơn kích thước mảng thì trình
biên dịch sẽ báo lỗi.
<i>Ví dụ:</i> int a[3] = {6,8}; //a[0]=6, a[1]=8, a[2]=0
int a[2] = {8, 6, 9}; //Báo lỗi
² Với những mảng được khởi tạo có thể khơng cần
xác định kích thước mảng. Khi đó trình biên dịch sẽ
đếm số giá trị khởi tạo và dùng số đó làm kích
thước mảng. <i>Ví dụ:</i>
</div>
<span class='text_page_counter'>(5)</span><div class='page_container' data-page=5>
Lập trình nâng cao - Chương 05 - Ngơ Cơng Thắng 9
I.5. M
ả
ng nhi
ề
u chi
ề
u
² Mảng một chiều là mảng mà các phần tử của nó được
truy nhập qua một chỉ số. Mảng nhiều chiều là mảng
mà các phần tử được truy nhập qua nhiều chỉ số.
² C cho phép khai báo các mảng nhiều chiều với kích
thước mỗi chiều có thể khác nhau. Cú pháp chung như
sau:
Kiểu Tên_biến_mảng[Kích thước chiều 1][Kích thước chiều 2]…;
² Ví dụ:
int a[4][3];
Lưu ý là mỗi chiều phải được bao bởi cặp ngoặc []
I.5. M
ả
ng nhi
ề
u chi
ề
u (ti
ế
p)
² Để truy nhập phần tử của mảng m chiều thì ta phải
dùng m chỉ số. Chỉ số của mỗi chiều có giá trị từ 0 đến
kích thước của chiều đó trừ đi 1. Cú pháp chung như
sau:
Tên_biến_mảng[chỉsố chiều 1][Chỉsố chiều 2]…
² Mảng 2 chiều có thể xem như là mảng một chiều có
các phần tử là một mảng một chiều.
² Ta cũng có thể khởi tạo giá trị cho các phần tử của
mảng nhiều chiều ngay khi định nghĩa. Ví dụ:
</div>
<span class='text_page_counter'>(6)</span><div class='page_container' data-page=6>
Lập trình nâng cao - Chương 05 - Ngô Công Thắng 11
I.6. Chú ý v
ề
ch
ỉ
s
ố
c
ủ
a ph
ầ
n t
ử
m
ả
ng
²
Trình biên d
ị
ch C s
ẽ
không báo l
ỗ
i khi ch
ỉ
s
ố
dùng
để
truy nh
ậ
p ph
ầ
n t
ử
c
ủ
a m
ả
ng n
ằ
m
ngoài kho
ả
ng cho phép, t
ứ
c là nh
ỏ
h
ơ
n 0
ho
ặ
c l
ớ
n h
ơ
n kích th
ướ
c m
ả
ng tr
ừ
1.
Đ
i
ề
u
này r
ấ
t nguy hi
ể
m b
ở
i vì n
ế
u ta ghi d
ữ
li
ệ
u
vào ph
ầ
n t
ử
m
ả
ng v
ớ
i ch
ỉ
s
ố
n
ằ
m ngoài
kho
ả
ng cho phép thì có th
ể
ghi
đ
è lên d
ữ
li
ệ
u
c
ủ
a các ch
ươ
ng trình khác
đ
ang ch
ạ
y ho
ặ
c
chính ch
ươ
ng trình c
ủ
a ta.
I.7. Vào/ra v
ớ
i bi
ế
n m
ả
ng
²
Không dùng
đượ
c l
ệ
nh printf và scanf
v
ớ
i c
ả
bi
ế
n m
ả
ng, ch
ỉ
dùng
đượ
c v
ớ
i
t
ừ
ng ph
ầ
n t
ử
c
ủ
a m
ả
ng. Ví d
ụ
:
int a[5],i;
for(i=0;i<5;++i)
{printf("Nhap vao phan tu thu %d: ”, i+1);
scanf(“%d”,&a[i]);
}
</div>
<span class='text_page_counter'>(7)</span><div class='page_container' data-page=7>
Lập trình nâng cao - Chương 05 - Ngô Công Thắng 13
Bài t
ậ
p
1.
Cho dãy s
ố
nguyên a
<sub>1</sub>
, a
<sub>2</sub>
, a
<sub>3</sub>
,…, a
<sub>n</sub>
. Tính
t
ổ
ng và TBC c
ủ
a dãy s
ố
.
2.
Cho ma tr
ậ
n ngun có m hàng, n c
ộ
t. Tìm
ph
ầ
n t
ử
l
ớ
n nh
ấ
t c
ủ
a t
ừ
ng hàng và
đổ
i ch
ỗ
v
ề đầ
u hàng. Ma tr
ậ
n
đọ
c vào t
ừ
t
ệ
p v
ă
n
b
ả
n.
BTVN
1.
Cho dãy s
ố
nguyên a
<sub>1</sub>
, a
<sub>2</sub>
, a
<sub>3</sub>
,…, a
<sub>n</sub>
. S
ắ
p x
ế
p
dãy s
ố
t
ă
ng d
ầ
n t
ừ
trái qua ph
ả
i.
2.
Cho dãy s
ố
nguyên a
<sub>1</sub>
, a
<sub>2</sub>
, a
<sub>3</sub>
,…, a
<sub>n</sub>
. Tính
t
ổ
ng và trung bình c
ộ
ng các s
ố
d
ươ
ng mà
chia h
ế
t cho 3.
3.
Cho ma tr
ậ
n nguyên có m hàng, n c
ộ
t. Tính
</div>
<span class='text_page_counter'>(8)</span><div class='page_container' data-page=8>
Lập trình nâng cao - Chương 05 - Ngô Công Thắng 15
II. Xâu ký t
ự
1. Khái ni
ệ
m v
ề
ki
ể
u xâu ký t
ự
2. Khai báo bi
ế
n xâu ký t
ự
3. Kh
ở
i t
ạ
o bi
ế
n xâu ký t
ự
4. Vào/ra v
ớ
i bi
ế
n xâu
5. Các hàm chu
ẩ
n x
ử
lý xâu ký t
ự
6. M
ả
ng xâu ký t
ự
II.1. Khái ni
ệ
m v
ề
ki
ể
u xâu ký t
ự
²
Xâu ký t
ự
là m
ộ
t dãy ký t
ự
có ký t
ự
cu
ố
i
cùng là ký t
ự
r
ỗ
ng. Ký t
ự
r
ỗ
ng có giá tr
ị
s
ố
là
0 và vi
ế
t là '\0'.
</div>
<span class='text_page_counter'>(9)</span><div class='page_container' data-page=9>
Lập trình nâng cao - Chương 05 - Ngô Công Thắng 17
II.2. Khai báo bi
ế
n xâu ký t
ự
² Khai báo biến xâu ký tự là xác định tên biến xâu và
số ký tự cực đại có thể chứa trong biến xâu.
² Cú pháp khai báo biến xâu ký tự giống cú pháp khai
báo biến mảng một chiều:
char Tên_biến_xâu[Kích thước];
Ví dụ:
char s[16];
trong đó Kích thước là số ơ nhớ của biến xâu, phải
là hằng hoặc biểu thức hằng.
² Biến xâu có thể chứa các xâu ký tự có độ dài khác
nhau nhưng khơng vượt q Kích thước - 1.
II.3. Kh
ở
i t
ạ
o bi
ế
n xâu
²
Khi
đị
nh ngh
ĩ
a bi
ế
n xâu ta có th
ể
kh
ở
i t
ạ
o
cho nó. D
ướ
i
đ
ây là 2 cách kh
ở
i t
ạ
o:
n Khởi tạo như biến mảng:
char str[6] = {'D', 'H', 'N', 'N', 'I', '\0'};
n Khởi tạo bằng hằng xâu:
char str[6] = "DHNNI";
</div>
<span class='text_page_counter'>(10)</span><div class='page_container' data-page=10>
Lập trình nâng cao - Chương 05 - Ngô Công Thắng 19
II.3. Kh
ở
i t
ạ
o bi
ế
n xâu (ti
ế
p)
² Lưu ý là khi khởi tạo cho biến xâu bằng hằng xâu
thì số ký tự cực đại của biến xâu phải lớn hơn số ký
tự của hằng xâu ít nhất là 1, bởi vì trình biên dịch sẽ
đưa thêm vào biến xâu một ký tự rỗng. Ví dụ:
char str[5] = "DHNNI"; //Sai
char str[6] = "DHNNI"; //Đúng
² Cũng giống như biến mảng, khi khởi tạo cho biến
xâu thì có thể khơng cần xác định số ký tự cực đại,
khi đó trình biên dịch sẽ xác định số ký tự cực đại
bằng số ký tự của hằng xâu cộng thêm 1. Ví dụ:
char str[] = "DHNNI";
II.4. Vào/ra v
ớ
i bi
ế
n xâu
² Có thể dùng lệnh printf và scanf với cả biến xâu.
Ví dụ:
char xau[11];
printf(“%s”,xau); scanf(“%s”,xau);
² scanf chỉ nhập vào được các xâu ký tự khơng có
dấu cách.
² Sử dụng fgets(stdin, Biến xâu, sizeof(Biến xâu)) để
nhập vào xâu ký tự có cả dấu cách. Ví dụ:
fgets(xau, sizeof(xau), stdin);
</div>
<span class='text_page_counter'>(11)</span><div class='page_container' data-page=11>
Lập trình nâng cao - Chương 05 - Ngô Công Thắng 21
II.5. Các hàm chu
ẩ
n x
ử
lý xâu ký t
ự
²
C có m
ộ
t th
ư
vi
ệ
n hàm làm vi
ệ
c v
ớ
i xâu ký
t
ự
là string.lib. Mu
ố
n s
ử
d
ụ
ng các hàm này ta
ph
ả
i khai báo s
ử
d
ụ
ng:
#include<string.h>
²
Hàm l
ấ
y
độ
dài c
ủ
a xâu: strlen(s) cho
độ
dài
c
ủ
a xâu s (khơng tính ký t
ự
'\0'). Ví d
ụ
:
strlen(“08T1A”) => 5
²
Hàm copy xâu: strcpy(s1, s2) copy xâu s2
vào bi
ế
n xâu s1, s2 có th
ể
là h
ằ
ng xâu ho
ặ
c
bi
ế
n xâu.
II.5. Các hàm chu
ẩ
n x
ử
lý xâu ký t
ự
(ti
ế
p)
² Hàm nối xâu: strcat(s1,s2) nối xâu s2 vào cuối biến
xâu s1, s2 có thể là hằng xâu hoặc biến xâu, biến
xâu s1 phải có số ký tự cực đại đủ chứa các ký tự s2
khi thêm vào.
² Hàm so sánh xâu: strcmp(s1,s2) so sánh hai xâu s1
và s2 theo mã ASCII, có phân biệt chữ hoa chữ
thường (không phân biệt dùng hàm stricmp(s1,s2)).
Hàm trả về một giá trị int:
</div>
<span class='text_page_counter'>(12)</span><div class='page_container' data-page=12>
Lập trình nâng cao - Chương 05 - Ngô Công Thắng 23
II.5. Các hàm chu
ẩ
n x
ử
lý xâu ký t
ự
(ti
ế
p)
²
Hàm
đả
o xâu: strrev(s)
đả
o ng
ượ
c các ký t
ự
trong xâu s,
đầ
u v
ề
cu
ố
i, cu
ố
i v
ề đầ
u.
²
Hàm chuy
ể
n ch
ữ
th
ườ
ng thành ch
ữ
hoa:
strupr(s) chuy
ể
n các ch
ữ
cái th
ườ
ng trong
xâu s thành ch
ữ
hoa, các ch
ữ
khác không
thay
đổ
i.
²
Hàm chuy
ể
n ch
ữ
hoa thành ch
ữ
th
ườ
ng:
strlwr(s) chuy
ể
n các ch
ữ
cái hoa trong xâu s
thành ch
ữ
th
ườ
ng, các ch
ữ
khác không thay
đổ
i.
II.6. M
ả
ng xâu ký t
ự
² Một mảng xâu ký tự rất hay được sử dụng, chẳng
hạn như dùng để lưu trữ danh sách tên, danh sách
mật khẩu, danh sách tên tệp,…
² Để tạo mảng các biến xâu rỗng ta tạo một mảng hai
chiều bởi vì xâu ký tự cũng là một mảng và mảng
xâu ký tự thực chất là mảng của các mảng.
² Ví dụ: để lưu trữ 5 họ tên, mỗi họ tên có tối đa 20
ký tự ta định nghĩa mảng xâu như sau:
</div>
<span class='text_page_counter'>(13)</span><div class='page_container' data-page=13>
Lập trình nâng cao - Chương 05 - Ngô Công Thắng 25
II.6. M
ả
ng xâu ký t
ự
(ti
ế
p)
for(i=0;i<5;++i)
{
printf("Nhap vao mot ho ten (an enter de thoat): “);
fgets(stdin,names[i],sizeof(names[i]));
if(strlen(names[i])==0)
break;
}
II.6. M
ả
ng xâu ký t
ự
(ti
ế
p)
²
Ta c
ũ
ng có th
ể
kh
ở
i t
ạ
o m
ả
ng xâu ngay khi
đị
nh ngh
ĩ
a gi
ố
ng nh
ư
các m
ả
ng khác. Ví d
ụ
:
char Thu[7][10] =
</div>
<span class='text_page_counter'>(14)</span><div class='page_container' data-page=14>
Bài t
ậ
p
1.
Nh
ậ
p vào m
ộ
t h
ọ
tên,
đư
a h
ọ
tên ra màn
hình
ở
d
ạ
ng ch
ữ
hoa. Ví d
ụ
: nguyen tuan
anh =>
đư
a ra NGUEN TUAN ANH. Cho
bi
ế
t h
ọ
tên có bao nhiêu ký t
ự
.
2.
BTVN 4: Nh
ậ
p vào m
ộ
t h
ọ
tên. Chu
ẩ
n hóa
h
ọ
tên theo các yêu c
ầ
u sau: (1)
Đầ
u và cu
ố
i
h
ọ
tên khơng có d
ấ
u cách; (2) Gi
ữ
a các t
ừ
ch
ỉ
có m
ộ
t d
ấ
u cách; (3) Các ch
ữ đầ
u tiên
c
ủ
a t
ừ
là ch
ữ
hoa, các ch
ữ
cịn l
ạ
i là ch
ữ
th
ườ
ng.
Lập trình nâng cao - Chương 05 - Ngô Công Thắng 27
Bài t
ậ
p
3. Nh
ậ
p vào m
ộ
t danh sách n tên (ch
ỉ
tên,
không h
ọ đệ
m). S
ắ
p x
ế
p danh sách tên theo v
ầ
n
ABC.
4. BTVN5: Nh
ậ
p vào m
ộ
t s
ố
nguyên d
ươ
ng.
Đư
a ra xâu ký t
ự
s
ố
nh
ị
phân t
ươ
ng
ứ
ng.
5. BTVN6: Nh
ậ
p vào m
ộ
t s
ố
nguyên d
ươ
ng có
giá tr
ị
>= 100.
Đư
a ra xâu ký t
ự
s
ố
hex t
ươ
ng
</div>
<span class='text_page_counter'>(15)</span><div class='page_container' data-page=15>
Lập trình nâng cao - Chương 05 - Ngô Công Thắng 29
Bài t
ậ
p ch
ươ
ng 5
² Bài 1. Viết chương trình nhập vào một dãy n số
nguyên, hãy sắp xếp dãy số này theo thứ tự không
giảm bằng phương pháp sắp xếp chọn.
² Bài 2. Hình vng kỳ ảo bậc n được định nghĩa là
một ma trận vuông cấp n sao cho:
n Chứađủ n2 số tự nhiênđầu tiên (1, 2, 3,…, n2)
n Tổng các số trên từng hàng bằng tổng các số trên từng cột
bằng tổng các số trên đường chéo chính bằng tổng các số
trên đường chéo phụ.
Viết chương trình nhập vào số tự nhiên lẻ n, đưa ra
màn hình một hình vng kỳ ảo bậc n lẻ đó.
Bài t
ậ
p ch
ươ
ng 6 (ti
ế
p)
Ví d
ụ
d
ướ
i
đ
ây là 2 hình vng k
ỳ ả
o b
ậ
c 3
và b
ậ
c 5:
8 1 6
3 5 7
4 9 2
</div>
<span class='text_page_counter'>(16)</span><div class='page_container' data-page=16>
Lập trình nâng cao - Chương 05 - Ngô Công Thắng 31
Bài t
ậ
p ch
ươ
ng (ti
ế
p)
² Bài 3. Viết chương trình nhập vào một số tự nhiên
n, đưa ra màn hình xâu ký tự số nhị phân tương ứng.
</div>
<!--links-->