mang pascalchương 5 mảng con trỏ tham chiếubài tập kiểu mảng 1 chiều pascalchương trình phát thanh măng non tháng 5các bài tập về mảng 1 chiều pascalxóa các phần tử trùng nhau trong mảng 1 chiều pascalđếm số nguyên tố trong mảng 1 chiều pascalsắp xếp mảng tăng dần pascal
Trang 2I- Tổng Quan:
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:
<Kiểu phần tử> <Tên Mảng> [S1][S2]…[Sn];
Trang 3II- MẢNG MỘT CHIỀU
Trang 41- Khái niệm:
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:
3 2
1 0
Chỉ số phần tử
1 5
2 2
5 9
A
Trang 52- Khai Báo Mảng 1 Chiều:
2- Khai Báo Mảng 1 Chiều:
a) Khai báo trực tiếp:
<kiểuPT> <tênmảng>[ <số phần tử> ] = {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 <kiểucơsở> < tênkiểumảng >[<số phần tử>];
– Khai báo mảng 1 chiều thuộc kiểu mảng đã định nghĩa:
< tênkiểumảng > <tênmảng> = {gt1, , gtn} ;
Trang 63- Một Số Thao Tác Trên Mảng 1 Chiều:
3- Một Số Thao Tác Trên Mảng 1 Chiều:
Trang 73.1 Địa chỉ vùng nhớ của một phần tử trong
– scanf ("mã định dạng", &TênMảng[ chỉsố ] );
– scanf ("mã định dạng", TênMảng + chỉsố );
Trang 83.2 Duyệt qua các phần tử của mảng:
3.2 Duyệt qua các phần tử của mảng:
Trang 9printf(“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] );
Trang 103.3 Tìm kiếm phần tử thỏa yêu cầu cực trị:
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ị
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
Trang 11Ví dụ: Nhập ngẫu nhiên N số nguyên (N <=100) Cho biết chỉ
printf(“Gia tri min la %d", A[cs]);
printf("\nThuoc cac phan tu: ");
for ( i = cs ; i < N ; i++)
if (A[i]==A[cs]) printf(“%6d”, i ); }
Trang 123.4 Sắp xếp mảng theo thứ tự tăng (hay giảm):
3.4 Sắp xếp mảng theo thứ tự tăng (hay giảm):
Mảng sắp theo thứ tự tăng
Mảng sắp theo thứ tự giảm
2 4
1 9
8 6
5 A
65
43
21
0Chỉ số
9 8
6 5
4 2
1 A
65
43
21
0Chỉ số
1 2
4 5
6 8
9 A
65
43
21
0Chỉ số
Trang 13Thuật toán chọn trực tiếp
(Straight Selection Sort)
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ử.
2 4
1 9
8 6
5 A
65
43
21
0Chỉ số
9 8
6 5
4 2
1 A
65
43
21
0Chỉ số
Trang 14Thuật toán: Sắp xếp mảng theo thứ tự tăng
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
Trang 15Ví dụ: Sắp xếp mảng theo thứ tự tăng
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;
if ( cs != I ) Hoanvi( A[cs], A[I] );
} printf("\nMang da sap xep:");
for( I = 0; I< N; I++)
printf("Nhap GT cac phan tu: \n");
for( I = 0; I< N; I++)
{
printf("Phan tu %d : ", I);
scanf("%d", &A[ I ] );
Trang 16Ví dụ: Sắp xếp mảng theo thứ tự tăng
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;
if ( cs != I ) Hoanvi( &A[cs], &A[I] );
} printf("\nMang da sap xep:");
for( I = 0; I< N; I++)
printf("Nhap GT cac phan tu: \n");
for( I = 0; I< N; I++)
{
printf("Phan tu %d : ", I);
Trang 174- Hàm có tham số là Mảng một chiều
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:
<kiểuhàm> 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 <KiểuPT> <TênKiểuMảng>[<số phần tử>];
<KiểuHàm> TênHàm( TênKiểuMảng TênMảng , )
• Khai báo kiểu con trỏ:
<kiểuhàm> 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:
Trang 18Ví dụ: Hàm sắp xếp mảng theo thứ tự tăng
Ví dụ: Hàm sắp xếp mảng theo thứ tự tăng
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++)
Trang 19Ví dụ: Hàm sắp xếp mảng theo thứ tự tăng
Ví dụ: Hàm sắp xếp mảng theo thứ tự tăng
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++)
Trang 20Ví dụ: Hàm sắp xếp mảng theo thứ tự tăng
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]);
//Sap xep mang A SapXepTang( A , N);
printf("\nMang da sap xep:");
for( I = 0; I< N; I++)
typedef int Dayint [100];
void Hoanvi(int &a, int &b)
}
}
Trang 21III- MẢNG HAI CHIỀU:
III- MẢNG HAI CHIỀU:
7 5
7 9
5
1
2 5
9
0
21
0
21
0
7
13 149
4
5 7
9
1 8
1 5
2 2
5 9
1211
108
76
53
21
0
Trang 221- Khái niệm:
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.
Trang 232- Khai báo mảng hai chiều:
2- Khai báo mảng hai chiều:
<Kiểuphầntử> 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.
<Kiểuphầntử> TênMảng[ ] [SoCot]= {giá trị phần tử};
Trang 242- Khai báo mảng hai chiều: (tt)
2- Khai báo mảng hai chiều: (tt)
• Định nghĩa kiểu mảng 2 chiều:
typedef <kiểuphầntử> Tênkiểumảng [SốDòng][SốCột];
• Khai báo mảng thuộc kiểu đã định nghĩa:
Trang 253- Duyệt qua các phần tử của mảng 2 chiều:
3- Duyệt qua các phần tử của mảng 2 chiều:
7 9
5
1
2 5
9
0
21
0
Trang 26Ví dụ: Nhập và In mảng 2 chiều
Ví dụ: Nhập và In mảng 2 chiều
for ( d = 0; d < SD; d++) for (c = 0; c < SC; c++) {
printf(“PT[%d][%d]=“, c, d);
scanf(“%f”, &B[ d ][ c ] );
} printf("Bang so da nhap:\n");
for ( d = 0; d < SD; d++) {
for (c = 0; c < SC; c++) printf(“ %f “, B[d] [c]);
printf("\n");
} }
#include <stdio.h>
#include <conio.h>
#define SoDong 20
#define SoCot 10
//Khai bao kieu mang 2 chieu
typedef float BangThuc[SoDong][SoCot];
printf("\nNhap So dong va so cot :");
scanf("%d %d", &SD, &SC);
Trang 274- Hàm có tham số là mảng 2 chiều:
4- Hàm có tham số là mảng 2 chiều:
1 Khai báo tham số hình thức của mảng 2 chiều:
KiểuHàm TênHàm( KiểuPT TênMảng[ ][SoCot], ) Chú ý: Không cần khai báo số dòng, còn số cột phải bằng với
số cột của mảng thực sự khai báo tại nơi gọi hàm.
typedef KiểuPT TênKiểuMảng [SoDong][SoCot];
KiểuHàm TênHàm( TênKiểuMảng TênMảng, )
2 Gọi hàm và truyền mảng: Tham số thực sự phải là tên
mảng:
TênHàm( TênMảng, )
Trang 28Ví dụ: Viết chương trình cộng 2 ma trận MxN
(M, N <= 100)
Ví dụ: Viết chương trình cộng 2 ma trận MxN
(M, N <= 100)
void CongMT(int A[[][MAX], int B[][MAX],
int C[][MAX], int M, int N)
{ int i,j;
for(i=0;i<M;i++) for(j=0; j<N; j++) C[i][j]= A[i][j] + B[i][j];
Trang 29Ví dụ: Viết chương trình cộng 2 ma trận MxN
(M, N <= 100)
Ví dụ: Viết chương trình cộng 2 ma trận MxN
(M, N <= 100)
void CongMT(MaTran A, MaTran B,
MaTran C, int M,int N)
{ int i,j;
for(i=0;i<M;i++) for(j=0; j<N; j++) C[i][j]= A[i][j] + B[i][j];
typedef int MaTran[MAX][MAX];
void NhapMaTran(MaTran A, int M, int N)
Trang 30IV- MẢNG NHIỀU CHIỀU:
IV- MẢNG NHIỀU CHIỀU:
Trang 311- Khái niệm:
1- Khái niệm:
Mảng N chiều là mảng một chiều mà mỗi phần tử là mảng N -1 chiều.
Trang 322- Khai báo mảng N chiều
2- Khai báo mảng N chiều
a) Khai báo trực tiếp:
b) Khai báo gián tiếp:
– Định nghĩa kiểu mảng N chiều:
typedef KiểuPhầnTử TênKiểuMảng [S1][S2] [Sn];
– Khai báo mảng N chiều:
Trang 344-Duyệt các phần tử trên mảng N chiều:
4-Duyệt các phần tử trên mảng N chiều:
Các thao tác trên mảng N chiều cần có N vòng lặp lồng nhau:
for (cs1 = 0; cs1 < S1 ; cs1++)
for (cs2 = 0; cs2 < S2; cs2++)
for (csN = 0; csN < Sn; csN++) {
<Xử lý phần tử Y[cs1][cs2] [csN];
Trang 35Bài tập: Mảng 1 chiều
Bài tập: Mảng 1 chiều
1 Nhập N (<=100) số thực Tìm và in chỉ số của các phần tử có giá trị lớn nhất
trong dãy
2 Nhập một dãy n số nguyên (n < 30) và một số nguyên x Loại khỏi dãy tất cả
các phần tử có giá trị bằng x In ra màn hình dãy số sau khi loại bỏ.
3 Nhập một dãy n số nguyên
a) Xếp dãy số theo thứ tự tăng dần In dãy đã xếp ra màn hình;
b) Nhập thêm một số từ bàn phím Chèn số này vào đúng vị trí của nó trong dãy đã xếp In dãy đã chèn ra màn hình.
4 Cho 2 dãy số ai (i ≤ N) và bj ( j ≤ M ), cả hai đều được xếp theo thứ tự tăng Từ
2 dãy trên hãy xây dựng 1 dãy mới cũng theo thứ tự tăng.
5 Cho dãy số nguyên gồm N số (N ≤ 100)
a) Tìm giá trị nhỏ nhất m và giá trị lớn nhất M.
b) In ra các số nguyên trên đọan [m, M] không có trong dãy.
6 Đa thức Pn(x) = a 0 + a 1 x + a 2 x 2 + + a n x n có thể biểu diễn bằng 1 mảng số
nguyên lưu trữ các hệ số từ a0 đến an Hãy nhập vào 2 đa thức có bậc tùy ý,
tính tổng 2 đa thức đó.
Trang 363 Tính tổng các phần tử trên đường chéo chính và tổng các phần tử trên
đường chéo phụ của ma trận vuông NxN.
Hướng dẫn: Phần tử trên đường chéo chính là A[i,i];đường chéo phụ là
A[i,n-i]
4 Xác định ma trận chuyển vị B của ma trận vuông A.Biết B[i,j]=A[j,i]
a) Kết quả lưu trong ma trận B khác A
b) Kết quả lưu trong chính ma trận A
5 Lập thủ tục nhân 2 ma trận chữ nhật A, B : C = A*B
Trang 3725 18
11
3 21
19 12
10
22 20
13 6
4
16 14
7 5
23
15 8
1 24
17