KỸ THUẬT LẬP TRÌNH C/ - Thayphet.net · 2. CÁC THAO TÁC TRÊN MẢNG 1 CHIỀU 1. Nhập...
Transcript of KỸ THUẬT LẬP TRÌNH C/ - Thayphet.net · 2. CÁC THAO TÁC TRÊN MẢNG 1 CHIỀU 1. Nhập...
1
Chương 5
KIỂU DỮ LIỆU MẢNG
Giảng Viên: ThS. Dương Thành Phết
Email: [email protected]
Website: http://www.thayphet.net
Tel: 0918158670 – facebook.com/duongthanhphet
KỸ THUẬT LẬP TRÌNH C/C++
TRƯỜNG ĐẠI HỌC NGUYỄN TẤT THÀNH
KHOA CÔNG NGHỆ THÔNG TIN
http://www.thayphet.net 2
2
NỘI DUNG
1. Giới thiệu mảng 1 chiều.
2. Các thao tác trên mảng 1 chiều
3. Mảng nhiều chiều
http://www.thayphet.net 3
1.1. ĐỊNH NGHĨA MẢNG
Mảng thưc chât la môt biên bao gôm nhiều
biên thanh phân đươc câp phát bô nhớ liên tuc.
Các thanh phân cua mảng la tâp hơp các biên
co cung kiêu dữ liệu va cung tên.
Đê truy xuât các biên thanh phân, ta dung cơ
chê chi số (vị trí).
3 0 1 2 3 4 5 6 7 8 9
Giá trị
Vị trí
1. GIỚI THIỆU
http://www.thayphet.net 4
1.2. KHAI BÁO
int a[100];
Khai bao mang so nguyen a gom 100 phan tu
float b[50];
Khai bao mang so thuc b gom 50 phan tu
char str[30];
Khai bao mang ky tu str gom 30 ky tu 4
< Kiểu DL> < Tên mảng > [<Sô phần tử tôi đa>] ;
1. GIỚI THIỆU
http://www.thayphet.net 5
1.3. GÁN GIÁ TRỊ BAN ĐẦU CHO MẢNG
int a[5] = {3, 6, 8, 1, 12};
a[0] = 3, a[1] = 6, a[2] = 8, …
5
int a[10] = {0};
a[0]=a[1]=a[2]=a[3]=…=a[9]=0
1. GIỚI THIỆU
http://www.thayphet.net 6
1.4. TRUY XUẤT
Vị trí 0 1 2 3 4
A 7 8 6 9 2
A[0] A[1] A[2] A[3] A[4]
7 8 6 9 2
6
1. GIỚI THIỆU
http://www.thayphet.net 7
2. CÁC THAO TÁC TRÊN MẢNG 1 CHIỀU
1. Nhâp mảng
2. Phát sinh mảng ngẫu nhiên
3. Xuât mảng
4. Xuât các phân tử thỏa điều kiện
5. Đêm các phân tử thỏa điều kiện
6. Tìm kiêm các phân tử thỏa điều kiện
7. Kiêm tra mảng thỏa điều kiện cho trước
8. Tính toán các phân tử trong mảng
9. Sắp xêp mảng
10.Thêm, Xoa, Sửa
7
http://www.thayphet.net 8
1. NHẬP MẢNG
void Nhapmang (int a[], int n)
{
for (int i = 0; i < n; i ++)
{
cout<<“Nhap phan tu thu “<<i<<“: “;
cin>>a[i];
}
}
8
2. CÁC THAO TÁC TRÊN MẢNG 1 CHIỀU
http://www.thayphet.net 9
2.2. PHÁT SINH MẢNG NGẪU NHIÊN
void Phatsinhmang (int a[], int n)
{
srand((int) time(NULL));
for(int i=0;i<n;i++)
a[i]=rand() % 101 ; // so ngau nhien tu 0-10
}
9
2. CÁC THAO TÁC TRÊN MẢNG 1 CHIỀU
Ghi chú: cần khai báo thư viện time.h (#include”time.h”)
http://www.thayphet.net 10
2.3. NHẬP XUẤT MẢNG
10
void Xuatmang (int a[], int n)
{
for (int i = 0; i < n; i ++)
cout<<a[i]<<“\t”;
}
2. CÁC THAO TÁC TRÊN MẢNG 1 CHIỀU
http://www.thayphet.net 11
void main ( )
{
int a[100] , n;
cout<<“Nhap kich thuoc mang: “;
cin>>n;
Nhapmang (a,n); //Hoac Phatsinhmang(a,n)
cout<<“Cac gia tri cua mang vua nhap: ”;
Xuatmang (a,n);
}
11
2. CÁC THAO TÁC TRÊN MẢNG 1 CHIỀU
http://www.thayphet.net 12
2.4. XUẤT CÁC PHẦN TỬ THỎA ĐIỀU KIỆN
Mẫu 1:
void LietKeXXX(int a[], int n){
for (int i = 0; i<n; i++)
if (a[i] thỏa điều kiện)
Xuất a[i];
}
12
2. CÁC THAO TÁC TRÊN MẢNG 1 CHIỀU
Ví dụ 1: Liệt kê các phân tử co giá trị chẵn trong mảng
void LietKeChan(int a[], int n){
for (int i = 0; i<n; i++)
if (a[i] %2 ==0)
cout<<a[i]<<“\t”;
}
http://www.thayphet.net 13
Ví dụ 2: Liệt kê các phân tử co giá trị lớn hơn x trong mảng
13
void LietKeLonHonX(int a[], int n, int x){
for (int i = 0; i<n; i++)
if (a[i] > x)
cout<<a[i]<<“\t”;
}
2.4. XUẤT CÁC PHẦN TỬ THỎA ĐIỀU KIỆN
2. CÁC THAO TÁC TRÊN MẢNG 1 CHIỀU
Mẫu 2:
void LietKeXXX(int a[], int n, int x){
for (int i = 0; i<n; i++)
if (a[i] thỏa điều kiện so với x)
Xuất a[i];
}
http://www.thayphet.net 14
2.5 ĐẾM CÁC PHẦN TỬ THỎA ĐIỀU KIỆN
Mẫu 1:
int DemXXX(int a[], int n){
int d = 0;
for (int i = 0; i<n; i++)
if (a[i] thỏa điều kiện)
d++;
return d;
}
14
2. CÁC THAO TÁC TRÊN MẢNG 1 CHIỀU
bool LaSNT(int k) {
int d = 0;
for (int i = 2; i <= k/2; i++)
if (k % i == 0)
return false;
return true;
}
int DemSNT(int a[], int n){
int d = 0;
for (int i = 0; i<n; i++)
if (LaSNT(a[i]) ==true)
d++;
return d;
}
Ví dụ 1:
Đêm các phân tử có giá trị
là số nguyên tố
http://www.thayphet.net 15
Ví dụ 2:
Đêm số phân tử có
trong mảng mà giá trị
nhỏ hơn x
2.5 ĐẾM CÁC PHẦN TỬ THỎA ĐIỀU KIỆN
2. CÁC THAO TÁC TRÊN MẢNG 1 CHIỀU
Mẫu 2:
int DemXXX(int a[], int n, int x){
int d = 0;
for (int i = 0; i<n; i++)
if (a[i] thỏa điều kiện so với x)
d++;
return d;
} int DemNhoHonX(int a[], int n, int x){
int d = 0;
for (int i = 0; i<n; i++)
if (a[i] < x)
d++;
return d;
}
http://www.thayphet.net 16
2.6. TÌM KIẾM CÁC PHẦN TỬ THỎA ĐIỀU KIỆN
16
2. CÁC THAO TÁC TRÊN MẢNG 1 CHIỀU
Mẫu 1: Tìm và trả về vị trí phần tử thỏa điều kiện
int TimXXX(int a[], int n){
int vt = 0;
for (int i = 0; i<n; i++)
if (a[i] thỏa điều kiện)
vt=i;
return vt;
} Ví dụ 1: Tìm và trả về vị trí phần tử có giá trị lớn nhất
int TimVTMax(int a[], int n){
int vtmax = 0;
for (int i = 0; i < n; i++)
if (a[i] > a[vtmax])
vtmax = i;
return vtmax;
}
http://www.thayphet.net 17
17
2.6. TÌM KIẾM CÁC PHẦN TỬ THỎA ĐIỀU KIỆN
2. CÁC THAO TÁC TRÊN MẢNG 1 CHIỀU
Mẫu 2: Tìm và trả về vị trí phần tử thỏa điều kiện so với x
int TimXXX(int a[], int n){
int vt = 0;
for (int i = 0; i<n; i++)
if (a[i] thỏa điều kiện so với x)
vt=i;
return vt;
}
Ví dụ 2:
Tìm vị trí phân tử có giá trị
x (nếu x không xuất hiện
trong mảng trả về -1)
int TimVTX(int a[], int n, int x){
for (int i = 0; i < n; i++)
if (a[i] == x)
return i;
return -1;
}
http://www.thayphet.net 18
2.7. KIỂM TRA MẢNG CÓ THỎA ĐK CHO TRƯỚC
Mẫu 1: kiểm tra tồn tại môt phân tử trong mảng thỏa điều
kiện cho trước tìm phân tử thỏa điều kiện đê kêt luân có
hay không?.
18
bool KiemTraTonTaiXXX(int a[], int n){
for (int i = 0; i<n; i++)
if (a[i] thỏa điều kiện)
return true;
return false;
} bool KiemTraTonTaiLe(int a[], int n){
foreach (int giatri in a)
if (giatri % 2 != 0)
return true;
return false;
}
Ví dụ 1:
Kiêm tra xem mảng
có tôn tại số lẻ
không?
2. CÁC THAO TÁC TRÊN MẢNG 1 CHIỀU
http://www.thayphet.net 19
19
bool KiemTraXXX(int a[], int n){
for (int i = 0; i<n; i++)
if (a[i] không thỏa điều kiện)
return false;
return true;
}
Mẫu 2: kiểm tra tất cả các phân tử thỏa điều kiện nào đo
cho trước tìm phân tử không thỏa điều kiện đê kêt luân
mảng không thỏa điều kiện.
2.7. KIỂM TRA MẢNG CÓ THỎA ĐK CHO TRƯỚC
2. CÁC THAO TÁC TRÊN MẢNG 1 CHIỀU
Ví du 2:
Kiêm tra xem mảng có
toàn giá trị âm không?
(true: có/ false: không)
bool KiemTraToanAm(int a[], int n){
for (int i = 0; i<n; i++)
if (a[i] >= 0)
return false;
return true;
}
http://www.thayphet.net 20
2.8. TÍNH TOÁN CÁC PHẦN TỬ TRONG MẢNG
Mẫu tính tổng:
int TongXXX(int a[], int n){
int s = 0;
for (int i = 0; i<n; i++)
if (a[i] thỏa điều kiện)
s += a[i];
return s;
}
20
2. CÁC THAO TÁC TRÊN MẢNG 1 CHIỀU
Ví dụ:
Tính tổng các phân tử có
giá trị lẻ trong mảng.
int TongLe(int a[], int n) {
int s = 0;
for (int i = 0; i<n; i++)
if (a[i] %2!=0)
s += a[i];
return s;
}
http://www.thayphet.net 21
Mẫu tính trung bình:
float TrungBinhXXX(int a[], int n){
int s = 0;
int d = 0;
for (int i = 0; i<n; i++)
if (a[i] thỏa điều kiện){
s += giatri;
d ++;
}
if (d==0)
return 0;
return (float) s / d;
} 21
2.8. TÍNH TOÁN CÁC PHẦN TỬ TRONG MẢNG
2. CÁC THAO TÁC TRÊN MẢNG 1 CHIỀU
http://www.thayphet.net 22
Ví dụ: Tính giá trị TB các phân tử co giá trị âm trong mảng
22
float TrungBinhAm(int a[], int n){
long s = 0;
int d = 0;
for (int i = 0; i<n; i++)
if (a[i] < 0){
s += a[i];
d++;
}
if (d == 0)
return 0;
return (float)s / d;
}
2.8. TÍNH TOÁN CÁC PHẦN TỬ TRONG MẢNG
2. CÁC THAO TÁC TRÊN MẢNG 1 CHIỀU
http://www.thayphet.net 23
Minh họa thuật toán
23
2 12 8 5 1 6 4
i=1 j=2 j=5 i=2 j=3 j=4 i=3 j=7 i=4 j=6 i=5 i=6 i=7
2.9. SẮP XẾP
2. CÁC THAO TÁC TRÊN MẢNG 1 CHIỀU
http://www.thayphet.net 24
2.9. SẮP XẾP
Mẫu phương thức sắp thứ tự tăng:
void SapTang(int a[], int n){
for (int i = 0; i < n-1; i ++)
for(int j = i+1; j < n; j ++)
if (a[i] > a[j])
HoanVi(a[i], a[j]);
}
void HoanVi(int &a, int &b){
int tam = a;
a = b;
b = tam;
}
24
2. CÁC THAO TÁC TRÊN MẢNG 1 CHIỀU
http://www.thayphet.net 25
25
3. MẢNG NHIỀU CHIỀU
Mảng hai chiều thưc chât la mảng môt chiều trong đo
môi phân tử cua mảng la môt mảng môt chiều, và đươc
truy xuât bơi hai chi số dong va côt.
Từ khái niệm trên ta co thê đưa ra môt khái niệm về
mảng nhiều chiều như sau: mang co từ hai chiêu trơ
lên goi la mang nhiêu chiêu.
3.1 GIỚI THIỆU
http://www.thayphet.net 26
26
3. MẢNG NHIỀU CHIỀU
3.2. KHAI BÁO
Cách 1:
< Kiêu dư liệu > < Tên mảng > [< Sô dong][<Sô côt>];
Ví du:
int A[5][10]; // Khai báo mảng int gồm 5 dòng, 10 cột
float b[7][8]; // Khai báo mảng float gồm 7 dòng, 8 cột
Cách 2 :
< Kiêu dư liệu > **<Tên mảng>;
Ví du :
int **A ; // Khai báo mảng động 2 chiều kiểu int
float **B ; // Khai báo mảng động 2 chiều kiểu float
http://www.thayphet.net 27
3. MẢNG NHIỀU CHIỀU
3.3. TRUY XUẤT
Đê truy xuât các thanh phân cua mảng hai chiều ta phải
dưa vao chi số dong va chi số côt.
Ví du: int A[3][4] = { {2,3,9,4} , {5,6,7,6} , {2,9,4,7} };
Với các khai báo như trên ta co:
A[0][0] = 2; A[0][1] = 3;
A[1][1] = 6; A[1][3] = 6;
http://www.thayphet.net 28
3. MẢNG NHIỀU CHIỀU
3.4. MA TRẬN VUÔNG
Số dòng = Số côt
Đương cheo chính cua ma trân vuông:
chi sô dong = chi sô cột
Đương cheo phụ của ma trận vuông:
chi sô cột + chi sô dong = kích thước - 1
Cheo chính
Cheo phu
http://www.thayphet.net 29
BÀI TẬP
1. Viêt chương trình nhâp xuât mảng môt chiều các số
nguyên.
2. Viêt chương trình phát sinh ngẫu nhiên mảng môt
chiều các số nguyên từ -100 đên 100.
3. Viêt chương trình phát sinh ngẫu nhiên mảng môt
chiều các số nguyên sao cho mảng co thư tư tăng
dân (Không sắp xêp).
4. Viêt chương trình nhâp vao mảng môt chiều các số
nguyên va xuât ra các phân tử chẵn nhỏ hơn 20.
5. Viêt chương trình nhâp vao mảng môt chiều các số
nguyên va xuât ra man hình các phân tử la số nguyên
tố.
http://www.thayphet.net 30
BÀI TẬP
6. Viêt hàm tìm vị trí phân tử co giá trị x xuât hiện cuối
cung trong mảng.
7. Viêt hàm in vị trí các phân tử nguyên tố trong mảng
các số nguyên.
8. Viêt hàm tìm số lẻ lớn nhât co trong mảng, nêu không
tôn tại số lẻ hàm trả về -1.
9. Viêt hàm tìm va đổi chô phân tử lớn nhât với phân tử
nhỏ nhât trong mảng.
10.Nhâp vao X, viêt hàm in ra man hình những phân tử
co giá trị từ 1 đên X co trong mảng.
http://www.thayphet.net 31
BÀI TẬP
11.Viêt hàm đêm số lân xuât hiện cua phân tử x trong
mảng.
12.Viêt hàm đêm các phân tử la số hoan thiện trong
mảng.
13.Viêt hàm tính tổng các phân tử lẻ trong mảng các số
nguyên.
14.Viêt hàm tính tổng các phân tử là nguyên tố trong
mảng.
15.Viêt hàm tính tổng các phân tử năm ơ vị trí chẵn trong
mảng các số nguyên.
http://www.thayphet.net 32
BÀI TẬP
16.Viêt hàm tính giá trị trung bình các số hoan thiện trong
mảng các số nguyên.
17.Viêt hàm tính giá trị trung bình các phân tử có giá trị là
ước số cua x trong mảng số nguyên (x nhâp từ bàn
phím).
18.Viêt hàm sắp xêp mảng theo thư tư giảm dân.
19.Viêt hàm sắp xêp mảng theo thư tư tăng dân cua các
phân tử la số nguyên tố.
20.Viêt hàm sắp xêp các phân tử lẻ tăng dân.
33
The End.