Mảng – Tìm
Tì vịị trí
t í X trong
t
dãy
dã
Bài tốn:
tốn: Tìm vị trí X trên mảng a đang có N thành phần
phần.
ầ .
Giải pháp:
pháp: Tìm tuần tự
//input: dãy (a, N), X
//output: Vị trí của X, -1 nếu khơng có
int
Search(int a[], int N, int X)
{
for (int i = 0; i < N; i ++)
if (a[i] == X)
return i;
return -1;
}
Mảng – Thêm
Thê một
ột thành
thà h phần
hầ dữ liệu
liệ
Bài toán:
toán: cần
ầ thêm thành phần
ầ dữ liệu X vào mảng a
đang có N thành phần.
phần.
Hai
H i trường
t ờ hợp
h cần
ầ xem xét:
xét
ét:
Dãy chưa có thứ tự
Ỉ Thêm
Thê X vào
à cuối
ối a.
Dãy đã có thứ tự
Ỉ Tìm vị trí thích hợp, chèn X vào
Mảng – Thêm
Thê X vào
à cuối
ối dãy
dã
Thêm 15 vào (a, 7)
0
1
2
3
4
5
6
12
2
8
5
1
6
4
N=8
7
a[N] = X;
15
NX ++;
7
Mảng – Chèn
Chè X vào
à dãy
dã tăng
tă dần
dầ
Chèn 6 vào (a, 7)
0
1
2
3
4
5
6
1
2
4
5
8
12
15
N=8
7
X
6
Vị trí thích hợp: 4
pos
7
Mảng – Chèn
Chè X vào
à dãy
dã tăng
tă dầ
dần
//input: dãy (a, N) tăng dần, X
//output: dãy (a, N) đã có X ở đúng vị trí
void
Insert(int a[], int &N, int X)
{
int pos;
for (pos = N; (pos>0)&&(a[pos
(pos>0)&&(a[pos-1]>X); pos ---)
)
a[pos] = a[pos – 1];
a[pos] = X;
N ++;
}
Mảng – L
Loạii bỏ một
ột thành
thà h phần
hầ dữ liệ
liệu
Bài toán:
toán: loại bỏ thành phần dữ liệu X ra khỏi
mảng a đang có N thành phần.
phần.
Hướng giải quyết:
quyết: xác định vị trí của X, nếu tìm
thấy thì dồn các phần tử ở phía sau lên để lấp vào
chỗ
hỗ trống
trống.
ố . 2 trường
ờ hợp
h :
hợp:
Dãy khơng có thứ tự
tự:: lấp phần tử cuối lên
Dãy đã thứ tự
tự:: dời tất
ấ cả các phần
ầ tử ở sau ví
trí của X lên trước 1 vị trí
trí..
Mảng – L
Loạii bỏ X ra khỏi dãy
dã tăng
tă
Loại 5 khỏi (a,
(a 8)
pos
0
1
2
3
4
5
6
7
1
2
4
5
7
8
8
9
STOP
N=7
8
X
Tìm vị trí của 5
5
Ok, found
Dồn các vị trí 4, 5, 6, 7 lên
Mảng – Loại
L i bỏ X ra khỏi dãy
dã tăng
tă
//input: dãy (a, N), X
//output: dãy (a, N) đã loại bỏ 1 thành phần X
int
Remove(int a[], int &N, int X)
{
int pos = Search(a, N, X);
if (pos == -1) //khơng có X trong dãy
return 0;
N ---;
;
for (; (pos < N); pos ++)
a[pos] = a[pos + 1];
return 1;
}
Mảng – Sắp
Sắ xếp
ế
Bài toán:
toán: Sắp
ắ xếp
ế các thành phần
ầ của (a, N) đểể thu
được dãy tăng dần
Giải pháp
pháp:
há : Tìm
Tì cách
á h triệt
t iệt tiêu
tiê tất cảả các
á nghịch
hị h thế
của dãy
Ỉ Thuật tốn sắp xếp Đổi chổ trực tiếp
Mảng – Sắp xếp đổi chổ
1
j
2
3
4
5
6
7
8
12
1
2
8
5
1
6
4
15
i
Mảng – Sắp xếp đổi chổ
1
2
j
3
1
2
12
8
i
4
5
6
7
8
5
2
6
4
15
Mảng – Sắp xếp đổi chổ
1
2
3
j
4
1
2
12
4
8
i
5
6
7
8
5
6
4
15
Mảng – Sắp xếp đổi chổ
1
2
3
4
j
5
1
2
4
12
5
8
i
6
7
8
6
5
15
Mảng – Sắp xếp đổi chổ
1
2
3
4
5
6
7
8
1
2
4
5
6
8
12
15
Mảng – Sắp xếp đổi chổ
void Swap(int &x
&x, int &y)
{
int t = x; x = y; y = t;
}
void
id I
InterchangeSort(int
t
h
S t(i t a[],
[] int
i t N)
{
int i, j;
for (i = 0 ; i
for (j =i+1; j < N ; j++)
if(a[j]< a[i])
Swap(a[i],a[j]);
}
Mả
Mảng nhiều
hiề chiều
hiề
C không
khô hỗ trợ
t mảng
ả nhiều
hiề chiều.
chiều
hiề . Tuy
T nhiên
hiê cóó thể tiếp
tiế
cận theo hướng:
hướng: Mảng 2 chiều là mảng một chiều mà mỗi
thành phần của nó là một mảng một chiều
chiều..
float
short
rainfall[12][365];
exam marks[500][10];
exam_marks[500][10];
“rainfall” là mảng gồm 12
thành phần, mỗi thành phần là
mảng gồm
ồ 365 số
ố float
“exam_marks” là mảng gồm
500 thà
thành
h phần,
hầ mỗi
ỗi thành
thà h
phần là mảng 10 số short
const
t int
i t brighton
b i ht
= 7
7;
int day_of_year = 238;
rainfall[brighton][day_of_year] = 0.0F;
Mả
Mảng nhiều
hiề chiều
hiề
Khai báo mảng 2 chiều:
chiều:
type name[row_size
name[row_size][
][column_size
column_size];
];
SumSquares
0
0
1
1
4
1
2
1
4
5
2
int SumSquares
SumSquares[[2][
][33] = { {0,1,4}, {1,2,5} };
int SumSquares
SumSquares[[2][
][33] = { 0,1,4,1,2,5 };
int SumSquares
SumSquares[[2][
][33] = { {0,1,4} };
int SumSquares
SumSquares[[ ][
][33] = { {0,1,4}, {1,2,5} };
int SumSquares
SumSquares[[ ][
][3
3] = { {0,1, }, {1} };
int SumSquares
SumSquares[[ ][
][33];
5
Nhậ Mảng
Nhập
Mả 2 chiều
hiề
2.
#define MAX_STUDENT
MAX STUDENT 5
#define MAX_SUBJECT 6
3.
int StudentScore
StudentScore[MAX_STUDENT][MAX_SUBJECT];
[MAX_STUDENT][MAX_SUBJECT];
4.
void
id read_Score
read_Score(
d S
(int
i Score[MAX_STUDENT][MAX_SUBJECT],
S
[MAX STUDENT][MAX SUBJECT]
int nStudents
nStudents,, int nSubjects
nSubjects))
{
int i,j
i,j;;
for(ii=0; i
for(
nStudents; i++)
for(j=0; j<
j
nSubjects;; j++)
scanf(“%d”,
scanf
(“%d”, &Score[
&Score[ii][j]);
}
1
1.
5.
6.
7.
8.
9.
10
10.
Hà
Hàm truy
t
cập,
ậ iin Mảng
Mả 2 chiều
hiề
1
1.
2.
3.
4.
5.
6.
7
7.
8.
9.
10.
void print_Score(
print Score(
print_Score
Score(int Score[MAX_STUDENT][MAX_SUBJECT],
Score[MAX STUDENT][MAX SUBJECT]
int nStudents
nStudents,, int nSubjects
nSubjects))
{
int i,j
i,j;;
for(ii=0; i
for(
nStudents; i++)
{
for(j=0; j<
j
nSubjects;; j++)
printf(“%2d
printf(
printf
(“%2d\
( %2d\
%2d\tt”, &Score[i
&Score[i][j]);
printf(“
printf
(“\\n”);
}
}
Ch
Chương
ttrình
ì h
1
1.
2.
3.
4.
5.
6.
7
7.
8.
9.
main(void)
{
int nStudents
nStudents,, nScores
nScores;;
scanf(“%d
scanf
(“%d %d”, &
&nStudents
nStudents,, &
&nScores
nScores);
);
if(nStudents
if(
nStudents <= MAX_STUDENT &&
nScores
S
<= MAX_SCORES)
MAX SCORES)
read_Score((StudentScore
read_Score
StudentScore,, nStudents,
nStudents, nScores);
nScores);
print_Score
print Score (StudentScore
StudentScore,, nStudents
nStudents,, nScores
nScores);
);
return 0;
}
Biểu diễn mảng 2 chiều
StudentScores
0
1
Student1
0
1
4
?
?
?
Student2
1
2
5
?
?
?
Student3
?
?
?
?
?
?
Student4
?
?
?
?
?
?
Student5
?
?
?
?
?
?
4
?
Student1
?
?
1
2
5
?
Student2
?
?
Con tr
trỏỏ - Pointer
Phạm Thế Bảo
Trường Đại học Khoa học Tự nhiên Tp.HCM
Tp HCM