Tải bản đầy đủ

Chuong 5 mang pascal, mang pascal full

NGÔN NGỮ C

Chương 5: KiỂU MẢNG
(ARRAY TYPE)
Giáo viên: Tạ Thúc Nhu
Khoa CNTT trường ĐH Lạc Hồng


I- Tổng Quan:


Mảng là 1 tập hợp nhiều biến nhớ có cùng kiểu, gọi là kiểu
phần tử của mảng, được cấp phát ở những vị trí liên tục
trong bộ nhớ.



Mỗi phần tử (biến nhớ) trong mảng được xác định dựa trên
tên mảng và các chỉ số xác định vị trí của phần tử trong
mảng.




Chỉ số phần tử của mảng là các số nguyên không âm.



Số lượng chỉ số dùng để xác định 1 phần tử trong mảng
được gọi là số chiều của mảng.

Khai báo mảng N chiều:
[S1][S2]…[Sn];
2

Mã hóa


II-MẢNG MỘT CHIỀU

3

Mã hóa


1- Khái niệm:
• Mảng 1 chiều là tập các biến nhớ cùng kiểu, mỗi phần tử được
xác định bởi tên mảng và một chỉ số bắt đầu từ 0 trở đi.
• Ví dụ: Mảng A có 6 phần tử thuộc kiểu số nguyên:

A
Chỉ số phần tử
Tên phần tử

9

5

2

2


5

1

0

1

2

3

4

5

A[0]

A[1]

A[2]

A[3]

A[4]

A[5]

4

Mã hóa


2- Khai Báo Mảng 1 Chiều:
a) Khai báo trực tiếp:
[] = {gt1, .., gtn} ;


Nếu số giá trị khởi đầu < số phần tử thì các phần tử còn lại
sẽ được gán giá trị khởi đầu = 0.

b) Khai báo gián tiếp:
– Định nghĩa kiểu mảng 1 chiều mới:

typedef

[];

– Khai báo mảng 1 chiều thuộc kiểu mảng đã định nghĩa:

= {gt1, .., gtn} ;

5

Mã hóa


3- Một Số Thao Tác Trên Mảng 1 Chiều:

6

Mã hóa


3.1 Địa chỉ vùng nhớ của một phần tử trong
mảng một chiều là:
Cách 1: Dùng phép toán lấy địa chỉ
&TênMảng[ chỉsố]
Cách 2: Dùng phép toán cộng địa chỉ
TênMảng + chỉsố
• Tên mảng là hằng chứa địa chỉ phần tử đầu tiên của mảng.
Nhập giá trị cho một phần tử của mảng ta có thể sử dụng 1
trong 2 cách sau:
– scanf("mã định dạng", &TênMảng[ chỉsố ] );
– scanf("mã định dạng", TênMảng + chỉsố );

7

Mã hóa


3.2 Duyệt qua các phần tử của mảng:
Sử dụng 1 vòng lặp thay đổi chỉ số:
• Từ 0 đến N-1
• Hoặc từ N-1 giảm đến 0.

Ví dụ: Viết chương trình nhập N số thực (N <= 100). In lại các
số thực đó ngược với thứ tự đã nhập.

8

Mã hóa


Ví dụ: Viết chương trình nhập N số thực (N <= 100).
In lại các số thực đó ngược với thứ tự đã nhập.
#include
typedef float DayThuc[100];
void main()
{
DayThuc A;

int N;

printf("Cho biet so phan tu can nhap:");
scanf("%d", &N);
printf(“Nhap gia tri cho cac phan tu : \n “);
for( int i = 0; i < N ; i++)
{
printf("Nhap gia tri phan tu %d : ", i );
scanf("%f", &A[ i ] );
}
printf("\nCac so thuc da nhap: ");
for( i = N-1; i >= 0; i-- ) printf(" %f ", A[i] );
}
9

Mã hóa


3.3 Tìm kiếm phần tử thỏa yêu cầu cực trị:


Ý tưởng: Sử dụng các biến để lưu giữ vị trí phần tử cực trị
trong quá trình so sánh.

Thuật toán: Tìm chỉ số của một phần tử có giá trị nhỏ nhất


Input: Mảng A chứa N phần tử



Output: cs: chỉ số phần tử có giá trị nhỏ nhất

Begin
1. cs = 0;
2. Cho i lần lượt lấy giá trị từ 1 đến N-1
Nếu A[cs] > A[ i ] thì thay cs = i
3. Phần tử cs có giá trị A[cs] là nhỏ nhất

End
10

Mã hóa


Ví dụ: Nhập ngẫu nhiên N số nguyên (N <=100). Cho biết chỉ
số của các phần tử có giá trị nhỏ nhất.
#include
#include

printf("\nCac so da tao:");

#define MAX 100

for( i= 1; i < N; i++)
printf(" %d ", A[i] );

typedef int DayNguyen[MAX];

//Tim chi so phan tu

void main()

cs = 0;

{

for( i= 1; i < N; i++)

DayNguyen A;
int N, cs;

if ( A[cs] > A[i] ) cs = i;

printf("So phan tu can nhap:");

printf(“Gia tri min la %d", A[cs]);

scanf("%d", &N);

printf("\nThuoc cac phan tu: ");

randomize();

for ( i = cs ; i < N ; i++)

for( int i = 0; i < N ; i++)
A[ i ] = random(100);

if (A[i]==A[cs]) printf(“%6d”, i );
}
11

Mã hóa


3.4 Sắp xếp mảng theo thứ tự tăng (hay giảm):
Chỉ số
A

0

1

2

3

4

5

6

5

6

8

9

1

4

2

0

1

2

3

4

5

6

1

2

4

5

6

8

9

Mảng sắp theo thứ tự tăng
Chỉ số
A

Mảng sắp theo thứ tự giảm
Chỉ số
A

0

1

2

3

4

5

6

9

8

6

5

4

2

1

12

Mã hóa


Thuật toán chọn trực tiếp
(Straight Selection Sort)
Ý tưởng thuật toán chọn trực tiếp (Straight Selection Sort).


Tìm phần tử nhỏ nhất trong dãy (0..N-1) ta đổi chổ với phần tử 0 đầu dãy



Sau đó, lại tìm phần tử nhỏ nhất trong dãy con từ (1..N-1) và đổi chổ với
phần tử 1 đầu dãy con



Tiếp tục cho tới khi dãy con chỉ còn 1 phần tử.

Chỉ số
A
Chỉ số
A

0

1

2

3

4

5

6

5

6

8

9

1

4

2

0

1

2

3

4

5

6

1

2

4

5

6

8

9

13

Mã hóa


Thuật toán: Sắp xếp mảng theo thứ tự tăng
Input:

Mảng A có N phần tử cần sắp xếp

Output: Mảng A đã sắp xếp theo thứ tự tăng
Temp: - I : chỉ số phần tử đầu dãy con; - J : biến chạy trên dãy con
- cs : chỉ số phần tử có giá trị nhỏ nhất trên dãy con từ I đến N-1
Bắt đầu
b1: Cho I = 0 (vị trí đầu của dãy con đầu tiên)
b2: Tìm phần tử A[cs] nhỏ nhất trong dãy a[I] .. a[N-1]
b2.1: cs = I
b2.2: Cho J lần lượt lấy giá trị từ ( I + 1) đến N-1
Nếu A[ J ] < A[cs] thì thay cs = J
b3: hoán vị A[cs] và A[I]
b4: Tăng I = I + 1 (Vị trí đầu dãy con mới)
b5: Nếu I < N-1 thì lặp bước 2 ngược lại chuyển sang bước 6
b6: Dãy đã được sắp xếp.
Kết thúc
14

Mã hóa


Ví dụ: Sắp xếp mảng theo thứ tự tăng
printf("\nMang chua sap:");
for( I = 0; I< N; I++)
printf("%6d ", A[I] );
//Sap xep mang A
for ( I = 0; I < N-1; I++)
{
cs = I;
for ( J=I+1; J<=N-1; J++)
if (A[ J ] < A[cs]) cs = J;

void Hoanvi(int &a, int &b)
{
int c = a;
a = b;
b = c;
}
void main()
{ int A[100];
int N, I, J, VT;
printf(“Nhap so phan tu");
scanf("%d", &N);
printf("Nhap GT cac phan tu: \n");

if ( cs != I )
Hoanvi( A[cs], A[I] );
}
printf("\nMang da sap xep:");
for( I = 0; I< N; I++)
printf("%6d ", A[I]);

for( I = 0; I< N; I++)
{
printf("Phan tu %d : ", I);
scanf("%d", &A[ I ] );

getch();
}

}
15

Mã hóa


Ví dụ: Sắp xếp mảng theo thứ tự tăng
printf("\nMang chua sap:");
for( I = 0; I< N; I++)
printf("%6d ", A[I] );
//Sap xep mang A
for ( I = 0; I < N-1; I++)
{
cs = I;
for ( J=I+1; J<=N-1; J++)
if (A[ J ] < A[cs]) cs = J;

void Hoanvi(int *a, int *b)
{
int c = *a;
*a = *b;
*b = c;
}
void main()
{ int A[100];
int N, I, J, cs;
printf(“Nhap so phan tu");
scanf("%d", &N);
printf("Nhap GT cac phan tu: \n");

if ( cs != I )
Hoanvi( &A[cs], &A[I] );
}
printf("\nMang da sap xep:");
for( I = 0; I< N; I++)
printf("%6d ", A[I]);

for( I = 0; I< N; I++)
{
printf("Phan tu %d : ", I);
scanf("%d", &A[ I ] );

getch();
}

}
16

Mã hóa


4- Hàm có tham số là Mảng một chiều
a) Khai báo tham số hình thức là mảng 1 chiều: Có 3 cách


Khai báo trực tiếp:
tênhàm( kiểuPT TênMảng[ ], ...)

Chú ý: Không cần khai báo kích thước tham số mảng, tuy nhiên nếu có
khai báo trình biên dịch cũng sẽ bỏ qua


Khai báo gián tiếp qua kiểu mảng:
typedef [];
TênHàm( TênKiểuMảng TênMảng, ...)



Khai báo kiểu con trỏ:
tênhàm( KiểuPT *ContrỏMảng, ...)

b) Gọi hàm và truyền mảng:
Tham số thực sự là tên mảng, vì tên mảng là hằng địa chỉ của mảng:
tênhàm( tênmảng, ...)
17

Mã hóa


Ví dụ: Hàm sắp xếp mảng theo thứ tự tăng
void Hoanvi(int *a, int *b)
{ int c = *a;
*a = *b;
*b = c;
}
void SapXepTang(int *A, int N)
{ int I, J, cs;
for ( I = 0; I < N-1; I++)
{ cs = I;
for ( J = I +1; J <= N - 1; J++)
if (A[ J ] < A[cs]) cs = J ;
if (cs != I)
Hoanvi(&A[cs],&A[I]);
}
}
void main()
{ int A[100];
int N, I;
printf(“Nhap so phan tu");
scanf("%d", &N);

printf("Nhap cac phan tu:\n");
for( I = 0; I< N; I++)
{
printf("Nhap phan tu %d : ", I);
scanf("%d", A + I);
}
printf("\nMang chua sap:");
for( I = 0; I< N; I++)
printf("%6d ", A[I]);
//Sap xep mang A
SapXepTang( A, N);
printf("\nMang da sap xep:");
for( I = 0; I< N; I++)
printf("%6d ", A[I]);
getch();
}
18

Mã hóa


Ví dụ: Hàm sắp xếp mảng theo thứ tự tăng
void Hoanvi(int &a, int &b)
{ int c = a;
a = b;
b = c;
}
void SapXepTang(int A[ ], int N)
{ int I, J, cs;
for ( I = 0; I < N-1; I++)
{ cs = I;
for ( J = I +1; J <= N - 1; J++)
if (A[ J ] < A[cs]) cs = J ;
if (VT != I)
Hoanvi(A[cs], A[I]);
}
}
void main()
{ int A[100];
int N, I;
printf(“Nhap so phan tu");
scanf("%d", &N);

printf("Nhap cac phan tu:\n");
for( I = 0; I< N; I++)
{
printf("Nhap phan tu %d : ", I);
scanf("%d", A + I);
}
printf("\nMang chua sap:");
for( I = 0; I< N; I++)
printf("%6d ", A[I]);
//Sap xep mang A
SapXepTang( A, N);
printf("\nMang da sap xep:");
for( I = 0; I< N; I++)
printf("%6d ", A[I]);
getch();
}
19

Mã hóa


Ví dụ: Hàm sắp xếp mảng theo thứ tự tăng
printf(“Nhap so phan tu");
scanf("%d", &N);
printf("Nhap cac phan tu:\n");
for( I = 0; I< N; I++)
{
printf("Nhap phan tu %d : ", I);
scanf("%d", A + I);
}
printf("\nMang chua sap:");
for( I = 0; I< N; I++)
printf("%6d ", A[I]);

typedef int Dayint[100];
void Hoanvi(int &a, int &b)
{ int c = a;
a = b;
b = c;
}
void SapXepTang(Dayint A, int N)
{ int I, J, cs;
for ( I = 0; I < N-1; I++)
{ cs = I;
for ( J = I +1; J <= N - 1; J++)
if (A[ J ] < A[cs]) cs = J ;
if (VT != I)
Hoanvi(A[cs],A[I]);
}
}
void main()
{ Dayint A;
int N, I;

//Sap xep mang A
SapXepTang( A, N);
printf("\nMang da sap xep:");
for( I = 0; I< N; I++)
printf("%6d ", A[I]);
}
20

Mã hóa


III- MẢNG HAI CHIỀU:
0

1

2

3

0

9

5

2

2

1

5

1

8

1

2

9

7

5

7

4

3

0

1

0

1

2

3

9

5

2

2

4

2

5

6

7

8

5

1

8

1

21

9

10

11

12

13

9

7

5

7

14

Mã hóa


1- Khái niệm:
• Mảng 2 chiều là tập các biến nhớ cùng kiểu, Mỗi biến nhớ
trong mảng 2 chiều được xác định dựa trên tên mảng và 2
chỉ số xác định vị trí dòng và cột của phần tử trong mảng.
• Theo C, Mảng 2 chiều là mảng 1 chiều mà mỗi phần tử lại là
mảng 1 chiều.

22

Mã hóa


2- Khai báo mảng hai chiều:
a) Khai báo trực tiếp:
TênMảng[SoDong][SoCot] = {giá trị phần tử};
Ví dụ: float B[4][5] = {{9, 5, 2, 2}, {5, 1, 8, 1}, {9, 7, 5, 7} };
– B là mảng 2 chiều
– B có 4 phần tử B[0],..,B[3]
– Mỗi phần tử B[d] là mảng 1 chiều có 5 phần tử B[d][0],
B[d][1], B[d][2], B[d][3], B[d][4] là các biến thuộc kiểu số thực.


Có thể khai báo không chỉ định tổng số dòng: Khi đó tổng
số dòng phụ thuộc vào số dòng được gán.
TênMảng[ ] [SoCot]= {giá trị phần tử};

23

Mã hóa


2- Khai báo mảng hai chiều: (tt)
b) Khai báo gián tiếp:


Định nghĩa kiểu mảng 2 chiều:
typedef Tênkiểumảng[SốDòng][SốCột];



Khai báo mảng thuộc kiểu đã định nghĩa:
TênKiểuMảng TênMảng ;

Ví dụ: Khai báo kiểu mảng 2 chiều có 4 dòng, 5 cột chứa 20
biến số thực
typedef float BangThuc[4][5];
BangThuc B = {{9, 5, 2, 2}, {5, 1, 8, 1}, {9, 7, 5, 7} };

24

Mã hóa


3- Duyệt qua các phần tử của mảng 2 chiều:
for ( d = 0; d < SD; d++)

0

1

2

3

0

9

5

2

2

1

5

1

8

1

2

9

7

5

7

{
for (c = 0; c < SC; c++)

4

{
Xử lý phần tử B[ d ][ c ]
}
}
3

25

Mã hóa


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

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

×