Mảng và chuỗi ký tự
NGÔN NGỮ LẬP TRÌNH C
Trường Cao Đẳng Công Nghiệp Tuy Hoà
Khoa Công nghệ Thông tin
o0o
Mảng và chuỗi
Lập trình C
3
Wednesday, July 9, 2014
Giới thiệu
•
Tất cả các biến ta khai báo và sử dụng
cho đến trước bài này đều là biến đơn
•
Vậy làm cách nào để lưu N số, hay lưu
1 bảng gồm MxN số?
•
Làm cách nào xử lý hàng loạt các số
này?
•
Làm thế nào để lưu 1 dãy các ký tự?
Mảng và chuỗi
Lập trình C
4
Wednesday, July 9, 2014
Mảng
•
Một mảng:
–
Là 1 cấu trúc dữ liệu.
–
Gồm nhiều phần tử, nằm liền kề nhau
trong bộ nhớ.
–
Tất cả các phần tử trong mảng đều có
cùng tên, cùng kiểu dữ liệu và được phân
biệt với nhau thông qua chỉ số.
–
Chỉ số bắt đầu từ 0.
Mảng và chuỗi
Lập trình C
5
Wednesday, July 9, 2014
Mảng (2)
A
0 1 2 3 4 5
M
0 1 2
0
1
2
Mảng và chuỗi
Lập trình C
6
Wednesday, July 9, 2014
Mảng 1 chiều
•
Khai báo:
typename arrname[d];
typename arrname[d] = {[valuelist]};
•
Ghi chú:
–
d phải là 1 hằng số nguyên dương
–
valuelist có thể có hoặc không
Mảng và chuỗi
Lập trình C
7
Wednesday, July 9, 2014
1D – Ví dụ khai báo
1.int a[50];
2.float x[20], y[100], z;
3.#define N 100
int arr[N];
4.const int MAX=50;
float D[MAX];
5.int A[5] = {2,4,6,8,10};
6.int B[10] = {1,2,3,4,5};
7.int C[] = {3,5,7,9};
Mảng và chuỗi
Lập trình C
8
Wednesday, July 9, 2014
1D – Truy nhập từng phần tử
•
Truy nhập từng phần tử của mảng
arrname[index]
–
A[0] = 8 A[2] = 3
–
A[3] = 5 …
•
Mỗi phần tử trong mảng được xem như 1 biến
đơn có kiểu tương ứng với kiểu dữ liệu của
mảng
475368
A
0 1 2 3 4 5
Mảng và chuỗi
Lập trình C
9
Wednesday, July 9, 2014
1D – Duyệt mảng
•
Vòng lặp được sử dụng để lần lượt duyệt
qua tất cả các phần tử trong mảng.
•
Nhập mảng:
int a[100], N, i;
scanf(“%d”, &N);
for(i=0; i<N; i++) {
printf(“Input element %d:”,i);
scanf(“%d”, &a[i]);
}
Mảng và chuỗi
Lập trình C
10
Wednesday, July 9, 2014
1D – Nhập – Xuất – Tính tổng
•
Xuất mảng:
for(i=0; i<N; i++)
printf(“%5d”,a[i]);
printf(“\n”);
•
Tổng các phần tử trong mảng:
tong = 0;
for(i=0; i<N; i++)
tong += a[i];
printf(“Tong = %d\n”, tong);
Mảng và chuỗi
Lập trình C
11
Wednesday, July 9, 2014
1D – Một số bài toán trên mảng
•
Tìm max, min của cả mảng
•
Tìm kiếm 1 giá trị trong mảng
–
Tìm tuyến tính
–
Tìm nhị phân
•
Sắp xếp mảng
•
Thêm, xóa phần tử
•
Kiểm tra tính chất của mảng
•
Tách, trộn mảng
•
ect.
Mảng và chuỗi
Lập trình C
12
Wednesday, July 9, 2014
1D – Tìm phần tử lớn nhất
•
Lưu đồ:
max=a[0];
pos=0;
i=0;
i<N
Output max
Output pos
max<a[i]
max=a[i];
pos=i;
i=i+1
End
F
T
T
F
Mảng và chuỗi
Lập trình C
13
Wednesday, July 9, 2014
1D – SourceCode
max = a[0];
pos = 0;
for(i=1; i<N; i++)
if (max < a[i]) {
max = a[i];
pos = i;
}
printf(“Max at %d = %d”,pos,max);
Mảng và chuỗi
Lập trình C
14
Wednesday, July 9, 2014
1D – Tìm tuyến tính
•
Lưu đồ:
pos=-1;
i=0;
i<N
Output “Fail”
a[i]==X
i=i+1
End
F
T
T
F
Output pos
pos=i;
Mảng và chuỗi
Lập trình C
15
Wednesday, July 9, 2014
1D – SourceCode
pos =-1;
i = 0;
while (i<N) {
if (a[i]==X){
pos = i;
printf(“Found at %d!”,pos);
break;
}
i++;
}
if (i>=N)
printf(“Searching failed!”);
Mảng và chuỗi
Lập trình C
16
Wednesday, July 9, 2014
1D – SourceCode (2)
pos =-1;
i = 0;
while (i<N && pos==-1) {
if (a[i]==X) pos = i;
i++;
}
if (i>=N)
printf(“Searching failed!”);
else
printf(“Found at %d!”,pos);
Mảng và chuỗi
Lập trình C
17
Wednesday, July 9, 2014
1D – Sắp mảng tăng dần
•
Lưu đồ:
i=0;
i<N-1
Output a
End
F
Finding
min (i N-1)
Exchange
min & a[i]
i=i+1;
T
Mảng và chuỗi
Lập trình C
18
Wednesday, July 9, 2014
1D – SourceCode
for(i=0; i<N-1; i++) {
min=a[i]; pos=i;
for(j=i+1; j<N; j++)
if (min>a[j]) {
min=a[j]; pos=j;
}
t=a[i]; a[i]=a[pos]; a[pos]=t;
}
//Output a
Mảng và chuỗi
Lập trình C
19
Wednesday, July 9, 2014
1D – SourceCode (2)
for(i=0; i<N-1; i++)
for(j=i+1; j<N; j++)
if (a[i]>a[j]) {
t=a[i]; a[i]=a[j]; a[j]=t;
}
//Output a
Mảng và chuỗi
Lập trình C
20
Wednesday, July 9, 2014
1D – Demo về sắp xếp mảng
Java applet for Sorting Demo
Mảng và chuỗi
Lập trình C
21
Wednesday, July 9, 2014
1D – Kiểm tra mảng tăng
•
Lưu đồ:
i=0;
i<N-1
Output “Yes”
End
F
i=i+1;
T
a[i]>a[i+1]
T
Output “No”
F
Mảng và chuỗi
Lập trình C
22
Wednesday, July 9, 2014
1D – Kiểm tra mảng tăng
flag = 1;
for(i=0; i<N-1; i++)
if (a[i]>a[i+1]){
flag = 0;
break;
}
if (flag) printf(“Incremental!”);
else printf(“Non-incremental!”);
Mảng và chuỗi
Lập trình C
23
Wednesday, July 9, 2014
Mảng 2 chiều
•
Còn được gọi là ma trận
•
Là 1 bảng bao gồm M dòng và N cột, do
vậy có tổng cộng MxN ô (phần tử)
•
Mỗi dòng (cột) của ma trận là 1 mảng 1
chiều.
•
Do vậy, mảng 2 chiều còn được gọi là
“mảng của mảng”
Mảng và chuỗi
Lập trình C
24
Wednesday, July 9, 2014
2D - Khai báo
•
Khai báo:
typename arrname[MAXR][MAXC];
typename arrname[MAXR][MAXC] = {[valuelist]};
•
Ghi chú:
–
MAXR & MAXC phải là các hằng số
nguyên
–
valuelist có thể có hoặc không
Mảng và chuỗi
Lập trình C
25
Wednesday, July 9, 2014
2D – Ví dụ khai báo
1. int a[50][20];
2. float x[20][20], y[100], z;
3. #define N 100
int arr[N][N];
4. int A[3][3] = { {1,0,0},
{0,1,0},
{0,0,1} };
Mảng và chuỗi
Lập trình C
26
Wednesday, July 9, 2014
2D – Truy nhập từng phần tử
•
Truy nhập từng phần tử của ma trận
arrname[row][col]
–
A[0][0] A[0][1] A[0][2] …
–
A[1][0] A[1][1] A[1][2] …
–
…
•
Mỗi phần tử được xem như 1 biến đơn,
cùng kiểu với kiểu của mảng