Professional Documents
Culture Documents
Chapter 5
Chapter 5
Chapter 5
Mảng và xâu ký tự
1
ThS. Nguyễn Văn Tiến
Nội dung
6. Xâu ký tự
2
Đặt vấn đề
Ví dụ
Chương trình cần lưu trữ 3 số nguyên?
=> Khai báo 3 biến int a1, a2, a3;
Chương trình cần lưu trữ 100 số nguyên?
=> Khai báo 100 biến kiểu số nguyên!
Người dùng muốn nhập n số nguyên?
=> Không thực hiện được!
Giải pháp
Kiểu dữ liệu mới cho phép lưu trữ một dãy các số nguyên và dễ dàng
truy xuất.
3
Giới thiệu về mảng
Mảng một loại cấu trúc dữ liệu có thể lưu trữ một tập hợp tuần tự có kích
thước cố định gồm các phần tử cùng loại. Mảng được sử dụng để lưu trữ
một tập hợp dữ liệu.
Thay vì khai báo các biến riêng lẻ như number0, number1, ... và
number99, có thể khai báo một biến mảng number và sử dụng các
number[0], number[1] và ..., number[99] để biểu diễn các biến riêng lẻ.
Một phần tử cụ thể trong một mảng được truy cập bởi một chỉ số.
4
Khai báo mảng
Để khai báo một mảng trong C, lập trình viên chỉ định loại phần tử và số
lượng phần tử mà một mảng yêu cầu như sau
<kiểu dữ liệu> arrayName [ arraySize ];
Đây được gọi là mảng một chiều. arraySize phải là một hằng số nguyên
lớn hơn 0 và kiểu có thể là bất kỳ kiểu dữ liệu nào.
Ví dụ:
double balance[10];
5
Khai báo mảng
Mảng 2D còn được gọi là ma trận (bảng gồm các hàng và cột).
7
Khai báo mảng
int SingleDimensionalArray[10];
0 1 2 3 4 5 6 7 8 9
SingleDimensionalArray
int TwoDimensionalArray[3][4];
0 1 2 3
TwoDimensionalArray 0
1
2
8
Khai báo mảng
Phải chỉ định số lượng phần tử tại thời điểm khai báo
int n1 = 10; int a[n1];
intb[20];
9
Khởi tạo mảng
0 1 2 3
a 2912 1706 0 0
10
Khởi tạo mảng
a 0 0 0 0
0 1 2 3
11
Truy cập phần tử của mảng
Sử dụng chỉ số
<array variable>[<index1>][<index2>]…[<indexn>]
Ví dụ
Cho mảng như sau
0 1 2 3
int a[4];
truy xuất
Hợp lệ: a[0], a[1], a[2], a[3]
Không hợp lệ: a[-1], a[4], a[5], …
Cho kết quả thường không như mong muốn!
12
Truy cập phần tử của mảng
Tham số kiểu mảng trong khai báo hàm giống như khai báo biến mảng
void Sort(int a[100]);
Tham số mảng truyền vào hàm là địa chỉ của phần tử đầu tiên của mảng
Có thể bỏ số phần tử hoặc sử dụng con trỏ.
Mảng có thể thay đổi sau khi thực hiện hàm.
void Sort(int a[]);
void Sort(int *a);
15
Truyền mảng cho hàm
Nhập, xuất
Tính tổng, tích
Tìm kiếm
Đếm
Sắp xếp
Thêm, xoá, thay thế
18
Mảng hai chiều
Khai báo
<Kiểu dữ liệu> <Tên mảng> [<Số dòng tối đa>][< Số cột tối đa>];
Ví dụ:
int A[10][10]; // Khai báo mảng 2 chiều kiểu int
//gồm 10 dòng, 10 cột
float b[10][10]; // Khai báo mảng 2 chiều kiểu
//float gồm 10 dòng, 10 cột
19
Mảng hai chiều
Để truy xuất các thành phần của mảng hai chiều ta phải dựa vào chỉ số
dòng và chỉ số cột.
Ví dụ:
int A[3][4] = { {2,3,9,4} , {5,6,7,6} , {2,9,4,7} };
Với các khai báo như trên ta có :
A[0][0] = 2; A[0][1] = 3;
A[1][1] = 6; A[1][3] = 6;
20
Ma trận vuông
21
Ma trận vuông
22
Ma trận vuông
24
Xâu ký tự
Xâu có thể được định nghĩa như là một mảng kiểu ký tự, được kết thúc
bằng ký tự null
Mỗi ký tự trong xâu chiếm một byte và ký tự cuối cùng của xâu là “\0”
(null)
Được khai báo và truyền tham số như mảng một chiều.
char s[100];
unsigned char s1[1000];
25
Xâu ký tự
char s[100];
unsigned char s1[1000];
26
Xâu ký tự
other 'T' 'o' ‘n’ 'y' 32 'B' 'l' 'u' 'r' 't' 0
27
Xâu ký tự - nhập / xuất
28
Xâu ký tự - nhập / xuất
Nhập xâu
char *gets(char *s);
Ví dụ:
int main(){
char s[80];
printf("Nhap vao xau:");
gets(s);
printf(“Xau vua nhap la: %s\n", s);
}
29
Xâu ký tự - nhập / xuất
In ra xâu
int puts(const char *s);
Ví dụ:
int main()
{
char s[] = “Hoc vien Hoang gia\n";
puts(s);
}
Lưu ý: Cách truy xuất các ký tự tương tự như mảng một chiều.
30
Xâu ký tự - nhập / xuất
#include <stdio.h>
int main()
{ "Blurt" sẽ không
char other[] = "Tony Blurt"; được in ra
printf("%s\n", other);
other[4] = '\0';
other 'T' 'o' ‘n’ 'y' 32 'B' 'l' 'u' 'r' 't' 0
31
Xâu ký tự - một số hàm thư viện
32
Xâu ký tự - một số hàm thư viện
#include <stdio.h>
int main()
Minor < Tony
{
char s1[] = "Minor";
char s2[] = "Tony";
int cmp = strcmp(s1, s2);
if (cmp < 0)
printf("%s < %s", s1, s2);
else
if (cmp == 0)
printf("%s = %s", s1, s2);
else
printf("%s > %s", s1, s2);
return 0;
}
33
Xâu ký tự - một số hàm thư viện
#include <stdio.h>
int main()
{ Tony Blurt
char s[] = "Tony Blurt"; To123Blurt
char s2[100], *s3; Blurt
strcpy(s2, s);
printf("%s\n", s2);
strncpy(s2 + 2, "12345", 3);
printf("%s\n", s2);
s3 = strdup(s + 5);
printf("%s\n", s3);
free(s3);
return 0;
}
35
Xâu ký tự - một số hàm thư viện
Nối xâu:
char *strcat(char *dest,const char *src);
Tách xâu:
char *strtok(char *s,const char *sep);
Trả về địa chỉ của đoạn đầu tiên. Muốn tách đoạn kế tiếp tham số
thứ nhất sẽ là NULL
36
Xâu ký tự - một số hàm thư viện
#include <stdio.h>
Test
#define SEPARATOR "., "
strtok:
int main() 9
{ 123
char s[]= "Test strtok: 9,123.45"; 45
char *p;
p = strtok(s, SEPARATOR);
while (p != NULL) {
printf("%s\n", p);
p = strtok(NULL, SEPARATOR);
}
return 0;
}
37
Xâu ký tự - một số hàm thư viện
38
Xâu ký tự - một số hàm thư viện
#include <stdio.h>
int main()
{
char s[]= “Try Searching";
char *p;
p = strchr(s, ‘y');
printf("%s\n", p);
p = strstr(s, “ing");
printf("%s\n", p);
return 0;
}
39
Xâu ký tự - một số hàm thư viện
#include <stdio.h>
#include <stdio.h>
41
THANK YOU FOR YOUR ATTENTION!
42