Thuật toán và cấu trúc dữ liệu
Tính kết thúc (tính dừng) Tính xác định Tính phổ dụng Tính hiệu quả • Thực hiện nhanh • Tiêu phí ít tài nguyên máy tính (bộ nhớ)
Bạn đang xem nội dung tài liệu Thuật toán và cấu trúc dữ liệu, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
0KỸ THUẬT LẬP TRÌNH
THUẬT TOÁN
VÀ CẤU TRÚC DỮ LIỆU
1
NỘI DUNG
Thuật toán
Kiểu dữ liệu và cấu trúc dữ liệu
Mối liên hệ giữa thuật toán và cấu trúc dữ liệu
Kiểu con trỏ trong C
Sử dụng kiểu array trong C
Kiểu xâu kí tự trong C
Sử dụng struct trong C
2
KHÁI NIỆM THUẬT TOÁN
Thuật toán (giải thuật) là một quy tắc để với những dữ
liệu ban đầu đã cho, tìm được lời giải sau một khoảng
thời gian hữu hạn
Bài toán
Thuật toán
Máy tính Dữ liệu vào Kết quả ra
3
Tính kết thúc (tính dừng)
Tính xác định
Tính phổ dụng
Tính hiệu quả
• Thực hiện nhanh
• Tiêu phí ít tài nguyên máy tính (bộ nhớ)
CÁC ĐẶC TRƯNG CỦA THUẬT TOÁN
4CÁC ĐẶC TRƯNG CỦA THUẬT TOÁN
Thuật toán tìm UCLN của hai số nguyên dương
1. Nhập vào hai số nguyên dương a, b
2. So sánh hai số, chọn số nhỏ nhất gắn cho UCLN
3. Nếu một trong hai số a, b không chia hết cho UCLN thì thực
hiện bước 4, ngược lại thì thực hiện bước 5
4. Giảm UCLN một đơn vị và quay lại bước 3
5. In UCLN. Kết thúc
? Các đặc trưng của thuật toán trên
5
TIÊU CHUẨN ĐÁNH GIÁ THUẬT TOÁN
Lựa chọn thuật toán nào cho bài toán?
Tiêu chuẩn 1: Thuật toán đơn giản, dễ hiểu, dễ cài đặt
Tiêu chuẩn 2: Thuật toán sử dụng tiết kiệm tài nguyên
máy tính (dung lượng không gian nhớ, thời gian)
6
NGÔN NGỮ THUẬT TOÁN
Ngôn ngữ dùng để mô tả thuật toán
? Tại sao phải dùng ngôn ngữ diễn đạt thuật toán
? Đặc điểm của ngôn ngữ diễn đạt thuật toán
• Ngôn ngữ liệt kê từng bước (Ngôn ngữ tự nhiên)
• Sơ đồ khối
• Ngôn ngữ “giả code”: Tựa Pascal, tựa C, …
– Các bước trong chương trình nên được đánh số thứ tự
– Có thể bỏ qua phần khai báo dữ liệu, thay vào đó là đặc tả cấu trúc dữ liệu
trước khi viết giải thuật
Mô tả thuật toán
• Thuật toán:
• Vào (Input):
• Ra (Output):
7
NGÔN NGỮ THUẬT TOÁN
Ngôn ngữ liệt kê từng bước
• Thuật toán: Euclid
• Vào: m,n nguyên dương (m > n)
• Ra: gcd là ước chung lớn nhất của m và n
r: số nguyên dương
Bước 1. Nhập vào m, n
Bước 2. Nếu m, n >0 thì chuyển sang bước 3, ngược lại thì thông báo
“Dữ liệu vào không hợp lệ” và kết thúc thuật toán
Bước 3. Nếu m > n thì chuyển sang bước 4. Ngược lại, hoán chuyển
giá trị của m, n
Bước 4. Nếu n = 0 thì gcd = m, in giá trị của gcd và kết thúc. Ngược lại,
chuyển sang bước 5.
Bước 5. Tính r là phần dư của phép chia m cho n
Bước 6. Gán giá trị của n cho m và của r cho n. Quay lại bước 4.
8NGÔN NGỮ THUẬT TOÁN
Sơ đồ khối
Điều kiện
Lệnh Nút thao tác
Chỉ hướng truyền thông tin
Nút điều kiện
Nút bắt đấu, nút kết thúc
9
NGÔN NGỮ THUẬT TOÁN
Thuật toán Euclid
Sai
Sai
Đúng
Đúng
Bắt đầu
Nhập m, n
m, n >0
m >= n
n = 0
gcd = m
In gcd
r = m mod n
m = n
n = r
r = m
m = n
n = r
Kết thúc
Thông báo
Dữ liệu vào
không hợp lệ
Sai Đúng
10
NGÔN NGỮ THUẬT TOÁN
Ngôn ngữ Tựa Pascal
• Khai báo: Program
Begin …….
End.
• Chú thích {….}
• Phép toán số học: +, - *, /, ↑(luỹ thừa)
• Phép toán so sánh: >, >=, <, <=, =, ≠
• Giá trị logic: true, false
• Phép toán logic: and, or, not
11
NGÔN NGỮ THUẬT TOÁN
Các câu lệnh
• Câu lệnh gán V := E;
– V: biến, E: biểu thức
– Phép gán chung: V1 := V2 := E;
• Câu lệnh điều kiện if B then S1 [else S2];
• Câu lệnh tuyển Case
B1: S1;
B2: S2;
….
Bn: Sn;
else Sn+1
end case;
12
NGÔN NGỮ THUẬT TOÁN
• Câu lệnh lặp
– Số lần lặp biết trước for i := m to n do ….
for i := n down to m do….
– Số lần lặp không biết trước while B do S;
repeat S until B;
(B: biểu thức logic; S: dãy lệnh)
• Câu lệnh chuyển
go to n; (n:số hiệu của một bước trong chương trình)
• Câu lệnh vào ra
read();
write()
13
NGÔN NGỮ THUẬT TOÁN
• Chương trình con
– Hàm
function ():
S
return
– Thủ tục Procedure: không có kết quả ra
– Sử dụng Var đặt trước tham số cần giữ lại sự thay đổi giá trị sau
khi kết thúc thực hiện hàm/thủ tục
– Lời gọi Hàm Tên_hàm()
– Lời gọi thủ tục Call ()
14
ĐỘ PHỨC TẠP THUẬT TOÁN
Giải thuật nào hiệu quả nhất cho một bài toán?
• Độ phức tạp thời gian
• Độ phức tạp không gian
? Đánh giá giải thuật khi chạy chương trình ???
Các yếu tố ảnh hưởng đến thời gian thực hiện thuật toán
• Môi trường phần cứng: tốc độ xử lý, bộ nhớ,…
• Môi trường phần mềm: kiểu lệnh, ngôn ngữ, trình biên dịch
• Kích thước dữ liệu vào
Đánh giá độ phức tạp thời gian T(n) bằng tổng số phép
tính cần phải thực hiện.
15
Độ tăng của hàm
• Cho hai hàm f(x), g(x) xác định từ tập các số nguyên dương hoặc tập
số thực vào tập số thực. Ta nói f(x) là O(g(x)) nếu tồn tại hai hằng số
C và k sao cho: |f(x)| ≤ C.|g(x)|, với mọi x > k.
Ví dụ 1
• f(x) = an xn +…. +a0, với ai là các số thực. Khi đó f(x) = O(xn).
• với x > 1 ta có
• Đặt C = |an| + |an−1| + … + |a0| và k = 1, suy ra f(x) = O(xn).
Ví dụ 2.
• f(x) = 1+ 2+ 3 + … + n = n(n+1)/2 nên là O(n2).
ĐỘ PHỨC TẠP THUẬT TOÁN
)....(
...(
...)(
01
01
0
1
1
aaax
x
a
x
a
ax
axaxaxf
nn
n
n
n
n
n
n
n
n
n
+++≤
+++≤
+++≤
−
−
−
−
16
ĐỘ PHỨC TẠP THUẬT TOÁN
Các thuật ngữ thường dùng
• Độ phức tạp O(1) gọi là độ phức tạp hằng số
• Độ phức tạp O(log(n)) gọi là độ phức tạp logarit
• Độ phức tạp O(n) gọi là độ phức tạp tuyến tính
• Độ phức tạp O(nlogn) gọi là độ phức tạp nlogn
• Độ phức tạp O(nk) gọi là độ phức tạp đa thức
• Độ phức tạp O(bn) , b>1, gọi là độ phức tạp hàm mũ
• Độ phức tạp O(n!) gọi là độ phức tạp giai thừa
17
ĐỘ PHỨC TẠP THUẬT TOÁN
Ví dụ 1
K:=0;
For i:=1 to n do
Begin
K:=K+i;
End;
Ví dụ 2
K:=0;
For i:=1 to n do
For j:= 1 to n do
Begin
K := K + i * j ;
End;
18
ĐỘ PHỨC TẠP THUẬT TOÁN
Ví dụ 3
i :=1; K:=0;
while i <= n do
begin
K:= K+ i*i;
i := i * 2;
end;
Số phép toán cần thực hiện:
(1 so sánh + 2 nhân + 1 cộng) * (1 + |log2n|) = 4 + 4 |log2n| là
O(log2n).
19
Ví dụ 4
Searching(A[]: array of integer, n: integer, integer K): Boolean
Begin
i := 1; found := false;
while (i <=n and !found) do
begin
if A[i] = K then found:=true;
else i := i+1;
end;
return found;
end;
ĐỘ PHỨC TẠP THUẬT TOÁN
20
ĐỘ PHỨC TẠP THUẬT TOÁN
Độ phức tạp xấu nhất
Độ phức tạp trường hợp tốt nhất
Độ phức tạp trung bình
21
ĐỘ PHỨC TẠP THUẬT TOÁN
Độ phức tạp trường hợp xấu nhất của A là số lớn nhất
các phép toán cơ bản được thực hiện trong A trên bất
kỳ dữ liệu vào có kích cỡ xác định.
Độ phức tạp trường hợp tốt nhất của A là số bé nhất
các phép toán cơ bản được thực hiện trong A trên bất
kỳ dữ liệu vào có kích cỡ xác định.
Độ phức tạp trung bình của A là giá trị trung bình của
số các phép toán cơ bản được thực hiện trong A trên
bất kỳ dữ liệu vào có kích thước xác định.
22
ĐỘ PHỨC TẠP THUẬT TOÁN
Ví dụ hàm Searching ở trên:
• Độ phức tạp trong trường hợp xấu nhất là O(n)
• Độ phức tạp trong trường hợp tốt nhất là:O(1) khi K chính là
phần tử đầu tiên của mảng.
• Độ phức tạp trung bình là: cỡ n/2 (khoảng ½ các phần tử của
mảng được duyệt). Việc tính toán rất phức tạp dựa vào xác
suất K xuất hiện trong A.
Thường đánh giá thuật toán theo độ phức tạp thời gian
xấu nhất. Hiệu quả sử dụng của thuật toán lại thể hiện
thông qua độ phức tạp trung bình.
23
Kiểu dữ liệu:
• Trong ngôn ngữ bậc cao
• Là sự trừu tượng hóa các thuộc tính bản chất của các đối
tượng trong thực tế và phù hợp với cách tổ chức thông tin trên
máy tính
• Kiểu số nguyên, số thực, kí tự,…
• Kiểu dữ liệu T = , V là tập các giá trị hợp lệ của T và O
là tập các phép toán trên kiểu T.
KIỂU DỮ LIỆU VÀ CẤU TRÚC DỮ LIỆU
24
KIỂU DỮ LIỆU VÀ CẤU TRÚC DỮ LIỆU
Cấu trúc dữ liệu:
• Là các lưu trữ dữ liệu trên máy tính sao cho việc sử dụng
dữ liệu đó được hiệu quả. Đó chính là tổ chức các khái
niệm toán học và logic về dữ liệu.
• Kiểu dữ liệu có cấu trúc được kết hợp nên từ các kiểu dữ liệu
cơ sở
• Ví dụ: Kiểu mảng, xâu kí tự, Bản ghi, File,…
Mối liên hệ giữa cấu trúc dữ liệu và Thuật toán
Chương trình = Cấu trúc dữ liệu + Thuật toán
25
KIỂU DỮ LIỆU VÀ CẤU TRÚC DỮ LIỆU
Mô hình dữ liệu
• Là mô hình toán học, có thể biểu diễn được trên máy tính, để
biểu diễn các đối tượng của bài toán và mối liên hệ giữa các
đối tượng
• Mô hình dữ liệu muốn cài đặt được trên máy tính phải có cách
tổ chức dữ liệu phù hợp.
• Ví dụ: Danh sách, Cây, Đồ thị, Quan hệ,. …
Các tiêu chuẩn chọn cấu trúc dữ liệu
• Phản ánh đúng thực tế: quan trọng nhất, đảm bảo tính đúng
đắn của phương án giải quyết
• Các thao tác phù hợp
• Tiết kiệm tài nguyên hệ thống
26
KIỂU DỮ LIỆU TRONG C
Kiểu dữ liệu cơ sở
• Kí tự (char, unsigned char)
• Số nguyên (int, unsigned int, long (int), unsigned long (int))
• Số thực, độ chính xác đơn (float)
• Số thực, độ chính xác kép (double)
– Lưu ý: Kích thước và phạm vi biểu diễn của các kiểu dữ liệu
Kiểu con trỏ
Kiểu enum
Kiểu mảng (array)
Kiểu cấu trúc (struct)
9 Kiểm tra kích thước của kiểu dữ liệu: dùng toán tử sizeof(), ví
dụ: sizeof(int),…
27
KIỂU CON TRỎ
Biến con trỏ (Pointer)
• Địa chỉ bộ nhớ của biến được gán cho con trỏ là giá trị của
biến con trỏ.
• Biến thông thường chứa giá trị một cụ thể (count = 7).
• Các con trỏ chứa địa chỉ của biến: biến được trỏ chứa giá trị cụ
thể (tham chiếu gián tiếp)
Con trỏ countPtr trỏ đến biến count, giá trị
của biến con trỏ countPtr là địa chỉ của
biến count, giá trị của biến count là 7.
count
7
count
7
countPtr
28
Biến con trỏ trong ngôn ngữ C
Con trỏ - Pointer
• Sức mạnh của ngôn ngữ lập trình C
• Tạo ra khả năng mềm dẻo khi lập trình
• Thuận lợi truyền tham số cho hàm (tham biến), xử lý
mảng, xâu, bộ nhớ
• Con trỏ có quan hệ mật thiết giữa arrays và strings
• Lưu ý, thận trọng trong cách sử dụng: can thiệp vào
bộ nhớ.
29
Định nghĩa và khởi tạo biến con trỏ
• * được sử dụng định nghĩa biến pointer
int *myPtr;
• Định nghĩa biến con trỏ, trỏ tới vùng nhớ kiểu int
• Định nghĩa nhiều con trỏ yêu cầu sử dụng * trước mỗi biến con
trỏ
int *myPtr1, *myPtr2;
• Có thể định nghĩa con trỏ kiểu dữ liệu bất kỳ
• Khởi tạo con trỏ là 0, NULL (con trỏ rỗng) hoặc một địa chỉ của
một biến cùng kiểu dữ liệu
Biến con trỏ trong C
30
&Tenbien (trả về địa chỉ của tenbien)
• Phép gán trả về địa chỉ của biến dữ liệu
int y = 5;
int *yPtr;
yPtr = &y; /* yPtr lấy địa chỉcủa y */
yPtr “trỏ tới” y
yPtr
y
5
yptr
500000 600000
y
600000 5
địa chỉ của y
là giá trị của
yptr
Biến con trỏ trong ngôn ngữ C
31
Sử dụng dấu * để tham chiếu giá trị trong vùng nhớ trỏ bởi
con trỏ
• *yptr trả về giá trị của biến y (bởi vì yptr trỏ tới y)
• Dấu * có thể sử dụng trong lệnh gán làm thay đổi giá trị
của biến dữ liệu.
*yptr = 7; /* thay đổi y bằng 7 */
* và & quan hệ đối ngược nhau
- *p là dữ liệu được chứa trong vùng nhớ có địa chỉ là p
- &x là địa chỉ của biến x
int x; int *xptr; xptr = &x;
Khi đó, *xptr = x; &*xptr = *&xptr
Biến con trỏ trong ngôn ngữ C
1 /* Fig. 7.4: fig07_04.c
2 Using the & and * operators */
3 #include
4
5 int main()
6 {
7 int a; /* a is an integer */
8 int *aPtr; /* aPtr is a pointer to an integer */
9
10 a = 7;
11 aPtr = &a; /* aPtr set to address of a */
12
13 printf( "The address of a is %p"
14 "\nThe value of aPtr is %p", &a, aPtr );
15
16 printf( "\n\nThe value of a is %d"
17 "\nThe value of *aPtr is %d", a, *aPtr );
18
19 printf( "\n\nShowing that * and & are complements of "
20 "each other\n&*aPtr = %p"
21 "\n*&aPtr = %p\n", &*aPtr, *&aPtr );
22
23 return 0; /* indicates successful termination */
24
25 } /* end main */
Địa chỉ của biến a là giá trị của
con trỏ aPtr
* aPtr là giá trị
của biến
Quan hệ giữa *
và & là bổ sung
The address of a is 0012FF7C
The value of aPtr is 0012FF7C
The value of a is 7
The value of *aPtr is 7
Showing that * and & are complements of each other.
&*aPtr = 0012FF7C
*&aPtr = 0012FF7C
33
Operators Associativity Type
() [] left to right highest
+ - ++ -- ! * & (type) right to left unary
* / % left to right multiplicative
+ - left to right additive
>= left to right relational
== != left to right equality
&& left to right logical and
|| left to right logical or
?: right to left conditional
= += -= *= /= %= right to left assignment
, left to right comma
Fig. 7.5 Operator precedence.
Toán tử trên con trỏ
Biến con trỏ trong ngôn ngữ C
34
SỬ DỤNG KIỂU MẢNG TRONG C
Các mảng
• Là cấu trúc gồm các phần tử dữ liệu có liên quan
với nhau
• Các thực thể tĩnh (Static) – kích thước không thay
đổi trong suốt chương trình
(Phân biệt với: Cấu trúc dữ liệu động (Dynamic)
35
Khái niệm mảng
• Nhóm của định vị bộ nhớ liên tiếp nhau
• Cùng chung tên và kiểu dữ liệu
Tham chiếu đến phần tử, cụ thể
• Tên mảng
• Số vị trí
Định dạng:
arrayname[ position number ]
• phần tử đầu tiên có vị trí 0
• n phần tử mảng với tên c:
– c[ 0 ], c[ 1 ]...c[ n – 1 ]
Tên của mảng (tất
cả các phần tử có
chung tên c)
Số vị trí của
phần tử trong
mảng c
c[6]
-45
6
0
72
1543
-89
0
62
-3
1
6453
78
c[0]
c[1]
c[2]
c[3]
c[11]
c[10]
c[9]
c[8]
c[7]
c[5]
c[4]
36
Các phần tử trong mảng giống như các biến
c[ 0 ] = 3;
printf( "%d", c[ 0 ] );
• Thực hiện thao tác trong ngoặc [] để xác định chỉ số.
+ Nếu x = 3 thì c[ 5 - 2 ] == c[ 3 ] == c[ x ]
+ Chỉ số của mảng có thể xác định bằng biểu thức
toán học
37
Khai báo mảng
Khi khai báo mảng
• Tên mảng
• Kiểu mảng
• Số phần tử
Cú pháp: arrayType arrayName[ numberOfElements ];
• Ví dụ:
int c[ 10 ];
float myArray[ 3284 ];
Khai báo nhiều mảng có cùng kiểu
• Cú pháp tương tự như khai báo biến
• Ví dụ:
int b[ 100 ], x[ 27 ];
38
Khai báo và khởi tạo mảng
Khởi tạo mảng: khai báo và gắn giá trị các phần tử
int n[ 5 ] = { 1, 2, 3, 4, 5 };
• Nếu không đủ các biến thì các phần tử bên phải nhất bằng 0
int n[ 5 ] = { 0 } // Tất cả các phần tử bằng 0
• Nếu quá nhiều phần tử thì báo lỗi cú pháp
• C không kiểm tra giới hạn của mảng
• Nếu bỏ qua kích thước, sử dụng mặc định số phần tử khởi tạo
int n[ ] = { 1, 2, 3, 4, 5 };
. Khởi tạo 5 phần tử, do đó mảng có 5 phần tử
1 /* Fig. 6.4: fig06_04.c
2 Initializing an array with an initializer list */
3 #include
4
5 /* function main begins program execution */
6 int main()
7 {
8 /* use initializer list to initialize array n */
9 int n[ 10 ] = { 32, 27, 64, 18, 95, 14, 90, 70, 60, 37 };
10 int i; /* counter */
11
12 printf( "%s%13s\n", "Element", "Value" );
13
14 /* output contents of array in tabular format */
15 for ( i = 0; i < 10; i++ ) {
16 printf( "%7d%13d\n", i, n[ i ] );
17 } /* end for */
18
19 return 0; /* indicates successful termination */
20
21 } /* end main */
Element Value
0 32
1 27
2 64
3 18
4 95
5 14
6 90
7 70
8 60
9 37
Program Output
Ví dụ: Khai báo và khởi tạo mảng
array = 0012FF78
&array[0] = 0012FF78
&array = 0012FF78
1 /* Fig. 6.12: fig06_12.c
2 The name of an array is the same as &array[ 0 ] */
3 #include
4
5 /* function main begins program execution */
6 int main()
7 {
8 char array[ 5 ]; /* define an array of size 5 */
9
10 printf( " array = %p\n&array[0] = %p\n"
11 " &array = %p\n",
12 array, &array[ 0 ], &array );
13
14 return 0; /* indicates successful termination */
15
16 } /* end main */
Ví dụ: Tên của array chính là &array[ 0 ] (địa chỉ của phần tử đầu tiên trong mảng)
Mối liên hệ giữa mảng và con trỏ trong C
41
Mảng nhiều chiều
Mảng nhiều chiều
• Bảng với các hàng và các cột (m hàng và n cột)
• Giống như ma trận: chỉ số đầu là hàng (row), sau đó là cột
(column)
Row 0
Row 1
Row 2
Column 0 Column 1 Column 2 Column 3
a[ 0 ][ 0 ]
a[ 1 ][ 0 ]
a[ 2 ][ 0 ]
a[ 0 ][ 1 ]
a[ 1 ][ 1 ]
a[ 2 ][ 1 ]
a[ 0 ][ 2 ]
a[ 1 ][ 2 ]
a[ 2 ][ 2 ]
a[ 0 ][ 3 ]
a[ 1 ][ 3 ]
a[ 2 ][ 3 ]
Chỉ sô hàng-Row
Tên mảng
Chỉ số cột-Column
42
Mảng nhiều chiều
Khởi tạo
• int b[ 2 ][ 2 ] = { { 1, 2 }, { 3, 4 } };
• Khởi tạo theo hàng trong dấu {}
• Nếu không đủ, các phần tử còn lại nhận giá trị 0
int b[ 2 ][ 2 ] = { { 1 }, { 3, 4 } };
Tham chiếu các phần tử
• Chỉ ra hàng và cột
printf( "%d", b[ 0 ][ 1 ] );
• Nhập giá trị cho phần tử (i,j) của mảng
scanf(“%d”, &b[i][j]);
1 2
3 4
1 0
3 4
1 /* Fig. 6.21: fig06_21.c
2 Initializing multidimensional arrays */
3 #include
4
5 void printArray( const int a[][ 3 ] ); /* function prototype */
6
7 /* function main begins program execution */
8 int main()
9 {
10 /* initialize array1, array2, array3 */
11 int array1[ 2 ][ 3 ] = { { 1, 2, 3 }, { 4, 5, 6 } };
12 int array2[ 2 ][ 3 ] = { 1, 2, 3, 4, 5 };
13 int array3[ 2 ][ 3 ] = { { 1, 2 }, { 4 } };
14
15 printf( "Values in array1 by row are:\n" );
16 printArray( array1 );
17
18 printf( "Values in array2 by row are:\n" );
19 printArray( array2 );
20
21 printf( "Values in array3 by row are:\n" );
22 printArray( array3 );
23
24 return 0; /* indicates successful termination */
25
26 } /* end main */
27
Ví dụ: Khởi tạo mảng đa chiều
Program Output
Values in array1 by row are:
1 2 3
4 5 6
Values in array2 by row are:
1 2 3
4 5 0
Values in array3 by row are:
1 2 0
4 0 0
28 /* function to output array with two rows and three columns */
29 void printArray( const int a[][ 3 ] )
30 {
31 int i; /* counter */
32 int j; /* counter */
33
34 /* loop through rows */
35 for ( i = 0; i <= 1; i++ ) {
36
37 /* output column values */
38 for ( j = 0; j <= 2; j++ ) {
39 printf( "%d ", a[ i ][ j ] );
40 } /* end inner for */
41
42 printf( "\n" ); /* start new line of output */
43 } /* end outer for */
44
45 } /* end function printArray */
45
Xâu kí tự trong C
Mảng ký tự
• Xâu “first” là một mảng các ký tự
• Mảng các ký tự có thể được khởi tạo bởi một xâu
char string1[ ] = "first"
– Kết thúc của xâu ký tự '\0' (Null)
– string1 thực tế có 6 phần tử
– Có thể viết tương ứng như sau:
char string1[ ] = { 'f', 'i', 'r', 's', 't', '\0' };
• Có thể truy cập đến từng ký tự : string1[ 3 ] là ký tự ‘s’
• Tên mảng thể hiện địa chỉ của mảng, vì vậy không cần sử dụng ký
tự “&” trong lệnh scanf
scanf( "%s", string2 );
– Đọc các ký tự đến khi gặp ký tự trắng / dấu cách
1 /* Fig. 6.10: fig06_10.c
2 Treating character arrays as strings */
3 #include
4
5 /* function main begins program execution */
6 int main()
7 {
8 char string1[ 20 ]; /* reserves 20 characters */
9 char string2[] = "string literal"; /* reserves 15 characters */
10 int i; /* counter */
11
12 /* read string from user into array string2 */
13 printf("Enter a string: ");
14 scanf( "%s", string1 );
15
16 /* output strings */
17 printf( "string1 is: %s\nstring2 is: %s\n"
18 "string1 with spaces between characters is:\n",
19 string1, string2 );
20
21 /* output characters until null character is reached */
22 for ( i = 0; string1[ i ] != '\0'; i++ ) {
23 printf( "%c ", string1[ i ] );
24 } /* end for */
25 47
Xâu kí tự trong C
Khai báo String
• Giống như khai báo một mảng ký tự hoặc một biến kiểu char *
char color[] = "blue";
char *colorPtr = "blue";
Đọc vào xâu
• Sử dụng scanf()
scanf("%s", word);
– Sao chép vào word[]
– Không cần & (vì tên xâu là con trỏ)
• Sử dụng gets( )
Xác định độ dài xâu:
size_t strlen( const char *s ): Trả về số ký tự trong xâu s
48
Kí tự và xâu kí tự trong C
Thư viện các hàm về kí tự và xâu kí tự
• Thư viện xử lý ký tự:
• Sử dụng các hàm vào/ra ký tự và xâu (thư viện stdio.h).
• Sử dụng các hàm chuyển đổi xâu (thư viện stdlib.h).
• Sử dụng các hàm xử lý string (thư viện string.h).
49
Thư viện chuẩn các hàm xử lý ký tự
Prototype Description
int isdigit( int c ); Returns true if c is a digit and false otherwise.
int isalpha( int c ); Returns true if c is a letter and false otherwise.
int isalnum( int c ); Returns true if c is a digit or a letter and false otherwise.
int isxdigit( int c ); Returns true if c is a hexadecimal digit character and false otherwise.
int islower( int c ); Returns true if c is a lowercase letter and false otherwise.
int isupper( int