Tải bản đầy đủ (.pdf) (15 trang)

Bài giảng nhập môn lập trình mảng dữ liệu trần phước tuấn

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (430.68 KB, 15 trang )

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ó


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í

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

ó 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 ;; iii++)
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



×