NMLT
M NG D LI U
Tr n Ph
c Tu n
M ng – Array
M t s tính ch t
Khai bá
báo m ng trong C
Truy xu t cá
các thà
thành ph n
Truy n tham s ki u m ng cho hàm
M t s thao tác c s
M ng nhi u chi u
NH P MÔN L P TRÌNH
12/23/2009
2
M ng – M t s tính ch t
M ng là
là m t ki u d li u có
có c u trú
trúc do ng i l p
trình nh ngh a
Dùng bi u di n các i t ng d li u d ng m t
dãy các thành ph n có cùng ki u v i nhau – ki u c
s
NNLT C luôn ch nh m t kh i nh liên t c cho
m t bi n ki u m ng
Kích th c c a m ng
c xác nh ngay khi khai
báo và không bao gi thay i
NH P MÔN L P TRÌNH
3
12/23/2009
M ng – Khai báo trong C
typedef ki uc s
Tênki u[S thà
thànhph n];
ki u c a m i thà
thành ph n
h ng s , s thà
thành ph n
t i a c a m ng
do l p trì
trình viên
typedef
int
t tên
AINT[100];
//AINT là ki u m ng bi u di n dãy g m 100 thành ph n int
AINT
NH P MÔN L P TRÌNH
a;
//a: bi n ki u AINT
12/23/2009
4
M ng – Ví d
#define
#define
SIZE
SIZE
int
int
a[5];
a[5];
10
10
//
// aa dãy
dãy gg mm 55 ss nguyên
nguyên
long
long int
int big[100];
big[100];//
// big:
big: chi
chi mm 400
400 bytes!
bytes!
double
double
d[100];
d[100];
long
long double
double
//
// d:
d: chi
chi mm 800
800 bytes!
bytes!
v[SIZE];//
v[SIZE];// v:10
v:10 long
long doubles
doubles
NH P MÔN L P TRÌNH
M ng – Ví d
int
int
double
double
short
short
long
long
a[5]
a[5]
d[100]
d[100]
primes[]
primes[]
b[50]
b[50]
kh i tr cho 5
thành ph n
== {{ 10,
10, 20,
20, 30,
30,
== {{ 1.5,
2.7};
1.5, 2.7};
== {{ 1,
1, 2,
2, 3,
3, 5,
5,
== {{ 00 };
};
compiler xác nh
kích th c g m 7
thành ph n
int
ii == 7;
int
7;
const
int
c
=
5;
const int c = 5;
int
a[i];
int
a[i];
double
d[c];
double
d[c];
short
primes[];
short
primes[];
NH P MÔN L P TRÌNH
5
12/23/2009
40,
40, 50};
50};
7,
7, 11,
11, 13};
13};
cách nhanh nh t
kh i tr t c các
thành ph n b ng 0
12/23/2009
2 thành ph n
u tiên
c
kh i tr , ph n
còn l i: 0
6
M ng – Truy xu t các ph n t
Các thành ph n c a m ng
c truy xu t thông qua ch s
c a chúng 0..size-1
Thao tác truy xu t không ki m tra gi i h n c a ch s
int
int main()
main()
{{
int
int a[6];
a[6];
int
i
int
i == 7;
7;
a[0]
=
59;
a[0] = 59;
a[5]
a[5] == -10;
-10;
a[i/2]
=
a[i/2] = 2;
2;
a[6]
=
0;
a[6] = 0;
a[-1]
a[-1] == 5;
5;
return
0;
return 0;
}}
NH P MÔN L P TRÌNH
a
0
1
2
3
4
5
12/23/2009
7
Truy n tham s M ng cho hàm
Tham s ki u m ng
c truy n cho hàm chính là a ch
c a ph n t
u tiên trên m ng
S thành ph n trong tham s m ng có th
tr ng.
S thành ph n th c s
c s d ng ph i truy n qua m t
tham s khác (vd: size)
int
int add_elements(int
add_elements(int a[],
a[], int
int size)
size)
{{
int
int add_elements(int
add_elements(int *p,
*p, int
int size)
size)
{{
NH P MÔN L P TRÌNH
12/23/2009
8
Ví d
primes
1
#include
#include <stdio.h>
<stdio.h>
void
sum(long
void sum(long [],
[], int);
int);
int
main(void)
{
int main(void) {
long
long primes[6]
primes[6] == {{ 1,
1, 2,
2,
3,
5,
7,
11
};
3, 5, 7, 11 };
sum(primes,
sum(primes, 6);
6);
printf("%li\n",
printf("%li\n", primes[0]);
primes[0]);
return
0;
return 0;
}}
3
5
7
11
a
sz
void
voidsum(long
sum(long a[],
a[], int
int sz)
sz) {{
int
int i;
i;
long
long total
total == 0;
0;
for(i
=
0;
i
<
for(i = 0; i < sz;
sz; i++)
i++)
total
+=
a[i];
total += a[i];
a[0]
=
a[0] = total;
total;
}}
NH P MÔN L P TRÌNH
2
6
dùng
ki m tra
gi i h n ch
ng
c l u vào
ph n t
u tiên
12/23/2009
9
M t s thao tác c s
Nh p
Xu t
Thêm m t thà
thành ph n d li u
Lo i b m t thà
thành ph n d li u
Tìm ki m
S px p
NH P MÔN L P TRÌNH
12/23/2009
10
M ng – Nh p d li u
void
void ReadData(int
ReadData(int a[],
a[], int
int size)
size)
{{
duy t qua t t c các
int
i;
int i;
ph n t
for(i
for(i == 0;
0; ii << size;
size; i++)
i++)
{{
printf(“Nhap
printf(“Nhap thanh
thanh phan
phan %d:
%d: ”,
”, i);
i);
scanf(“%d”,
scanf(“%d”, &a[i]);
&a[i]);
}}
}}
nh p d
NH P MÔN L P TRÌNH
li u cho a[i]
12/23/2009
11
M ng – Xu t d li u ra màn hình
void
void WriteData(int
WriteData(int a[],
a[], int
int size)
size)
{{
int
int i;
i;
for(i
for(i == 0;
0; ii << size;
size; i++)
i++)
printf(“%d
printf(“%d ”,
”, a[i]);
a[i]);
printf(“\n”);
printf(“\n”);
}}
NH P MÔN L P TRÌNH
12/23/2009
12
M ng – Nh p xu t d li u
#include
#include <stdio.h>
<stdio.h>
void
void ReadData(int
ReadData(int [],
[], int
int );
);
void
WriteData(int
[],
int
void WriteData(int [], int );
);
void
main()
void main()
{{
int
int a[100],
a[100], n;
n;
clrscr();
clrscr();
printf(“Nhap
printf(“Nhap so
so thanh
thanh phan
phan cua
cua day:
day: “);
“);
scanf(“%d”,
scanf(“%d”, &n);
&n);
printf(“Nhap
printf(“Nhap cac
cac thanh
thanh phan
phan cua
cua day:
day: “);
“);
ReadData(a,
ReadData(a, n);
n);
printf(“Day
vua
printf(“Day vua nhap:
nhap: \n“);
\n“);
WriteData(a,
WriteData(a, n);
n);
}}
NH P MÔN L P TRÌNH
12/23/2009
13
M ng – Tìm v trí X trong dãy
Bài toá
toán: Tì
Tìm v trí
trí X trên m ng a ang có
có N thà
thành ph n.
Gi i pháp: Tìm tu n t
//input:
//input: dãy
dãy
//output:
//output: VV
(a,
(a,
trí
trí
N),
N),
cc aa
XX
X,
X, -1
-1 nn uu không
không có
có
int
Search(int
int
Search(int a[],
a[], int
int N,
N, int
int X)
X)
{{
for
for (int
(int ii == 0;
0; ii << N;
N; ii ++)
++)
if
if (a[i]
(a[i] ==
== X)
X)
return
i;
return i;
return
1;
return --1;
}}
NH P MÔN L P TRÌNH
12/23/2009
14
M ng – Thêm m t thành ph n d li u
Bài toá
toán: c n thêm thà
thành ph n d li u X và
vào m ng a
ang có N thành ph n.
Hai tr ng h p c n xem xét:
Dãy ch a có th t
Thêm X vào cu i a.
Dãy ã có th t
Tìm v trí thích h p, chèn X vào
NH P MÔN L P TRÌNH
15
12/23/2009
M ng – Thêm X vào cu i dãy
Thêm 15 vào (a, 7)
0
1
2
3
4
5
6
12
2
8
5
1
6
4
N=8
7
NH P MÔN L P TRÌNH
7
a[N]
a[N] == X;
X;
15
X
NN ++;
++;
12/23/2009
16
M ng – Chèn X vào dãy t ng d n
Chèn 6 vào (a, 7)
0
1
2
3
4
5
6
1
2
4
5
8
12
15
pos
7
N=8
7
X
6
trí thích h p: 4
NH P MÔN L P TRÌNH
12/23/2009
17
M ng – Chèn X vào dãy t ng d n
//input:
ng
//input: dãy
dãy (a,
(a, N)
N)
ng dd n,
n, XX
//output:
úng
//output: dãy
dãy (a,
(a, N)
N) ãã có
có XX
úng vv trí
trí
void
Insert(int
void
Insert(int a[],
a[], int
int &N,
&N, int
int X)
X)
{{
int
int pos;
pos;
for
-1]>X); pos
)
(pos>0)&&(a[pos
-for (pos
(pos == N;
N; (pos>0)&&(a[pos(pos>0)&&(a[pos-1]>X);
pos --)
--)
a[pos]
a[pos] == a[pos
a[pos –– 1];
1];
a[pos]
=
X;
a[pos] = X;
NN ++;
++;
}}
NH P MÔN L P TRÌNH
12/23/2009
18
M ng – Lo i b m t thành ph n d li u
Bài 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.
ng gi i 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 tr ng. 2 tr ng h p:
Dãy không có th t : l p ph n t cu i lên
Dãy ã th t : d i t t c các ph n t
sau ví
ví
trí c a X lên tr c 1 v trí.
NH P MÔN L P TRÌNH
19
12/23/2009
M ng – Lo i b X ra kh i dãy t ng
Lo i 5 kh i (a, 8)
pos
0
1
2
3
4
5
6
7
12
2
8
5
1
6
4
15
STOP
N=7
8
X
Tìm v trí c a 5
NH P MÔN L P TRÌNH
5
Ok, found
n các v trí 4, 5, 6, 7 lên
12/23/2009
20
M ng – Lo i b X ra kh i dãy t ng
//input:
//input: dãy
dãy (a,
(a, N),
N), XX
//output:
//output: dãy
dãy (a,
(a, N)
N) ãã lo
lo ii bb 11 thành
thành ph
ph nn XX
int
Remove(int
int
Remove(int a[],
a[], int
int &N,
&N, int
int X)
X)
{{
int
int pos
pos == Search(a,
Search(a, N,
N, X);
X);
if
(pos
==
1)
//không
có
ó XX trong
c
if (pos == -1) //không có
trong dãy
dãy
return
return 0;
0;
NN --;
;
---;
for
for (;
(; (pos
(pos << N);
N); pos
pos ++)
++)
a[pos]
=
a[pos
+
1];
a[pos] = a[pos + 1];
return
return 1;
1;
}}
NH P MÔN L P TRÌNH
12/23/2009
21
M ng – S p x p
Bài toá
thu
toán: S p x p cá
các thà
thành ph n c a (a,
(a, N)
c dãy t ng d n
Gi i pháp: Tìm cách tri t tiêu t t c các ngh ch th
c a dãy
Thu t toán s p x p i ch tr c ti p
NH P MÔN L P TRÌNH
12/23/2009
22
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
NH P MÔN L P TRÌNH
23
12/23/2009
M ng – S p x p
1
2
j
3
1
2
12
8
i ch
4
5
6
7
8
5
2
6
4
15
i
NH P MÔN L P TRÌNH
12/23/2009
24
M ng – S p x p
1
2
3
j
4
1
2
12
4
8
i ch
5
6
7
8
5
6
4
15
i
NH P MÔN L P TRÌNH
25
12/23/2009
M ng – S p x p
i ch
1
2
3
4
j
5
1
2
4
12
5
8
6
7
8
6
5
15
i
NH P MÔN L P TRÌNH
12/23/2009
26
M ng – S p x p
i ch
1
2
3
4
5
6
7
8
1
2
4
5
6
8
12
15
NH P MÔN L P TRÌNH
M ng – S p x p
12/23/2009
27
i ch
void
void Swap(int
Swap(int &x,
&x, int
int &y)
&y)
{{
int
int tt == x;
x; xx == y;
y; yy == t;
t;
}}
void
void InterchangeSort(int
InterchangeSort(int a[],
a[], int
int N)
N)
{{
int
int i,
i, j;
j;
for
for (i
(i == 00 ;; i
i
i++)
for
for (j
(j =i+1;
=i+1; jj << NN ;; j++)
j++)
if(a[j]<
if(a[j]< a[i])
a[i])
Swap(a[i],a[j]);
Swap(a[i],a[j]);
}}
NH P MÔN L P TRÌNH
12/23/2009
28
M ng nhi u chi u
C không h tr m ng nhi u chi u. Tuy nhiên có th ti p
c n theo 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.
float
float
short
short
“rainfall” là m ng g m 12
thành ph n, m i thành ph n là
ng g m 365 s float
rainfall[12][365];
rainfall[12][365];
exam_marks[500][10];
exam_marks[500][10];
“exam_marks” là m ng g m
500 thành ph n, m i thành
ph n là m ng 10 s short
const
const int
int brighton
brighton == 7;
7;
int
day_of_year
=
238;
int day_of_year = 238;
rainfall[brighton][day_of_year]
rainfall[brighton][day_of_year] == 0.0F;
0.0F;
NH P MÔN L P TRÌNH
Tóm l
12/23/2009
29
c
Khai báo m ng trong C
Truy xu t các ph n t
Truy n tham s ki u m ng cho hà
hàm
Các thao tá
tác: nh p, xu t, thêm/h y 1 thà
thành ph n,
tìm ki m, s p x p
M ng nhi u chi u
NH P MÔN L P TRÌNH
12/23/2009
30