Tải bản đầy đủ (.ppt) (30 trang)

Mảng - Array

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 (3.73 MB, 30 trang )

Mảng - Array


Mảng – Array







Một số tính chất
Khai báo mảng trong C
Truy xuất các 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


Mảng – Một số tính chất








Mảng là một kiểu dữ liệu có cấu 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


Mảng – Khai báo trong C
kiểucơsở TênBiến[Sốthànhphần];
kiểu của mỗi thành phần

hằng số, số thành phần
tối đa của mảng

do lập trình viên đặt tên

int

a[100];

//a là mảng biểu diễn dãy gồm 100 thành phần int


Mảng – Ví dụ
#define
#define SIZE
SIZE
int
int


a[5];
a[5];

10
10
//
// aa dãy
dãy gồm
gồm 55 số
số nguyên
nguyên

long
long int
int big[100];
big[100];//
// big:
big: chiếm
chiếm 400
400 bytes!
bytes!
double
double

d[100];
d[100];

long
long double

double

//
// d:
d: chiếm
chiếm 800
800 bytes!
bytes!

v[SIZE];//
v[SIZE];// v:10
v:10 long
long doubles
doubles


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 tạo cho
5 thành phần

10,
10, 20,
20, 30,
30,
1.5,
1.5, 2.7};
2.7};
1,
1, 2,
2, 3,
3, 5,
5,

00 };
};

Trình biên dịch xác
định kích thước
gồm 7 thành phần

40,
40, 50};
50};
7,
7, 11,
11, 13};
13};

cách nhanh nhất để
khởi tạo tất cả các
thành phần bằng 0

2 thành phần
đầu tiên được
khởi tạo, phần
còn lại: 0


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..n-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
int ii == 7;
7;
a[0]
a[0] == 59;
59;
a[5]
a[5] == -10;
-10;
a[i/2]
a[i/2] == 2;
2;
a[6]
a[6] == 0;
0;
a[-1]
a[-1] == 5;
5;
return
return 0;

0;
}}

a

0
1
2
3
4
5


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)
{{


Ví dụ
#include
#include <stdio.h>
<stdio.h>
void
voidsum(long
sum(long [],
[], int);
int);
int
int main(void)
main(void) {{
long
long primes[6]
primes[6] == {{ 1,
1, 2,
2,
3,
3, 5,
5, 7,

7, 11
11 };
};
sum(primes,
sum(primes, 6);
6);
printf("%li\n",
printf("%li\n", primes[0]);
primes[0]);
return
return 0;
0;
}}
void
voidsum(long
sum(long a[],
a[], int
int sz)
sz) {{
int
int i;
i;
long
long total
total == 0;
0;
for(i
for(i == 0;
0; ii << sz;
sz; i++)

i++)
total
total +=
+= a[i];
a[i];
a[0]
a[0] == total;
total;
}}

primes
1
2
3
5
7
11
a
sz

6

dùng để kiểm tra
giới hạn chỉ số
tổng được lưu vào
phần tử đầu tiên


Một số thao tác cơ sở








Nhập
Xuất
Thêm một thành phần dữ liệu
Loại bỏ một thành phần dữ liệu
Tìm kiếm
Sắp xếp


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
int i;
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ữ liệu cho a[i]


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”);


Mảng – Nhập xuất dữ liệu
#include
#include <stdio.h>
<stdio.h>

void
void ReadData(int
ReadData(int [],
[], int
int );
);
void
void WriteData(int

WriteData(int [],
[], int
int );
);
int
int main()
main()
{{
int
int a[100],
a[100], n;
n;

}}

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
printf(“Day vua
vua nhap:
nhap: \n“);
\n“);
WriteData(a,
WriteData(a, n);
n);
return
return 0;
0;


Mảng – Tìm vị trí X trong dãy



Bài tốn: Tìm vị trí X trên mảng a đang có N thành phần.
Giải pháp: Tìm tuần tự

//input:
//input: dãy
dãy

//output:
//output: Vị
Vị

(a,
(a,
trí
trí

N),
N),
của
của

XX
X,
X, -1
-1 nếu
nếu 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
return i;
i;
return
return -1;
-1;
}}


Mảng – Thêm một thành phần dữ liệu




Bài 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.
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


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

1
2

2

8

5


1

6

4

N=7
8

a[N]
a[N] == X;
X;
1
NX
N ++;
++;
5

7


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

1
2

1
5

N=7
8
X

6
Vị trí thích hợp: 4


pos
7


Mảng – Chèn X vào dãy tăng dần
//input:
//input: dãy
dãy (a,
(a, N)
N) tăng
tăng dần,
dần, XX
//output:
//output: dãy
dãy (a,
(a, N)
N) đã
đã có
có XX ởở đúng
đúng vị
vị trí
trí

void
void insert(int
insert(int mang[],
mang[], int
int *N,
*N, int

int X)
X)
{{
int
int pos=
pos= *N
*N -1;
-1;
while
while (pos
(pos >=
>= 00 &&
&& mang[pos]>X)
mang[pos]>X) {{
mang[pos+1]
mang[pos+1] == mang[pos];
mang[pos];
pos--;
pos--;
}}
mang[pos+1]
mang[pos+1] == X;
X;
*N
*N == *N
*N ++ 1;
1;
}}



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.
Hướ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í.


Mảng – Loại bỏ X ra khỏi dãy tăng
Loại 5 khỏi (a, 8)
pos
0
1
2

1

2

3

4


5

6

7

2

8

5

1

6

4

1
5

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 bỏ X ra khỏi dãy tăng
//input:
//input: dãy
dãy (a,
(a, N),
N),
//output:
//output: dãy
dãy (a,
(a, N)
N)

XX
đã
đã loại
loại bỏ
bỏ 11 thành
thành phần
phần 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
if (pos
(pos ==
== -1)
-1) //khơng
//khơng có
có XX trong
trong dãy
dãy
return
return 0;
0;
*N
*N == *N-1;
*N-1;
for
for (;
(; (pos
(pos << *N);

*N); pos
pos ++)
++)
a[pos]
a[pos] == a[pos
a[pos ++ 1];
1];
return
return 1;
1;
}}


Mảng – Sắp xếp




Bài 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: Tìm cách loại bỏ tất cả các vị trí sai trong
dãy
 Thuật toán sắp xếp Đổi chổ trực tiếp
 Thuật toán nổi bọt - Bubble sort
 Thuật toán Selection Sort
…


Mảng – Sắp xếp đổi chổ
1

1
1
2
i

j
2

3

4

5

6

7

8

2

8

5

1

6


4

1
5


Mảng – Sắp xếp đổi chổ
1

2

1

2
1
2

i

j
3

4

5

6

7


8

8

5

2

6

4

1
5


Mảng – Sắp xếp đổi chổ
1

2

3

1

2

4
1
2


i

j
4

5

6

7

8

8

5

6

4

1
5


Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×